From eda9676347d989aa358eeeb9deb42ff8249662af Mon Sep 17 00:00:00 2001 From: zombieyang Date: Sat, 5 Apr 2025 16:38:08 +0800 Subject: [PATCH] send text to layer --- sdppp_python/comfy/nodes.py | 49 +++++++++++--- sdppp_python/protocols/photoshop.py | 13 ++++ typescripts/src/common/zh-cn.mts | 2 + .../src/sdsystem/comfy/comfy-nodes/nodes.mts | 64 +++---------------- .../sdsystem/comfy/litegraph/fe-widgets.mts | 1 + .../sdsystem/comfy/litegraph/node-wrapper.mts | 3 +- 6 files changed, 66 insertions(+), 66 deletions(-) diff --git a/sdppp_python/comfy/nodes.py b/sdppp_python/comfy/nodes.py index a8857db..1bb9c93 100644 --- a/sdppp_python/comfy/nodes.py +++ b/sdppp_python/comfy/nodes.py @@ -435,6 +435,44 @@ def define_comfyui_nodes(sdpppServer): return (output_mask, ) + class SendTextToLayerNode: + RETURN_TYPES = ("DOCUMENT",) + FUNCTION = "action" + CATEGORY = "SD-PPP" + + @classmethod + def IS_CHANGED(self, **kwargs): + return np.random.rand() + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "text": ('STRING', {"sdppp_type": "STRING"}), + "layer": ('LAYER', {"default": None, "sdppp_type": "LAYER"}), + }, + "optional": SDPPPOptional({}, { + "sdppp": ("STRING", {"default": ""}) + }), + "hidden": { + "unique_id": "UNIQUE_ID", + "prompt": "PROMPT", + } + } + + def action(self, text, layer, **kwargs): + sdpppServer.has_ps_instance(throw_error=True) + + document = layer['document'] + + call_async_func_in_server_thread(ProtocolPhotoshop.send_text( + instance_id=document['instance_id'], + document_identify=document['identify'], + text=text, + layer_identify=layer['layer_identify'], + ), True) + + return (document, ) class GetTextFromLayerNode: RETURN_TYPES = ("STRING",) @@ -469,15 +507,7 @@ def define_comfyui_nodes(sdpppServer): def action(self, layer_or_group, unique_id, prompt, document = None, **kwargs): sdpppServer.has_ps_instance(throw_error=True) - linked_style = check_linked_in_prompt(prompt, unique_id, 'layer_or_group') - if not linked_style: - document = json.loads(document) - else: - document = layer_or_group[0]['document'] - - # dont check here, some python cannot read the data in this thread. - # if document['instance_id'] not in sdpppServer.ppp_instances: - # raise ValueError(f'Photoshop instance {document["instance_id"]} not found') + document = json.loads(document) res_text = [] for i, item_layer in enumerate(layer_or_group): @@ -517,6 +547,7 @@ def define_comfyui_nodes(sdpppServer): 'SDPPP Get Linked Layers': GetLinkedLayersNode, 'SDPPP Get Layers In Group': GetLayersInGroupNode, 'SDPPP Get Text From Layer': GetTextFromLayerNode, + 'SDPPP Send Text To Layer': SendTextToLayerNode, 'SDPPP Get Selection': GetSelectionNode, 'SDPPP Parse Layer Info': ParseLayerInfoNode, # 'SDPPP Settings': SDPPPSettingsNode, diff --git a/sdppp_python/protocols/photoshop.py b/sdppp_python/protocols/photoshop.py index 738d0f3..eb1ef67 100644 --- a/sdppp_python/protocols/photoshop.py +++ b/sdppp_python/protocols/photoshop.py @@ -57,6 +57,19 @@ class ProtocolPhotoshop: }) return result['text'] + @classmethod + async def send_text(cls, instance_id, document_identify, text, layer_identify): + ppp_instance = cls.sdpppServer.ppp_instances[instance_id] + result = await protocol_call(ppp_instance, 'B_photoshop', data={ + 'action': 'sendText', + 'params': { + 'document_identify': document_identify, + 'text': text, + 'layer_identify': layer_identify + } + }) + return result + @classmethod async def get_selection(cls, instance_id, document_identify, boundary): ppp_instance = cls.sdpppServer.ppp_instances[instance_id] diff --git a/typescripts/src/common/zh-cn.mts b/typescripts/src/common/zh-cn.mts index e028f31..0afb048 100644 --- a/typescripts/src/common/zh-cn.mts +++ b/typescripts/src/common/zh-cn.mts @@ -37,6 +37,7 @@ export default { 'SDPPP Get Selection': 'SDPPP获取选区(GetSelection)', 'SDPPP Get Image From Photoshop': 'SDPPP从PS获取图像(GetImageFromPhotoshop)', 'SDPPP Send Images To Photoshop': 'SDPPP发送图像到PS(SendImagesToPhotoshop)', + 'SDPPP Send Text To Layer': 'SDPPP发送文本到图层(SendTextToLayer)', 'SDPPP Settings': 'SDPPP设置/杂项(Settings/Misc)', // comfy widget/input @@ -170,6 +171,7 @@ export default { 'get layer info': '获取图层信息', 'sdppp extract PSD': 'sdppp 导入 PSD', 'sdppp get PSD': 'sdppp 获取 PSD', + 'set text to layer': '设置图层的文本', // photoshop dialog/widget '{0} wants to extract a PSD file to Photoshop, are you sure?': '{0} 想要释放一个.psd文件到Photoshop,确定吗?', diff --git a/typescripts/src/sdsystem/comfy/comfy-nodes/nodes.mts b/typescripts/src/sdsystem/comfy/comfy-nodes/nodes.mts index 5fdef7e..a8a7a71 100644 --- a/typescripts/src/sdsystem/comfy/comfy-nodes/nodes.mts +++ b/typescripts/src/sdsystem/comfy/comfy-nodes/nodes.mts @@ -51,6 +51,14 @@ export class GetLinkedLayersNode extends SDPPPNodeWithInput implements NodeWithL this.node.outputs.forEach((i: any) => i.label = i18n(i.name)); } } + +export class SendTextToLayerNode extends SDPPPDownloadableNode { + protected async update() { + super.update(); + this.node.inputs[0].label = i18n(this.node.inputs[0].name) + this.node.outputs[0].label = i18n(this.node.outputs[0].name) + } +} export class GetTextFromLayerNode extends SDPPPDownloadableNode { static prehandleNodeType(nodeData: any) { if (nodeData.input.optional['document']) { @@ -91,62 +99,6 @@ export class GetTextFromLayerNode extends SDPPPDownloadableNode { } } -// export class SDPPPSettingsNode extends SDPPPNodeWithInput { -// async update() { -// super.update(); -// this.node.inputs[0].label = i18n(this.node.inputs[0].name) -// if (this.node.properties.psd) { -// pageStore.setHasPSDNodes(true) -// this.psdWidget.label = i18n('extract saved .psd to Photoshop') - -// } else { -// pageStore.setHasPSDNodes(false) -// this.psdWidget.label = i18n('save .psd to this workflow') -// } -// } - -// protected onDestroy(): void { -// pageStore.setHasPSDNodes(false) -// } - -// protected psdWidget: any -// constructor(node: any) { -// const existed = app.graph.nodes.filter((n: any) => n.comfyClass == 'SDPPP Settings') -// if (existed.length > 1) { -// alert(i18n('You can only have one SDPPP Settings node in a workflow')) -// app.graph.remove(node) -// throw new Error(i18n('You can only have one SDPPP Settings node in a workflow')) -// } -// super(node); -// this.psdWidget = node.addWidget('button', '', '', () => { -// const backendDatas = pagePhotoshopStoreMap.getAllPhotoshopDocumentData(); -// const [instanceName, documentIdentify] = this.documentWidget.widget.value.split('/'); -// if (this.node.properties.psd) { -// this.extractPSD(backendDatas[instanceName].sid, documentIdentify) - -// } else { -// ComfySocket.instance -// .importPSDDataURLFromPhotoshop(backendDatas[instanceName].sid, documentIdentify) -// .then(psdBase64 => { -// this.node.setProperty('psd', psdBase64); -// }); -// } -// }, {}) -// } - -// public extractPSD(sid: string, documentIdentify: string) { -// if (this.node.properties.psd) { -// ComfySocket.instance -// .exportPSDDataURLToPhotoshop(sid, documentIdentify, this.node.properties['psd']) -// .then(async () => { -// await new Promise(resolve => setTimeout(resolve, 300)); -// (globalThis as any).app.canvas.draw(true, true) -// }) -// .catch(console.error); -// } -// } -// } - export class GetDocumentNode extends SDPPPNodeWithInput implements NodeWithDocumentOutput { get documentWidget() { return this.widgets[0] as DocumentWidget; diff --git a/typescripts/src/sdsystem/comfy/litegraph/fe-widgets.mts b/typescripts/src/sdsystem/comfy/litegraph/fe-widgets.mts index 5d603ef..91f9d47 100644 --- a/typescripts/src/sdsystem/comfy/litegraph/fe-widgets.mts +++ b/typescripts/src/sdsystem/comfy/litegraph/fe-widgets.mts @@ -58,6 +58,7 @@ export class DocumentWidget extends SDPPPComboWidget { const documentWidget = node.addWidget('combo', name, options[0] || '', () => { }, { forceInput: true, values: makeDocumentDataOptions }) documentWidget.serializeValue = async () => { const data = parseDocumentOption(documentWidget.value); + console.log('documentWidgetData: ', data); if (!data) return ''; return JSON.stringify({ instance_id: data.instance_id, diff --git a/typescripts/src/sdsystem/comfy/litegraph/node-wrapper.mts b/typescripts/src/sdsystem/comfy/litegraph/node-wrapper.mts index ae16367..5b8640c 100644 --- a/typescripts/src/sdsystem/comfy/litegraph/node-wrapper.mts +++ b/typescripts/src/sdsystem/comfy/litegraph/node-wrapper.mts @@ -1,6 +1,6 @@ import i18n from "../../../common/i18n.mjs"; import { GetImageFromLayerNode, SendImageToLayerNode } from "../comfy-nodes/legacy-nodes.mjs"; -import { GetDocumentNode, GetLayerNode, GetLayersInGroupNode, GetLinkedLayersNode, GetSelectionNode, GetTextFromLayerNode, ParseLayerInfoNode } from "../comfy-nodes/nodes.mjs"; +import { GetDocumentNode, GetLayerNode, GetLayersInGroupNode, GetLinkedLayersNode, GetSelectionNode, GetTextFromLayerNode, ParseLayerInfoNode, SendTextToLayerNode } from "../comfy-nodes/nodes.mjs"; import { SDPPPNode } from "../comfy-nodes/SDPPPNode.mjs"; import { SDPPPNodeWithInput } from "../comfy-nodes/SDPPPNodeWithInput.mjs"; declare const comfyAPI: any; @@ -8,6 +8,7 @@ declare const comfyAPI: any; const SDPPPNodeList = { 'Get Image From Photoshop Layer': GetImageFromLayerNode, 'Send Images To Photoshop': SendImageToLayerNode, + 'SDPPP Send Text To Layer': SendTextToLayerNode, 'SDPPP Get Text From Layer': GetTextFromLayerNode, 'SDPPP Parse Layer Info': ParseLayerInfoNode, 'SDPPP Get Linked Layers': GetLinkedLayersNode,