LIST / BATCH 入力を any_* と length に分解。MASK バッチの [B,1,H,W] 正規化と旧名 Any List Split の互換登録を含む。 Co-authored-by: Cursor <cursoragent@cursor.com>
75 lines
2.4 KiB
JavaScript
75 lines
2.4 KiB
JavaScript
/**
|
|
* Any Split (misc) — データ出力本数の純粋ロジック(ComfyUI 非依存)。
|
|
*/
|
|
|
|
export const MIN_DATA_OUTPUTS = 1
|
|
|
|
/**
|
|
* 接続済み data 出力スロット番号から、表示すべき data 出力本数を求める。
|
|
* length スロットへの接続は linkedSlots に含まれていても反復で除外される。
|
|
*
|
|
* @param {number[]} linkedSlots - このノード出力への接続スロット番号
|
|
* @param {number} [minDataOutputs=1]
|
|
* @returns {number}
|
|
*/
|
|
export function computeSplitNumData(linkedSlots, minDataOutputs = MIN_DATA_OUTPUTS) {
|
|
if (!linkedSlots?.length) {
|
|
return minDataOutputs
|
|
}
|
|
|
|
const slots = [...new Set(linkedSlots.map((s) => Number(s)))].sort((a, b) => a - b)
|
|
|
|
if (slots.length === 1 && slots[0] === minDataOutputs) {
|
|
return minDataOutputs
|
|
}
|
|
|
|
const lengthCandidates = slots.filter((slot) => slots.some((s) => s < slot))
|
|
const lengthSlot = lengthCandidates.length ? Math.max(...lengthCandidates) : -1
|
|
const dataSlots = lengthSlot >= 0 ? slots.filter((slot) => slot !== lengthSlot) : slots
|
|
|
|
const maxData = dataSlots.length ? Math.max(...dataSlots) : -1
|
|
return maxData < 0 ? minDataOutputs : Math.max(minDataOutputs, maxData + 2)
|
|
}
|
|
|
|
/**
|
|
* 実行結果タプルを組み立てる。
|
|
*
|
|
* @param {unknown[]} items
|
|
* @param {number[]} linkedSlots
|
|
* @param {number} [minDataOutputs]
|
|
* @returns {{ values: unknown[], length: number }}
|
|
*/
|
|
export function buildSplitOutputValues(items, linkedSlots, minDataOutputs = MIN_DATA_OUTPUTS) {
|
|
const list = Array.isArray(items) ? items : items == null ? [] : [items]
|
|
const length = list.length
|
|
if (!length) {
|
|
return { values: [length], length }
|
|
}
|
|
const numData = computeSplitNumData(linkedSlots, minDataOutputs)
|
|
const values = []
|
|
for (let i = 0; i < numData; i++) {
|
|
values.push(i < length ? list[i] : null)
|
|
}
|
|
values.push(length)
|
|
return { values, length }
|
|
}
|
|
|
|
/**
|
|
* ノード outputs 配列(length 除く)から UI 用の desired data 本数を求める。
|
|
*
|
|
* @param {Array<{ links?: unknown[] }>} dataOutputs
|
|
* @returns {number}
|
|
*/
|
|
export function computeDesiredDataOutputCount(dataOutputs) {
|
|
let maxConnectedIndex = -1
|
|
for (let i = 0; i < (dataOutputs?.length ?? 0); i++) {
|
|
if (dataOutputs[i]?.links?.length) {
|
|
maxConnectedIndex = i
|
|
}
|
|
}
|
|
if (maxConnectedIndex < 0) {
|
|
return MIN_DATA_OUTPUTS
|
|
}
|
|
return maxConnectedIndex + 2
|
|
}
|