From 7ca8b4ddf476644847f84d4690a69a81dd2bba41 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 10 Nov 2022 17:36:58 +0100 Subject: [PATCH] OP-4361 - addd support for multiple composition in AE There cannot be multiple Render items for same composition in Render Queue. There cannot be multiple output modules for same Render item. --- openpype/hosts/aftereffects/api/extension.zxp | Bin 100943 -> 101272 bytes .../aftereffects/api/extension/js/main.js | 4 +- .../api/extension/jsx/hostscript.jsx | 96 +++++++++++++----- openpype/hosts/aftereffects/api/ws_stub.py | 10 +- .../plugins/publish/collect_render.py | 15 ++- .../plugins/publish/extract_local_render.py | 12 ++- 6 files changed, 93 insertions(+), 44 deletions(-) diff --git a/openpype/hosts/aftereffects/api/extension.zxp b/openpype/hosts/aftereffects/api/extension.zxp index 217d06098f856d8daa2e50f4dcdb56149fe71b52..e7b3bcac8ae26be2d55a122a77701e43e265fa06 100644 GIT binary patch delta 10790 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 F{|{^Kuk`=` diff --git a/openpype/hosts/aftereffects/api/extension/js/main.js b/openpype/hosts/aftereffects/api/extension/js/main.js index 2105ea82dc..bb0f3b1f0c 100644 --- a/openpype/hosts/aftereffects/api/extension/js/main.js +++ b/openpype/hosts/aftereffects/api/extension/js/main.js @@ -237,7 +237,7 @@ function main(websocket_url){ RPC.addRoute('AfterEffects.get_render_info', function (data) { log.warn('Server called client route "get_render_info":', data); - return runEvalScript("getRenderInfo()") + return runEvalScript("getRenderInfo(" + data.comp_id +")") .then(function(result){ log.warn("get_render_info: " + result); return result; @@ -289,7 +289,7 @@ function main(websocket_url){ RPC.addRoute('AfterEffects.render', function (data) { log.warn('Server called client route "render":', data); var escapedPath = EscapeStringForJSX(data.folder_url); - return runEvalScript("render('" + escapedPath +"')") + return runEvalScript("render('" + escapedPath +"', " + data.comp_id + ")") .then(function(result){ log.warn("render: " + result); return result; diff --git a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx index 91df433908..c72b423af8 100644 --- a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx +++ b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx @@ -395,25 +395,52 @@ function saveAs(path){ app.project.save(fp = new File(path)); } -function getRenderInfo(){ +function getRenderInfo(comp_id){ /*** Get info from render queue. Currently pulls only file name to parse extension and if it is sequence in Python **/ - try{ - var render_item = app.project.renderQueue.item(1); - if (render_item.status == RQItemStatus.DONE){ - render_item.duplicate(); // create new, cannot change status if DONE - render_item.remove(); // remove existing to limit duplications - render_item = app.project.renderQueue.item(1); - } + var item = app.project.itemByID(comp_id); + if (!item){ + return _prepareError("Composition with '" + comp_id + "' wasn't found! Recreate publishable instance(s)") + } - render_item.render = true; // always set render queue to render - var item = render_item.outputModule(1); + var comp_name = item.name; + try{ + var comp_id_count = 0; + for (i = 1; i <= app.project.renderQueue.numItems; ++i){ + var render_item = app.project.renderQueue.item(i); + if (render_item.comp.id != comp_id){ + continue; + } + comp_id_count += 1; + + if (render_item.status == RQItemStatus.DONE){ + var new_item = render_item.duplicate(); // create new, cannot change status if DONE + render_item.remove(); // remove existing to limit duplications + render_item = new_item; + } + + render_item.render = true; // always set render queue to render + var item = render_item.outputModule(1); + } } catch (error) { return _prepareError("There is no render queue, create one"); } + + if (comp_id_count > 1){ + return _prepareError("There cannot be more items in Render Queue for '" + comp_name + "'!") + } + + if (comp_id_count == 0){ + return _prepareError("There is no item in Render Queue for '" + comp_name + "'! Add composition to Render Queue.") + } + + if (render_item.numOutputModules !=1){ + return _prepareError("There must be just 1 Output Module in Render Queue for '" + comp_name + "'! Keep only correct one.") + } + var file_url = item.file.toString(); return JSON.stringify({ @@ -689,30 +716,42 @@ function isFileSequence (item){ return false; } -function render(target_folder){ +function render(target_folder, comp_id){ var out_dir = new Folder(target_folder); var out_dir = out_dir.fsName; for (i = 1; i <= app.project.renderQueue.numItems; ++i){ var render_item = app.project.renderQueue.item(i); - var om1 = app.project.renderQueue.item(i).outputModule(1); - var file_name = File.decode( om1.file.name ).replace('℗', ''); // Name contains special character, space? + var composition = render_item.comp; + if (composition.id == comp_id){ + if (render_item.status == RQItemStatus.DONE){ + var new_item = render_item.duplicate(); + render_item.remove(); + render_item = new_item; + } + + render_item.render = true; + + var om1 = app.project.renderQueue.item(i).outputModule(1); + var file_name = File.decode( om1.file.name ).replace('℗', ''); // Name contains special character, space? + + var omItem1_settable_str = app.project.renderQueue.item(i).outputModule(1).getSettings( GetSettingsFormat.STRING_SETTABLE ); + + var targetFolder = new Folder(target_folder); + if (!targetFolder.exists) { + targetFolder.create(); + } + + om1.file = new File(targetFolder.fsName + '/' + file_name); + }else{ + if (render_item.status != RQItemStatus.DONE){ + render_item.render = false; + } + } - var omItem1_settable_str = app.project.renderQueue.item(i).outputModule(1).getSettings( GetSettingsFormat.STRING_SETTABLE ); - - if (render_item.status == RQItemStatus.DONE){ - render_item.duplicate(); - render_item.remove(); - continue; - } - - var targetFolder = new Folder(target_folder); - if (!targetFolder.exists) { - targetFolder.create(); - } - - om1.file = new File(targetFolder.fsName + '/' + file_name); } + app.beginSuppressDialogs(); app.project.renderQueue.render(); + app.endSuppressDialogs(false); } function close(){ @@ -730,3 +769,6 @@ function _prepareSingleValue(value){ function _prepareError(error_msg){ return JSON.stringify({"error": error_msg}) } + +// render("c:/projects/test", 2); +getRenderInfo(1); \ No newline at end of file diff --git a/openpype/hosts/aftereffects/api/ws_stub.py b/openpype/hosts/aftereffects/api/ws_stub.py index 8719a8f46e..32125a7d99 100644 --- a/openpype/hosts/aftereffects/api/ws_stub.py +++ b/openpype/hosts/aftereffects/api/ws_stub.py @@ -418,14 +418,15 @@ class AfterEffectsServerStub(): return self._handle_return(res) - def get_render_info(self): + def get_render_info(self, comp_id): """ Get render queue info for render purposes Returns: (AEItem): with 'file_name' field """ res = self.websocketserver.call(self.client.call - ('AfterEffects.get_render_info')) + ('AfterEffects.get_render_info', + comp_id=comp_id)) records = self._to_records(self._handle_return(res)) if records: @@ -522,7 +523,7 @@ class AfterEffectsServerStub(): if records: return records.pop() - def render(self, folder_url): + def render(self, folder_url, comp_id): """ Render all renderqueueitem to 'folder_url' Args: @@ -531,7 +532,8 @@ class AfterEffectsServerStub(): """ res = self.websocketserver.call(self.client.call ('AfterEffects.render', - folder_url=folder_url)) + folder_url=folder_url, + comp_id=comp_id)) return self._handle_return(res) def get_extension_version(self): diff --git a/openpype/hosts/aftereffects/plugins/publish/collect_render.py b/openpype/hosts/aftereffects/plugins/publish/collect_render.py index d444ead6dc..2b37c1f101 100644 --- a/openpype/hosts/aftereffects/plugins/publish/collect_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/collect_render.py @@ -64,14 +64,13 @@ class CollectAERender(publish.AbstractCollectRender): if family not in ["render", "renderLocal"]: # legacy continue - item_id = inst.data["members"][0] + comp_id = int(inst.data["members"][0]) - work_area_info = CollectAERender.get_stub().get_work_area( - int(item_id)) + work_area_info = CollectAERender.get_stub().get_work_area(comp_id) if not work_area_info: self.log.warning("Orphaned instance, deleting metadata") - inst_id = inst.get("instance_id") or item_id + inst_id = inst.get("instance_id") or str(comp_id) CollectAERender.get_stub().remove_instance(inst_id) continue @@ -84,7 +83,7 @@ class CollectAERender(publish.AbstractCollectRender): task_name = inst.data.get("task") # legacy - render_q = CollectAERender.get_stub().get_render_info() + render_q = CollectAERender.get_stub().get_render_info(comp_id) if not render_q: raise ValueError("No file extension set in Render Queue") @@ -118,13 +117,13 @@ class CollectAERender(publish.AbstractCollectRender): file_name=render_q.file_name ) - comp = compositions_by_id.get(int(item_id)) + comp = compositions_by_id.get(comp_id) if not comp: raise ValueError("There is no composition for item {}". - format(item_id)) + format(comp_id)) instance.outputDir = self._get_output_dir(instance) instance.comp_name = comp.name - instance.comp_id = item_id + instance.comp_id = comp_id is_local = "renderLocal" in inst.data["family"] # legacy if inst.data.get("creator_attributes"): diff --git a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py index dc65cee61d..f2ae91c341 100644 --- a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py @@ -24,22 +24,28 @@ class ExtractLocalRender(publish.Extractor): self.log.info("staging_dir::{}".format(staging_dir)) # pull file name from Render Queue Output module - render_q = stub.get_render_info() - stub.render(staging_dir) + comp_id = instance.data['comp_id'] + render_q = stub.get_render_info(comp_id) # re queue render item if not render_q: raise ValueError("No file extension set in Render Queue") + + stub.render(staging_dir, comp_id) + _, ext = os.path.splitext(os.path.basename(render_q.file_name)) ext = ext[1:] first_file_path = None files = [] - self.log.info("files::{}".format(os.listdir(staging_dir))) for file_name in os.listdir(staging_dir): files.append(file_name) if first_file_path is None: first_file_path = os.path.join(staging_dir, file_name) + self.log.debug("files::{}".format(os.listdir(staging_dir))) + if not files: + raise ValueError("Nothing rendered!") + resulting_files = files if len(files) == 1: resulting_files = files[0]