From 71d7e63c79f18dd5908be0bdaf388d50f3c8acc0 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Mon, 13 Nov 2023 20:40:08 +0000 Subject: [PATCH] allow outputs to be used internally and externally --- web/extensions/core/groupNode.js | 42 +++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/web/extensions/core/groupNode.js b/web/extensions/core/groupNode.js index 46092d507..3dd1becdd 100644 --- a/web/extensions/core/groupNode.js +++ b/web/extensions/core/groupNode.js @@ -39,6 +39,18 @@ export async function registerGroupNodes(groupNodes, source, prefix, missingNode } } +function getOutputs(config) { + const map = {}; + for (const ext of config.external) { + if (!map[ext[0]]) { + map[ext[0]] = { [ext[1]]: true }; + } else { + map[ext[0]][ext[1]] = true; + } + } + return map; +} + function getLinks(config) { const linksFrom = {}; const linksTo = {}; @@ -84,6 +96,7 @@ function buildNodeDef(config, nodeName, defs, source = "workflow") { [GROUP_SLOTS]: slots, }; const links = getLinks(config); + const externalOutputs = getOutputs(config); const seenInputs = {}; const seenOutputs = {}; @@ -180,7 +193,7 @@ function buildNodeDef(config, nodeName, defs, source = "workflow") { // Add outputs for (let outputId = 0; outputId < def.output.length; outputId++) { - if (linksFrom?.[outputId]) { + if (linksFrom?.[outputId] && !externalOutputs[nodeId]?.[outputId]) { continue; } @@ -247,6 +260,33 @@ class ConvertToGroupAction { link.push(type); } + // Check for external links to add extra outputs + const selectedIds = Object.keys(app.canvas.selected_nodes); + for (let i = 0; i < selectedIds.length; i++) { + const id = selectedIds[i]; + const node = app.graph.getNodeById(id); + if (!node.outputs?.length) continue; + for (let slot = 0; slot < node.outputs.length; slot++) { + let hasExternal = false; + const output = node.outputs[slot]; + if (!output.links?.length) continue; + for (const l of output.links) { + const link = app.graph.links[l]; + if (!link) continue; + + if (!app.canvas.selected_nodes[link.target_id]) { + hasExternal = true; + break; + } + } + if (hasExternal) { + if (!config.external) config.external = []; + config.external.push([i, slot]); + break; + } + } + } + const def = buildNodeDef(config, name, globalDefs); await app.registerNodeDef("workflow/" + name, def); return { config, def };