From 7ca8b4ddf476644847f84d4690a69a81dd2bba41 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 10 Nov 2022 17:36:58 +0100 Subject: [PATCH 01/12] 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] From d0f8233b8bedf5a3742d35a090f58ec99c2825a2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 10 Nov 2022 17:40:33 +0100 Subject: [PATCH 02/12] OP-4361 - updated documentation --- website/docs/artist_hosts_aftereffects.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/website/docs/artist_hosts_aftereffects.md b/website/docs/artist_hosts_aftereffects.md index d235cf44f0..ede2f7e86e 100644 --- a/website/docs/artist_hosts_aftereffects.md +++ b/website/docs/artist_hosts_aftereffects.md @@ -38,8 +38,6 @@ In AfterEffects you'll find the tools in the `OpenPype` extension: You can show the extension panel by going to `Window` > `Extensions` > `OpenPype`. -Because of current rendering limitations, it is expected that only single composition will be marked for publishing! - ### Publish When you are ready to share some work, you will need to publish it. This is done by opening the `Publisher` through the `Publish...` button. @@ -69,7 +67,8 @@ Publisher allows publishing into different context, just click on any instance, #### RenderQueue -AE's Render Queue is required for publishing locally or on a farm. Artist needs to configure expected result format (extension, resolution) in the Render Queue in an Output module. Currently its expected to have only single render item and single output module in the Render Queue. +AE's Render Queue is required for publishing locally or on a farm. Artist needs to configure expected result format (extension, resolution) in the Render Queue in an Output module. +Currently its expected to have only single render item and single output module per composition in the Render Queue. AE might throw some warning windows during publishing locally, so please pay attention to them in a case publishing seems to be stuck in a `Extract Local Render`. From 104fc1fd83af7b5993db2ef59f2eac63a3726e07 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 10 Nov 2022 17:49:35 +0100 Subject: [PATCH 03/12] OP-4361 - removed forgotten debug method call --- openpype/hosts/aftereffects/api/extension.zxp | Bin 101272 -> 101245 bytes .../api/extension/jsx/hostscript.jsx | 3 --- 2 files changed, 3 deletions(-) diff --git a/openpype/hosts/aftereffects/api/extension.zxp b/openpype/hosts/aftereffects/api/extension.zxp index e7b3bcac8ae26be2d55a122a77701e43e265fa06..339560fa387be6b792d2da0da71c879111b40b40 100644 GIT binary patch delta 7977 zcmZvBWl$VpwCpbK?(PsYxVyUq_u#g;Ew)%7Sa5d<=(I$Mx?f!0XN`Tye($#ntD%2K;_5cnf7r4>0Sv->Cwja<2iSKqECdurc_(o4 zz-**<^8FJq6!D!f837kypz*%hrNWp2J!u^N$^563nj$m|4gdf^0Q@`F+QK=^X}|>l zmi1F}%z$2S|F<)h*c`|PQ3$1>!x^EKTg~{nc}{x%axP!p0gMA6ytrhIq>^g!W6I}E zA3D0fP1zh@T>8e-=?zsEYLL{GS3bny+Ok}znhZZ@lsr<6r3%gB)8<~UN*MY7Wf(Eb z(ULti33nh|zp589d%H~%7I{9N-rfOcs1_u>eEw;?Z~IHJ^J!8Z!lQhW)?iFP){P%- z%Yk_T$@%g}`p{4uY(Fdku`3$Aykv;y*`Q=81tLO-6;}Z5-wRy`QuLAAf{$i5< zv=}3686Kijg)&_+BM&o7`u|4Ui%ibu-9=h=!WheBG5igy zDCcj_QYwOZYVa<)^l7M)bcR7Edd5)6=JPwM@LSSui5>2B-5MPBefyhwi)oyLk3BZt9m3K58M8o;*Z5@J`k!vjQ945|dEGHR4+h zIolqMJdhhA=b2(5L`I;nIz6tf^TR0%O`LpTI)1%ERP9l{Jn^kydpoIjVK*axnY0Dn zCFKHR7@)z>(`!Sp!5TGY^BAN9T^O6jde7k_92`)N&UoO_xLfeG__>7lKpb7*_Lsa=v!twN__+ zN@y%=J8saXhsO&C|4E9LoOW4gPt<&D>#PIl0wOl9XI8kV4XS6#J&P&t+(mB|au#)S znIq!z;~Emv>>coP9-Qi^x6SFZD|4USWVyZ8XI{=+a&VHY!dF&%kRs1r@q>jQPND0$ z>aB&a4~$yLkFp`<1f^>s=f-SH_Cay?1`2#UTpC96AI7ozlCZ64Ln}}AhYPYRDvM_| zWV+?jLw|9W(etx}n*sr=W)qV)Cr$TP9w}?!SDyx552pNso(d}KhO}; zYpQ^MxD$VfE~d19?1@t@^j>KS2b&zvT#rN>&AqG3S@kQZ?~|t`$F+B1r4Kbgc7uJ|&$l zaESBEr!5OBw;bJ}n|3!}o{!}ZyQ?0r(kK_W&Y#y%=NIN{5Vu+{Am}v8Am>A*&h7bu z=X~kv-Farb(~+d4L_av84}nBp6bTDE1YVC6hXHS`sHH_)G}u~6%KT|*O5iL(pT_nv z#5<#PCjQn@HHmZo&J&PkXl}d}*kL<##ap+I`%=wVMSRwPQ2f)Ov-s`h2j;C|ZPMt= zy72pIFR8`QzhOL<&o>FWEpiaEO*aeOCW`$(4z7R^-r?k-3U*w^)T7q@B} z)ZgYBT#VyTpS1h=o7Cd?K&j+|Ci8CrcJ+eRzV)kqP``_jlN!*gat!({phnCSd+EJQ6` zUdw--P#wyD$ChxqEzb0Egt>`|Gv6Q77o&i`jbFCPW{$^}R`}*d$v?2ZUbjk+oBNfi z&G9U~Q_Ep=xXWunTkIM#&%1gvP2NE_iH0uTID_k@L(zsG5<1Zd_c9wr&h`X-OX_?4 zh~itGe~yOzF�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 BB$faG delta 8041 zcmZvBWmFwex8%LJ6Fg{;-~_iIfgr&xcyPJ6yEhixor`mk0Kwftu;3D$;O_1cnDD+g z^JdMO)qPg&>QlY@{H(71Hw7sz6)7$hE{(oAd>jmyPM@d)2mQxtZ{XCiUQiJS5AFp` z@VYQxw&|(TUT7!PEc^?F(&oHSK{_?u7mVlE{coJaN$k>n>02wO$NXQK84j_CfwE4g`h%ZH- z5Lg)Fr9hGaXQBOjwXskY9E|!>FzbP55a1atO;Zt!!ESGlKoFDv{V8QRcm#Y92!sN{ z4zp6X9{6KBLI46`>!fBIgWZuRC~f~KQ%Oz0Y(PZtTRQv!T80H^|H?7>@!w;aidJwO z2<5M1=0GaB`gXt9(RLr%7KSg}APOY=|BHOf1 zbq&;fe%Z^pUQNTel|1y{R0HHSk}gAK`(b|-4mpe|RF?|2a~~hs~?cK)B2A@a>RRbEc`~up;Z&yi0nY>z7UW;Ydgd z2>q&NaNaDcYJrj1c+0&7|)1F}D*ufl)IESOwf1qw>@3F27y^YxR3dhV9><&h6JG-F@;@GhE< z=~Td{%=mOdS#QDfTvlk9Iau1iF0_S1Pp*Ur^4bLKbd(~|zLAwt0G~&uuM+8b_pTEa z^N2qC$YHKj?~LUz>-&ssNuj2Cy=GagH&BnX&rWY#dmtbDKCNDNk3LpI{hDDpABfU) z9naW^wfRDT?&hX*Aq4(i3|S&|VHo!CO))^GEairp>Q1V3KT`!iEViA{oYGXn-j>2b zBD?!y31(x7y~PUQEd^WV_XqEyC#iP31q5omuaIR$WL?h< zxP>xt=b*Y=+^rkebfdU->#s%8wuoM1b}vYJ68FCG5N5v*^B5)ieSmYR>Z|;|5{5_w z!N15^&O{d8o#T2iWia3M=Zlfvb-J_uNd3m>vxB2H0j<{P{vj`cYi=kBAPW~1Q2Wh) z4EGx=K6Z<9@rq+#cD1<&IYe%GaHOV*gFlV4^p;`7ocNho2g!Z~Gt7G7bV5=)AQUr6 z@6N_vjfeoK+6s6`4~NauOVb5d8knT$49~m*lExDY7AK zdC6}*+a@35pW(FAQi1~d{$~Gdw0_DDOZBIeZu65`^e{H&2z6@$QSXo7PPbcDXn!hH zMjql6dmM10y$!N#(V+`g5GMnwmXI^m)m0GNXTRby_51e@p^ZxcS>=z_!zsN(kdz~; zSPSY18*S$hG$YqM4c&QX-upN?lK1))ODPg#c=i+%Cu3nVit)@;_IfC zIeK$D{!S90@d|wZJrv)G)chDT-CNTN+L&*+ul@57$791N=cp5yBqCCClZ7nr1K1xN z;~|t=Z}JH+CXxFAL<}>RfS9Z%&=SGghbNr|EIN=*r#rI@O3bCFakY`Fse!s#hw!G-M5<(d?|t@N%9Hik`$0HH?p^7~{+jiM9n( zS}=p_O__ZX1|vNY$Sr*Abc8QaHx37(4LzCU(JJ7ERGv zMapxyv&VFBWAQg^T2Ha*WM6-vQ#}ON>10FC9!C8b#XV$#PCxalJEA;1^xO#zx;%&i z6$?eLiB&QJi!|&TM#T#ExVO`^(0%8tW85fCrE38sp|{60-KB^efO!zag*|UEpm364 zATLtYFhfhtHK;K(fyA-kI65-HX08!;wB&2x@W&RAa5WVDvSGLUeBI1nj)oI6SCX=r zAU2n0O}P90$=V+3Lw)NImRNEorKVY>nbjxF<~%VoU$R?W{=1`CS+Ve$n&uDj3DxF_ z6lVZzMp3U^eyG+I<4D@tpC8;Ia6U__N+{)uF}c!^qwH{n@0{%UCRYGgEr>%{3tPAl zz=#gy(2&1n836_p*VWZohH~kX6;ayfGwha|amLxiW76@g!2x7*Qf3*hEuxC}jPFOk zZeqB*_t}}W0n`XZ#b#0pID`rb3L*TK)m+pI*wn|s6}TX| zRATdMJH(!IKP)-mIxGok5tRRFN+$u=x0LOEW3;~2+dDl_R*QU=XCahCkU4sLInuke zH6M9~P5#4lo`?}zVBwMOUjj~*CeB~a*9 z#N;{M&R%Pv-9N$=6M0Qo*g9*u@wGtYwBoz%T#_&_`U7GBEN#uj%IEx8h_+-&`R!}$ z74*dpp-t2+a$JWkGP};XY0b59iu-#c4kD3QcFA71So+v2JKhZ}YIO?8{2)2vqglp) zLt5KL`s(;o4sXq*_`CST;;LJOAHcRGX0=^9z0uf!bN+;~TamI%3O-v-WA(*cb0t^8 zvt!hca{>w@ZIuBDLCnrPIKE49Jc*M(Y26nE(fsA%ck$7Gi1^J#+KL``E#m`N9CA5w z8D8VCt}T@FQH|32gg&6X2Bqxs>D|}dq+otKCM)n1j_b!@53H3^pK^f}uK+?1FadR# z0-Iwy_{tj>d!=&JV0SN_V|J+>CuVBUDviG(+Oo{^red4SoeeaHhWD;I1An;eCiuPX zVlxxiSQ{S?#fD%#R}m=nzef!juntbKnB`{ZLTKqanyHb0n~A{bZ7ALQ5mweCQ;lg^ zFY%cN`Q~E|v`lYqva_9V0|?DHOT`Vv{COQG}jg?1h}IJP_p=!)ojZo^u1 zMP$gJdlt(E9lAxL{}dF15=Sp<{=MIXxvp$WSPpf$XSoF8Bg8T(0}57jr?0I&^3??$ z2zOXpHQ|pg2M0|rwG5`{>HR~k-Zp*nFNl@ zvr|NC^UX9{wgM|AUdJ&+kTc?n>LK|0Xl2>a5>na&&DC<29WG&eJI0;^c1J zdhyAw!URgKvLxg_gYA4JJKDdae6`!XHr9?mg=X*nk?FcB0;IPv{jrv+?$(Zn{-o{x znTyjFvtYa0q-3|U<1;k+==*w}0$SKpY)DM4@RMd@dZ;C09s5uqnq=r6vu^qKin=W8 zBy_!cL0@6YqIl<+*Y<4y^5FeL>a?NDkx1y9PR#1P{w2}y5u{WUa`^b}vPdE#+zzk- zpL+aQ2m*$sAp8idC$+&A{0^YSUiegepO&3G#Dd4kR4+-fdSmKV=jd3M!OmhDk%ulZ zXZrbPw0^};snV?D4P-5^og`aT>RFDG55~^zU%?*B=6vx#<=H-7!k-RsKxQGBWoag^ z#)+R$dvbSX1b2I`=0H_>U@4p6g?GUG&kx8DWuxdo;wzw$V`{RXm&!jPa)gU-Fenofu zM4O=GwBdja0@xBwk1n9gt=-}e$&=#4n*NJG@Uyp4ud{`eDluA@?u@}b{JX@wLS0v{ zmJT|FcEYS4>A5s!zE<;hfF*&JKi~WZ=EU~MpJNn5PTnarFv#pUQ|FCg#)SLfyd6M^ ztojGhrIEqGM!*wk=j{?btni~;^%Y@V%WnfR7a`G9f~wKthjW0Mz5+|M z>Gs6y{3f^AG>t4%acK$3T%CI&-Bp`=kHC*uI}G)SCcd3L8~ukr1A`YrM|ZgeyObXB|m=l3@(RvY({>IC~vVlIh#0*sMo+bz2ML$A$vq zY~D9FiOQiPr689{7oth8`r?Ou&P#}J~sL{Ac97I=~5cfA=$ zAiLYXSiJgjtqaoPu0;qQts0#>wREZG*Jg(h0cM^gkey9-uU5U33^gT!n1qbRz6QieSz#o7~W5$|fbK%lS1(Ve)uaoJ$?BpdH;X;|)gM(dZ zOd?B^>k0fLZn^^*ofG2Z!o1RT{?M!y587MVm>;q0*tKX7dx}w>DK%8wdlZg}$m+wo zawN-%SNJtg$Olf-a>RTd{wDCbDxLmkK{KdfnuO~DSU=}Q?+0ml zn_fN2yZVY1n;D63Tbdhvt#zGi3T`#3aaYH;$-_I#XM|Fe+A}4uI9?#P>n+Quo*%7l zb@S{jy`vhPI-V;5ot-SofHjn`=`0XB%Ja0*C-^z9!~ttW(#J%yUe;MRs2$T3-QZ`n zQd;s+{&sNZT>|+s)b{bv66vGD5Z~ULAMJiP5aO5T)Eh!?Hi>ep2>lx; z)r5IqCt62(P354MhK&X-(k&>6 z540)wHN6f`S?a+FuPed)yThjXoE^RWg-iGN}{2_1V`Sl4Os^w!CfE2l&7G$5s zt!`%{jyrJE6wO^_tCVop!x#2AP1HJKQB@c=I1hFHxMRParQnnU*IwVx+hzZLrJai3Pk_B`=oj5v z#U=5tXl)ig?)g(}U!qTaE>@5(7JucST#|h_$>b4E`DUhT=>Lmta}5qt|NGWt1(3>y zhJS)hAgmwgw4@{3|K|^q-oSJU?<@TSYo>=JIo>`Ew9M6q*IzIY_!?G;x63o?%0!{W zmi$Id{UuXk3@Lbw#jAT&cN~!tz7;~+*inBxHKoOinI|6RWEzh*IlR>kogA?ut$6Jz z@(N3FJQXXb-auYWE)M=|9CBvmC;{d?T)nuY}I49a2}G)FO207< zTFd+7Z2c-!rE?Q9MyaB%EWY}_hCsXaGP}*%;q zLj&O5#v`@t1rGVzmv`~+?*L|QA(YG_Bc@NTP)Jb7un?|DF=}H>-d1)QFZv%0-0ibk zhT1x;dn4dgisT;P7?+RmcHbjL5scyXFIGWnr<9#dlx)sk{Jz0$&^O)q?Bn$os(J>Srf6@wh&32eBzRm~+A=PBm+$fp)+ zt5;p4{ai2{H=Zug_sHdWj+-R?x5n?+X@wrJecoDbI zICsS}gTIUSk&$Nyk!5GQn>)2zArJ9=k zO!f8z2LLaE|1FwM({|1n#O+(r+d7GJqEP28YtV5loeLIaF^(5)!(=~@^JKWg zU+t_~oWBSQeGud5X6XQw+{G^nW4htEZ4nPDZ`=){8fS_>j78kvQCUGZfL8?vEyXb& zOl7Y+Rq!RpX*sb@`v!8}d_aA==mrQq7*W=4?y&94J{m9to)`A|=d&1No1TH7O)RE! z5{1v07W!6#DJ0*|Rr7x$ZM))4I5Pt_XGZG=8Ws!eT= zk1Xb%G8@k8;~#d-Yq$@hCxEm%6#iNVe&;2+FpQ;WnJ2Zy6+Oa)I!dJ3DphConE*!R zkY)`HEiTyEhQv5sk($zlC+QY0?}3>-{o1zGd(%%)Bow3Nm8($G<`nG!oqFML`x@2b zjGDd(VQwBg^cWPzq{73{3OA3ZqRY@gm7{O&@ND)IM~p3|AK{mei2*GhNA^#W@EwDJ zqDn|1c`VUJ+=Ro|M15>bJjOK0Jr0aGzOc1@<6Ol zrLvARWl+FkGChg8-X8VjHRSH;n1)uI=(#XQMIfj&M4^2mv*Cj5?*VkiE!df`bRa zL^S6@d~VJ?NtSdKOtf8AC@UNfTeVE%S@ob~?`UdmNlgtcZEc*^B%`>~k<}NgjE7dI zJ}G2PZQ7dct8@)eD<7`}9iww#4p-!v2Y&=7;8+8zQ8r<{aUXO+exyqLY%7YGl9}?wh(&~#(2 zz5RakrcVnx6MtUM6i9I9$;eK;do_^Tf_e!}ZEfVf|3Ki=pC`h3 zVVym)LB?wm;dgt_R?vckF!TiIg%Cpu)O<}?Cn7s-em+7U$riMv}){0ijp`+Babp7m40$( z5s3ypf8c)~@g)S?xeF%*f}nR)a;s!ORc&a%I8`oACu}EXwP_{7?E7hZb&- z#{#(d$?B$$Jt@a6c+9R9R7mx1BidXf!nvp?+%VOG5kqD+lwNBrA=cqDLaxoUod{5Umw#^(VV`*~E_#L3^+Vtpsz`bOhc7O`z;SwSQo z+_#)pAD^o?5l`}{3;K)a_?brga0bN$Wdm7}0EGR4mQVUju8zYwcKwDt)9k<_BdcIA z{oMg)v0_rzot0Vf(PePuH=^v_cc03oyZ2@R zxOQSUKbi|h5)Kj!6W`{j3~REd*5H;lOy0en)~acg&J~kEc8;ve)!&hRq_2v{RRdtG zf!w>d&HYcPZWaV!toxC@>m+Wq4x)$GDeQR?ufdI0u#_=Sb&EQD--L5Ui#qmkb4%Q;W;!_c z@b2?C3A=UZG?m40x2I>1i*eb}G;>y4xFJ?wpaToIEF(_*3m2R(22~*bVr}s)pjyxf zE}s(ZT(f-SWmaUa)_!m5NA4Lb0a=>TCwP;A)7J6vgW61mQv#>)aD>ni>Rjb@ z$e@8)worP4xFMxSkma*POk46oCE{Hy(_>#p+3ZZKNH+lfza4>_Qg8#Aq1uKSD?*IS* diff --git a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx index c72b423af8..cfb72bacf5 100644 --- a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx +++ b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx @@ -769,6 +769,3 @@ 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 From 5f302eb95c970618497ed85b9e1ebbf713423963 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 11 Nov 2022 12:20:19 +0100 Subject: [PATCH 04/12] OP-4361 - streamline local render Do not do get render queue again, should be already collected. --- .../plugins/publish/extract_local_render.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py index f2ae91c341..309855f1c7 100644 --- a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py @@ -21,30 +21,32 @@ class ExtractLocalRender(publish.Extractor): def process(self, instance): stub = get_stub() staging_dir = instance.data["stagingDir"] - self.log.info("staging_dir::{}".format(staging_dir)) + self.log.debug("staging_dir::{}".format(staging_dir)) - # pull file name from Render Queue Output module - comp_id = instance.data['comp_id'] - render_q = stub.get_render_info(comp_id) # re queue render item - if not render_q: + # pull file name collected value from Render Queue Output module + if not instance.data["file_name"]: raise ValueError("No file extension set in Render Queue") + comp_id = instance.data['comp_id'] stub.render(staging_dir, comp_id) - _, ext = os.path.splitext(os.path.basename(render_q.file_name)) + _, ext = os.path.splitext(os.path.basename(instance.data["file_name"])) ext = ext[1:] first_file_path = None files = [] for file_name in os.listdir(staging_dir): + if not file_name.endswith(ext): + continue + 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!") + self.log.info("no files") + return resulting_files = files if len(files) == 1: From 9ba1028e615b4d39388dd2f39f4ed9cf473d98d6 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 11 Nov 2022 12:53:22 +0100 Subject: [PATCH 05/12] OP-4361 - fixed issue in render info Weird synchronization issue was happening in getRenderInfo when re-publishing published workfile. This implementation is ugly, but seems to work. --- openpype/hosts/aftereffects/api/extension.zxp | Bin 101245 -> 101376 bytes .../api/extension/jsx/hostscript.jsx | 120 ++++++++++-------- 2 files changed, 65 insertions(+), 55 deletions(-) diff --git a/openpype/hosts/aftereffects/api/extension.zxp b/openpype/hosts/aftereffects/api/extension.zxp index 339560fa387be6b792d2da0da71c879111b40b40..f80787fef8a989c46d4fda489a39b7792ff9500b 100644 GIT binary patch delta 8538 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�j3y*|tVkd!*Ct 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 TKf9p%eQl!x00Du(-*5i|E_3Gr diff --git a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx index cfb72bacf5..cdaa2e3b83 100644 --- a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx +++ b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx @@ -395,61 +395,6 @@ function saveAs(path){ app.project.save(fp = new File(path)); } -function getRenderInfo(comp_id){ - /*** - Get info from render queue. - Currently pulls only file name to parse extension and - if it is sequence in Python - **/ - var item = app.project.itemByID(comp_id); - if (!item){ - return _prepareError("Composition with '" + comp_id + "' wasn't found! Recreate publishable instance(s)") - } - - 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({ - "file_name": file_url, - "width": render_item.comp.width, - "height": render_item.comp.height - }) -} - function getAudioUrlForComp(comp_id){ /** * Searches composition for audio layer @@ -716,6 +661,71 @@ function isFileSequence (item){ return false; } +function getRenderInfo(comp_id){ + /*** + Get info from render queue. + Currently pulls only file name to parse extension and + if it is sequence in Python + **/ + var item = app.project.itemByID(comp_id); + if (!item){ + return _prepareError("Composition with '" + comp_id + "' wasn't found! Recreate publishable instance(s)") + } + + var comp_name = item.name; + try{ + // render_item.duplicate() should create new item on renderQueue + // BUT it works only sometimes, there are some weird synchronization issue + // this method will be called always before render, so prepare items here + // for render to spare the hassle + 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; + } + + if (render_item.status == RQItemStatus.DONE){ + render_item.duplicate(); // create new, cannot change status if DONE + render_item.remove(); // remove existing to limit duplications + continue; + } + } + + // properly validate as `numItems` won't change magically + 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; + 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({ + "file_name": file_url, + "width": render_item.comp.width, + "height": render_item.comp.height + }) +} + function render(target_folder, comp_id){ var out_dir = new Folder(target_folder); var out_dir = out_dir.fsName; From 6a18fa0fdaef4ed2d85a91f2f74b0bd7bccdd611 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 15 Nov 2022 12:11:26 +0100 Subject: [PATCH 06/12] OP-4361 - updated Creator to use composition name There is new flag to allow use composition name Updated subset template. Removed obsolete 'renderLocal', now it is only 'render' with a flag. --- .../plugins/create/create_render.py | 68 +++++++++++++------ .../defaults/project_settings/global.json | 6 +- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/create/create_render.py b/openpype/hosts/aftereffects/plugins/create/create_render.py index 65a4bc4500..7010696df3 100644 --- a/openpype/hosts/aftereffects/plugins/create/create_render.py +++ b/openpype/hosts/aftereffects/plugins/create/create_render.py @@ -1,3 +1,5 @@ +import re + from openpype import resources from openpype.lib import BoolDef, UISeparatorDef from openpype.hosts.aftereffects import api @@ -8,6 +10,7 @@ from openpype.pipeline import ( legacy_io, ) from openpype.hosts.aftereffects.api.pipeline import cache_and_get_instances +from openpype.lib import prepare_template_data class RenderCreator(Creator): @@ -50,7 +53,7 @@ class RenderCreator(Creator): self.host.remove_instance(instance) self._remove_instance_from_context(instance) - def create(self, subset_name, data, pre_create_data): + def create(self, subset_name_from_ui, data, pre_create_data): stub = api.get_stub() # only after After Effects is up if pre_create_data.get("use_selection"): items = stub.get_selected_items( @@ -59,31 +62,40 @@ class RenderCreator(Creator): else: items = stub.get_items(comps=True, folders=False, footages=False) - if len(items) > 1: - raise CreatorError( - "Please select only single composition at time." - ) if not items: - raise CreatorError(( + raise CreatorError( "Nothing to create. Select composition " "if 'useSelection' or create at least " "one composition." - )) + ) - for inst in self.create_context.instances: - if subset_name == inst.subset_name: - raise CreatorError("{} already exists".format( - inst.subset_name)) + for item in items: + if pre_create_data.get("use_composition_name"): + composition_name = item.name + dynamic_fill = prepare_template_data({"composition": + composition_name}) + subset_name = subset_name_from_ui.format(**dynamic_fill) + data["composition_name"] = composition_name + else: + subset_name = subset_name_from_ui + re.sub(subset_name, r"{composition}", '', + flags=re.IGNORECASE) - data["members"] = [items[0].id] - new_instance = CreatedInstance(self.family, subset_name, data, self) - if "farm" in pre_create_data: - use_farm = pre_create_data["farm"] - new_instance.creator_attributes["farm"] = use_farm + for inst in self.create_context.instances: + if subset_name == inst.subset_name: + raise CreatorError("{} already exists".format( + inst.subset_name)) - api.get_stub().imprint(new_instance.id, - new_instance.data_to_store()) - self._add_instance_to_context(new_instance) + data["members"] = [items[0].id] + new_instance = CreatedInstance(self.family, subset_name, data, + self) + if "farm" in pre_create_data: + use_farm = pre_create_data["farm"] + new_instance.creator_attributes["farm"] = use_farm + + api.get_stub().imprint(new_instance.id, + new_instance.data_to_store()) + self._add_instance_to_context(new_instance) def get_default_variants(self): return self._default_variants @@ -94,6 +106,8 @@ class RenderCreator(Creator): def get_pre_create_attr_defs(self): output = [ BoolDef("use_selection", default=True, label="Use selection"), + BoolDef("use_composition_name", + label="Use composition name in subset"), UISeparatorDef(), BoolDef("farm", label="Render on farm") ] @@ -102,6 +116,22 @@ class RenderCreator(Creator): def get_detail_description(self): return """Creator for Render instances""" + def get_dynamic_data(self, variant, task_name, asset_doc, + project_name, host_name, instance): + dynamic_data = super(RenderCreator, self).get_dynamic_data( + variant, task_name, asset_doc, project_name, host_name, + instance + ) + + if instance is not None: + composition_name = instance.get("composition_name") + if composition_name: + dynamic_data["composition"] = composition_name + else: + dynamic_data["composition"] = "{composition}" + + return dynamic_data + def _handle_legacy(self, instance_data): """Converts old instances to new format.""" if not instance_data.get("members"): diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json index b128564bc2..9ad90af63a 100644 --- a/openpype/settings/defaults/project_settings/global.json +++ b/openpype/settings/defaults/project_settings/global.json @@ -347,15 +347,13 @@ "template": "{family}{Task}" }, { - "families": [ - "renderLocal" - ], + "families": ["render"], "hosts": [ "aftereffects" ], "task_types": [], "tasks": [], - "template": "render{Task}{Variant}" + "template": "{family}{Task}{Composition}{Variant}" }, { "families": [ From 702edb0efe0e268f1a92d0b7e020bfda2b05d694 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 15 Nov 2022 12:17:27 +0100 Subject: [PATCH 07/12] OP-4361 - rename composition after create Previously it was renaming composition with subset name, this was missing in new creator. Renamed items to more descriptive 'comps'. --- .../aftereffects/plugins/create/create_render.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/create/create_render.py b/openpype/hosts/aftereffects/plugins/create/create_render.py index 7010696df3..518f3070af 100644 --- a/openpype/hosts/aftereffects/plugins/create/create_render.py +++ b/openpype/hosts/aftereffects/plugins/create/create_render.py @@ -56,22 +56,22 @@ class RenderCreator(Creator): def create(self, subset_name_from_ui, data, pre_create_data): stub = api.get_stub() # only after After Effects is up if pre_create_data.get("use_selection"): - items = stub.get_selected_items( + comps = stub.get_selected_items( comps=True, folders=False, footages=False ) else: - items = stub.get_items(comps=True, folders=False, footages=False) + comps = stub.get_items(comps=True, folders=False, footages=False) - if not items: + if not comps: raise CreatorError( "Nothing to create. Select composition " "if 'useSelection' or create at least " "one composition." ) - for item in items: + for comp in comps: if pre_create_data.get("use_composition_name"): - composition_name = item.name + composition_name = comp.name dynamic_fill = prepare_template_data({"composition": composition_name}) subset_name = subset_name_from_ui.format(**dynamic_fill) @@ -86,7 +86,7 @@ class RenderCreator(Creator): raise CreatorError("{} already exists".format( inst.subset_name)) - data["members"] = [items[0].id] + data["members"] = [comp.id] new_instance = CreatedInstance(self.family, subset_name, data, self) if "farm" in pre_create_data: @@ -97,6 +97,8 @@ class RenderCreator(Creator): new_instance.data_to_store()) self._add_instance_to_context(new_instance) + stub.rename_item(comp.id, subset_name) + def get_default_variants(self): return self._default_variants From 2e1004c618f136999d02728471c4fa9c4acb98dd Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 15 Nov 2022 16:03:45 +0100 Subject: [PATCH 08/12] OP-4361 - rename composition after update, delete --- .../aftereffects/plugins/create/create_render.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/aftereffects/plugins/create/create_render.py b/openpype/hosts/aftereffects/plugins/create/create_render.py index 518f3070af..5684657bf9 100644 --- a/openpype/hosts/aftereffects/plugins/create/create_render.py +++ b/openpype/hosts/aftereffects/plugins/create/create_render.py @@ -47,11 +47,25 @@ class RenderCreator(Creator): for created_inst, _changes in update_list: api.get_stub().imprint(created_inst.get("instance_id"), created_inst.data_to_store()) + subset_change = _changes.get("subset") + if subset_change: + api.get_stub().rename_item(created_inst.data["members"][0], + subset_change[1]) def remove_instances(self, instances): for instance in instances: - self.host.remove_instance(instance) self._remove_instance_from_context(instance) + self.host.remove_instance(instance) + + subset = instance.data["subset"] + comp_id = instance.data["members"][0] + comp = api.get_stub().get_item(comp_id) + if comp: + new_comp_name = comp.name.replace(subset, '') + if not new_comp_name: + new_comp_name = "dummyCompName" + api.get_stub().rename_item(comp_id, + new_comp_name) def create(self, subset_name_from_ui, data, pre_create_data): stub = api.get_stub() # only after After Effects is up From fb154ad4f18b43b6d7e872f239889bd98381d00a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 15 Nov 2022 16:11:55 +0100 Subject: [PATCH 09/12] OP-4361 - implemented multiple output modules per composition Working version for local rendering. --- openpype/hosts/aftereffects/api/extension.zxp | Bin 101376 -> 101426 bytes .../api/extension/jsx/hostscript.jsx | 176 +++++++++--------- openpype/hosts/aftereffects/api/ws_stub.py | 5 +- .../plugins/publish/collect_render.py | 43 +++-- .../plugins/publish/extract_local_render.py | 64 ++++--- 5 files changed, 151 insertions(+), 137 deletions(-) diff --git a/openpype/hosts/aftereffects/api/extension.zxp b/openpype/hosts/aftereffects/api/extension.zxp index f80787fef8a989c46d4fda489a39b7792ff9500b..b436f0ca0b67313cf4509d1ec5e7d4a1dfd2d106 100644 GIT binary patch delta 8603 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 diff --git a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx index cdaa2e3b83..9b211207de 100644 --- a/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx +++ b/openpype/hosts/aftereffects/api/extension/jsx/hostscript.jsx @@ -395,13 +395,84 @@ function saveAs(path){ app.project.save(fp = new File(path)); } +function getRenderInfo(comp_id){ + /*** + Get info from render queue. + Currently pulls only file name to parse extension and + if it is sequence in Python + Args: + comp_id (int): id of composition + Return: + (list) [{file_name:"xx.png", width:00, height:00}] + **/ + var item = app.project.itemByID(comp_id); + if (!item){ + return _prepareError("Composition with '" + comp_id + "' wasn't found! Recreate publishable instance(s)") + } + + var comp_name = item.name; + var output_metadata = [] + try{ + // render_item.duplicate() should create new item on renderQueue + // BUT it works only sometimes, there are some weird synchronization issue + // this method will be called always before render, so prepare items here + // for render to spare the hassle + 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; + } + + if (render_item.status == RQItemStatus.DONE){ + render_item.duplicate(); // create new, cannot change status if DONE + render_item.remove(); // remove existing to limit duplications + continue; + } + } + + // properly validate as `numItems` won't change magically + 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; + var item = render_item.outputModule(1); + + for (j = 1; j<= render_item.numOutputModules; ++j){ + var file_url = item.file.toString(); + output_metadata.push( + JSON.stringify({ + "file_name": file_url, + "width": render_item.comp.width, + "height": render_item.comp.height + }) + ); + } + } + } 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.") + } + + return '[' + output_metadata.join() + ']'; +} + function getAudioUrlForComp(comp_id){ /** * Searches composition for audio layer - * + * * Only single AVLayer is expected! * Used for collecting Audio - * + * * Args: * comp_id (int): id of composition * Return: @@ -429,7 +500,7 @@ function addItemAsLayerToComp(comp_id, item_id, found_comp){ /** * Adds already imported FootageItem ('item_id') as a new * layer to composition ('comp_id'). - * + * * Args: * comp_id (int): id of target composition * item_id (int): FootageItem.id @@ -452,17 +523,17 @@ function addItemAsLayerToComp(comp_id, item_id, found_comp){ function importBackground(comp_id, composition_name, files_to_import){ /** * Imports backgrounds images to existing or new composition. - * + * * If comp_id is not provided, new composition is created, basic * values (width, heights, frameRatio) takes from first imported * image. - * + * * Args: * comp_id (int): id of existing composition (null if new) - * composition_name (str): used when new composition + * composition_name (str): used when new composition * files_to_import (list): list of absolute paths to import and * add as layers - * + * * Returns: * (str): json representation (id, name, members) */ @@ -484,7 +555,7 @@ function importBackground(comp_id, composition_name, files_to_import){ } } } - + if (files_to_import){ for (i = 0; i < files_to_import.length; ++i){ item = _importItem(files_to_import[i]); @@ -496,8 +567,8 @@ function importBackground(comp_id, composition_name, files_to_import){ if (!comp){ folder = app.project.items.addFolder(composition_name); imported_ids.push(folder.id); - comp = app.project.items.addComp(composition_name, item.width, - item.height, item.pixelAspect, + comp = app.project.items.addComp(composition_name, item.width, + item.height, item.pixelAspect, 1, 26.7); // hardcode defaults imported_ids.push(comp.id); comp.parentFolder = folder; @@ -506,7 +577,7 @@ function importBackground(comp_id, composition_name, files_to_import){ item.parentFolder = folder; addItemAsLayerToComp(comp.id, item.id, comp); - } + } } var item = {"name": comp.name, "id": folder.id, @@ -517,19 +588,19 @@ function importBackground(comp_id, composition_name, files_to_import){ function reloadBackground(comp_id, composition_name, files_to_import){ /** * Reloads existing composition. - * + * * It deletes complete composition with encompassing folder, recreates * from scratch via 'importBackground' functionality. - * + * * Args: * comp_id (int): id of existing composition (null if new) - * composition_name (str): used when new composition + * composition_name (str): used when new composition * files_to_import (list): list of absolute paths to import and * add as layers - * + * * Returns: * (str): json representation (id, name, members) - * + * */ var imported_ids = []; // keep track of members of composition comp = app.project.itemByID(comp_id); @@ -592,7 +663,7 @@ function reloadBackground(comp_id, composition_name, files_to_import){ function _get_file_name(file_url){ /** * Returns file name without extension from 'file_url' - * + * * Args: * file_url (str): full absolute url * Returns: @@ -607,7 +678,7 @@ function _delete_obsolete_items(folder, new_filenames){ /*** * Goes through 'folder' and removes layers not in new * background - * + * * Args: * folder (FolderItem) * new_filenames (array): list of layer names in new bg @@ -632,14 +703,14 @@ function _delete_obsolete_items(folder, new_filenames){ function _importItem(file_url){ /** * Imports 'file_url' as new FootageItem - * + * * Args: * file_url (str): file url with content * Returns: * (FootageItem) */ file_name = _get_file_name(file_url); - + //importFile prepared previously to return json item_json = importFile(file_url, file_name, JSON.stringify({"ImportAsType":"FOOTAGE"})); item_json = JSON.parse(item_json); @@ -661,71 +732,6 @@ function isFileSequence (item){ return false; } -function getRenderInfo(comp_id){ - /*** - Get info from render queue. - Currently pulls only file name to parse extension and - if it is sequence in Python - **/ - var item = app.project.itemByID(comp_id); - if (!item){ - return _prepareError("Composition with '" + comp_id + "' wasn't found! Recreate publishable instance(s)") - } - - var comp_name = item.name; - try{ - // render_item.duplicate() should create new item on renderQueue - // BUT it works only sometimes, there are some weird synchronization issue - // this method will be called always before render, so prepare items here - // for render to spare the hassle - 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; - } - - if (render_item.status == RQItemStatus.DONE){ - render_item.duplicate(); // create new, cannot change status if DONE - render_item.remove(); // remove existing to limit duplications - continue; - } - } - - // properly validate as `numItems` won't change magically - 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; - 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({ - "file_name": file_url, - "width": render_item.comp.width, - "height": render_item.comp.height - }) -} - function render(target_folder, comp_id){ var out_dir = new Folder(target_folder); var out_dir = out_dir.fsName; diff --git a/openpype/hosts/aftereffects/api/ws_stub.py b/openpype/hosts/aftereffects/api/ws_stub.py index 32125a7d99..e5d6d9ed89 100644 --- a/openpype/hosts/aftereffects/api/ws_stub.py +++ b/openpype/hosts/aftereffects/api/ws_stub.py @@ -422,15 +422,14 @@ class AfterEffectsServerStub(): """ Get render queue info for render purposes Returns: - (AEItem): with 'file_name' field + (list) of (AEItem): with 'file_name' field """ res = self.websocketserver.call(self.client.call ('AfterEffects.get_render_info', comp_id=comp_id)) records = self._to_records(self._handle_return(res)) - if records: - return records.pop() + return records def get_audio_url(self, item_id): """ Get audio layer absolute url for comp diff --git a/openpype/hosts/aftereffects/plugins/publish/collect_render.py b/openpype/hosts/aftereffects/plugins/publish/collect_render.py index 2b37c1f101..6153a426cf 100644 --- a/openpype/hosts/aftereffects/plugins/publish/collect_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/collect_render.py @@ -22,7 +22,7 @@ class AERenderInstance(RenderInstance): stagingDir = attr.ib(default=None) app_version = attr.ib(default=None) publish_attributes = attr.ib(default={}) - file_name = attr.ib(default=None) + file_names = attr.ib(default=[]) class CollectAERender(publish.AbstractCollectRender): @@ -86,6 +86,7 @@ class CollectAERender(publish.AbstractCollectRender): render_q = CollectAERender.get_stub().get_render_info(comp_id) if not render_q: raise ValueError("No file extension set in Render Queue") + render_item = render_q[0] subset_name = inst.data["subset"] instance = AERenderInstance( @@ -102,8 +103,8 @@ class CollectAERender(publish.AbstractCollectRender): setMembers='', publish=True, name=subset_name, - resolutionWidth=render_q.width, - resolutionHeight=render_q.height, + resolutionWidth=render_item.width, + resolutionHeight=render_item.height, pixelAspect=1, tileRendering=False, tilesX=0, @@ -114,7 +115,7 @@ class CollectAERender(publish.AbstractCollectRender): fps=fps, app_version=app_version, publish_attributes=inst.data.get("publish_attributes", {}), - file_name=render_q.file_name + file_names=[item.file_name for item in render_q] ) comp = compositions_by_id.get(comp_id) @@ -162,28 +163,30 @@ class CollectAERender(publish.AbstractCollectRender): start = render_instance.frameStart end = render_instance.frameEnd - _, ext = os.path.splitext(os.path.basename(render_instance.file_name)) - base_dir = self._get_output_dir(render_instance) expected_files = [] - if "#" not in render_instance.file_name: # single frame (mov)W - path = os.path.join(base_dir, "{}_{}_{}.{}".format( - render_instance.asset, - render_instance.subset, - "v{:03d}".format(render_instance.version), - ext.replace('.', '') - )) - expected_files.append(path) - else: - for frame in range(start, end + 1): - path = os.path.join(base_dir, "{}_{}_{}.{}.{}".format( + for file_name in render_instance.file_names: + _, ext = os.path.splitext(os.path.basename(file_name)) + ext = ext.replace('.', '') + version_str = "v{:03d}".format(render_instance.version) + if "#" not in file_name: # single frame (mov)W + path = os.path.join(base_dir, "{}_{}_{}.{}".format( render_instance.asset, render_instance.subset, - "v{:03d}".format(render_instance.version), - str(frame).zfill(self.padding_width), - ext.replace('.', '') + version_str, + ext )) expected_files.append(path) + else: + for frame in range(start, end + 1): + path = os.path.join(base_dir, "{}_{}_{}.{}.{}".format( + render_instance.asset, + render_instance.subset, + version_str, + str(frame).zfill(self.padding_width), + ext + )) + expected_files.append(path) return expected_files def _get_output_dir(self, render_instance): diff --git a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py index 309855f1c7..d535329eb4 100644 --- a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py @@ -24,46 +24,52 @@ class ExtractLocalRender(publish.Extractor): self.log.debug("staging_dir::{}".format(staging_dir)) # pull file name collected value from Render Queue Output module - if not instance.data["file_name"]: + if not instance.data["file_names"]: raise ValueError("No file extension set in Render Queue") comp_id = instance.data['comp_id'] stub.render(staging_dir, comp_id) - _, ext = os.path.splitext(os.path.basename(instance.data["file_name"])) - ext = ext[1:] + representations = [] + for file_name in instance.data["file_names"]: + _, ext = os.path.splitext(os.path.basename(file_name)) + ext = ext[1:] - first_file_path = None - files = [] - for file_name in os.listdir(staging_dir): - if not file_name.endswith(ext): - continue + first_file_path = None + files = [] + for found_file_name in os.listdir(staging_dir): + if not found_file_name.endswith(ext): + continue - files.append(file_name) - if first_file_path is None: - first_file_path = os.path.join(staging_dir, - file_name) + files.append(found_file_name) + if first_file_path is None: + first_file_path = os.path.join(staging_dir, + found_file_name) - if not files: - self.log.info("no files") - return + if not files: + self.log.info("no files") + return - resulting_files = files - if len(files) == 1: - resulting_files = files[0] + # single file cannot be wrapped in array + resulting_files = files + if len(files) == 1: + resulting_files = files[0] - repre_data = { - "frameStart": instance.data["frameStart"], - "frameEnd": instance.data["frameEnd"], - "name": ext, - "ext": ext, - "files": resulting_files, - "stagingDir": staging_dir - } - if instance.data["review"]: - repre_data["tags"] = ["review"] + repre_data = { + "frameStart": instance.data["frameStart"], + "frameEnd": instance.data["frameEnd"], + "name": ext, + "ext": ext, + "files": resulting_files, + "stagingDir": staging_dir + } + first_repre = not representations + if instance.data["review"] and first_repre: + repre_data["tags"] = ["review"] - instance.data["representations"] = [repre_data] + representations.append(repre_data) + + instance.data["representations"] = representations ffmpeg_path = get_ffmpeg_tool_path("ffmpeg") # Generate thumbnail. From a9249c1b75f8f8174697bd207bf908132283b825 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 15 Nov 2022 16:17:16 +0100 Subject: [PATCH 10/12] OP-4361 - remove limitation on single output module --- website/docs/artist_hosts_aftereffects.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/docs/artist_hosts_aftereffects.md b/website/docs/artist_hosts_aftereffects.md index ede2f7e86e..9f10a4f08d 100644 --- a/website/docs/artist_hosts_aftereffects.md +++ b/website/docs/artist_hosts_aftereffects.md @@ -68,7 +68,8 @@ Publisher allows publishing into different context, just click on any instance, #### RenderQueue AE's Render Queue is required for publishing locally or on a farm. Artist needs to configure expected result format (extension, resolution) in the Render Queue in an Output module. -Currently its expected to have only single render item and single output module per composition in the Render Queue. +Currently its expected to have only single render item per composition in the Render Queue. + AE might throw some warning windows during publishing locally, so please pay attention to them in a case publishing seems to be stuck in a `Extract Local Render`. From 9a503fce6a025d9918f1653cb531dcd56f4d2087 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 15 Nov 2022 16:49:40 +0100 Subject: [PATCH 11/12] OP-4361 - fix wrong usage of regex --- openpype/hosts/aftereffects/plugins/create/create_render.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/create/create_render.py b/openpype/hosts/aftereffects/plugins/create/create_render.py index 5684657bf9..11864dd68c 100644 --- a/openpype/hosts/aftereffects/plugins/create/create_render.py +++ b/openpype/hosts/aftereffects/plugins/create/create_render.py @@ -92,8 +92,8 @@ class RenderCreator(Creator): data["composition_name"] = composition_name else: subset_name = subset_name_from_ui - re.sub(subset_name, r"{composition}", '', - flags=re.IGNORECASE) + subset_name = re.sub(r"\{composition\}", '', subset_name, + flags=re.IGNORECASE) for inst in self.create_context.instances: if subset_name == inst.subset_name: From b0e433e520feab015e90ddc6de4d8e25527f3066 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 16 Nov 2022 11:24:36 +0100 Subject: [PATCH 12/12] OP-4362 - remove unnecessary call to super --- openpype/hosts/aftereffects/plugins/create/create_render.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openpype/hosts/aftereffects/plugins/create/create_render.py b/openpype/hosts/aftereffects/plugins/create/create_render.py index 11864dd68c..8d38288257 100644 --- a/openpype/hosts/aftereffects/plugins/create/create_render.py +++ b/openpype/hosts/aftereffects/plugins/create/create_render.py @@ -134,11 +134,7 @@ class RenderCreator(Creator): def get_dynamic_data(self, variant, task_name, asset_doc, project_name, host_name, instance): - dynamic_data = super(RenderCreator, self).get_dynamic_data( - variant, task_name, asset_doc, project_name, host_name, - instance - ) - + dynamic_data = {} if instance is not None: composition_name = instance.get("composition_name") if composition_name: