Region widget
This commit is contained in:
@@ -14,18 +14,20 @@ function isBoundingBox(param: any): param is BoundingBox {
|
||||
|
||||
export interface ComfyMultiRegionProperties extends ComfyWidgetProperties {
|
||||
regionCount: number,
|
||||
totalWidth: number,
|
||||
totalHeight: number,
|
||||
canvasWidth: number,
|
||||
canvasHeight: number,
|
||||
inputType: "size" | "image"
|
||||
}
|
||||
|
||||
const DEFAULT_BBOX: BoundingBox = [0.4, 0.4, 0.2, 0.2];
|
||||
|
||||
export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]> {
|
||||
override properties: ComfyMultiRegionProperties = {
|
||||
tags: [],
|
||||
defaultValue: false,
|
||||
regionCount: 1,
|
||||
totalWidth: 512,
|
||||
totalHeight: 512,
|
||||
canvasWidth: 512,
|
||||
canvasHeight: 512,
|
||||
inputType: "size"
|
||||
}
|
||||
|
||||
@@ -49,12 +51,13 @@ export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]>
|
||||
}
|
||||
|
||||
override svelteComponentType = MultiRegionWidget;
|
||||
override defaultValue: BoundingBox[] = [[0.4, 0.4, 0.8, 0.2]];
|
||||
override defaultValue: BoundingBox[] = [[...DEFAULT_BBOX]];
|
||||
override outputSlotName = null;
|
||||
override storeActionName = "store";
|
||||
override changedEventName = "changed";
|
||||
|
||||
sizeChanged: Writable<boolean> = writable(true);
|
||||
regionsChanged: Writable<boolean> = writable(true);
|
||||
|
||||
override onPropertyChanged(property: any, value: any) {
|
||||
if (property === "regionCount") {
|
||||
@@ -66,16 +69,18 @@ export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]>
|
||||
}
|
||||
|
||||
constructor(name?: string) {
|
||||
super(name, [[0.4, 0.4, 0.8, 0.2]])
|
||||
super(name, [[...DEFAULT_BBOX]])
|
||||
}
|
||||
|
||||
override onExecute() {
|
||||
let width = this.getInputData(1)
|
||||
let height = this.getInputData(2)
|
||||
let width = this.getInputData(1) || 0
|
||||
let height = this.getInputData(2) || 0
|
||||
|
||||
if (width != null && height != null && width != this.properties.width && height != this.properties.height) {
|
||||
this.properties.width = width;
|
||||
this.properties.height = height;
|
||||
if (width != this.properties.canvasWidth || height != this.properties.canvasHeight) {
|
||||
console.warn("SIZCHANGE", width, height, this.properties.canvasWidth, this.properties.canvasHeight)
|
||||
this.properties.canvasWidth = width;
|
||||
this.properties.canvasHeight = height;
|
||||
this.sizeChanged.set(true);
|
||||
this.updateSize();
|
||||
}
|
||||
|
||||
@@ -86,10 +91,10 @@ export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]>
|
||||
if (bbox != null) {
|
||||
const xOutput = this.outputs[index + 1]
|
||||
if (xOutput != null) {
|
||||
this.setOutputData(index + 1, bbox[0] * this.properties.width)
|
||||
this.setOutputData(index + 2, bbox[1] * this.properties.height)
|
||||
this.setOutputData(index + 3, bbox[2] * this.properties.width)
|
||||
this.setOutputData(index + 4, bbox[3] * this.properties.height)
|
||||
this.setOutputData(index + 1, bbox[0] * this.properties.canvasWidth)
|
||||
this.setOutputData(index + 2, bbox[1] * this.properties.canvasHeight)
|
||||
this.setOutputData(index + 3, bbox[2] * this.properties.canvasWidth)
|
||||
this.setOutputData(index + 4, bbox[3] * this.properties.canvasHeight)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -111,12 +116,15 @@ export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]>
|
||||
this.addOutput(`h${index + 1}`, "number")
|
||||
}
|
||||
|
||||
this.regionsChanged.set(true);
|
||||
this.notifyPropsChanged();
|
||||
|
||||
this.setValue(this.getValue())
|
||||
}
|
||||
|
||||
private updateSize(value?: BoundingBox[]): BoundingBox[] {
|
||||
this.properties.width = Math.max(this.properties.width, 1);
|
||||
this.properties.height = Math.max(this.properties.height, 1);
|
||||
this.properties.canvasWidth = Math.max(this.properties.canvasWidth, 0);
|
||||
this.properties.canvasHeight = Math.max(this.properties.canvasHeight, 0);
|
||||
|
||||
value ||= this.getValue();
|
||||
|
||||
@@ -128,6 +136,7 @@ export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]>
|
||||
}
|
||||
|
||||
this.sizeChanged.set(true);
|
||||
this.notifyPropsChanged();
|
||||
|
||||
return value
|
||||
}
|
||||
@@ -136,13 +145,19 @@ export default class ComfyMultiRegionNode extends ComfyWidgetNode<BoundingBox[]>
|
||||
if (param == null || this.properties.regionCount <= 0)
|
||||
return []
|
||||
|
||||
let val = []
|
||||
|
||||
if (isBoundingBox(param))
|
||||
return this.updateSize([param])
|
||||
val = this.updateSize([param])
|
||||
|
||||
if (Array.isArray(param) && param.every(isBoundingBox))
|
||||
return this.updateSize(param.splice(0, this.properties.regionCount))
|
||||
val = this.updateSize(param.splice(0, this.properties.regionCount))
|
||||
|
||||
return null;
|
||||
// Fill the array with missing regions
|
||||
for (let index = val.length; index < this.properties.regionCount; index++)
|
||||
val.push([...DEFAULT_BBOX])
|
||||
|
||||
return val;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user