From 597ea868765b8a31e7743e5a94224a3d7738319a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:44:56 +0200 Subject: [PATCH 01/37] fix source path, not destination path (#5702) --- start.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start.py b/start.py index 3b020c76c0..54a252ccf3 100644 --- a/start.py +++ b/start.py @@ -366,8 +366,8 @@ def run_disk_mapping_commands(settings): destination = destination.replace("/", "\\").rstrip("\\") source = source.replace("/", "\\").rstrip("\\") # Add slash after ':' ('G:' -> 'G:\') - if destination.endswith(":"): - destination += "\\" + if source.endswith(":"): + source += "\\" else: destination = destination.rstrip("/") source = source.rstrip("/") From b7d9fb76fd70bda9ebb99f8e284b5131ec132588 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 21 Nov 2023 17:54:36 +0100 Subject: [PATCH 02/37] use full color for branch icon background --- openpype/style/style.css | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/openpype/style/style.css b/openpype/style/style.css index ca368f84f8..f6ecebd683 100644 --- a/openpype/style/style.css +++ b/openpype/style/style.css @@ -512,52 +512,58 @@ QAbstractItemView::item:selected:hover { } /* Row colors (alternate colors) are from left - right */ -QAbstractItemView:branch { - background: transparent; +QTreeView::branch { + background: {color:bg-view}; +} +QTreeView::branch:hover { + background: {color:bg-view}; +} +QTreeView::branch:selected { + background: {color:bg-view}; } QAbstractItemView::branch:open:has-children:!has-siblings, QAbstractItemView::branch:open:has-children:has-siblings { border-image: none; image: url(:/openpype/images/branch_open.png); - background: transparent; + background: {color:bg-view}; } QAbstractItemView::branch:open:has-children:!has-siblings:hover, QAbstractItemView::branch:open:has-children:has-siblings:hover { border-image: none; image: url(:/openpype/images/branch_open_on.png); - background: transparent; + background: {color:bg-view}; } QAbstractItemView::branch:has-children:!has-siblings:closed, QAbstractItemView::branch:closed:has-children:has-siblings { border-image: none; image: url(:/openpype/images/branch_closed.png); - background: transparent; + background: {color:bg-view}; } QAbstractItemView::branch:has-children:!has-siblings:closed:hover, QAbstractItemView::branch:closed:has-children:has-siblings:hover { border-image: none; image: url(:/openpype/images/branch_closed_on.png); - background: transparent; + background: {color:bg-view}; } QAbstractItemView::branch:has-siblings:!adjoins-item { border-image: none; image: url(:/openpype/images/transparent.png); - background: transparent; + background: {color:bg-view}; } QAbstractItemView::branch:has-siblings:adjoins-item { border-image: none; image: url(:/openpype/images/transparent.png); - background: transparent; + background: {color:bg-view}; } QAbstractItemView::branch:!has-children:!has-siblings:adjoins-item { border-image: none; image: url(:/openpype/images/transparent.png); - background: transparent; + background: {color:bg-view}; } CompleterView { From 12417e1ffa6edf8ca4b49f7b746eec165f58fc72 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 28 Nov 2023 22:55:44 +0800 Subject: [PATCH 03/37] make sure resolution with burnin are correct --- openpype/hosts/max/api/preview_animation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/max/api/preview_animation.py b/openpype/hosts/max/api/preview_animation.py index 6c7b8eaa80..74579b165f 100644 --- a/openpype/hosts/max/api/preview_animation.py +++ b/openpype/hosts/max/api/preview_animation.py @@ -198,8 +198,8 @@ def _render_preview_animation_max_pre_2024( res_width, res_height, filename=filepath ) dib = rt.gw.getViewportDib() - dib_width = rt.renderWidth - dib_height = rt.renderHeight + dib_width = float(dib.width) + dib_height = float(dib.height) # aspect ratio viewportRatio = dib_width / dib_height renderRatio = float(res_width / res_height) From 3bc341b8ba5d877db9e9cb8a3c9eb616d1f21636 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 5 Dec 2023 22:01:18 +0800 Subject: [PATCH 04/37] make sure the processEvents not rushing into indefinite loop --- openpype/hosts/substancepainter/api/lib.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/substancepainter/api/lib.py b/openpype/hosts/substancepainter/api/lib.py index 2cd08f862e..7055c1f8ba 100644 --- a/openpype/hosts/substancepainter/api/lib.py +++ b/openpype/hosts/substancepainter/api/lib.py @@ -588,6 +588,7 @@ def prompt_new_file_with_mesh(mesh_filepath): # the file while not file_dialog.selectedFiles(): app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 1000) + continue print(f"Selected: {file_dialog.selectedFiles()}") # Set it again now we know the path is refreshed - without this From 72d86c4e0dd99041b7f3a3b618b40bdfb1cef558 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 6 Dec 2023 21:12:30 +0800 Subject: [PATCH 05/37] add missing repair action in validate resolution setting --- .../max/plugins/publish/validate_resolution_setting.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/max/plugins/publish/validate_resolution_setting.py b/openpype/hosts/max/plugins/publish/validate_resolution_setting.py index 7d91a7b991..1c4b05c556 100644 --- a/openpype/hosts/max/plugins/publish/validate_resolution_setting.py +++ b/openpype/hosts/max/plugins/publish/validate_resolution_setting.py @@ -1,9 +1,12 @@ import pyblish.api +from pymxs import runtime as rt from openpype.pipeline import ( - PublishValidationError, OptionalPyblishPluginMixin ) -from pymxs import runtime as rt +from openpype.pipeline.publish import ( + RepairAction, + PublishValidationError +) from openpype.hosts.max.api.lib import reset_scene_resolution @@ -16,6 +19,7 @@ class ValidateResolutionSetting(pyblish.api.InstancePlugin, hosts = ["max"] label = "Validate Resolution Setting" optional = True + actions = [RepairAction] def process(self, instance): if not self.is_active(instance.data): From 7c104e1336984071cbd341e4e4938421c094b54e Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 6 Dec 2023 22:28:35 +0800 Subject: [PATCH 06/37] make sure the select file dialog is closed after selecting the mesh file and make sure the new project dialog hit accepted after finishing the mesh selection and other settings --- openpype/hosts/substancepainter/api/lib.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/openpype/hosts/substancepainter/api/lib.py b/openpype/hosts/substancepainter/api/lib.py index 7055c1f8ba..71b7e3630a 100644 --- a/openpype/hosts/substancepainter/api/lib.py +++ b/openpype/hosts/substancepainter/api/lib.py @@ -583,21 +583,7 @@ def prompt_new_file_with_mesh(mesh_filepath): file_dialog.setDirectory(os.path.dirname(mesh_filepath)) url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) file_dialog.selectUrl(url) - - # Give the explorer window time to refresh to the folder and select - # the file - while not file_dialog.selectedFiles(): - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 1000) - continue - print(f"Selected: {file_dialog.selectedFiles()}") - - # Set it again now we know the path is refreshed - without this - # accepting the dialog will often not trigger the correct filepath - file_dialog.setDirectory(os.path.dirname(mesh_filepath)) - url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) - file_dialog.selectUrl(url) - - file_dialog.done(file_dialog.Accepted) + file_dialog.close() app.processEvents(QtCore.QEventLoop.AllEvents) def _setup_prompt(): @@ -630,6 +616,8 @@ def prompt_new_file_with_mesh(mesh_filepath): if not mesh_filename_label.text(): dialog.close() raise RuntimeError(f"Failed to set mesh path: {mesh_filepath}") + else: + dialog.done(dialog.Accepted) new_action = _get_new_project_action() if not new_action: From f6b41910e1c5059c08fb5508240c2f744cef22be Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 6 Dec 2023 17:04:20 +0100 Subject: [PATCH 07/37] Revert "Revert "Ayon: Updated name of Adobe extension to Ayon" (#6010)" This reverts commit 15eabaf3ad871e134a6732a9460c1d04f1573f8c. --- openpype/hosts/aftereffects/api/README.md | 20 +++++++++-------- openpype/hosts/aftereffects/api/extension.zxp | Bin 103005 -> 106275 bytes .../hosts/aftereffects/api/extension/.debug | 21 +++++++++--------- .../api/extension/CSXS/manifest.xml | 12 +++++----- .../api/extension/icons/ayon_logo.png | Bin 0 -> 3538 bytes openpype/hosts/aftereffects/api/panel.png | Bin 0 -> 16269 bytes .../hosts/aftereffects/api/panel_failure.PNG | Bin 13568 -> 0 bytes .../hosts/aftereffects/api/panel_failure.png | Bin 0 -> 13115 bytes openpype/hosts/photoshop/api/README.md | 10 ++++----- openpype/hosts/photoshop/api/extension.zxp | Bin 54056 -> 55656 bytes openpype/hosts/photoshop/api/extension/.debug | 4 ++-- .../photoshop/api/extension/CSXS/manifest.xml | 10 ++++----- .../api/extension/icons/avalon-logo-48.png | Bin 1362 -> 0 bytes .../api/extension/icons/ayon_logo.png | Bin 0 -> 3538 bytes openpype/hosts/photoshop/api/panel.PNG | Bin 8756 -> 0 bytes .../api/panel.PNG => photoshop/api/panel.png} | Bin .../hosts/photoshop/api/panel_failure.PNG | Bin 13568 -> 0 bytes .../hosts/photoshop/api/panel_failure.png | Bin 0 -> 13115 bytes 18 files changed, 39 insertions(+), 38 deletions(-) create mode 100644 openpype/hosts/aftereffects/api/extension/icons/ayon_logo.png create mode 100644 openpype/hosts/aftereffects/api/panel.png delete mode 100644 openpype/hosts/aftereffects/api/panel_failure.PNG create mode 100644 openpype/hosts/aftereffects/api/panel_failure.png delete mode 100644 openpype/hosts/photoshop/api/extension/icons/avalon-logo-48.png create mode 100644 openpype/hosts/photoshop/api/extension/icons/ayon_logo.png delete mode 100644 openpype/hosts/photoshop/api/panel.PNG rename openpype/hosts/{aftereffects/api/panel.PNG => photoshop/api/panel.png} (100%) delete mode 100644 openpype/hosts/photoshop/api/panel_failure.PNG create mode 100644 openpype/hosts/photoshop/api/panel_failure.png diff --git a/openpype/hosts/aftereffects/api/README.md b/openpype/hosts/aftereffects/api/README.md index 790c9f859a..9c4bad3689 100644 --- a/openpype/hosts/aftereffects/api/README.md +++ b/openpype/hosts/aftereffects/api/README.md @@ -1,6 +1,6 @@ # AfterEffects Integration -Requirements: This extension requires use of Javascript engine, which is +Requirements: This extension requires use of Javascript engine, which is available since CC 16.0. Please check your File>Project Settings>Expressions>Expressions Engine @@ -13,26 +13,28 @@ The After Effects integration requires two components to work; `extension` and ` To install the extension download [Extension Manager Command Line tool (ExManCmd)](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#option-2---exmancmd). ``` -ExManCmd /install {path to avalon-core}\avalon\photoshop\extension.zxp +ExManCmd /install {path to addon}/api/extension.zxp ``` OR download [Anastasiy’s Extension Manager](https://install.anastasiy.com/) +`{path to addon}` will be most likely in your AppData (on Windows, in your user data folder in Linux and MacOS.) + ### Server The easiest way to get the server and After Effects launch is with: ``` -python -c ^"import avalon.photoshop;avalon.aftereffects.launch(""c:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe"")^" +python -c ^"import openpype.hosts.photoshop;openpype.hosts..aftereffects.launch(""c:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe"")^" ``` `avalon.aftereffects.launch` launches the application and server, and also closes the server when After Effects exists. ## Usage -The After Effects extension can be found under `Window > Extensions > OpenPype`. Once launched you should be presented with a panel like this: +The After Effects extension can be found under `Window > Extensions > AYON`. Once launched you should be presented with a panel like this: -![Avalon Panel](panel.PNG "Avalon Panel") +![Ayon Panel](panel.png "Ayon Panel") ## Developing @@ -43,8 +45,8 @@ When developing the extension you can load it [unsigned](https://github.com/Adob When signing the extension you can use this [guide](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#package-distribute-install-guide). ``` -ZXPSignCmd -selfSignedCert NA NA Avalon Avalon-After-Effects avalon extension.p12 -ZXPSignCmd -sign {path to avalon-core}\avalon\aftereffects\extension {path to avalon-core}\avalon\aftereffects\extension.zxp extension.p12 avalon +ZXPSignCmd -selfSignedCert NA NA Ayon Avalon-After-Effects Ayon extension.p12 +ZXPSignCmd -sign {path to addon}/api/extension {path to addon}/api/extension.zxp extension.p12 Ayon ``` ### Plugin Examples @@ -52,14 +54,14 @@ ZXPSignCmd -sign {path to avalon-core}\avalon\aftereffects\extension {path to av These plugins were made with the [polly config](https://github.com/mindbender-studio/config). To fully integrate and load, you will have to use this config and add `image` to the [integration plugin](https://github.com/mindbender-studio/config/blob/master/polly/plugins/publish/integrate_asset.py). Expected deployed extension location on default Windows: -`c:\Program Files (x86)\Common Files\Adobe\CEP\extensions\com.openpype.AE.panel` +`c:\Program Files (x86)\Common Files\Adobe\CEP\extensions\io.ynput.AE.panel` For easier debugging of Javascript: https://community.adobe.com/t5/download-install/adobe-extension-debuger-problem/td-p/10911704?page=1 Add (optional) --enable-blink-features=ShadowDOMV0,CustomElementsV0 when starting Chrome then localhost:8092 -Or use Visual Studio Code https://medium.com/adobetech/extendscript-debugger-for-visual-studio-code-public-release-a2ff6161fa01 +Or use Visual Studio Code https://medium.com/adobetech/extendscript-debugger-for-visual-studio-code-public-release-a2ff6161fa01 ## Resources - https://javascript-tools-guide.readthedocs.io/introduction/index.html - https://github.com/Adobe-CEP/Getting-Started-guides diff --git a/openpype/hosts/aftereffects/api/extension.zxp b/openpype/hosts/aftereffects/api/extension.zxp index 933dc7dc6cab34b6a1630b25d11a2167fa0aef7a..104a5c9e997577959bd8c134fc2ac9febbb8797a 100644 GIT binary patch delta 11531 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 diff --git a/openpype/hosts/aftereffects/api/extension/.debug b/openpype/hosts/aftereffects/api/extension/.debug index b06ec515dd..20a6713ab2 100644 --- a/openpype/hosts/aftereffects/api/extension/.debug +++ b/openpype/hosts/aftereffects/api/extension/.debug @@ -1,32 +1,31 @@ - + - + - + - + - + - + - + - + - + - + - \ No newline at end of file diff --git a/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml b/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml index 7329a9e723..cf6ba67f44 100644 --- a/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml +++ b/openpype/hosts/aftereffects/api/extension/CSXS/manifest.xml @@ -1,8 +1,8 @@ - + - + @@ -38,7 +38,7 @@ - + ./index.html @@ -49,7 +49,7 @@ Panel - OpenPype + AYON 200 @@ -66,7 +66,7 @@ - ./icons/iconNormal.png + ./icons/ayon_logo.png ./icons/iconRollover.png ./icons/iconDisabled.png ./icons/iconDarkNormal.png diff --git a/openpype/hosts/aftereffects/api/extension/icons/ayon_logo.png b/openpype/hosts/aftereffects/api/extension/icons/ayon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a96f8e2b499baa337cdc5a4d3cdf547f9ded972 GIT binary patch literal 3538 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 E-zj>|X#fBK literal 0 HcmV?d00001 diff --git a/openpype/hosts/aftereffects/api/panel.png b/openpype/hosts/aftereffects/api/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..d05ed354286dc0dd00b5d7a2df40ba1e3e1fa6cb GIT binary patch literal 16269 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

G+>DJ?e&gjtJv$ZP-J* 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 diff --git a/openpype/hosts/aftereffects/api/panel_failure.png b/openpype/hosts/aftereffects/api/panel_failure.png new file mode 100644 index 0000000000000000000000000000000000000000..6e52a77d22d54708b8bf0d1abac676ce723bd254 GIT binary patch literal 13115 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 Extensions > Avalon`. Once launched you should be presented with a panel like this: +The Photoshop extension can be found under `Window > Extensions > Ayon`. Once launched you should be presented with a panel like this: -![Avalon Panel](panel.PNG "Avalon Panel") +![Ayon Panel](panel.png "AYON Panel") ## Developing @@ -37,7 +37,7 @@ When developing the extension you can load it [unsigned](https://github.com/Adob When signing the extension you can use this [guide](https://github.com/Adobe-CEP/Getting-Started-guides/tree/master/Package%20Distribute%20Install#package-distribute-install-guide). ``` -ZXPSignCmd -selfSignedCert NA NA Avalon Avalon-Photoshop avalon extension.p12 +ZXPSignCmd -selfSignedCert NA NA Ayon Ayon-Photoshop Ayon extension.p12 ZXPSignCmd -sign {path to avalon-core}\avalon\photoshop\extension {path to avalon-core}\avalon\photoshop\extension.zxp extension.p12 avalon ``` diff --git a/openpype/hosts/photoshop/api/extension.zxp b/openpype/hosts/photoshop/api/extension.zxp index 39b766cd0d354e63c5b0e5b874be47131860e3c6..26a73a37fdd2c064a8438f595e8612a7adbcb323 100644 GIT binary patch delta 10879 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 F^*&K&>% delta 9331 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 - + - \ No newline at end of file + diff --git a/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml b/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml index 2089d06da1..16d85be9b4 100644 --- a/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml +++ b/openpype/hosts/photoshop/api/extension/CSXS/manifest.xml @@ -1,7 +1,7 @@ - + - + @@ -16,7 +16,7 @@ - + ./index.html @@ -32,7 +32,7 @@ Panel -

OpenPype + AYON 300 @@ -44,7 +44,7 @@ - ./icons/avalon-logo-48.png + ./icons/ayon_logo.png
diff --git a/openpype/hosts/photoshop/api/extension/icons/avalon-logo-48.png b/openpype/hosts/photoshop/api/extension/icons/avalon-logo-48.png deleted file mode 100644 index 33fe2a606bd1ac9d285eb0d6a90b9b14150ca3c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmV-Y1+DstP)5JpvKiH|A7SK4P~kT{6`M*9LrdQ!Ns9=$qj3(E_W@4gmP#=ht)#^0_psT^(5Px6qr0)mBB%5&-P}{Y*9ph@Pcn`!ete zwiE<#115v#ScdV2GBk!NTFTzWbF>Xip`p8%&KqcqI~Jb6tC``Vaf&07o~axnzSGF( z(ok|5&-4zgtV5rc$qke?7a8cU$D55m^%IcuOgXaxfTb~yegblyEaWJw%`Qe=-M%S@ zhOXSbt2KkcJv{&)s&PL6vC{g1Y-aKYBs(yc@x{whhk_0fK#=N=)Uup zs)>qe=dc=h3&3Gwr10?^8zc#g%1L4Xs{p!rj(uw=)9Szs&#`@sH{=+ zG+fz{pjE0VR%8l+hOX;W8`PbV32glOJ!~I2VXJkTz5Ufkuk(!F8z4>Ok_kkI+Kb}3)n06_ssJy4_*!y{BAe4)9jbBbSR!>UnLxyMT9bL9_?YdfL@K^^G6aZ)C$Qje z(NzKf2bZq2#ed1=gx1ZJQM{TNMk>CBw!wSvUjy@gS4qs1_a85GREVYsFz!+tU$`&M%7iR@HuBiw5bSa5S}|?)>G0PCUMb-Q{Pf zZt0{hEhroOCi1l=h%&q$mkBdG$MzLns~iea1>hEds{qcP5QbL){0`u*@Qfwke+13^ UGpuMiD*ylh07*qoM6N<$g1d2qT>t<8 diff --git a/openpype/hosts/photoshop/api/extension/icons/ayon_logo.png b/openpype/hosts/photoshop/api/extension/icons/ayon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a96f8e2b499baa337cdc5a4d3cdf547f9ded972 GIT binary patch literal 3538 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 E-zj>|X#fBK literal 0 HcmV?d00001 diff --git a/openpype/hosts/photoshop/api/panel.PNG b/openpype/hosts/photoshop/api/panel.PNG deleted file mode 100644 index be5db3b8df08aa426b92de61eacc9afd00e93d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8756 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 diff --git a/openpype/hosts/photoshop/api/panel_failure.png b/openpype/hosts/photoshop/api/panel_failure.png new file mode 100644 index 0000000000000000000000000000000000000000..6e52a77d22d54708b8bf0d1abac676ce723bd254 GIT binary patch literal 13115 zcmbVz2Q-{p_qT|I5J5!r-VzL>Gg?Gv5TZpNW5`5jj9wEpN<=4!l2H;wuTi2#XY?8^ zj1tj1-?+K=zW4pF_x*q0`mAL=&vVW`d+)RNK4&b93W$6XbPpw&vp(7Z>LP3h)UC0I(DQ7Y};`#2sMo!ul5n zd6)~-8SaRHJJ>T_afDbnxFV!ju&Vx^gPr5wZ0%kCv=i21eC`lOK7L-{)tvqyw1oam z=jiHe`-gB#C?CugW(TuJxL|4d|E6_(?tpM`dG7FESpVJqZvwEkRagI8#(&hs&hBp! zE(irAb{c;g(*u3Dy`_Vj%fo*RfXPD;Few(S*8~Cl`~aZ14nIGLUl=67&kf`U0fE0s)g3J1 zRv!N(6#xK*bofO;SRw(@e%Vxf))UAF_?uYL|i}s1{J=F=6^}nfw?2V5D%EM%b&~SF~s`MH(U5W?D7YV2E-0) z7ujc;8viueA6-{`{_Ntzj_12tAHP}g{TE^XYW`~`vRE6tV1wyDsUrRN6romPPzx&& z0Mr5~2oMzz5(QX@ia-Iv!h&K@VGAn=R8Z`>dk(`g{a+TuZ!s2t>i=)y{hR4ORsW9*^#4coKNW^PhuB-gu-Sx<90RR?jKw9U(Uzw`&X}jXB_Ou-#H6rk7ezQ%}8btr&l;QJa{VdvO4aQn`wTI zv@6MThtuEoe@vco+HHxXtP4fJ=N@DuJ29@Roe8!qC_CAl{y>%P9|k45ihcZ{-j!sE zI_AP;k=lg>YGlMu1uC-SzP$&0cyFuf51%yegAjKOQpc$fo-~uYN3mt|6n=8GEDaxI zIQiLdx;SIj#CuDdY2O>ah52CR^-TZiMp^%9{g&E{QwRNrKzqtPVp3(!o|`|G?x?uU zdaPV0k$j@1RpNVoq7*Kd$Cf8~4|OaP_{ilhkQf(5nGWA@X!>&P8k*@%C!!?m@uS4J zI352-F1mvg@MKIuLBYP-6B6m8_bu}VM23jMXJx4IWMqwTG>`1a@bD+oFO#_@zI#1yPpVaCvcx?W`S7ZZIRg zuueA%fIra!p8GSMMbD4nGkTMrvtIUYQzYG#oxYxQb0!5W!~1-(J+h*r0@)7=F~M^2 zY)9eCsY*WKAy1~ zV^$>0TP61fpc$Vnx&3HiF&hxG81?xkis+r_vFnOV$iLdgCJI=cy+r zp60cm4fyiX6cs&Nf{8)ijQlqY_jQ3IYy(^_rq(yBdiG4*W?(NdHh}{&lzgVGOm8dX zO;6Ldyp@6(?EIY)(@6IybuE(N9sqc*7K~{VRB+gYfRyltrZudjd-WuZQo{vb7K%3E zbyd);3&covPyFe z9n@CKg!C)|%UCqOTK^>W%}oQf)o^Mbgqili1*YJWFv!1QK78pN8yl2hZW9?=ez&yA zvYRgU5;{6~EdcYuHkXoVGF33}Y(S1=!kk8{&1srkQ!+pbpRS?_sZ&`uZavVtzbE#V zf#_uJ4ZP<5{@$MC!8o)DL3V-`Pf9q0tAUH{PS#~2>-RVtZ(p>1YzPq@oeM5vrmeNm+o0|R@mI$vUD?{MOak6RMW}QxHD(Fz~ zBG!9TQ*$Fdnyji>NF>=4p2Zjpwwc8h7VuUYE^ec^o@BauwD%QQ80J8FIV`=yCv%%6 zP66fdsqSK@QA(5%HCAL|69%{Ch@mYs%j0kIM3w9oKFfo*#`sX2CyXm~G|QUT=1r3I zCe2nmu{M|gNYjMXT(-F=~zYaP_pTsM&T!pT1mNQRlh(BGI;$zW#3G#bI zGp8Bp>J2y+T-O8mw{w1*xB4!sR<9OC$8r9%dS}Uea^4XK zqR>|UJXcqomP`E7>h-E?gj+(ojKJB{p2Njf#(&u!0>Y^J&xIXK= zHuGip^3-U}kTF`|1YEBH^OIGl&-I?WUv)gG-?%+Q;tzkaJ&BQFbWiR&1Gw(^J^83A z|3b7b?}&R?roOq3Wz}UhWH{W9y=cci2Q`=FJLfldNJ}^;atHkKlb|}nSxX#!D19j; zjC=#S6yy?AKL07Tmg^^XKFGMUA^j^O&o5l7(JSO+SyLfJbXq-4Tp1>lgYwK5OuOVb zd8GP?t83lFtZfP5!mNka>jc^pX?F) z-g1^99UaruZuCpM4EN`F`{<%Ag#Kr(AvgHrNezz{s${*Ap?npaqP|`wfEBBg`3{Ej zY_l%~U5zb_({b*VuWLOcY7g!UJ0)E*+M(tICMwpJt*%CokKPdMr>n+eJTka6usrFL zlPEuSTUrryc&e%Y)Nk7%|M0rxgh~s*tj@0fn=>9W%$qq{5F+8FHh$JA0aJ+Ff!{l*?kv0 zlxRV+7d|)o5tfwu(VV>i&{pj9mvb-iK3LNp4}qnUl@rMh_a(^vXT@V+uiwQd&2M8a zbu%<5EfpcKW{*FX6^sY(L*2Z0@=ryir-C~rHN&HoAz&fR7{aEb6`RzNabC9kVC1)$ z`^`H2sc>e71#gtB$j~a!s!yVj-my+1U4e|!H|GZ8Y{ z+$Zr2|C4yqnZIiSj3nQWA5(to%1=xWPlNY!Qx*fRf8hq67a_N6 z`d;ks_+~65>NJ8-8{9;8JzM+w#SOJ471Yvkd7I~5;_aq|dRrRz@=r$G!YYL&hB`#*d2WfcwtevhInl9q_RhsZ647(2y-lXoq-{`w5DE7+YE+8@8h?B0A!ur zpUPU&Si~P?4PoLcj2God=r$YMl9Bt#<-kax`AND|ht0Wo``nviQl?>#ud*#pCuiiN z{+#QWiQAmdVT!QLXpxCmztrJ0wqDW5-8Gs!8TC1w(bv^=y*xjZVY=1d5ph3D_xbg5 z>Pf22zyk#(1Hc2Nz>=?fhk=x+gaEwqN~I6Qtfyqb1n>D_uS5CwhYv!_k>}T(cKHJ^ zq2;;1Mm~QHol>eKQ>#)4WhtDKVWBj?EhtsF$0za?Ra!b^!5HYEQmgqSo+*M)@mTh8 zus5`oe_1@o;>3^dx`KO0miS{HYRq?)PZ%nS#thpZWVFH)W);Y|VzOS&53VW2;%v4m zS~8LkDd0XGp{1qS!94wU?^nJ~p+luUcqLH)Wkau^yB~4hKxq~v_zcb8C6EYcOh00N zycVw+N*v10IdD-Fr5Q?}s@XZkZt4WTQ)I@Hwi{1_N%D>{E@q3+12|Dgq4_c{ZK+rB zE|2DrkIVLMN5|BkK^f!=Fs}xA&nWdfsGUU9;Umo&LRymV8OcKmJ(eRb>c2j0T_gyJ zLuzeRv{v9HHPqf_EB#T1422+zu5@bqo8{ zMMWoJzyGMRuc2SJBWgSBBxxS#F623TAww20Sv6{c`O0-272!YBl!_6;L2m``AEewC zjnmeF%eiYGfi^gOvt^`1ER65u^FDk10m^pZ{x~rJqfmyX7OBiOc1;zuEgf4SO%(Hf zX-kGff2jXG(+xVI62qmh&m{w{Q)>m)N-*=%5P?=&%HNM8X~8ZnzWB>GQIsQxOrI*8 zQ)B6e3Uj4mFsTvc+K*dF6A5&Nbn+#{zD`u4x#T3=P>XTM>+ywV`|x)DpnjX75OeUK|i?oMV=<$4)+dO5t!D0!ZXf<$+c}Z7fzSqND4sZ} zVRm1VrNG!-UnNLn+qG?iW`(eK5C5P7oZRP_pSKsKEI~o1guBevTFN{}`qtJp{2AxW zUIq1?GE!cwelp{bGPM7PZkkp+f0-%XIihYnfO_zAKNIASbojk(bp^7Nj$Vr1u zEY4^(9$dE}-ih;VT1~BWaj7<2@wQXR=D0vz(k%)!VZ;681m8q&M<>3RntM+_EIXTm zyK`gLYY^;hL_}b|I2pToIE%qNz%#U;;8rq zewoJ0fl|V~v!j^uj8df8*6<-H^rP`?kvk~+#UxQ&Se@`*>8`ndjXgmUEP8nUa2a0>u)X%7hc>Z?6o!au6liF zt!6UIa82D6o%VK7f8O@_t&c;iLWR%8C&`389OZ3{3!)wJvh_z!y<+J!HVxQ?_M{j> zKSUC~v_1Pgw~<&1Wp;=(V8P(uO^L#1piCjtAHi3uc3)SuPU{$>h>FY^pJvlgtY24s zm4VUa3Uho^QxWeF)h2T-iMQbl&O57Zf0r_QwOyHv?P!Jz7e$o(n9`#U^4PT*SC`4$ zbFioU%?-njoZ)`0J5tpj390jNvAZd|o_k`!uUCo$oUzcSEzO>jT1|z(>8;HOO`RnMWJ$1QC>+TzA)H3{>my@x|exRBZ406GT6OQqFB@pq1D@w>nBAM z1o&fcm%Sc9?Uw1!y1K-mU1ErFndI9Z+}*BFCbAlJ0Pq4IX!5;YazD?a2EVaOrjKei z!Xe^b;^7BvDdMPtn+{$N1m1yP%SAecMR|TkHwi6iVl(DH%=%~I#KJ#V%m0tW`Cl8c z2EOY1ZRdY^>>rN%J1760n*TB2_qe?wD2Tq`siu!CIOIc5OwdZ}k#46tMrX}&)FbdE z#<+uR1&xCZAV_ZijiBVk>7E>W-C$ye$68Ma7dzMX9%ShtAj(q#lk$p~?7U z$iOuY{x|CVF>QxZuab)klHxMix172Kkvm^qXky4M=fB;9n?;~yuAKp6?gM>xlSGnV z3Cf@sEFEd^u?QO~kr&Mx;Jp8?S1&m|%3bxLl1<=soB)gkBn29))%e;iH*M#v@*oNI z(9;G_(*7#f>MiXc6yBn($l|>l@H+xxZlYdyXt;#wg~+yEKf^+M21%&%TiLGp8o4zx zkt@t@t8^q+k@F1{dB|h@r^X!I zZ9=#|btnCU$D<57as&uRw(qCEDEQiPTdnT(W+*Xah{d{EXLu!!``a&CUG`*nb)i2&RmjiKGJehLklT-W1~MrRyI?T+49 zI89^>#=UO#V6NDNW^L8Gz(=PF`a?CM_*Gud{)ovbG{b5HKi{mmSlfqTz0pE1d_wJ< z4=JfTs#jGDo!eIPcoA0^>2i+OV#MF2Lk9D;4`tUYWejrD+wIOcF%@%CulqPZX*6|s zbo877)e#ab&D!Y4@H(oG67$X1Y(-%wA$@X03Sp9iTb!4Vv^WCcL{~*Qtar z**|h7C&k7zfy41*b;zH3;q<9YZz5gC5?zD)eVWHsGTgE*PyN#T0Kl}Dn2D!+$OAvr z*X@ZfyReh4)R}peyBPE-GVMa!uCpZ?6F>z+5_7ZlMhVpW5T?}z5FtS#navvu^94~2 zDuNN9H9bW4&nWZ7sga)pbfSI7-%{_g)RHxZ+GnxcDw^Vo6@UsTBYr=Ou)*0$N6=8GqCQL(jM`IUa_`J6p; z(ONe>$a-_|GsdIOsO?5lTH3|^0%NB5E8X~NZy2Tj^kqH3eENAZRyeMvm!6-IJ;|;& zOotVfj+qeTEXg>r#rG|kt#-_NiO@`T3%Ne>s{e5B^l2x|TX4yRrNHWGhg^S={YUPp zb%{6~`<{yVrnO4I<~P2PsE)od8C`J(KGn)m4$?DqfCR{@^x$!a>D>0ir_*F{n<^HA zBMrfowOsLuGKrD97q7Ns(@RC>ZsnVoeQSss=<7IGP%|;}+KXG@_v0U)Zr3;5QSxq` zE7rT1VI4CxueDp5y>Q$Z8s7g1O-th{>n&y{X7gsQ#d{dpD{TN2sSN+(m&er~2 z2Bzvw#+T&*_Alh=tE)@jiljjzYQyg+)>OHt`A8h@ITzkQO&$2L`J8X~FnU}%^8;iq zCg;RB_q~$UH;T3AHfYNXm7XoSdy`Hc&PUcrRu>a*>ex5NIO!^pAo>w5>FCm@mk$ zhTaIBaWjG6q&om;;)v>H=%OSMZPZMun+UKcKXJL%>`OW;<0yO>UEt6+!}ai$fGJx6 zx%2uUcgi-kot>lu%5RprW4Oddsa@*Z6V0fKCd9Sm2B#PLM)cIOsqAN%?J7fEO~)no zBn1FCz+6VGcB^$nax1EC645L>{{bl?C&@p#-gS>Pmq@(dXR%&pzI$D~U}~hnx;D57 z_ASviYeJbmL&VIBTQE(<)r|=ikHmzbUL=507NZ z$?3CczH~5O+&YZRH+Zi0?38w=H{JU(M1Felu~K4}Z?=(zReKT1mKT@Zw z!$+s1W5~m3qOr@#whKl#dWMXV2H^zPgL4}C<=4aOlSuipiYi_-)GN$=cUJ3m-d*4O zJ&Knu1$nz09T1YQdtn0u#qk|;4M=9OFIk)UoO0)u&~z^8G|4llD~+6x<@mi^E{g5j z$)G{_o4!nY1ZiYmOmzC1eKDU6N$iq|W^n2;mG_r27eAf&ul)Uyy}p6c(ozzh>s65W$oojIiET!~uekl?(Qzk-?Bi02>tj!O;m(fW#33>a&e@VsZ z@wU;2a7rIB47d^fSs47}{r9rNGczfwYKaDICWS9ZkYvh*1jXJiLTgf`!;}K;uZpUy zh7j|@3h*xZxBYhWQVMfVaei#Ym`H)nANLn3)C*R>6MPn3oMW^==d7%n|F(C27$Gpa zSZtM6TtqHqp=CEa}kqSEg;^=mx zkEP8m-T4qq6*d{eQt0=*a`G3%5)>LLi0n!y$j9j|DnSoCr>6ABXg$E77}q>zG_d5XMw z?RT(^0@yE!VufvvMvM9>M8il^=UF@PX}5wlyUko!b*_}w?N7iOJ6&MDl*}JB2Icf& zQWUTQ0k-+dgp0m_?1+^krGKbEPy-xiMGt`{lz|iN*s{f4sr+mCJl*2gD3*?^Dzr7} zhlTp{fY?2$Ur`7f79uQaqR_kten*x~o#0JkKM?YcBt$Y>YzS{Lr|UZFgfZA!?EX~| z^9JlvO+QGjrQ0llE9dXC_vo&^*^JMGW&d3}@XxD__y?l>&uA1I(DKNxeBhat;b z6)Yx_iX*bRy!mxQSt%xQuIh}z9Vw9zGB}1ol===?k2o@oJs-?R>u^}DdfdiNL3}aG zrbgxZ?3HWC5w@oE@W3KE|EYS!#>+p7R)VC4V<>Z8YDLMauEvU$pL>LEl&kpCsDu9R zI?@H)rbZHSmYT*5SKYW(De=y-39+#2B^%L`8qzbWM!bypQk_Y2uJlx&-oHt*7)af*3Y71(b#Yyxp@ zBp%s@@Vu&rGJh_iUv5=c8Ye>qSa;4d>dkn*8)virBzFgMuklh2OQH93awlsD!rSamFaeD$R7Tw3~&52Y)wL<+Xm1w5_N5&hJzRY5e310%9pR83|x4bP2ni)(aPe;RQ`T;ljFH|fypU2W&;_V%H5i(HC$RULl3&B4yXjad<~O2b9k`|YtHEF72>}icnfXo zaQ%alYX6?H|Djm_0kNRYGprXc@;DvEtUyt>g@_{A5sm8qKpe+M}oV5EAQm&38Akq%=P29Ds4 z%CylFNj9{==t42j+OXa5jQPGd3GYO6D}_vJ-RCPnrbmLscTglkEw89Loc7~_g{jR} z+<3;Qq-N=hq*sHPx0ChG!{32F`i5@0$@kE0M)Q%Pvt$at7&nz~R^waWeKcUYt+Kc( zYo8bNDB$5ILp58v!|xVTgJH|O>x$s+wvWF~tA1D+=Hpz@BNrK{2Am}*rmUu+ZsM&{ zJc5N0LFS}~Pi8X&YKp2K%h-HrX8+NvMb5!GkEX*=thQJxZo^qo%L`h^NeSHk?Nj{L zppll)ege8o(Fo1#vF-WKDm?wxG4T8b4=8Cy!c5~Clv#N*blGz8-H|+MmBw%B-MBYw zxQo5PN{fQQN~{g`2_i-PW9lJx-Es3))Wd2pmN_$vQVH4>*M2$<#kI(lvvPRWV^b_M z>c@w)X0kp4=~k|5B?F(=Ft9QX3V+L#O>!*m!g^~5_DhVSDrAl<{wn^LI2Qum?q!A+*Q>v$d>e;w8LoUKnvXUd`2^FI>1 zxBfeJj>T83QXHyYvr&53y6}?y49^wBVZN%?a-j_?pZ40m54A+NnY@IwM$!`s{jzJ^ z>*~1fq%MOa(kxV~`l^J`I1(Jlu7};roU$?Ll53xWAWKoe5b@y6^~S~l?FkAx~vh+Ui1<$}~4lM_l=yq>i@Y1$nfdwnojfYhODiWe-+Z?SidcV$& ze#KeqRgT>msOyZu!t)U9k++E~DV-DjSX0+X>Jf30Mvw>=DJCcl)f&JRX8{uk<_Q5Bq_A4ebY*>Emz@v zDz3PZE}kEDw+g_tMK7~U7zfLO8rT(VB`jmp){w2q^6%R>w^(gu=H8E!(hW8|f6POY zWI8QEsb0lxf(NA7A1ls!SkO8`rL!YdjVF^8KJkdi(w}6~*dOz_GLpM@QdB9Qm$E$a zIy$HqG9((vlV!EgK+_4qLW8L`UG3M^*J8Hr4=RSF@3x@=*;}`UEv``UFOL$^Df!-RuuSf=m~(ZsYR+T*cNUo16Eh?ZKX6 zOLH5ol zcjIOg^zY-<6<+R$U0_R&*&+i_ta`bicT_iACT&-5pfId{7w=6+W5p)oX8%go7yJ$7 zfkI1-*Sj^!lrc~xD&Gc*8A+!FTh^hdY0Fm`)|Pk5*!uoX>8-b(2>g$fo|x3nKCzDO zTlx9{TF85iCOd3%JgNB8wCDrd^!Z#1rz9PJTaLD2EqnHJV7FpWzP`}IAI6}eC9QtZ zuoWXX!5!3+Gb)&x&(G;q!@U+?CAA2O#k~}ds%pgW${P)cWCl?x!SDd$L*l#s<%9z% z@Z0SggW|V6pEBHD)9!6oxuk(4bmm}0{UC+Y4K_uhGDhnDx*)xp56kWctk=PjKW0>e zL??BYDS#v>Y2|s312tt;YAizym2o*O&c=J45j z21Q1ZfTz+KV;n_xkaDeGDC`jC%`48y#Ny84_rB^x;?bdYSxe`8Q=Z*Au32K?K!a#{ zj>Rn{%d$7cW!f+d#2odp1!kR=yyD%vtUsNo`l1QIHg#0(H-~DHt-NS&Yb)-9ZB~@~ zKFa%NbaVTiaHn@vUL=*2^&NOT&^?4W`O3o#JEp;ABI#qpgy`uq^Se?L0+U$A`Uc4Nk^)CyP@Z zjNcWThorF*6JGGM^F!O89h&?-eBZTLyOeWl`)lD6`1%eW}lh7QCl zaVx7_Gz9+m_?`Z{trx(=(2%hC61&_A>1Zo^tB8st?w;g?lKXz4H|AcdA%RY9B-_~A zMnqP*W5s5E++SE#$-8J<*>&`d+ah)6i#G1hJ}i+bq|FB3Apc^ru4&V9<7;u}xAL`+ zabKm@p23SFTzeWPCPju&6vI-mA;G<*uLTvY?M@`Tm1%k;YWYw@ zUelntMqyF3>WyDppJ@-9{1c|~$3+$y>bfaeewKif)58RZUhSV$hwNO$eRFN2IC-{C z%zM_^h!Tbf+?DQ)F%6IgTiweLu`uLih>wQX;6AUXcR@Xsia3gBB0C{m?1OJOjN^618s2B!}FbwArHS;hltKRBQ|~`p`gi` zM)H{9sHCX-@QM8zcv_zWQ20A-H~)Gvic2G4gmI5<%)FcH^^2N=SRLHc$q4EAdQE&T zdwAadwjzfCIs^WzHuy!_cwFI~EvkDIx;Wb_E6H#4g=s`J{%hVQOxh|b_aPx&TE^Z+ z{f)K;S6PPc?6EQplx|C@s;b(nqdwxz`~5h^-WB~5o&Ei2P)NSI zyGb_sD~bRYCHvk2R$E?v4}t~y6DZKi(T`pdJ)bCNoyA_3rCOh2_mL}{lC4U=y(Rt6 z`?5LUZUdX|Hv=r=_8(#Ym|v Date: Thu, 7 Dec 2023 11:57:50 +0800 Subject: [PATCH 08/37] add the processEvents after the dialog has selected the file URL --- openpype/hosts/substancepainter/api/lib.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/substancepainter/api/lib.py b/openpype/hosts/substancepainter/api/lib.py index 71b7e3630a..bb4481bb1d 100644 --- a/openpype/hosts/substancepainter/api/lib.py +++ b/openpype/hosts/substancepainter/api/lib.py @@ -583,7 +583,9 @@ def prompt_new_file_with_mesh(mesh_filepath): file_dialog.setDirectory(os.path.dirname(mesh_filepath)) url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) file_dialog.selectUrl(url) - file_dialog.close() + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 3000) + + file_dialog.done(file_dialog.Accepted) app.processEvents(QtCore.QEventLoop.AllEvents) def _setup_prompt(): From 459000ec90fa3cdcd11608c4085a620844f5e0c9 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 7 Dec 2023 18:28:28 +0800 Subject: [PATCH 09/37] if the prompt dialog can't help to import mesh, use substance_painter.project.create instead to 'load' the mesh into the scene --- .../hosts/substancepainter/plugins/load/load_mesh.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/substancepainter/plugins/load/load_mesh.py b/openpype/hosts/substancepainter/plugins/load/load_mesh.py index 57db869a11..ca22163c5d 100644 --- a/openpype/hosts/substancepainter/plugins/load/load_mesh.py +++ b/openpype/hosts/substancepainter/plugins/load/load_mesh.py @@ -44,14 +44,20 @@ class SubstanceLoadProjectMesh(load.LoaderPlugin): # Get user inputs import_cameras = data.get("import_cameras", True) preserve_strokes = data.get("preserve_strokes", True) - + sp_settings = substance_painter.project.Settings( + import_cameras=import_cameras + ) if not substance_painter.project.is_open(): # Allow to 'initialize' a new project path = self.filepath_from_context(context) result = prompt_new_file_with_mesh(mesh_filepath=path) if not result: - self.log.info("User cancelled new project prompt.") - return + self.log.info("User cancelled new project prompt." + "Creating new project directly from" + " Substance Painter API Instead.") + settings = substance_painter.project.create( + mesh_file_path=path, settings=sp_settings + ) else: # Reload the mesh From aeaee28539a2903eb2fb061e14ab673204f2a11b Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 7 Dec 2023 18:51:07 +0800 Subject: [PATCH 10/37] edit the comment --- openpype/hosts/substancepainter/api/lib.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/substancepainter/api/lib.py b/openpype/hosts/substancepainter/api/lib.py index bb4481bb1d..35e5b63625 100644 --- a/openpype/hosts/substancepainter/api/lib.py +++ b/openpype/hosts/substancepainter/api/lib.py @@ -617,7 +617,9 @@ def prompt_new_file_with_mesh(mesh_filepath): mesh_filename_label = mesh_filename.findChild(QtWidgets.QLabel) if not mesh_filename_label.text(): dialog.close() - raise RuntimeError(f"Failed to set mesh path: {mesh_filepath}") + substance_painter.logging.warning( + f"Failed to set mesh path with the prompt dialog: {mesh_filepath}\n\n" + "Creating new project directly with the mesh path instead.") else: dialog.done(dialog.Accepted) From 34bb371b810ca0c12ff99729cfb9d045aaa1bdeb Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 7 Dec 2023 18:53:04 +0800 Subject: [PATCH 11/37] hound --- openpype/hosts/substancepainter/api/lib.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/substancepainter/api/lib.py b/openpype/hosts/substancepainter/api/lib.py index 35e5b63625..4d3a1d19bd 100644 --- a/openpype/hosts/substancepainter/api/lib.py +++ b/openpype/hosts/substancepainter/api/lib.py @@ -618,7 +618,8 @@ def prompt_new_file_with_mesh(mesh_filepath): if not mesh_filename_label.text(): dialog.close() substance_painter.logging.warning( - f"Failed to set mesh path with the prompt dialog: {mesh_filepath}\n\n" + "Failed to set mesh path with the prompt dialog:" + f"{mesh_filepath}\n\n" "Creating new project directly with the mesh path instead.") else: dialog.done(dialog.Accepted) From f0692c87777f9bd31f73a48d3731c54f0f46c1d0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 7 Dec 2023 20:53:53 +0800 Subject: [PATCH 12/37] add comment --- openpype/hosts/substancepainter/api/lib.py | 2 ++ openpype/hosts/substancepainter/plugins/load/load_mesh.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/openpype/hosts/substancepainter/api/lib.py b/openpype/hosts/substancepainter/api/lib.py index 4d3a1d19bd..1cb480b552 100644 --- a/openpype/hosts/substancepainter/api/lib.py +++ b/openpype/hosts/substancepainter/api/lib.py @@ -583,6 +583,8 @@ def prompt_new_file_with_mesh(mesh_filepath): file_dialog.setDirectory(os.path.dirname(mesh_filepath)) url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) file_dialog.selectUrl(url) + # TODO: find a way to improve the process event to + # load more complicated mesh app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 3000) file_dialog.done(file_dialog.Accepted) diff --git a/openpype/hosts/substancepainter/plugins/load/load_mesh.py b/openpype/hosts/substancepainter/plugins/load/load_mesh.py index ca22163c5d..6b4b79753b 100644 --- a/openpype/hosts/substancepainter/plugins/load/load_mesh.py +++ b/openpype/hosts/substancepainter/plugins/load/load_mesh.py @@ -50,6 +50,8 @@ class SubstanceLoadProjectMesh(load.LoaderPlugin): if not substance_painter.project.is_open(): # Allow to 'initialize' a new project path = self.filepath_from_context(context) + #TODO: improve the prompt dialog function to not + # only works for simple polygon scene result = prompt_new_file_with_mesh(mesh_filepath=path) if not result: self.log.info("User cancelled new project prompt." From 16c7d5565d072d84d9a1f5e717c54b832431b7fc Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 7 Dec 2023 20:54:35 +0800 Subject: [PATCH 13/37] hound --- openpype/hosts/substancepainter/plugins/load/load_mesh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/substancepainter/plugins/load/load_mesh.py b/openpype/hosts/substancepainter/plugins/load/load_mesh.py index 6b4b79753b..08c1d5c391 100644 --- a/openpype/hosts/substancepainter/plugins/load/load_mesh.py +++ b/openpype/hosts/substancepainter/plugins/load/load_mesh.py @@ -50,7 +50,7 @@ class SubstanceLoadProjectMesh(load.LoaderPlugin): if not substance_painter.project.is_open(): # Allow to 'initialize' a new project path = self.filepath_from_context(context) - #TODO: improve the prompt dialog function to not + # TODO: improve the prompt dialog function to not # only works for simple polygon scene result = prompt_new_file_with_mesh(mesh_filepath=path) if not result: From b855c72557f64f126b95ef5d38408a250eace688 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 8 Dec 2023 17:39:28 +0100 Subject: [PATCH 14/37] Refactor clip name extraction in create_editorial.py The code change updates the way the clip name is extracted from the OTIO file. The ".lower()" method has been removed to preserve case sensitivity. --- openpype/hosts/traypublisher/plugins/create/create_editorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/traypublisher/plugins/create/create_editorial.py b/openpype/hosts/traypublisher/plugins/create/create_editorial.py index 26cce35d55..dce4a051fd 100644 --- a/openpype/hosts/traypublisher/plugins/create/create_editorial.py +++ b/openpype/hosts/traypublisher/plugins/create/create_editorial.py @@ -663,7 +663,7 @@ or updating already created. Publishing will create OTIO file. variant_name = instance_data["variant"] # basic unique asset name - clip_name = os.path.splitext(otio_clip.name)[0].lower() + clip_name = os.path.splitext(otio_clip.name)[0] project_doc = get_project(self.project_name) shot_name, shot_metadata = self._shot_metadata_solver.generate_data( From 41bdcf305e30155adb55f77dd6fde74e7ae37da2 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Sat, 9 Dec 2023 03:25:59 +0000 Subject: [PATCH 15/37] [Automated] Bump version --- openpype/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/version.py b/openpype/version.py index 48688d5651..cdaafa0559 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.17.7-nightly.6" +__version__ = "3.17.7-nightly.7" From 8a1a1c3b15790859985c1120764b8a1dd32e91c3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 9 Dec 2023 03:26:34 +0000 Subject: [PATCH 16/37] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index f827d275a6..6f651076ce 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -35,6 +35,7 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: + - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 - 3.17.7-nightly.4 @@ -134,7 +135,6 @@ body: - 3.15.3-nightly.3 - 3.15.3-nightly.2 - 3.15.3-nightly.1 - - 3.15.2 validations: required: true - type: dropdown From 97b192b02bd6639d9740da8a17540af804d76f1a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 11 Dec 2023 12:50:09 +0200 Subject: [PATCH 17/37] remove redundant code --- .../houdini/plugins/publish/collect_chunk_size.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/houdini/plugins/publish/collect_chunk_size.py b/openpype/hosts/houdini/plugins/publish/collect_chunk_size.py index 1c867e930a..f8cd4089e2 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_chunk_size.py +++ b/openpype/hosts/houdini/plugins/publish/collect_chunk_size.py @@ -14,18 +14,13 @@ class CollectChunkSize(pyblish.api.InstancePlugin, hosts = ["houdini"] targets = ["local", "remote"] label = "Collect Chunk Size" - chunkSize = 999999 + chunk_size = 999999 def process(self, instance): # need to get the chunk size info from the setting attr_values = self.get_attr_values_from_data(instance.data) instance.data["chunkSize"] = attr_values.get("chunkSize") - @classmethod - def apply_settings(cls, project_settings): - project_setting = project_settings["houdini"]["publish"]["CollectChunkSize"] # noqa - cls.chunkSize = project_setting["chunk_size"] - @classmethod def get_attribute_defs(cls): return [ @@ -33,7 +28,6 @@ class CollectChunkSize(pyblish.api.InstancePlugin, minimum=1, maximum=999999, decimals=0, - default=cls.chunkSize, + default=cls.chunk_size, label="Frame Per Task") - ] From 3de0c8ed66c521119d8847df19735fec86bcb143 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 11 Dec 2023 12:50:47 +0200 Subject: [PATCH 18/37] add missing settings --- .../defaults/project_settings/houdini.json | 12 +++-- .../schemas/schema_houdini_create.json | 4 ++ .../schemas/schema_houdini_publish.json | 50 +++++++++---------- .../houdini/server/settings/create.py | 7 +++ .../houdini/server/settings/publish.py | 17 +++++++ 5 files changed, 62 insertions(+), 28 deletions(-) diff --git a/openpype/settings/defaults/project_settings/houdini.json b/openpype/settings/defaults/project_settings/houdini.json index 0001b23967..813e7153ea 100644 --- a/openpype/settings/defaults/project_settings/houdini.json +++ b/openpype/settings/defaults/project_settings/houdini.json @@ -62,6 +62,12 @@ "Main" ] }, + "CreateMantraIFD": { + "enabled": true, + "default_variants": [ + "Main" + ] + }, "CreateMantraROP": { "enabled": true, "default_variants": [ @@ -137,14 +143,14 @@ } }, "publish": { + "CollectAssetHandles": { + "use_asset_handles": true + }, "CollectChunkSize": { "enabled": true, "optional": true, "chunk_size": 999999 }, - "CollectAssetHandles": { - "use_asset_handles": true - }, "ValidateContainers": { "enabled": true, "optional": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json index f37738c4ec..213ec9d04e 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json @@ -69,6 +69,10 @@ "key": "CreateKarmaROP", "label": "Create Karma ROP" }, + { + "key": "CreateMantraIFD", + "label": "Create Mantra IFD" + }, { "key": "CreateMantraROP", "label": "Create Mantra ROP" diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json index 935c2a4c35..aaaf4311b7 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json @@ -25,6 +25,31 @@ } ] }, + { + "type": "dict", + "collapsible": true, + "checkbox_key": "enabled", + "key": "CollectChunkSize", + "label": "Collect Chunk Size", + "is_group": true, + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "boolean", + "key": "optional", + "label": "Optional" + }, + { + "type": "number", + "key": "chunk_size", + "label": "Frames Per Task" + } + ] + }, { "type": "label", "label": "Validators" @@ -55,31 +80,6 @@ } ] }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectChunkSize", - "label": "Collect Chunk Size", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Frames Per Task" - } - ] - }, { "type": "dict", "collapsible": true, diff --git a/server_addon/houdini/server/settings/create.py b/server_addon/houdini/server/settings/create.py index e8db917849..a5ca4d477b 100644 --- a/server_addon/houdini/server/settings/create.py +++ b/server_addon/houdini/server/settings/create.py @@ -52,6 +52,9 @@ class CreatePluginsModel(BaseSettingsModel): CreateKarmaROP: CreatorModel = Field( default_factory=CreatorModel, title="Create Karma ROP") + CreateMantraIFD: CreatorModel = Field( + default_factory=CreatorModel, + title="Create Mantra IFD") CreateMantraROP: CreatorModel = Field( default_factory=CreatorModel, title="Create Mantra ROP") @@ -114,6 +117,10 @@ DEFAULT_HOUDINI_CREATE_SETTINGS = { "enabled": True, "default_variants": ["Main"] }, + "CreateMantraIFD": { + "enabled": True, + "default_variants": ["Main"] + }, "CreateMantraROP": { "enabled": True, "default_variants": ["Main"] diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 92a676b0d0..692c7b2fa0 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -13,6 +13,14 @@ class CollectAssetHandlesModel(BaseSettingsModel): title="Use asset handles") +class CollectChunkSizeModel(BaseSettingsModel): + """Collect Chunk Size.""" + enabled: bool = Field(title="Enabled") + optional: bool = Field(title="Optional") + chunk_size: int = Field( + title="Frames Per Task") + + class ValidateWorkfilePathsModel(BaseSettingsModel): enabled: bool = Field(title="Enabled") optional: bool = Field(title="Optional") @@ -38,6 +46,10 @@ class PublishPluginsModel(BaseSettingsModel): title="Collect Asset Handles.", section="Collectors" ) + CollectChunkSize: CollectChunkSizeModel = Field( + default_factory=CollectChunkSizeModel, + title="Collect Chunk Size." + ) ValidateContainers: BasicValidateModel = Field( default_factory=BasicValidateModel, title="Validate Latest Containers.", @@ -63,6 +75,11 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { "CollectAssetHandles": { "use_asset_handles": True }, + "CollectChunkSize" : { + "enabled": True, + "optional": True, + "chunk_size": 999999 + }, "ValidateContainers": { "enabled": True, "optional": True, From b6291e2b6721d7bfdc63d9eccff6e84c54fa714f Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 11 Dec 2023 12:51:08 +0200 Subject: [PATCH 19/37] bump houdini addon patch version --- server_addon/houdini/server/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/server/version.py b/server_addon/houdini/server/version.py index 75cf7831c4..6232f7ab18 100644 --- a/server_addon/houdini/server/version.py +++ b/server_addon/houdini/server/version.py @@ -1 +1 @@ -__version__ = "0.2.9" +__version__ = "0.2.10" From 69ed6f5d20a685f8cf94f58e9a6c926b23d13262 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 11 Dec 2023 13:00:32 +0200 Subject: [PATCH 20/37] resolve hound - Remove redundant white space --- server_addon/houdini/server/settings/publish.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 692c7b2fa0..f551b3a209 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -75,7 +75,7 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { "CollectAssetHandles": { "use_asset_handles": True }, - "CollectChunkSize" : { + "CollectChunkSize": { "enabled": True, "optional": True, "chunk_size": 999999 From 6d36857fe8026f793d30cabc15bb5e1d432e3570 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 11 Dec 2023 11:19:43 +0000 Subject: [PATCH 21/37] Testing: Validate errors and failed status from Deadline jobs. (#5986) * Validate errors from Deadline jobs. * Check dependency chain and failed jobs. * Houd * Fix wrong datatype It failed on expecting string but receiving dictionary. --------- Co-authored-by: kalisp --- tests/lib/testing_classes.py | 57 +++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/tests/lib/testing_classes.py b/tests/lib/testing_classes.py index 7a90f76662..ade38d60c8 100644 --- a/tests/lib/testing_classes.py +++ b/tests/lib/testing_classes.py @@ -481,7 +481,7 @@ class DeadlinePublishTest(PublishTest): while not valid_date_finished: time.sleep(0.5) if time.time() - time_start > timeout: - raise ValueError("Timeout for DL finish reached") + raise ValueError("Timeout for Deadline finish reached") response = requests.get(url, timeout=10) if not response.ok: @@ -491,6 +491,61 @@ class DeadlinePublishTest(PublishTest): if not response.json(): raise ValueError("Couldn't find {}".format(deadline_job_id)) + job = response.json()[0] + + def recursive_dependencies(job, results=None): + if results is None: + results = [] + + for dependency in job["Props"]["Dep"]: + dependency = requests.get( + "{}/api/jobs?JobId={}".format( + deadline_url, dependency["JobID"] + ), + timeout=10 + ).json()[0] + results.append(dependency) + grand_dependencies = recursive_dependencies( + dependency, results=results + ) + for grand_dependency in grand_dependencies: + if grand_dependency not in results: + results.append(grand_dependency) + return results + + job_status = { + 0: "Unknown", + 1: "Active", + 2: "Suspended", + 3: "Completed", + 4: "Failed", + 6: "Pending" + } + + jobs_to_validate = [job] + jobs_to_validate.extend(recursive_dependencies(job)) + failed_jobs = [] + errors = [] + for job in jobs_to_validate: + if "Failed" == job_status[job["Stat"]]: + failed_jobs.append(str(job)) + + resp_error = requests.get( + "{}/api/jobreports?JobID={}&Data=allerrorcontents".format( + deadline_url, job["_id"] + ), + timeout=10 + ) + errors.extend(resp_error.json()) + + msg = "Errors in Deadline:\n" + msg += "\n".join(errors) + assert not errors, msg + + msg = "Failed in Deadline:\n" + msg += "\n".join(failed_jobs) + assert not failed_jobs, msg + # '0001-...' returned until job is finished valid_date_finished = response.json()[0]["DateComp"][:4] != "0001" From 2d73f6a6aaa5e54134cf7b43dc4402609529cf06 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 11 Dec 2023 12:51:58 +0100 Subject: [PATCH 22/37] Chore: Staging mode determination (#5895) * use 'is_staging_enabled' to determine if staging resource is used * fix bug in 'is_running_staging' --- openpype/lib/openpype_version.py | 2 +- openpype/resources/__init__.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/lib/openpype_version.py b/openpype/lib/openpype_version.py index 1c8356d5fe..5618eb0c2e 100644 --- a/openpype/lib/openpype_version.py +++ b/openpype/lib/openpype_version.py @@ -140,7 +140,7 @@ def is_running_staging(): latest_version = get_latest_version(local=False, remote=True) staging_version = latest_version - if current_version == production_version: + if current_version == staging_version: return True return is_staging_enabled() diff --git a/openpype/resources/__init__.py b/openpype/resources/__init__.py index b33d1bf023..c429fb8c3e 100644 --- a/openpype/resources/__init__.py +++ b/openpype/resources/__init__.py @@ -1,6 +1,6 @@ import os from openpype import AYON_SERVER_ENABLED -from openpype.lib.openpype_version import is_running_staging +from openpype.lib.openpype_version import is_staging_enabled RESOURCES_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -59,7 +59,7 @@ def get_openpype_icon_filepath(staging=None): return get_resource("icons", "AYON_icon_dev.png") if staging is None: - staging = is_running_staging() + staging = is_staging_enabled() if staging: return get_openpype_staging_icon_filepath() @@ -68,7 +68,7 @@ def get_openpype_icon_filepath(staging=None): def get_openpype_splash_filepath(staging=None): if staging is None: - staging = is_running_staging() + staging = is_staging_enabled() if AYON_SERVER_ENABLED: if os.getenv("AYON_USE_DEV") == "1": From 72e980b1e493c185794900ff59dfcb9e888f838a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 11 Dec 2023 12:58:38 +0100 Subject: [PATCH 23/37] keys in hierarchyContext are always names --- .../standalonepublisher/plugins/publish/collect_hierarchy.py | 4 ++-- .../traypublisher/plugins/publish/collect_shot_instances.py | 4 ++-- openpype/plugins/publish/collect_hierarchy.py | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/standalonepublisher/plugins/publish/collect_hierarchy.py b/openpype/hosts/standalonepublisher/plugins/publish/collect_hierarchy.py index 9109bf6726..eb06875601 100644 --- a/openpype/hosts/standalonepublisher/plugins/publish/collect_hierarchy.py +++ b/openpype/hosts/standalonepublisher/plugins/publish/collect_hierarchy.py @@ -257,8 +257,6 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin): if 'shot' not in instance.data.get('family', ''): continue - name = instance.data["asset"] - # get handles handle_start = int(instance.data["handleStart"]) handle_end = int(instance.data["handleEnd"]) @@ -286,6 +284,8 @@ class CollectHierarchyContext(pyblish.api.ContextPlugin): parents = instance.data.get('parents', []) self.log.debug(f"parents: {pformat(parents)}") + # Split by '/' for AYON where asset is a path + name = instance.data["asset"].split("/")[-1] actual = {name: in_info} for parent in reversed(parents): diff --git a/openpype/hosts/traypublisher/plugins/publish/collect_shot_instances.py b/openpype/hosts/traypublisher/plugins/publish/collect_shot_instances.py index e00ac64244..b99b634da1 100644 --- a/openpype/hosts/traypublisher/plugins/publish/collect_shot_instances.py +++ b/openpype/hosts/traypublisher/plugins/publish/collect_shot_instances.py @@ -155,8 +155,6 @@ class CollectShotInstance(pyblish.api.InstancePlugin): else {} ) - asset_name = instance.data["asset"] - # get handles handle_start = int(instance.data["handleStart"]) handle_end = int(instance.data["handleEnd"]) @@ -177,6 +175,8 @@ class CollectShotInstance(pyblish.api.InstancePlugin): parents = instance.data.get('parents', []) + # Split by '/' for AYON where asset is a path + asset_name = instance.data["asset"].split("/")[-1] actual = {asset_name: in_info} for parent in reversed(parents): diff --git a/openpype/plugins/publish/collect_hierarchy.py b/openpype/plugins/publish/collect_hierarchy.py index b5fd1e4bb9..32f10ba4c8 100644 --- a/openpype/plugins/publish/collect_hierarchy.py +++ b/openpype/plugins/publish/collect_hierarchy.py @@ -61,8 +61,9 @@ class CollectHierarchy(pyblish.api.ContextPlugin): "resolutionHeight": instance.data["resolutionHeight"], "pixelAspect": instance.data["pixelAspect"] } - - actual = {instance.data["asset"]: shot_data} + # Split by '/' for AYON where asset is a path + name = instance.data["asset"].split("/")[-1] + actual = {name: shot_data} for parent in reversed(instance.data["parents"]): next_dict = {} From 8a3a318480699e3f12866e0783973338c6bbfc05 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 11 Dec 2023 12:59:18 +0100 Subject: [PATCH 24/37] modify extract hierarchy to ayon to work with names --- .../publish/extract_hierarchy_to_ayon.py | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/openpype/plugins/publish/extract_hierarchy_to_ayon.py b/openpype/plugins/publish/extract_hierarchy_to_ayon.py index ef69369d67..8f791a6093 100644 --- a/openpype/plugins/publish/extract_hierarchy_to_ayon.py +++ b/openpype/plugins/publish/extract_hierarchy_to_ayon.py @@ -223,23 +223,24 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): valid_ids = set() hierarchy_queue = collections.deque() - hierarchy_queue.append((project_id, project_children_context)) + hierarchy_queue.append((project_id, "", project_children_context)) while hierarchy_queue: queue_item = hierarchy_queue.popleft() - parent_id, children_context = queue_item + parent_id, parent_path, children_context = queue_item if not children_context: continue - for asset, asset_info in children_context.items(): + for folder_name, folder_info in children_context.items(): + folder_path = "{}/{}".format(parent_path, folder_name) if ( - asset not in active_folder_paths - and not asset_info.get("childs") + folder_path not in active_folder_paths + and not folder_info.get("childs") ): continue - asset_name = asset.split("/")[-1] + item_id = uuid.uuid4().hex - new_item = copy.deepcopy(asset_info) - new_item["name"] = asset_name + new_item = copy.deepcopy(folder_info) + new_item["name"] = folder_name new_item["children"] = [] new_children_context = new_item.pop("childs", None) tasks = new_item.pop("tasks", {}) @@ -253,9 +254,11 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): items_by_id[item_id] = new_item parent_id_by_item_id[item_id] = parent_id - if asset in active_folder_paths: + if folder_path in active_folder_paths: valid_ids.add(item_id) - hierarchy_queue.append((item_id, new_children_context)) + hierarchy_queue.append( + (item_id, folder_path, new_children_context) + ) if not valid_ids: return None From c1cba8640fb7da4222acde29b8261c77e71aa65b Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Mon, 11 Dec 2023 15:52:12 +0100 Subject: [PATCH 25/37] convert the createAt value to local timezone --- openpype/client/server/conversion_utils.py | 2 +- openpype/tools/ayon_loader/models/products.py | 2 +- openpype/tools/ayon_workfiles/models/workfiles.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/client/server/conversion_utils.py b/openpype/client/server/conversion_utils.py index 51af99e722..e8d3c4cbe4 100644 --- a/openpype/client/server/conversion_utils.py +++ b/openpype/client/server/conversion_utils.py @@ -606,7 +606,7 @@ def convert_v4_version_to_v3(version): output_data[dst_key] = version[src_key] if "createdAt" in version: - created_at = arrow.get(version["createdAt"]) + created_at = arrow.get(version["createdAt"]).to("local") output_data["time"] = created_at.strftime("%Y%m%dT%H%M%SZ") output["data"] = output_data diff --git a/openpype/tools/ayon_loader/models/products.py b/openpype/tools/ayon_loader/models/products.py index daa36aefdc..135f28df97 100644 --- a/openpype/tools/ayon_loader/models/products.py +++ b/openpype/tools/ayon_loader/models/products.py @@ -44,7 +44,7 @@ def version_item_from_entity(version): # NOTE There is also 'updatedAt', should be used that instead? # TODO skip conversion - converting to '%Y%m%dT%H%M%SZ' is because # 'PrettyTimeDelegate' expects it - created_at = arrow.get(version["createdAt"]) + created_at = arrow.get(version["createdAt"]).to("local") published_time = created_at.strftime("%Y%m%dT%H%M%SZ") author = version["author"] version_num = version["version"] diff --git a/openpype/tools/ayon_workfiles/models/workfiles.py b/openpype/tools/ayon_workfiles/models/workfiles.py index 907b9b5383..d74a8e164d 100644 --- a/openpype/tools/ayon_workfiles/models/workfiles.py +++ b/openpype/tools/ayon_workfiles/models/workfiles.py @@ -606,7 +606,7 @@ class PublishWorkfilesModel: print("Failed to format workfile path: {}".format(exc)) dirpath, filename = os.path.split(workfile_path) - created_at = arrow.get(repre_entity["createdAt"]) + created_at = arrow.get(repre_entity["createdAt"].to("local")) return FileItem( dirpath, filename, From d66bac0f145e39228804dace2f42190131ad4b68 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 11 Dec 2023 17:50:48 +0100 Subject: [PATCH 26/37] Tests: update after thumbnail default change (#6040) * Updates to tests because of default Thumbnail non integration Some previous PR changed default behavior of Thumbnail, they are not integrated anymore. Tests were expecting they are. Change in AE local render is required to match behavior and provide Colorspace handling. * Updates to tests because of default Thumbnail non integration Missed values * Updates to tests because of default Thumbnail non integration Missed values --- .../plugins/publish/extract_local_render.py | 5 +++-- .../test_deadline_publish_in_aftereffects.py | 4 ++-- ..._publish_in_aftereffects_multicomposition.py | 4 ++-- .../test_publish_in_aftereffects.py | 4 ++-- .../test_publish_in_aftereffects_legacy.py | 6 +++--- .../test_publish_in_aftereffects_multiframe.py | 4 ++-- .../hosts/maya/test_deadline_publish_in_maya.py | 4 ++-- ...st_asset_renderTest_taskMain_beauty_v001.jpg | Bin 77035 -> 0 bytes .../hosts/nuke/test_deadline_publish_in_nuke.py | 4 ++-- 9 files changed, 18 insertions(+), 17 deletions(-) delete mode 100644 tests/integration/hosts/maya/test_deadline_publish_in_maya/expected/test_project/test_asset/publish/render/renderTest_taskMain_beauty/v001/test_project_test_asset_renderTest_taskMain_beauty_v001.jpg diff --git a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py index bdb48e11f8..b44e986d83 100644 --- a/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py +++ b/openpype/hosts/aftereffects/plugins/publish/extract_local_render.py @@ -60,8 +60,9 @@ class ExtractLocalRender(publish.Extractor): first_repre = not representations if instance.data["review"] and first_repre: repre_data["tags"] = ["review"] - thumbnail_path = os.path.join(staging_dir, files[0]) - instance.data["thumbnailSource"] = thumbnail_path + # TODO return back when Extract from source same as regular + # thumbnail_path = os.path.join(staging_dir, files[0]) + # instance.data["thumbnailSource"] = thumbnail_path representations.append(repre_data) diff --git a/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects.py index 30761693a8..1aa612207d 100644 --- a/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects.py @@ -60,7 +60,7 @@ class TestDeadlinePublishInAfterEffects(AEDeadlinePublishTestClass): name="renderTest_taskMain")) failures.append( - DBAssert.count_of_types(dbcon, "representation", 4)) + DBAssert.count_of_types(dbcon, "representation", 3)) additional_args = {"context.subset": "workfileTest_task", "context.ext": "aep"} @@ -77,7 +77,7 @@ class TestDeadlinePublishInAfterEffects(AEDeadlinePublishTestClass): additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", diff --git a/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects_multicomposition.py b/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects_multicomposition.py index 0e9cd3b00d..4254b951b5 100644 --- a/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects_multicomposition.py +++ b/tests/integration/hosts/aftereffects/test_deadline_publish_in_aftereffects_multicomposition.py @@ -71,7 +71,7 @@ class TestDeadlinePublishInAfterEffectsMultiComposition(AEDeadlinePublishTestCla name="renderTest_taskMain2")) failures.append( - DBAssert.count_of_types(dbcon, "representation", 5)) + DBAssert.count_of_types(dbcon, "representation", 4)) additional_args = {"context.subset": "workfileTest_task", "context.ext": "aep"} @@ -89,7 +89,7 @@ class TestDeadlinePublishInAfterEffectsMultiComposition(AEDeadlinePublishTestCla additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py index 2e4f343a5a..f13043d8bb 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects.py @@ -58,7 +58,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): name="renderTest_taskMain")) failures.append( - DBAssert.count_of_types(dbcon, "representation", 4)) + DBAssert.count_of_types(dbcon, "representation", 3)) additional_args = {"context.subset": "workfileTest_task", "context.ext": "aep"} @@ -75,7 +75,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_legacy.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_legacy.py index a62036e4a7..b99db24e75 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_legacy.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_legacy.py @@ -60,7 +60,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): name="renderTest_taskMain")) failures.append( - DBAssert.count_of_types(dbcon, "representation", 4)) + DBAssert.count_of_types(dbcon, "representation", 2)) additional_args = {"context.subset": "workfileTest_task", "context.ext": "aep"} @@ -77,7 +77,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", @@ -89,7 +89,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", diff --git a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_multiframe.py b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_multiframe.py index dcf34844d1..bd9d3e9b50 100644 --- a/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_multiframe.py +++ b/tests/integration/hosts/aftereffects/test_publish_in_aftereffects_multiframe.py @@ -45,7 +45,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): name="renderTest_taskMain")) failures.append( - DBAssert.count_of_types(dbcon, "representation", 4)) + DBAssert.count_of_types(dbcon, "representation", 3)) additional_args = {"context.subset": "workfileTest_task", "context.ext": "aep"} @@ -62,7 +62,7 @@ class TestPublishInAfterEffects(AELocalPublishTestClass): additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", diff --git a/tests/integration/hosts/maya/test_deadline_publish_in_maya.py b/tests/integration/hosts/maya/test_deadline_publish_in_maya.py index 7d2b409db3..79d6c22a26 100644 --- a/tests/integration/hosts/maya/test_deadline_publish_in_maya.py +++ b/tests/integration/hosts/maya/test_deadline_publish_in_maya.py @@ -54,7 +54,7 @@ class TestDeadlinePublishInMaya(MayaDeadlinePublishTestClass): DBAssert.count_of_types(dbcon, "subset", 1, name="workfileTest_task")) - failures.append(DBAssert.count_of_types(dbcon, "representation", 8)) + failures.append(DBAssert.count_of_types(dbcon, "representation", 7)) # hero included additional_args = {"context.subset": "modelMain", @@ -85,7 +85,7 @@ class TestDeadlinePublishInMaya(MayaDeadlinePublishTestClass): additional_args = {"context.subset": "renderTest_taskMain_beauty", "context.ext": "jpg"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain_beauty", diff --git a/tests/integration/hosts/maya/test_deadline_publish_in_maya/expected/test_project/test_asset/publish/render/renderTest_taskMain_beauty/v001/test_project_test_asset_renderTest_taskMain_beauty_v001.jpg b/tests/integration/hosts/maya/test_deadline_publish_in_maya/expected/test_project/test_asset/publish/render/renderTest_taskMain_beauty/v001/test_project_test_asset_renderTest_taskMain_beauty_v001.jpg deleted file mode 100644 index 79ff799e8b063ba841c0566523d91de5c87a0c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77035 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 diff --git a/tests/integration/hosts/nuke/test_deadline_publish_in_nuke.py b/tests/integration/hosts/nuke/test_deadline_publish_in_nuke.py index a4026f195b..586078ead6 100644 --- a/tests/integration/hosts/nuke/test_deadline_publish_in_nuke.py +++ b/tests/integration/hosts/nuke/test_deadline_publish_in_nuke.py @@ -69,7 +69,7 @@ class TestDeadlinePublishInNuke(NukeDeadlinePublishTestClass): name="workfileTest_task")) failures.append( - DBAssert.count_of_types(dbcon, "representation", 4)) + DBAssert.count_of_types(dbcon, "representation", 3)) additional_args = {"context.subset": "workfileTest_task", "context.ext": "nk"} @@ -86,7 +86,7 @@ class TestDeadlinePublishInNuke(NukeDeadlinePublishTestClass): additional_args = {"context.subset": "renderTest_taskMain", "name": "thumbnail"} failures.append( - DBAssert.count_of_types(dbcon, "representation", 1, + DBAssert.count_of_types(dbcon, "representation", 0, additional_args=additional_args)) additional_args = {"context.subset": "renderTest_taskMain", From ac49ab3803a993238eb77ed0eb04731bdeba8d52 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 12 Dec 2023 12:53:31 +0100 Subject: [PATCH 27/37] fill template data for editorial --- openpype/plugins/publish/collect_resources_path.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/openpype/plugins/publish/collect_resources_path.py b/openpype/plugins/publish/collect_resources_path.py index 0f29fec054..9298ffe10c 100644 --- a/openpype/plugins/publish/collect_resources_path.py +++ b/openpype/plugins/publish/collect_resources_path.py @@ -68,7 +68,6 @@ class CollectResourcesPath(pyblish.api.InstancePlugin): ] def process(self, instance): - anatomy = instance.context.data["anatomy"] template_data = copy.deepcopy(instance.data["anatomyData"]) @@ -86,6 +85,18 @@ class CollectResourcesPath(pyblish.api.InstancePlugin): "hierarchy": instance.data["hierarchy"] }) + # Add fill keys for editorial publishing creating new entity + # TODO handle in editorial plugin + if ( + instance.data.get("newAssetPublishing") + and "asset" not in template_data + ): + asset_name = instance.data["asset"].split("/")[-1] + template_data["asset"] = asset_name + template_data["folder"] = { + "name": asset_name + } + publish_templates = anatomy.templates_obj["publish"] if "folder" in publish_templates: publish_folder = publish_templates["folder"].format_strict( From 476921ce7ad3207e414a129c20de55fb22cd7006 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 12 Dec 2023 13:55:41 +0100 Subject: [PATCH 28/37] move hierarchy key fill under 'newAssetPublishing' condition --- .../plugins/publish/collect_resources_path.py | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/openpype/plugins/publish/collect_resources_path.py b/openpype/plugins/publish/collect_resources_path.py index 9298ffe10c..af0ef17789 100644 --- a/openpype/plugins/publish/collect_resources_path.py +++ b/openpype/plugins/publish/collect_resources_path.py @@ -79,23 +79,18 @@ class CollectResourcesPath(pyblish.api.InstancePlugin): "representation": "TEMP" }) - # For the first time publish - if instance.data.get("hierarchy"): - template_data.update({ - "hierarchy": instance.data["hierarchy"] - }) - # Add fill keys for editorial publishing creating new entity # TODO handle in editorial plugin - if ( - instance.data.get("newAssetPublishing") - and "asset" not in template_data - ): - asset_name = instance.data["asset"].split("/")[-1] - template_data["asset"] = asset_name - template_data["folder"] = { - "name": asset_name - } + if instance.data.get("newAssetPublishing"): + if "hierarchy" not in instance.data: + template_data["hierarchy"] = instance.data["hierarchy"] + + if "asset" not in template_data: + asset_name = instance.data["asset"].split("/")[-1] + template_data["asset"] = asset_name + template_data["folder"] = { + "name": asset_name + } publish_templates = anatomy.templates_obj["publish"] if "folder" in publish_templates: From 755ef2e8655fc7fd8fc90903e705ae3a9d05e082 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Tue, 12 Dec 2023 14:35:11 +0000 Subject: [PATCH 29/37] [Automated] Release --- CHANGELOG.md | 1098 +++++++++++++++++++++++++++++++++++++++++++ openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 1100 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5909c26f7e..fdba44b7bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,1104 @@ # Changelog +## [3.17.7](https://github.com/ynput/OpenPype/tree/3.17.7) + + +[Full Changelog](https://github.com/ynput/OpenPype/compare/3.17.6...3.17.7) + +### **πŸ†• New features** + + +
+AYON: Use folder path as unique identifier #5817 + +Use folder path instead of asset name as unique identifier, with OpenPype compatibility. + + +___ + +
+ + +
+Houdini: Farm caching submission to Deadline #4903 + +Implements functionality to offload instances of the specific families to be processed on Deadline instead of locally. This increases productivity as artist can use local machine could be used for other tasks.Implemented for families: +- [x] ass +- [x] redshift proxy +- [x] ifd +- [x] abc +- [x] bgeo +- [x] vdb + + +___ + +
+ + +
+Houdini: Add support to split Deadline render tasks in export + render #5420 + +This adds initial support in Houdini so when submitting render jobs to Deadline it's not running as a single Houdini task but rather it gets split in two different tasks: Export + Render. This way it's more efficient as we only need a Houdini license during the export step and the render tasks can run exclusively with a render license. Moreover, we aren't wasting all the overhead time of opening the render scene in Houdini for every frame.I have also added the corresponding settings json files so we can set some of the default values for the Houdini deadline submitter. + + +___ + +
+ + +
+Wrap: new integration #5823 + +These modifications are necessary for adding Wrap integration (DCC handling scans and textures) . + + +___ + +
+ + +
+AYON: Prepare for 'data' via graphql #5923 + +AYON server does support to query 'data' field for hierarchy entities (project > ... > representation) using GraphQl since version 0.5.5. Because of this PR in ayon-python-api it is required to modify custom graphql function in `openpype.client` to support that option. + + +___ + +
+ + +
+Chore AYON: AYON addon class #5937 + +Introduced base class for AYON addon in openpype modules discovery logic. + + +___ + +
+ + +
+Asset Usage Reporter Tool #5946 + +This adds simple tool for OpenPype mode that will go over all published workfiles and print linked assets and their version:This is created per project and can be exported in csv file or copied to clipboard in _"ASCII Human readable form"_. + + +___ + +
+ + +
+Testing: dump_databases flag #5955 + +This introduces a `dump_databases` flag which makes it convenient to output the resulting database of a successful test run. The flag supports two formats; `bson` and `json`.Due to outputting to the test data folder, when dumping the databases, the test data folder will persist.Split from https://github.com/ynput/OpenPype/pull/5644 + + +___ + +
+ + +
+SiteSync: implemented in Ayon Loader #5962 + +Implemented `Availability` column in Ayon loader and redo of loaders to `ActionItems` in representation window there. + + +___ + +
+ + +
+AYON: Workfile template build works #5975 + +Modified workfile template builder to work, to some degree, in AYON mode. + + +___ + +
+ +### **πŸš€ Enhancements** + + +
+Maya: Small Tweaks on Validator for Look Default Shader Connection for Maya 2024 #5957 + +Resolve https://github.com/ynput/OpenPype/issues/5269 + + +___ + +
+ + +
+Settings: Changes in default settings #5983 + +We've made some changes in the default settings as several application versions were obsolete (Maya 18, Nuke 11, PS 2020, etc). Also added tools and changed settings for Blender, Maya, and Blender. + +All should work as usual. +___ + +
+ + +
+Testing: Do not persist data by default in Maya/Deadline. #5987 + +This is similar to the Maya publishing test. + + +___ + +
+ + +
+Max: Validate loaded plugins tweaks #5820 + +In the current development of 3dsMax, users need to use separate validators to validate if certain plugins being loaded before the extraction. For example, usd extractor in model family, prt/tycache extractor in pointcloud/tycache family.But with the PR where implements optional validate loaded plugin, users just need to put what kind of plugins they want to validate in the settings. They no longer need to go through all the separate plugin validators when publishing, and only one validator would do all the check on the loaded plugins before extraction. + + +___ + +
+ + +
+Nuke: Change context label enhancement #5887 + +Use QAction to change label of context label in Nuke pipeline menu. + + +___ + +
+ + +
+Chore: Do not use template data as source for context #5918 + +Use available information on context to receive context data instead of using `"anatomyData"` during publishing. + + +___ + +
+ + +
+Houdini: Add python3.10 libs for Houdini 20 startup #5932 + +Add python3.10 libs for Houdini 20 startup + + +___ + +
+ + +
+General: Use colorspace data when creating thumbnail #5938 + +Thumbnails with applied colormanagement. + + +___ + +
+ + +
+Ftrack: rewriting component creation to support multiple thumbnails #5939 + +The creation of Ftrack components needs to allow for multiple thumbnails. This is important in situations where there could be several reviewable streams, like in the case of a nuke intermediate files preset. Customers have asked for unique thumbnails for each data stream.For instance, one stream might contain a baked LUT file along with Display and View. Another stream might only include the baked Display and View. These variations can change the overall look. Thus, we found it necessary to depict these differences via thumbnails. + + +___ + +
+ + +
+Chore: PySide6 tree view style #5940 + +Define solid color for background of branch in QTreeView. + + +___ + +
+ + +
+Nuke: Explicit Thumbnail workflow #5941 + +Nuke made a shift from using its own plugin to a global one for thumbnail creation. This was because it had to handle several thumbnail workflows for baking intermediate data streams. To manage this, the global plugin had to be upgraded. Now, each baking stream can set a unique tag 'need_thumbnail'. This tag is used to mark representations that need a thumbnail. + + +___ + +
+ + +
+Global: extract thumbnail with new settings #5944 + +Settings are now configurable for the following: +- target size of thumbnail - source or constrained to specific +- where should be frame taken from in sequence or video file +- if thumbnail should be integrated or not +- background color for letter boxes +- added AYON settings + + +___ + +
+ + +
+RoyalRender: inject submitter environment to the royal render job #5958 + +This is an attempt to solve runtime environment injection for render jobs in RoyalRender as there is no easy way to implement something like `GlobalJobPreload` logic in Deadline. Idea is to inject OpenPype environments directly to the job itself. + + +___ + +
+ + +
+General: Use manual thumbnail if present when publishing #5969 + +Use manual thumbnail added to the publisher instead of using it from published representation. + + +___ + +
+ + +
+AYON: Change of server url should work as expected #5971 + +Using login action in tray menu to change server url should correctly start new process without issues of missing bundle or previous url. + + +___ + +
+ + +
+AYON: make sure the AYON menu bar in 3dsMax is named AYON when AYON launches #5972 + +Renaming the menu bar in 3dsMax for AYON and some cosmetic fix in the docstring + + +___ + +
+ + +
+Resolve: renaming menu to AYON #5974 + +Resolve in Ayon is now having aligned name. + + +___ + +
+ + +
+Hiero: custom tools menu rename #5976 + +- OpenPype Tools are now Custom Tools menu +- fixing order of tools. Create should be first. + + +___ + +
+ + +
+nuke: updating name for custom tools menu item #5977 + +- Ayon variant of settings renamed `Custom Tools` menu item + + +___ + +
+ + +
+fusion: AYON renaming menu #5978 + +Fusion is having Ayon menu. + + +___ + +
+ + +
+Blender: Changed the labels for Layout JSON Extractor #5981 + +Changed the labels for Blender's Layout JSON Extractor. + + +___ + +
+ + +
+Testing: Skip Arnold license for test rendering. #5984 + +Skip license check when rendering for testing. + + +___ + +
+ + +
+Testing: Validate errors and failed status from Deadline jobs. #5986 + +While waiting for the Deadline jobs to finish, we query the errors on the job and its dependent jobs to fail as early as possible. Plus the failed status. + + +___ + +
+ + +
+AYON: rename Openpype Tools as Custom Tools in Maya Host #5991 + +Rename Openpype Tools as Custom Tools in Maya Host in + + +___ + +
+ + +
+AYON: Use AYON label in ayon mode #5995 + +Replaced OpenPype with AYON in AYON mode and added bundle nam to information. + + +___ + +
+ + +
+AYON: Update ayon python api #6002 + +Updated ayon-python-api to '1.0.0-rc.1'. + + +___ + +
+ + +
+Max: Add missing repair action in validate resolution setting #6014 + +Add missing repair action for validate resolution setting + + +___ + +
+ + +
+Add the AYON/OP settings to enable extractor for model family in 3dsmax #6027 + +Add the AYON/OP settings to enable extractor for model family in 3dsmax + + +___ + +
+ + +
+Bugfix: Fix error message formatting if ayon executable can't be found by deadline #6028 + +Without this fix the error message would report executables string with `;` between EACH character, similar to this PR: https://github.com/ynput/OpenPype/pull/5815However that PR apparently missed also fixing it in `GlobalJobPreLoad` and only fixed it in `Ayon.py` plugin. + + +___ + +
+ + +
+Show slightly different info in AYON mode #6031 + +This PR changes what is shown in Tray menu in AYON mode. Previously, it showed version of OpenPype that is very confusing in AYON mode. So this now shows AYON version instead. When clicked, it will opene AYON info window, where OpenPype version is now added, for debugging purposes. + + +___ + +
+ + +
+AYON Editorial: Hierarchy context have names as keys #6041 + +Use folder name as keys in `hierarchyContext` and modify hierachy extraction accordingly. + + +___ + +
+ + +
+AYON: Convert the createAt value to local timezone #6043 + +Show correct create time in UIs. + + +___ + +
+ +### **πŸ› Bug fixes** + + +
+Maya: Render creation - fix broken imports #5893 + +Maya specific imports were moved to specific methods but not in all cases by #5775. This is just quickly restoring functionality without questioning that decision. + + +___ + +
+ + +
+Maya: fix crashing model renderset collector #5929 + +This fix is handling case where model is in some type of render sets but no other connections are made there. Publishing this model would fail with `RuntimeError: Found no items to list the history for.` + + +___ + +
+ + +
+Maya: Remove duplicated attributes of MTOA verbosity level #5945 + +Remove duplicated attributes implementation mentioned in https://github.com/ynput/OpenPype/pull/5931#discussion_r1402175289 + + +___ + +
+ + +
+Maya: Bug fix Redshift Proxy not being successfully published #5956 + +Bug fix redshift proxy family not being successfully published due to the error found in integrate.py + + +___ + +
+ + +
+Maya: Bug fix load image for texturesetMain #6011 + +Bug fix load image with file node for texturesetMain + + +___ + +
+ + +
+Maya: bug fix the repair function in validate_rendersettings #6021 + +The following error has been encountered below: +``` +// pyblish.pyblish.plugin.Action : Finding failed instances.. +// pyblish.pyblish.plugin.Action : Attempting repair for instance: renderLookdevMain ... +// Error: pyblish.plugin : Traceback (most recent call last): +// File "C:\Users\lbate\AppData\Local\Ynput\AYON\dependency_packages\ayon_2310271602_windows.zip\dependencies\pyblish\plugin.py", line 527, in __explicit_process +// runner(*args) +// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\pipeline\publish\publish_plugins.py", line 241, in process +// plugin.repair(instance) +// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\hosts\maya\plugins\publish\validate_rendersettings.py", line 395, in repair +// cmds.setAttr("{}.{}".format(node, prefix_attr), +// UnboundLocalError: local variable 'node' referenced before assignment +// Traceback (most recent call last): +// File "C:\Users\lbate\AppData\Local\Ynput\AYON\dependency_packages\ayon_2310271602_windows.zip\dependencies\pyblish\plugin.py", line 527, in __explicit_process +// runner(*args) +// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\pipeline\publish\publish_plugins.py", line 241, in process +// plugin.repair(instance) +// File "C:\Users\lbate\AppData\Local\Ynput\AYON\addons\openpype_3.17.7-nightly.6\openpype\hosts\maya\plugins\publish\validate_rendersettings.py", line 395, in repair +// cmds.setAttr("{}.{}".format(node, prefix_attr), +// UnboundLocalError: local variable 'node' referenced before assignment +``` +This PR is a fix for that + + +___ + +
+ + +
+Fusion: Render avoid unhashable type `BlackmagicFusion.PyRemoteObject` error #5672 + +Fix Fusion 18.6+ support: Avoid issues with Fusion's `BlackmagicFusion.PyRemoteObject` instances being unhashable. +```python +Traceback (most recent call last): + File "E:\openpype\OpenPype\.venv\lib\site-packages\pyblish\plugin.py", line 527, in __explicit_process + runner(*args) + File "E:\openpype\OpenPype\openpype\hosts\fusion\plugins\publish\extract_render_local.py", line 61, in process + result = self.render(instance) + File "E:\openpype\OpenPype\openpype\hosts\fusion\plugins\publish\extract_render_local.py", line 118, in render + with enabled_savers(current_comp, savers_to_render): + File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\contextlib.py", line 119, in __enter__ + return next(self.gen) + File "E:\openpype\OpenPype\openpype\hosts\fusion\plugins\publish\extract_render_local.py", line 33, in enabled_savers + original_states[saver] = original_state +TypeError: unhashable type: 'BlackmagicFusion.PyRemoteObject' +``` + + + +___ + +
+ + +
+Nuke: Validate Nuke Write Nodes refactor to use variable `node_value` instead of `value` #5764 + +Nuke: Validate Nuke Write Nodes refactor to use variable `node_value` instead of `value`The variable `value` only exists as the last variable value in the `for value in values` loop and might not be declared if `values` is an empty iterable. + + +___ + +
+ + +
+resolve: fixing loader handles calculation #5863 + +Resolve was not correctly calculating duration of database related duration. + + +___ + +
+ + +
+Chore: Staging mode determination #5895 + +Resources use `is_staging_enabled` function instead of `is_running_staging` to determine if should use staging icon. And fixed comparison bug in `is_running_staging`. + + +___ + +
+ + +
+AYON: Handle staging templates category #5905 + +Staging anatomy templates category is handled during project templates conversion. The keys are stored into `others` with `"staging_"` prefix. + + +___ + +
+ + +
+Max: fix the subset name not changing accordingly after the variant name changes #5911 + +Resolve #5902 + + +___ + +
+ + +
+AYON: Loader tool bugs hunt #5915 + +Fix issues with invalid representation ids in loaded containers and handle missing product type in server database. + + +___ + +
+ + +
+Publisher: Bugfixes and enhancements #5924 + +Small fixes/enhancements in publisher UI. + + +___ + +
+ + +
+Maya: Supports for additional Job Info and Plugin Info in deadline submission #5931 + +This PR is to resolve some of the attributes such as MTOA's `ArnoldVerbose` are not preserved on farm and users can use the project settings to add the attributes back to either job or plugin Info. + + +___ + +
+ + +
+Bugfix: Houdini license validator missing families #5934 + +Adding missing families to Houdini license validator. + + +___ + +
+ + +
+TrayPublisher: adding back `asset_doc` variable #5943 + +Returning variable which had been removed accidentally in previous PR. + + +___ + +
+ + +
+Settings: Fix ModulesManager init args #5947 + +Remove usage of kwargs to create ModulesManager. + + +___ + +
+ + +
+Blender: Fix Deadline Frames per task #5949 + +Fixed a problem with Frames per task setting not being applied when publishing a render. + + +___ + +
+ + +
+Testing: Fix is_test_failed #5951 + +`is_test_failed` is used (exclusively) on module fixtures to determine whether the tests have failed or not. This determines whether to run tear down code like cleaning up the database and temporary files.But in the module scope `request.node.rep_call` is not available, which results in `is_test_failed` always returning `True`, and no tear down code get executed.The solution was taken from; https://github.com/pytest-dev/pytest/issues/5090 + + +___ + +
+ + +
+Harmony: Fix local rendering #5953 + +Local rendering was throwing warning about license, but didn't fail per se. It just didn't produce anything. + + +___ + +
+ + +
+Testing: hou module should be within class code. #5954 + +`hou` module should be within the class code else we'll get pyblish errors from needing to skip the plugin. + + +___ + +
+ + +
+Maya: Add Label to MayaUSDReferenceLoader #5964 + +As the create placeholder dialog displays the two distinct loaders with the same name, this PR is to distinguish Maya USD Reference Loaders from the loaders of which inherited from. See the screenshot below: + + +___ + +
+ + +
+Max: Bug fix the resolution not being shown correctly in review burnin #5965 + +The resolution is not being shown correctly in review burnin + + +___ + +
+ + +
+AYON: Fix thumbnail integration #5970 + +Thumbnail integration could cause crash of server if thumbnail id was changed for the same entity id multiple times. Modified the code to avoid that issue. + + +___ + +
+ + +
+Photoshop: Updated label in Settings #5980 + +Replaced wrong label from different plugin. + + +___ + +
+ + +
+Photoshop: Fix removed unsupported Path #5996 + +Path is not json serializable by default, it is not necessary, better model reused. + + +___ + +
+ + +
+AYON: Prepare functions for newer ayon-python-api #5997 + +Newer ayon python api will add new filtering options or change order of existing. Kwargs are used in client code to prevent issues on update. + + +___ + +
+ + +
+AYON: Conversion of the new playblast settings in Maya #6000 + +Conversion of the new playblast settings in Maya + + +___ + +
+ + +
+AYON: Bug fix for loading Mesh in Substance Painter as new project not working #6004 + +Substance Painter in AYON can't load mesh for creating a new project + + +___ + +
+ + +
+Deadline: correct webservice couldn't be selected in Ayon #6007 + +Changed the Setting model to mimic more OP approach as it needs to live together for time being. + + +___ + +
+ + +
+AYON tools: Fix refresh thread #6008 + +Trigger 'refresh_finished' signal out of 'run' method. + + +___ + +
+ + +
+Ftrack: multiple reviewable components missing variable #6013 + +Missing variable in code for editorial publishing in traypublisher. + + +___ + +
+ + +
+TVPaint: Expect legacy instances in metadata #6015 + +Do not expect `"workfileInstances"` constains only new type instance data with `creator_identifier`. + + +___ + +
+ + +
+Bugfix: handle missing key in Deadline #6019 + +This quickly fixes bug introduced by #5420 + + +___ + +
+ + +
+Revert `extractenvironments` behaviour #6020 + +This is returning original behaviour of `extractenvironments` command from before #5958 so we restore functionality. + + +___ + +
+ + +
+OP-7535 - Fix renaming composition in AE #6025 + +Removing of `render` instance caused renaming of composition to `dummyComp` which caused issue in publishing in next attempt.This PR stores original composition name(cleaned up for product name creation) and uses it if instance needs to be removed. + + +___ + +
+ + +
+Refactor code to skip instance creation for new assets #6029 + +Publishing effects from hiero during editorial publish is working as expected again. + + +___ + +
+ + +
+Refactor code to handle missing "representations" key in instance data #6032 + +Minor code change for optimisation of thumbnail workflow. + + +___ + +
+ + +
+Traypublisher: editorial preserve clip case sensitivity #6036 + +Keep EDL clip name inheritance with case sensitivity. + + +___ + +
+ + +
+Bugfix/add missing houdini settings #6039 + +add missing settings. now, it looks like this:| Ayon | OpenPype || -- | -- | | | || | | + + +___ + +
+ +### **πŸ”€ Refactored code** + + +
+Maya: Remove RenderSetup layer observers #5836 + +Remove RenderSetup layer observers that are not needed since new publisher since Renderlayer Creators manage these themselves on Collect and Save/Update of instances. + + +___ + +
+ +### **Merged pull requests** + + +
+Tests: Removed render instance #6026 + +This test was created as simple model and workfile publish, without Deadline rendering. Cleaned up render elements. + + +___ + +
+ + +
+Tests: update after thumbnail default change #6040 + +https://github.com/ynput/OpenPype/pull/5944 changed default state of integration of Thumbnails to NOT integrate. This PR updates automatic tests to follow that. + + +___ + +
+ + +
+Houdini: Remove legacy LOPs USD output processors #5861 + +Remove unused/broken legacy code for Houdini Solaris USD LOPs output processors. The code was originally written in Avalon, against early Houdini 18 betas which had a different API for output processors and thus the current state doesn't even work in recent versions of Houdini. + + +___ + +
+ + +
+Chore: Substance Painter Addons for Ayon #5914 + +Substance Painter Addons for Ayon + + +___ + +
+ + +
+Ayon: Updated name of Adobe extension to Ayon #5992 + +This changes name in menu in Adobe extensions to Ayon. + + +___ + +
+ + +
+Chore/houdini update startup log #6003 + +print `Installing AYON ...` on startup when launching houdini from launcher in ayon mode.also update submenu to `ayon_menu` instead of `openpype_menu` + + +___ + +
+ + +
+Revert "Ayon: Updated name of Adobe extension to Ayon" #6010 + +Reverts ynput/OpenPype#5992 + +That PR is only applicable to Ayon. +___ + +
+ + +
+Standalone/Tray Publisher: Remove simple Unreal texture publishing #6012 + +We are removing _simple Unreal Texture publishing_ that was just renaming texture files to fit to Unreal naming conventions but without any additional functionality. We might return this functionality back with better texture publishing system.Related to #5983 + + +___ + +
+ + +
+Deadline: Bump version because of Settings changes for Deadline #6023 + + +___ + +
+ + +
+Change ASCII art in the Console based on the server mode #6030 + +This changes ASCII art in the console based on the AYON/OpenPype mode + + +___ + +
+ + + + ## [3.17.6](https://github.com/ynput/OpenPype/tree/3.17.6) diff --git a/openpype/version.py b/openpype/version.py index cdaafa0559..04ee3fbc5b 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.17.7-nightly.7" +__version__ = "3.17.7" diff --git a/pyproject.toml b/pyproject.toml index 21ba7d1199..018f876e26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.17.6" # OpenPype +version = "3.17.7" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From 5240ec0c60628fdc27ddbf0003d5a60a6ed931e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 12 Dec 2023 14:36:03 +0000 Subject: [PATCH 30/37] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 6f651076ce..5ded53d7fb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -35,6 +35,7 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: + - 3.17.7 - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 @@ -134,7 +135,6 @@ body: - 3.15.3-nightly.4 - 3.15.3-nightly.3 - 3.15.3-nightly.2 - - 3.15.3-nightly.1 validations: required: true - type: dropdown From a32e645e5dba768385fc5a6048f8acae4eab33f6 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Tue, 12 Dec 2023 14:41:03 +0000 Subject: [PATCH 31/37] [Automated] Release --- CHANGELOG.md | 21 +++++++++++++++++++++ openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdba44b7bb..a10c2715a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,27 @@ # Changelog +## [3.18.0](https://github.com/ynput/OpenPype/tree/3.18.0) + + +[Full Changelog](https://github.com/ynput/OpenPype/compare/...3.18.0) + +### **πŸ› Bug fixes** + + +
+Chore: Fix subst paths handling #5702 + +Make sure that source disk ends with `\` instead of destination disk. + + +___ + +
+ + + + ## [3.17.7](https://github.com/ynput/OpenPype/tree/3.17.7) diff --git a/openpype/version.py b/openpype/version.py index 04ee3fbc5b..012876f6bc 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.17.7" +__version__ = "3.18.0" diff --git a/pyproject.toml b/pyproject.toml index 018f876e26..040da82aa3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.17.7" # OpenPype +version = "3.18.0" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License" From fec557f30a6280cb251407cc44907dafe7ba966e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 12 Dec 2023 14:41:55 +0000 Subject: [PATCH 32/37] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 5ded53d7fb..569271dd71 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -35,6 +35,7 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: + - 3.18.0 - 3.17.7 - 3.17.7-nightly.7 - 3.17.7-nightly.6 @@ -134,7 +135,6 @@ body: - 3.15.3 - 3.15.3-nightly.4 - 3.15.3-nightly.3 - - 3.15.3-nightly.2 validations: required: true - type: dropdown From 0cb90a75af2d69512f20386e9da8d4ab42d043f5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 12 Dec 2023 16:33:35 +0100 Subject: [PATCH 33/37] create copy of hierarchyContext before any processing --- openpype/plugins/publish/extract_hierarchy_to_ayon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/plugins/publish/extract_hierarchy_to_ayon.py b/openpype/plugins/publish/extract_hierarchy_to_ayon.py index 8f791a6093..b601a3fc29 100644 --- a/openpype/plugins/publish/extract_hierarchy_to_ayon.py +++ b/openpype/plugins/publish/extract_hierarchy_to_ayon.py @@ -204,7 +204,8 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): project_item = None project_children_context = None - for key, value in context.data["hierarchyContext"].items(): + hierarchy_context = copy.deepcopy(context.data["hierarchyContext"]) + for key, value in hierarchy_context.items(): project_item = copy.deepcopy(value) project_children_context = project_item.pop("childs", None) project_item["name"] = key From ac1ad826506b72e1d96b8f6ec07c4006ef5c49cf Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 12 Dec 2023 17:40:16 +0100 Subject: [PATCH 34/37] wrong check --- openpype/plugins/publish/collect_resources_path.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/plugins/publish/collect_resources_path.py b/openpype/plugins/publish/collect_resources_path.py index af0ef17789..c8b67a3d05 100644 --- a/openpype/plugins/publish/collect_resources_path.py +++ b/openpype/plugins/publish/collect_resources_path.py @@ -82,7 +82,7 @@ class CollectResourcesPath(pyblish.api.InstancePlugin): # Add fill keys for editorial publishing creating new entity # TODO handle in editorial plugin if instance.data.get("newAssetPublishing"): - if "hierarchy" not in instance.data: + if "hierarchy" not in template_data: template_data["hierarchy"] = instance.data["hierarchy"] if "asset" not in template_data: From 10d3661d84372a146d43e5fd75ca681b2d60fbe6 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Wed, 13 Dec 2023 03:26:46 +0000 Subject: [PATCH 35/37] [Automated] Bump version --- openpype/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/version.py b/openpype/version.py index 012876f6bc..34aa3399b8 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.18.0" +__version__ = "3.17.7-nightly.8" From 48abb52cc36b45bd3617ffd21abf317bc6d187aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 13 Dec 2023 03:27:19 +0000 Subject: [PATCH 36/37] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 569271dd71..9b9c9b242e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -37,6 +37,7 @@ body: options: - 3.18.0 - 3.17.7 + - 3.17.7-nightly.8 - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 @@ -134,7 +135,6 @@ body: - 3.15.4-nightly.1 - 3.15.3 - 3.15.3-nightly.4 - - 3.15.3-nightly.3 validations: required: true - type: dropdown From 79f34220e39168a974f6b63db0a6b1bbb9b8bbf6 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 13 Dec 2023 11:07:33 +0100 Subject: [PATCH 37/37] fixing nightly build version bump --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- openpype/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9b9c9b242e..dfadd0088c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -37,7 +37,7 @@ body: options: - 3.18.0 - 3.17.7 - - 3.17.7-nightly.8 + - 3.18.1-nightly.1 - 3.17.7-nightly.7 - 3.17.7-nightly.6 - 3.17.7-nightly.5 diff --git a/openpype/version.py b/openpype/version.py index 34aa3399b8..44cae8e131 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.17.7-nightly.8" +__version__ = "3.18.1-nightly.1"