Files
wraith_executioner_year_2andCursor f3903224b9 ✨ Any Split (misc) を追加
LIST / BATCH 入力を any_* と length に分解。MASK バッチの [B,1,H,W] 正規化と旧名 Any List Split の互換登録を含む。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-15 10:59:57 +09:00

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
}