diff --git a/javascript/plugins/sd-ppp_PS.ccx b/javascript/plugins/sd-ppp_PS.ccx index d1faed6..441d179 100644 Binary files a/javascript/plugins/sd-ppp_PS.ccx and b/javascript/plugins/sd-ppp_PS.ccx differ diff --git a/javascript/sdppp-comfy.js b/javascript/sdppp-comfy.js index 9315d7d..d9c9f44 100644 --- a/javascript/sdppp-comfy.js +++ b/javascript/sdppp-comfy.js @@ -12,7 +12,7 @@ transports: ["websocket"], path: '/sd-ppp/', query: { - api_level: 2, + api_level: 407, type: 'comfyui' } }); diff --git a/javascript/sdppp-sd.js b/javascript/sdppp-sd.js index f8bf377..a0a5031 100644 --- a/javascript/sdppp-sd.js +++ b/javascript/sdppp-sd.js @@ -136,7 +136,7 @@ transports: ["websocket"], path: '/sd-ppp/', query: { - api_level: 2, + api_level: 407, type: 'sd' } }); @@ -151,14 +151,12 @@ const tab = document.getElementById('tabs').querySelector('button.selected'); const activeTabIndex = Array.prototype.indexOf.call(tab.parentElement.children, tab) - const actions = [] for (let getWidgetRef of insertedGetWidgets) { const widget = getWidgetRef.deref(); if (widget && widget.isReady()) { - actions.push(widget.action()); + await widget.action() } } - if (actions.length) await Promise.all(actions) let skipButton = null; if (activeTabIndex == 0) { diff --git a/javascript/sdppp-util.js b/javascript/sdppp-util.js index c9fbd6a..99d6d5a 100644 --- a/javascript/sdppp-util.js +++ b/javascript/sdppp-util.js @@ -11,8 +11,7 @@ return -1; } const split = name.split('(id:') - id = parseInt(split.pop().trim().slice(0, -1)) - return id; + return parseInt(split.pop().trim().slice(0, -1)); } static getLayerID(name) { if (name == this.SPECIAL_LAYER_USE_CANVAS) @@ -24,8 +23,7 @@ if (name == this.SPECIAL_LAYER_SAME_AS_LAYER) return -3; const split = name.split('(id:') - id = parseInt(split.pop().trim().slice(0, -1)) - return id; + return parseInt(split.pop().trim().slice(0, -1)); } diff --git a/photoshop/dist/index.js b/photoshop/dist/index.js index 30f218e..da6d1b8 100644 --- a/photoshop/dist/index.js +++ b/photoshop/dist/index.js @@ -374,7 +374,7 @@ class ComfyConnection { transports: ["websocket"], path: '/sd-ppp/', query: { - api_level: 2, + api_level: 407, type: 'photoshop' } }); @@ -411,7 +411,7 @@ class ComfyConnection { } catch (e) { console.error(e); callback({ - error: e.message + error: e.message || e }); } }); @@ -424,7 +424,7 @@ class ComfyConnection { } catch (e) { console.error(e); callback({ - error: e.message + error: e.message || e }); } }); @@ -436,7 +436,7 @@ class ComfyConnection { } catch (e) { console.error(e); callback({ - error: e.message + error: e.message || e }); } }); @@ -543,7 +543,7 @@ async function findLayer(document, layerID) { layer.visible = true; visibleOriginal = false; } - const dupLayer = await layer.duplicate(); + const dupLayer = await layer.duplicate(document); const mergedLayer = await dupLayer.merge(); layerIsFolder = true; if (!visibleOriginal) layer.visible = false; @@ -552,7 +552,8 @@ async function findLayer(document, layerID) { // ps returns trimmed data so need padding function padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, desireBounds) { - if (pixelDataFromAPI.length == desireBounds.width * desireBounds.height * 4) { + if (pixelDataFromAPI.length == desireBounds.width * desireBounds.height * 4 || pixelDataFromAPI.length == desireBounds.width * desireBounds.height * 3 // for layer that does not has alpha. + ) { return pixelDataFromAPI; } let pixelDataForReturn = new Uint8Array(desireBounds.width * desireBounds.height * 4); @@ -652,27 +653,13 @@ async function getImage(serverURL, params) { let layerOpacity = 100; const layerID = _util_js__WEBPACK_IMPORTED_MODULE_1__.SpeicialIDManager.getLayerID(layerIdentify); const startTime = Date.now(); - await (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.executeAsModalUntilSuccess)(async executionContext => { + await photoshop__WEBPACK_IMPORTED_MODULE_0__.core.executeAsModal(async executionContext => { let hostControl; let suspensionID; let layer; let isFolder = false; const activeLayers = document.activeLayers; - try { - hostControl = executionContext.hostControl; - suspensionID = await hostControl.suspendHistory({ - "documentID": document.id, - "name": "Image To ComfyUI" - }); - [layer, isFolder] = await findLayer(document, layerID); - layerOpacity = layer?.opacity ?? 100; - const pixelDataFromAPI = await getPixelsData(document, layer, desireBounds); - pixelDataForReturn = padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, desireBounds); - console.log('getPixels', Date.now() - startTime, 'ms'); - } catch (e) { - console.error(e); - throw e; - } finally { + function finalize() { if (layer && isFolder) { layer.selected = false; layer.delete(); @@ -686,6 +673,23 @@ async function getImage(serverURL, params) { } if (hostControl && suspensionID) hostControl.resumeHistory(suspensionID); } + try { + hostControl = executionContext.hostControl; + suspensionID = await hostControl.suspendHistory({ + "documentID": document.id, + "name": "Image To ComfyUI" + }); + [layer, isFolder] = await findLayer(document, layerID); + layerOpacity = layer?.opacity ?? 100; + const pixelDataFromAPI = await getPixelsData(document, layer, desireBounds); + pixelDataForReturn = padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, desireBounds); + console.log('getPixels', Date.now() - startTime, 'ms'); + finalize(); + } catch (e) { + finalize(); + console.error(e); + throw e; + } }, { commandName: "get content of layer " + layerIdentify }); @@ -5293,6 +5297,8 @@ class Model { constructor() { if (Model.instance) throw new Error('Model already inited'); Model.instance = this; + + // historyState change listening setInterval(() => { const historyStates = photoshop__WEBPACK_IMPORTED_MODULE_0__.app.activeDocument?.historyStates; if (historyStates && historyStates.length > 0) { diff --git a/photoshop/src/system/ComfyConnection.js b/photoshop/src/system/ComfyConnection.js index 88d7dd1..027c79b 100644 --- a/photoshop/src/system/ComfyConnection.js +++ b/photoshop/src/system/ComfyConnection.js @@ -81,7 +81,7 @@ class ComfyConnection { transports: ["websocket"], path: '/sd-ppp/', query: { - api_level: 2, + api_level: 407, type: 'photoshop' } }); @@ -115,20 +115,20 @@ class ComfyConnection { const result = await getImage(this.backendURL, Object.assign(data, { isComfy: this.serverType == "comfy" })) console.log('get_image cost', Date.now() - startTime, 'ms'); callback(result) - } catch (e) { console.error(e); callback({ error: e.message }) } + } catch (e) { console.error(e); callback({ error: e.message || e }) } }) socket.on('s_send_images', async (data, callback) => { try { const result = await sendImages(this.backendURL, Object.assign(data, { isComfy: this.serverType == "comfy" })) callback(result) - } catch (e) { console.error(e); callback({ error: e.message }) } + } catch (e) { console.error(e); callback({ error: e.message || e }) } }) socket.on('s_get_active_history_state_id', async (data, callback) => { try { callback({ history_state_id: Model.instance.historyStateId }) - } catch (e) { console.error(e); callback({ error: e.message }) } + } catch (e) { console.error(e); callback({ error: e.message || e }) } }) socket.on('s_confirm', (data) => { this.serverType = data.server_type diff --git a/photoshop/src/system/events/get_image.js b/photoshop/src/system/events/get_image.js index d43a476..e6c4863 100644 --- a/photoshop/src/system/events/get_image.js +++ b/photoshop/src/system/events/get_image.js @@ -1,4 +1,4 @@ -import { app, imaging } from "photoshop"; +import { app, imaging, core } from "photoshop"; import { SpeicialIDManager, executeAsModalUntilSuccess, findInAllSubLayer, unTrimImageData } from '../util.js'; import Jimp from "../library/jimp.min"; @@ -20,7 +20,7 @@ async function findLayer(document, layerID) { layer.visible = true; visibleOriginal = false; } - const dupLayer = await layer.duplicate(); + const dupLayer = await layer.duplicate(document); const mergedLayer = await dupLayer.merge() layerIsFolder = true; if (!visibleOriginal) layer.visible = false @@ -29,7 +29,10 @@ async function findLayer(document, layerID) { // ps returns trimmed data so need padding function padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, desireBounds) { - if (pixelDataFromAPI.length == desireBounds.width * desireBounds.height * 4) { + if ( + pixelDataFromAPI.length == desireBounds.width * desireBounds.height * 4 || + pixelDataFromAPI.length == desireBounds.width * desireBounds.height * 3 // for layer that does not has alpha. + ) { return pixelDataFromAPI; } let pixelDataForReturn = new Uint8Array(desireBounds.width * desireBounds.height * 4); @@ -37,7 +40,7 @@ function padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, de left: 0, top: 0, right: document.width, - bottom: document.height, + bottom: document.height, } if (layer) bounds = layer.bounds; unTrimImageData( @@ -145,28 +148,13 @@ export default async function getImage(serverURL, params) { const layerID = SpeicialIDManager.getLayerID(layerIdentify); const startTime = Date.now(); - await executeAsModalUntilSuccess(async (executionContext) => { + await core.executeAsModal(async (executionContext) => { let hostControl; let suspensionID; let layer; let isFolder = false; const activeLayers = document.activeLayers; - try { - hostControl = executionContext.hostControl; - suspensionID = await hostControl.suspendHistory({ - "documentID": document.id, - "name": "Image To ComfyUI" - }); - [layer, isFolder] = await findLayer(document, layerID); - layerOpacity = layer?.opacity ?? 100; - const pixelDataFromAPI = await getPixelsData(document, layer, desireBounds) - pixelDataForReturn = padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, desireBounds) - console.log('getPixels', Date.now() - startTime, 'ms'); - } catch (e) { - console.error(e); - throw e - - } finally { + function finalize() { if (layer && isFolder) { layer.selected = false; layer.delete(); @@ -180,6 +168,27 @@ export default async function getImage(serverURL, params) { } if (hostControl && suspensionID) hostControl.resumeHistory(suspensionID); } + try { + hostControl = executionContext.hostControl; + suspensionID = await hostControl.suspendHistory({ + "documentID": document.id, + "name": "Image To ComfyUI" + }); + [layer, isFolder] = await findLayer(document, layerID); + layerOpacity = layer?.opacity ?? 100; + const pixelDataFromAPI = await getPixelsData(document, layer, desireBounds) + pixelDataForReturn = padAndTrimLayerDataToDesireBounds(document, layer, pixelDataFromAPI, desireBounds) + console.log('getPixels', Date.now() - startTime, 'ms'); + + finalize(); + + } catch (e) { + finalize(); + + console.error(e); + throw e + + } }, { commandName: "get content of layer " + layerIdentify }) diff --git a/photoshop/src/system/model.js b/photoshop/src/system/model.js index 415f7e8..a2156ca 100644 --- a/photoshop/src/system/model.js +++ b/photoshop/src/system/model.js @@ -24,7 +24,8 @@ export default class Model { constructor() { if (Model.instance) throw new Error('Model already inited') Model.instance = this; - + + // historyState change listening setInterval(() => { const historyStates = app.activeDocument?.historyStates; if (historyStates && historyStates.length > 0) { diff --git a/sdppp_python/apis.py b/sdppp_python/apis.py index 88a29fc..0a58d1c 100644 --- a/sdppp_python/apis.py +++ b/sdppp_python/apis.py @@ -158,6 +158,11 @@ def registerSocketEvents(sdppp, sio): @sio.event async def c_progress(sid, data): + instance = sdppp.page_instances[sid] + instance["progress"] = data["progress"] + if instance["progress"] == 100: + instance["progress"] = 0 + instance = sdppp.get_ps_instance() if instance is None: return diff --git a/sdppp_python/sdppp.py b/sdppp_python/sdppp.py index 8195a5d..442af9c 100644 --- a/sdppp_python/sdppp.py +++ b/sdppp_python/sdppp.py @@ -37,7 +37,7 @@ class SDPPP: qs = environ['QUERY_STRING'] qsobj = dict(x.split('=') for x in qs.split('&')) - if 'api_level' not in qsobj or qsobj['api_level'] != "2": + if 'api_level' not in qsobj or qsobj['api_level'] != "407": raise socketio.exceptions.ConnectionRefusedError('version mismatch, please reinstall PS plugin') if 'type' not in qsobj: raise socketio.exceptions.ConnectionRefusedError('instance type not recognized') @@ -51,14 +51,16 @@ class SDPPP: self.page_instances[sid] = { "sid": sid, "type": "comfy", - "name": "" + "name": "", + "progress": 0 } elif qsobj['type'] == 'sd': self.page_instances[sid] = { "sid": sid, "type": "sd", - "name": "" + "name": "", + "progress": 0 } else: