From 7e867f83f6135a18da4bb9761ae4dfcf295aee08 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 4 Jul 2024 00:40:50 +0200 Subject: [PATCH 01/43] Implement first draft for Load Shot LOP --- .../ayon_lop_load_shot.hda/INDEX__SECTION | 14 + .../otls/ayon_lop_load_shot.hda/Sections.list | 4 + .../AYON__icon.png | Bin 0 -> 16907 bytes .../Contents.dir/Contents.createtimes | 6 + .../Contents.dir/Contents.houdini_versions | 9 + .../Contents.dir/Contents.mime | 334 ++++++++++++++++++ .../Contents.dir/Contents.modtimes | 6 + .../Contents.dir/Sections.list | 2 + .../CreateScript | 15 + .../DialogScript | 306 ++++++++++++++++ .../ExtraFileOptions | 122 +++++++ .../ayon_8_8Lop_1load__shot_8_81.0/Help | 0 .../ayon_8_8Lop_1load__shot_8_81.0/IconImage | Bin 0 -> 6939 bytes .../InternalFileOptions | 10 + .../MessageNodes | 1 + .../ayon_8_8Lop_1load__shot_8_81.0/OnCreated | 6 + .../ayon_8_8Lop_1load__shot_8_81.0/OnDeleted | 6 + .../ayon_8_8Lop_1load__shot_8_81.0/OnLoaded | 14 + .../OnNameChanged | 8 + .../PythonModule | 10 + .../Sections.list | 17 + .../Tools.shelf | 18 + .../TypePropertiesOptions | 14 + .../ayon_lop_load_shot.hda/houdini.hdalibrary | 0 24 files changed, 922 insertions(+) create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/Sections.list create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/AYON__icon.png create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.houdini_versions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Sections.list create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/CreateScript create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/ExtraFileOptions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/IconImage create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/InternalFileOptions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/MessageNodes create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnCreated create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnDeleted create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnLoaded create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnNameChanged create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/PythonModule create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Sections.list create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Tools.shelf create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/TypePropertiesOptions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/houdini.hdalibrary diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION new file mode 100644 index 0000000000..c3a54285ea --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION @@ -0,0 +1,14 @@ +Operator: ayon::load_shot::1.0 +Label: AYON Load Shot +Path: oplib:/ayon::Lop/load_shot::1.0?ayon::Lop/load_shot::1.0 +Icon: opdef:/ayon::Lop/load_shot::1.0?IconImage +Table: Lop +License: +Extra: +User: +Inputs: 0 to 1 +Subnet: true +Python: false +Empty: false +Modified: Thu Jul 4 00:34:30 2024 + diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/Sections.list b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/Sections.list new file mode 100644 index 0000000000..38cb15df6f --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/Sections.list @@ -0,0 +1,4 @@ +"" +INDEX__SECTION INDEX_SECTION +houdini.hdalibrary houdini.hdalibrary +ayon_8_8Lop_1load__shot_8_81.0 ayon::Lop/load_shot::1.0 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/AYON__icon.png b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/AYON__icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed13aeea527299092c400f18045b11b28c4d23ac GIT binary patch literal 16907 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 nj9>flH|4A;bjv5p2ZMqB`y< + + + + + LOP + + + $HDA_TABLE_AND_NAME + + AYON + + + diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/TypePropertiesOptions b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/TypePropertiesOptions new file mode 100644 index 0000000000..a6d52acf2a --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/TypePropertiesOptions @@ -0,0 +1,14 @@ +CheckExternal := 1; +ContentsCompressionType := 1; +ForbidOutsideParms := 1; +GzipContents := 1; +LockContents := 1; +MakeDefault := 1; +ParmsFromVfl := 0; +PrefixDroppedParmLabel := 0; +PrefixDroppedParmName := 0; +SaveCachedCode := 0; +SaveIcon := 1; +SaveSpareParms := 0; +UnlockOnCreate := 0; +UseDSParms := 1; diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/houdini.hdalibrary b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/houdini.hdalibrary new file mode 100644 index 0000000000..e69de29bb2 From 8c4b6e9e2a5fa43ee0ab490d3d2cca4efad5393b Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 4 Jul 2024 00:44:22 +0200 Subject: [PATCH 02/43] Remove unrelated parm --- .../otls/ayon_lop_load_shot.hda/INDEX__SECTION | 2 +- .../Contents.dir/Contents.createtimes | 2 +- .../Contents.dir/Contents.mime | 13 +++++++++---- .../Contents.dir/Contents.modtimes | 2 +- .../CreateScript | 5 +++-- .../DialogScript | 18 ++---------------- 6 files changed, 17 insertions(+), 25 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION index c3a54285ea..73ccafc80b 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/INDEX__SECTION @@ -10,5 +10,5 @@ Inputs: 0 to 1 Subnet: true Python: false Empty: false -Modified: Thu Jul 4 00:34:30 2024 +Modified: Thu Jul 4 00:43:25 2024 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes index 243abdb381..0efccf8510 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes @@ -2,5 +2,5 @@ "hdaroot/sublayer1.def":1720045839, "hdaroot/warn_no_representation_set.def":1708980551, "hdaroot/output0.def":1698215383, - "hdaroot.def":1720045816 + "hdaroot.def":1720046536 } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime index d6976bd513..57b79f0816 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime @@ -11,7 +11,7 @@ Lop Content-Disposition: attachment; filename="hdaroot.init" Content-Type: text/plain -type = ayon::lop_load_shot::1.0 +type = ayon::load_shot::1.0 matchesdef = 0 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY @@ -19,11 +19,12 @@ Content-Disposition: attachment; filename="hdaroot.def" Content-Type: text/plain comment "" -position -2.73039 0.765033 -connectornextid 0 -flags = lock off model off template off footprint off xray off bypass off display on render on highlight off unload off savedata off compress on colordefault on exposed on debug off +position -3.46569 1.07549 +connectornextid 1 +flags = lock off model off template off footprint off xray off bypass off display off render off highlight off unload off savedata off compress on colordefault on exposed on debug off outputsNamed3 { +0 "output1" } inputsNamed3 { @@ -52,6 +53,10 @@ Content-Type: text/plain "type":"string", "value":"" }, + "nodeshape":{ + "type":"string", + "value":"bulge_down" + }, "wirestyle":{ "type":"string", "value":"rounded" diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes index 7638f0cf3c..325435da1d 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes @@ -2,5 +2,5 @@ "hdaroot/sublayer1.def":1720045978, "hdaroot/warn_no_representation_set.def":1720045871, "hdaroot/output0.def":1720045871, - "hdaroot.def":1720046068 + "hdaroot.def":1720046571 } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/CreateScript b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/CreateScript index de66bba76d..2e18ea0da2 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/CreateScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/CreateScript @@ -1,7 +1,7 @@ # Automatically generated script \set noalias = 1 # -# Creation script for ayon::lop_load_shot::1.0 operator +# Creation script for ayon::load_shot::1.0 operator # if ( "$arg1" == "" ) then @@ -9,7 +9,8 @@ if ( "$arg1" == "" ) then exit endif -# Node $arg1 (ayon::Lop/lop_load_shot::1.0) +# Node $arg1 (ayon::Lop/load_shot::1.0) opexprlanguage -s hscript $arg1 opuserdata -n '___Version___' -v '' $arg1 +opuserdata -n 'nodeshape' -v 'bulge_down' $arg1 opuserdata -n 'wirestyle' -v 'rounded' $arg1 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript index d71b707a38..125e8d0cc9 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript @@ -1,7 +1,7 @@ -# Dialog script for ayon::lop_load_shot::1.0 automatically generated +# Dialog script for ayon::load_shot::1.0 automatically generated { - name ayon::lop_load_shot::1.0 + name ayon::load_shot::1.0 script load_asset::1.0 label "AYON Load Shot" @@ -140,20 +140,6 @@ default { "" } parmtag { "script_callback_language" "python" } } - parm { - name "primpath1" - label "Primitive Root" - type string - default { "`chs(\"folder_path\")`/$OS" } - menureplace { - [ "opmenu -l -a reference_character primpath1" ] - } - parmtag { "autoscope" "0000000000000000" } - parmtag { "script_action" "import loputils\nloputils.selectPrimsInParm(kwargs, False)" } - parmtag { "script_action_help" "Select a primitive in the Scene Viewer or Scene Graph Tree pane.\nCtrl-click to select using the primitive picker dialog.\nAlt-click to toggle movement of the display flag." } - parmtag { "script_action_icon" "BUTTONS_reselect" } - parmtag { "sidefx::usdpathtype" "prim" } - } groupcollapsible { name "extra_options" label "Load Options" From 01226ec4ebb60bc8e8c3d42150ed572649cc84cf Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 11 Jul 2024 18:57:29 +0300 Subject: [PATCH 03/43] implement and use select product dialog --- client/ayon_houdini/api/hda_utils.py | 123 +++++++++++++++--- .../DialogScript | 27 +--- .../PythonModule | 2 +- 3 files changed, 105 insertions(+), 47 deletions(-) diff --git a/client/ayon_houdini/api/hda_utils.py b/client/ayon_houdini/api/hda_utils.py index 8b8b0a323b..cbbb447c06 100644 --- a/client/ayon_houdini/api/hda_utils.py +++ b/client/ayon_houdini/api/hda_utils.py @@ -555,38 +555,119 @@ def _select_folder_path(): folder_parm.pressButton() # allow any callbacks to trigger -def get_available_products(node): - """Return products menu items - It gets a list of available products of the specified product types - within the specified folder path with in the specified project. - Users can specify those in the HDA parameters. +class SelectProductDialog(QtWidgets.QDialog): + """Simple dialog to allow a user to select a product.""" - Args: - node (hou.OpNode): The HDA node. + def __init__(self, project_name, folder_id, parent=None): + super(SelectProductDialog, self).__init__(parent) + self.setWindowTitle("Select a Product") + self.setStyleSheet(load_stylesheet()) + + self.project_name = project_name + self.folder_id = folder_id + + # Create widgets and layout + product_types_widget = QtWidgets.QComboBox() + products_widget = QtWidgets.QListWidget() + accept_button = QtWidgets.QPushButton("Accept") + + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.addWidget(product_types_widget, 0) + main_layout.addWidget(products_widget, 1) + main_layout.addWidget(accept_button, 0) + + self.product_types_widget = product_types_widget + self.products_widget = products_widget + + # Connect Signals + product_types_widget.currentTextChanged.connect(self.on_product_type_changed) + products_widget.itemDoubleClicked.connect(self.accept) + accept_button.clicked.connect(self.accept) + + # Initialize widgets contents + product_types_widget.addItems(self.get_product_types()) + product_type = self.get_selected_product_type() + self.set_product_name(product_type) + + def get_selected_product(self) -> str: + if self.products_widget.currentItem(): + return self.products_widget.currentItem().text() + return "" + + def get_selected_product_type(self) -> str: + return self.product_types_widget.currentText() + + def get_product_types(self) -> List[str]: + """return default product types. + """ + + return [ + "*", + "animation", + "camera", + "model", + "pointcache", + "usd", + ] + + def on_product_type_changed(self, product_type: str): + self.set_product_name(product_type) + + def set_product_name(self, product_type: str): + self.product_types_widget.setCurrentText(product_type) + + if self.product_types_widget.currentText() != product_type: + # Product type does not exist + return + + # Populate products list + products = self.get_available_products(product_type) + self.products_widget.clear() + if products: + self.products_widget.addItems(products) + + def get_available_products(self, product_type): + + if product_type == "*": + product_type = "" + + product_types = [product_type] if product_type else None + + products = ayon_api.get_products( + self.project_name, + folder_ids=[self.folder_id], + product_types=product_types + ) + + return list(sorted(product["name"] for product in products)) + + +def select_a_product(node): - Returns: - list[str]: Product names for Products menu. - """ project_name = node.evalParm("project_name") folder_path = node.evalParm("folder_path") - product_type = node.evalParm("product_type") + product_parm = node.parm("product_name") folder_entity = ayon_api.get_folder_by_path(project_name, folder_path, fields={"id"}) if not folder_entity: - return [] - - # Apply filter only if any value is set - product_types = [product_type] if product_type else None - - products = ayon_api.get_products( + return + + dialog = SelectProductDialog( project_name, - folder_ids=[folder_entity["id"]], - product_types=product_types - ) + folder_entity["id"], + parent=lib.get_main_window() + ) + result = dialog.exec_() + + if result != QtWidgets.QDialog.Accepted: + return + selected_product = dialog.get_selected_product() - return list(sorted(product["name"] for product in products)) + if selected_product: + product_parm.set(selected_product) + product_parm.pressButton() # allow any callbacks to trigger def set_to_latest_version(node): diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript index dee8fa4c8f..85e5c631f4 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript @@ -47,36 +47,13 @@ parmtag { "script_callback" "hou.phm().on_representation_parms_changed(kwargs['node'])" } parmtag { "script_callback_language" "python" } } - parm { - name "product_type" - label "Product Type" - type string - default { "usd" } - menu { - "" "*" - "animation" "animation" - "camera" "camera" - "model" "model" - "pointcache" "pointcache" - "usd" "usd" - } - } parm { name "product_name" label "Product" type string default { "usdAsset" } - menureplace { - [ "products = hou.phm().get_available_products(kwargs['node'])" ] - [ "" ] - [ "result = []" ] - [ "for product in products:" ] - [ " result.append(product)" ] - [ " result.append(product)" ] - [ " " ] - [ "return result" ] - language python - } + parmtag { "script_action" "from ayon_houdini.api.hda_utils import select_a_product;select_a_product(kwargs['node'])" } + parmtag { "script_action_icon" "BUTTONS_reselect" } parmtag { "script_callback" "hou.phm().set_to_latest_version(kwargs['node'])\nhou.phm().on_representation_parms_changed(kwargs['node'])" } parmtag { "script_callback_language" "python" } } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule index 934fb2f612..ac17b275f9 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule @@ -5,6 +5,6 @@ from ayon_houdini.api.hda_utils import ( on_representation_parms_changed, setup_flag_changed_callback, get_available_versions, - get_available_products, + select_a_product, set_to_latest_version ) From d294d4c922cfb4038c8a690ea71b0df29973571a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 11 Jul 2024 19:14:20 +0300 Subject: [PATCH 04/43] remove redundant code --- client/ayon_houdini/api/hda_utils.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/client/ayon_houdini/api/hda_utils.py b/client/ayon_houdini/api/hda_utils.py index cbbb447c06..ecc38eea00 100644 --- a/client/ayon_houdini/api/hda_utils.py +++ b/client/ayon_houdini/api/hda_utils.py @@ -129,14 +129,6 @@ def update_info(node, context): if node.evalParm(key) != value} parms["load_message"] = "" # clear any warnings/errors - # Update the product type filter to match the type - current = node.evalParm("product_type") - product_type = context["product"]["productType"] - if current and current != product_type: - # If current is empty we consider no filtering applied and we allow - # that to be a state that needs no switching - parms["product_type"] = product_type - # Note that these never trigger any parm callbacks since we do not # trigger the `parm.pressButton` and programmatically setting values # in Houdini does not trigger callbacks automatically From 89c71f0b4ee73807b3df1ff5b30415d38a1d5a46 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 17 Jul 2024 20:44:53 +0200 Subject: [PATCH 05/43] Remove deprecated `ocio_config` `ImageIOConfigModel` settings --- server/settings/imageio.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/server/settings/imageio.py b/server/settings/imageio.py index d77ff0751c..5c8c54d0f1 100644 --- a/server/settings/imageio.py +++ b/server/settings/imageio.py @@ -3,32 +3,6 @@ from ayon_server.settings.validators import ensure_unique_names -class ImageIOConfigModel(BaseSettingsModel): - """[DEPRECATED] Addon OCIO config settings. Please set the OCIO config - path in the Core addon profiles here - (ayon+settings://core/imageio/ocio_config_profiles). - """ - - override_global_config: bool = SettingsField( - False, - title="Override global OCIO config", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - filepath: list[str] = SettingsField( - default_factory=list, - title="Config path", - description=( - "DEPRECATED functionality. Please set the OCIO config path in the " - "Core addon profiles here (ayon+settings://core/imageio/" - "ocio_config_profiles)." - ), - ) - - class ImageIOFileRuleModel(BaseSettingsModel): name: str = SettingsField("", title="Rule name") pattern: str = SettingsField("", title="Regex pattern") @@ -81,10 +55,6 @@ class HoudiniImageIOModel(BaseSettingsModel): activate_host_color_management: bool = SettingsField( True, title="Enable Color Management" ) - ocio_config: ImageIOConfigModel = SettingsField( - default_factory=ImageIOConfigModel, - title="OCIO config" - ) file_rules: ImageIOFileRulesModel = SettingsField( default_factory=ImageIOFileRulesModel, title="File Rules" @@ -97,10 +67,6 @@ class HoudiniImageIOModel(BaseSettingsModel): DEFAULT_IMAGEIO_SETTINGS = { "activate_host_color_management": False, - "ocio_config": { - "override_global_config": False, - "filepath": [] - }, "file_rules": { "activate_host_rules": False, "rules": [] From e2885466f493aa0b95483663a1b86c29e014a181 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 17 Jul 2024 21:07:23 +0200 Subject: [PATCH 06/43] Activate host color management by default --- server/settings/imageio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/settings/imageio.py b/server/settings/imageio.py index d77ff0751c..1def068f68 100644 --- a/server/settings/imageio.py +++ b/server/settings/imageio.py @@ -96,7 +96,7 @@ class HoudiniImageIOModel(BaseSettingsModel): DEFAULT_IMAGEIO_SETTINGS = { - "activate_host_color_management": False, + "activate_host_color_management": True, "ocio_config": { "override_global_config": False, "filepath": [] From b1ad56b67934ed0baff3b592b362b2aa358fadac Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:01:31 +0200 Subject: [PATCH 07/43] bump version to '0.3.10' --- client/ayon_houdini/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_houdini/version.py b/client/ayon_houdini/version.py index 6ddfe2d47b..f5d4d35bf7 100644 --- a/client/ayon_houdini/version.py +++ b/client/ayon_houdini/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'houdini' version.""" -__version__ = "0.3.10-dev.1" +__version__ = "0.3.10" diff --git a/package.py b/package.py index def4d72c57..c86cbc2363 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "houdini" title = "Houdini" -version = "0.3.10-dev.1" +version = "0.3.10" client_dir = "ayon_houdini" From 649c6115b40faf6302fb2e5850d9f1a59a823a62 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:01:58 +0200 Subject: [PATCH 08/43] bump version to '0.3.11-dev.1' --- client/ayon_houdini/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_houdini/version.py b/client/ayon_houdini/version.py index f5d4d35bf7..1819a6e4ed 100644 --- a/client/ayon_houdini/version.py +++ b/client/ayon_houdini/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'houdini' version.""" -__version__ = "0.3.10" +__version__ = "0.3.11-dev.1" diff --git a/package.py b/package.py index c86cbc2363..e1f45c29cf 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "houdini" title = "Houdini" -version = "0.3.10" +version = "0.3.11-dev.1" client_dir = "ayon_houdini" From e5c3238beadb7d99dedb8f184a18c71a7e2ce4a8 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 15:07:25 +0200 Subject: [PATCH 09/43] Add hidden `folder_name` parm so users can easily reference it without having to split the folder path parm, etc. --- .../ayon_8_8Lop_1lop__import_8_81.0/DialogScript | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript index dee8fa4c8f..e1644df11b 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript @@ -47,6 +47,14 @@ parmtag { "script_callback" "hou.phm().on_representation_parms_changed(kwargs['node'])" } parmtag { "script_callback_language" "python" } } + parm { + name "folder_name" + label "Folder Name" + type string + invisible + default { "`strsplit(chs(\"folder_path\"), \"/\", -1)`" } + parmtag { "script_callback_language" "python" } + } parm { name "product_type" label "Product Type" From 4a2ed657ae5488fe427e1c2fa2b1ce8282c5e947 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 16:35:47 +0200 Subject: [PATCH 10/43] Provide a little Prim Path preset button to give easy access for artists to use "asset build" prim path or scene assembly prim path --- .../ayon_8_8Lop_1lop__import_8_81.0/DialogScript | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript index e1644df11b..bea53c5a45 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript @@ -51,7 +51,6 @@ name "folder_name" label "Folder Name" type string - invisible default { "`strsplit(chs(\"folder_path\"), \"/\", -1)`" } parmtag { "script_callback_language" "python" } } @@ -160,6 +159,7 @@ name "primpath1" label "Primitive Root" type string + joinnext default { "`chs(\"folder_path\")`/$OS" } menureplace { [ "opmenu -l -a reference_character primpath1" ] @@ -170,6 +170,19 @@ parmtag { "script_action_icon" "BUTTONS_reselect" } parmtag { "sidefx::usdpathtype" "prim" } } + parm { + name "primpath_presets" + label "Presets" + type button + nolabel + default { "0" } + menu { + "`chs(\"folder_name\")`" "Folder Name\n (Use for \"Asset Build\" workflow)" + "`chs(\"folder_path\")`/$OS" "Folder Path with Node Name\n (Use for \"Shot\" or \"Scene Assembly\" workflow)" + } + parmtag { "script_callback" "parm = kwargs[\"node\"].parm(\"primpath1\"); parm.revertToDefaults(); parm.set(kwargs[\"script_value0\"])" } + parmtag { "script_callback_language" "python" } + } groupcollapsible { name "extra_options" label "Load Options" From 0eb40773559ead78a07c31168a01827fafd1f448 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 16:47:40 +0200 Subject: [PATCH 11/43] Make folder name parm hidden --- .../startup/otls/ayon_lop_import.hda/INDEX__SECTION | 9 +++++---- .../ayon_8_8Lop_1lop__import_8_81.0/DialogScript | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION index 5b5d5a1340..6d9227f48e 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION @@ -3,11 +3,12 @@ Label: AYON Load Asset Path: oplib:/ayon::Lop/lop_import::1.0?ayon::Lop/lop_import::1.0 Icon: opdef:/ayon::Lop/lop_import::1.0?IconImage Table: Lop -License: -Extra: -User: +License: +Extra: +User: Inputs: 0 to 1 Subnet: true Python: false Empty: false -Modified: Thu Jun 10 16:44:00 2024 +Modified: Mon Jul 29 16:47:13 2024 + diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript index bea53c5a45..bd95d7d945 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript @@ -51,6 +51,7 @@ name "folder_name" label "Folder Name" type string + invisible default { "`strsplit(chs(\"folder_path\"), \"/\", -1)`" } parmtag { "script_callback_language" "python" } } From 64f0d7e40a9bc8aafc4ed75ba0b51d44975b25f9 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 20:37:21 +0200 Subject: [PATCH 12/43] Implement a rudimentary HELP page for the Lop Node --- .../ayon_8_8Lop_1lop__import_8_81.0/Help | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help index e69de29bb2..a9ebde486c 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help @@ -0,0 +1,16 @@ += AYON Load Asset = + +#icon: path/to/icon + +"""References a USD file, usually an asset.""" + +== Overview == + +*References* or *Payloads* a USD file into the current USD layer. + +In USD, when referencing, it's good to understand that you load a *single root prim* from the USD file. You will not get the full contents of the USD file if the USD file's content do not live within that single root primitive. By default, it will load a USD file's *default prim* but can be customized using the Load Options on this LOP node. + + +@related + +* [Node:lop/reference] \ No newline at end of file From ee4659c86c9ffced66ac495864e5bb0696747931 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 22:52:35 +0200 Subject: [PATCH 13/43] Add AYON Mute Layers LOP which supports wildcards unlike the Houdini Configure Stage LOP node --- .../ayon_lop_mute_layers.hda/INDEX__SECTION | 14 + .../ayon_lop_mute_layers.hda/Sections.list | 4 + .../Contents.dir/Contents.createtimes | 6 + .../Contents.dir/Contents.houdini_versions | 9 + .../Contents.dir/Contents.mime | 418 ++++++++++++++++++ .../Contents.dir/Contents.modtimes | 6 + .../Contents.dir/Sections.list | 2 + .../CreateScript | 14 + .../DialogScript | 108 +++++ .../ExtraFileOptions | 2 + .../ayon_8_8Lop_1mute__layers_8_81.0/Help | 13 + .../IconImage | Bin 0 -> 6939 bytes .../InternalFileOptions | 10 + .../Sections.list | 10 + .../Tools.shelf | 20 + .../TypePropertiesOptions | 14 + .../houdini.hdalibrary | 0 17 files changed, 650 insertions(+) create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/INDEX__SECTION create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/Sections.list create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.createtimes create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.houdini_versions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.modtimes create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Sections.list create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/CreateScript create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/IconImage create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/InternalFileOptions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Sections.list create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Tools.shelf create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/TypePropertiesOptions create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/houdini.hdalibrary diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/INDEX__SECTION b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/INDEX__SECTION new file mode 100644 index 0000000000..b431d9b512 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/INDEX__SECTION @@ -0,0 +1,14 @@ +Operator: ayon::mute_layers::1.0 +Label: AYON Mute Layers +Path: oplib:/ayon::Lop/mute_layers::1.0?ayon::Lop/mute_layers::1.0 +Icon: opdef:/ayon::Lop/mute_layers::1.0?IconImage +Table: Lop +License: +Extra: +User: +Inputs: 1 to 1 +Subnet: true +Python: false +Empty: false +Modified: Mon Jul 29 22:47:28 2024 + diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/Sections.list b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/Sections.list new file mode 100644 index 0000000000..f30b8b2397 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/Sections.list @@ -0,0 +1,4 @@ +"" +INDEX__SECTION INDEX_SECTION +houdini.hdalibrary houdini.hdalibrary +ayon_8_8Lop_1mute__layers_8_81.0 ayon::Lop/mute_layers::1.0 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.createtimes b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.createtimes new file mode 100644 index 0000000000..9022f76458 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.createtimes @@ -0,0 +1,6 @@ +{ + "hdaroot/mute_layers.def":1708351767, + "hdaroot/get_layers.def":1708351772, + "hdaroot/output0.def":1708352522, + "hdaroot.def":1722285625 +} diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.houdini_versions b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.houdini_versions new file mode 100644 index 0000000000..e09ed20933 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.houdini_versions @@ -0,0 +1,9 @@ +{ + "values":["20.0.724" + ], + "indexes":{ + "hdaroot/mute_layers.userdata":0, + "hdaroot/get_layers.userdata":0, + "hdaroot/output0.userdata":0 + } +} diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime new file mode 100644 index 0000000000..c2fcf567ca --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime @@ -0,0 +1,418 @@ +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY" + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="node_type" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +Lop + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot.init" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +type = ayon::mute_layers::1.0 +matchesdef = 0 + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot.def" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +comment "" +position -3.49676 -0.462294 +connectornextid 1 +flags = lock off model off template off footprint off xray off bypass off display on render off highlight off unload off savedata off compress on colordefault on exposed on debug off +outputsNamed3 +{ +} +inputsNamed3 +{ +0 load_shot1 0 1 "input1" +} +inputs +{ +0 load_shot1 0 1 +} +stat +{ + create -1 + modify -1 + author User@HP-Z820-03 + access 0777 +} +color UT_Color RGB 0.8 0.8 0.8 +delscript "" +exprlanguage hscript +end + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot.userdata" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ + "___Version___":{ + "type":"string", + "value":"" + } +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot.inp" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +1 +0 0 6 2 0 __NO_OWNER_NETWORK_BOX__ "FROMOUTPUT" + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/output0.init" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +type = output +matchesdef = 1 + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/output0.def" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +comment "" +position -1.11759e-08 2.91502 +connectornextid 1 +flags = lock off model off template off footprint off xray off bypass off display off render on highlight off unload off savedata off compress on colordefault on exposed on debug off +outputsNamed3 +{ +} +inputsNamed3 +{ +0 mute_layers 1 1 "input1" +} +inputs +{ +0 mute_layers 0 1 +} +stat +{ + create -1 + modify -1 + author User@HP-Z820-03 + access 0777 +} +color UT_Color RGB 0.8 0.8 0.8 +delscript "" +exprlanguage hscript +end + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/output0.parm" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ +version 0.8 +outputidx [ 0 locks=0 ] ( 0 ) +modifiedprims [ 0 locks=0 ] ( "`lopinputprims(\".\", 0)`" ) +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/output0.userdata" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ + "___Version___":{ + "type":"string", + "value":"___EXTERNAL___" + } +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/get_layers.init" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +type = pythonscript +matchesdef = 1 + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/get_layers.def" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +comment "" +position -1.11759e-08 4.9334 +connectornextid 2 +flags = lock off model off template off footprint off xray off bypass off display on render off highlight off unload off savedata off compress on colordefault on exposed on debug off +outputsNamed3 +{ +1 "output1" +} +inputsNamed3 +{ +0 (0) "" 1 "input1" +} +inputs +{ +0 (0) 0 1 +} +stat +{ + create -1 + modify -1 + author User@HP-Z820-03 + access 0777 +} +color UT_Color RGB 0.8 0.8 0.8 +delscript "" +exprlanguage hscript +end + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/get_layers.spareparmdef" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + + parm { + name "pattern" + label "Pattern" + type string + default { "" } + menureplace { + "" "*usdAsset_look*" + "" "*usdAsset_model*" + "" "*usdShot_fx*" + "" "*usdShot_lighting*" + } + parmtag { "script_callback_language" "python" } + } + parm { + name "casesensitive" + label "Case Sensitive" + type toggle + default { "0" } + parmtag { "script_callback_language" "python" } + } + parm { + name "python" + baseparm + label "Python Code" + export none + } + parm { + name "maintainstate" + baseparm + label "Maintain State" + export none + } + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/get_layers.chn" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ + channel pattern { + lefttype = extend + righttype = extend + defaultString = chs(\"../mute_pattern\") + flags = 0 + start = 40 + segment { length = 0 expr = chs(\"../mute_pattern\") } + } + channel casesensitive { + lefttype = extend + righttype = extend + flags = 0 + start = 40 + segment { length = 0 expr = ch(\"../casesensitive\") } + } + } + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/get_layers.parm" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ +version 0.8 +python [ 0 locks=0 ] ( "import os +from pxr import Usd + + +def get_paths(stage: Usd.Stage, pattern: str, case_sensitive: bool) -> list[str]: + \"\"\"Return matching filepaths used by composed Usd.Stage that match the `pattern`.\"\"\" + + if not pattern: + return [] + + paths = [] + layers = stage.GetUsedLayers() + for layer in layers: + identifier = layer.identifier + + # Ignore identifiers that are not a file + path = identifier.split(\":SDF_FORMAT_ARGS:\")[0] + + if not os.path.exists(path): + continue + + if not hou.text.patternMatch( + pattern, + path, + ignore_case=not case_sensitive, + path_match=True): + continue + + paths.append(identifier) + + return paths + + +node = hou.pwd() +stage = node.editableStage() +pattern = node.evalParm(\"pattern\") +case_sensitive = node.evalParm(\"casesensitive\") +paths = get_paths(stage, pattern, case_sensitive) + +# Update mute layers value on next node +parm = node.parent().parm(\"mutepaths\") +parm.lock(False) +parm.set(\"\\n\".join(paths)) +parm.lock(True)" ) +maintainstate [ 0 locks=0 ] ( "off" ) +pattern [ 0 locks=0 ] ( [ pattern "" ] ) +casesensitive [ 0 locks=0 ] ( [ casesensitive 0 ] ) +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/get_layers.userdata" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ + "___Version___":{ + "type":"string", + "value":"___EXTERNAL___" + } +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/mute_layers.init" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +type = configurestage +matchesdef = 1 + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/mute_layers.def" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +comment "" +position -1.11759e-08 3.99421 +connectornextid 2 +flags = lock off model off template off footprint off xray off bypass off display off render off highlight off unload off savedata off compress on colordefault on exposed on debug off +outputsNamed3 +{ +1 "output1" +} +inputsNamed3 +{ +0 get_layers 1 1 "input1" +} +inputs +{ +0 get_layers 0 1 +} +stat +{ + create -1 + modify -1 + author User@HP-Z820-03 + access 0777 +} +color UT_Color RGB 0.8 0.8 0.8 +delscript "" +exprlanguage hscript +end + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/mute_layers.chn" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ + channel editmute { + lefttype = extend + righttype = extend + defaultString = \"set\" + flags = 0 + start = 40 + segment { length = 0 expr = chs(\"../editmute\") } + } + } + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/mute_layers.parm" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ +version 0.8 +editpopulate [ 0 locks=0 ] ( nochange ) +populatepattern [ 0 locks=0 ] ( "" ) +unpopulatepattern [ 0 locks=0 ] ( "" ) +populatepaths [ 0 locks=0 ] ( "" ) +unpopulatepaths [ 0 locks=0 ] ( "" ) +separator_load [ 0 locks=0 ] ( ) +editload [ 0 locks=0 ] ( nochange ) +loadpattern [ 0 locks=0 ] ( "" ) +unloadpattern [ 0 locks=0 ] ( "" ) +loadpaths [ 0 locks=0 ] ( "" ) +unloadpaths [ 0 locks=0 ] ( "" ) +separator_mute [ 0 locks=0 ] ( ) +editmute [ 0 locks=0 ] ( [ editmute nochange ] ) +mutepaths [ 8 locks=0 ] ( `chs(\"../mutepaths\")` ) +unmutepaths [ 0 locks=0 ] ( "" ) +separator_resolver [ 0 locks=0 ] ( ) +resolvercontextassetpath [ 0 locks=0 ] ( "" ) +resolvercontextstringcount [ 0 locks=0 ] ( 0 ) +variantselectioncount [ 0 locks=0 ] ( 0 ) +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot/mute_layers.userdata" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +{ + "___Version___":{ + "type":"string", + "value":"___EXTERNAL___" + } +} + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot.order" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +3 +output0 +get_layers +mute_layers + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY +Content-Disposition: attachment; filename="hdaroot.net" +Content-Modified-Time: 1722286048 +Content-Type: text/plain + +1 + +--HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY-- diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.modtimes b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.modtimes new file mode 100644 index 0000000000..352d55965f --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.modtimes @@ -0,0 +1,6 @@ +{ + "hdaroot/mute_layers.def":1722285992, + "hdaroot/get_layers.def":1722286006, + "hdaroot/output0.def":1722285928, + "hdaroot.def":1722286039 +} diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Sections.list b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Sections.list new file mode 100644 index 0000000000..49f2c1522a --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Sections.list @@ -0,0 +1,2 @@ +"" +Contents.mime Contents.mime diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/CreateScript b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/CreateScript new file mode 100644 index 0000000000..1d54767e66 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/CreateScript @@ -0,0 +1,14 @@ +# Automatically generated script +\set noalias = 1 +# +# Creation script for ayon::mute_layers::1.0 operator +# + +if ( "$arg1" == "" ) then + echo This script is intended as a creation script + exit +endif + +# Node $arg1 (ayon::Lop/mute_layers::1.0) +opexprlanguage -s hscript $arg1 +opuserdata -n '___Version___' -v '' $arg1 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript new file mode 100644 index 0000000000..0e7436778f --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript @@ -0,0 +1,108 @@ +# Dialog script for ayon::mute_layers::1.0 automatically generated + +{ + name ayon::mute_layers::1.0 + script cb::mute_layers::1.0 + label "AYON Mute Layers" + + help { + "" + } + + inputlabel 1 "Input Stage" + inputlabel 2 "Input 2" + inputlabel 3 "Input 3" + inputlabel 4 "Input 4" + + parm { + name "editmute" + label "Mute Layers" + type string + default { "set" } + menu { + "addremove" "Add and remove layers to mute" + "set" "Set layers to mute" + "setnone" "Unmute all layers" + } + parmtag { "autoscope" "0000000000000000" } + parmtag { "script_action" "from scenegraphlayers import panelutils\npanelutils.openPanelForConfigureStageNode(kwargs['node'])" } + parmtag { "script_action_help" "Select layers to mute." } + parmtag { "script_action_icon" "BUTTONS_reselect" } + parmtag { "sidefx::usdpathtype" "primlist" } + } + parm { + name "mute_pattern" + label "Mute Pattern" + type string + default { "" } + help "Match any pattern within a filepath using wildcards to mute for." + hidewhen "{ editmute == setnone }" + menutoggle { + "*usdAsset_model*" "Asset Model Layer" + "*usdAsset_look*" "Asset Look Layer" + "*usdAsset_groom*" "Asset Groom Layer" + "*usdShot_animation*" "Shot Animation Layer" + "*usdShot_fx*" "Shot FX Layer" + "*usdShot_lighting*" "Shot Lighting Layer" + } + parmtag { "autoscope" "0000000000000000" } + parmtag { "script_callback_language" "python" } + } + parm { + name "unmute_pattern" + label "Unmute Pattern" + type string + default { "" } + help "Match any pattern within a filepath using wildcards to mute for." + hidewhen "{ editmute != addremove }" + menutoggle { + "*usdAsset_model*" "Asset Model Layer" + "*usdAsset_look*" "Asset Look Layer" + "*usdAsset_groom*" "Asset Groom Layer" + "*usdShot_animation*" "Shot Animation Layer" + "*usdShot_fx*" "Shot FX Layer" + "*usdShot_lighting*" "Shot Lighting Layer" + } + parmtag { "autoscope" "0000000000000000" } + parmtag { "script_callback_language" "python" } + } + parm { + name "casesensitive" + label "Case Sensitive" + type toggle + default { "off" } + help "Whether the pattern should match case-sensitive or not" + hidewhen "{ editmute == setnone }" + parmtag { "autoscope" "0000000000000000" } + parmtag { "script_callback_language" "python" } + } + groupcollapsible { + name "muted_results" + label "Muted Results" + hidewhen "{ editmute == setnone }" + + parm { + name "mutepaths" + label "Muted Paths" + type string + default { "" } + help "The filepaths/layers that were targeted by the pattern" + hidewhen "{ editmute == setnone }" + parmtag { "editor" "1" } + parmtag { "editorlines" "5-10" } + parmtag { "script_callback_language" "python" } + } + parm { + name "unutepaths" + label "Unmuted Paths" + type string + default { "" } + help "The filepaths/layers that were targeted by the pattern" + hidewhen "{ editmute != addremove }" + parmtag { "editor" "1" } + parmtag { "editorlines" "5-10" } + parmtag { "script_callback_language" "python" } + } + } + +} diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions @@ -0,0 +1,2 @@ +{ +} diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help new file mode 100644 index 0000000000..71cbb06f69 --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help @@ -0,0 +1,13 @@ += My Asset = + +"""Mute USD layers by wildcard path matching.""" + +== Overview == + +Sets used USD layers in the stage to be Muted downstream. + +For example using `*usdAsset_look*` this can ensure to mute all look related layers, or `*usdShot_lighting*` to do the same for lighting. + +The `pattern` parameter has a drop-down to easily set or disable often used presets. + +@parameters \ No newline at end of file diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/IconImage b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/IconImage new file mode 100644 index 0000000000000000000000000000000000000000..fc14f71ec6a9d7bde253bc5de5552327f7494daa GIT binary patch literal 6939 zcmbtZ36zu76@HUtvQ3i7WHOn|42uFH>uij}jxZEajye(+0cimNr3$i)QnVCQY|)|u zf|g~Nzb+itwy2d_IViZHD2fQbJ5=ovtDGJ@YFUzZ``zUKU;c>+httkEAusp4@B8k( z@BR0^gyxHz>g+;@(PImQXsX7jY2mEtEwg5Jp0T9!=o@aFIcMIS+5vqV`u3}D=scyi zrnyl&%@8w9 zw-G$xzll5`ysqH^r*#nz-hQj-!sdP$r1*zt@w3nwsNzF_FESNIv3J2p4riD+%MTd_ zo_v;*+PP&IShyW@mLD<B-W4 ziCtT!czJrz$9Vj&XQjojNQleI;0i{ahPM}2p zabz_7XVMUVvS@5IV@WT=Z5EANOenn!d!X^6WvMyoym^R87LBo{Us_{?MPrBwr8Q3B#zgZrRXB?(y8g$%gc{uJ+T_^o;I1b|B*oQVV8v?0K#i8X>DiAcn zqBKx>vJ${ri&8HI@-6~6sy`*5d5Nx70Tnq$`kmfpF)qoOn5%2rG7+#FS~(L1}HMDP5u6ZBLs3+K_}IM9P{$;eTQ zS`h=hDkDY{6v&xj=I_P@#FVpEg`%847OqVYgDLS48*tf1sqgMO9 z)LN#=HJMY3GXoqrT2Jx|AN0n#B8HRcLw`#(C8mU7Kxuw3?`` z&~gs*^&l5BFJYmO9rhRN^s)!9VqNZwDLMl#+f=O48V_E@n%r2TV9o@yJO0pzEQy!%$0BhU*^)}Z@RGO1gAz< z!1KIYT^il&G5L9qv*Rm0h+goB`0wyJRS0It6~no(dxWe#l%`eb*Kr+XuoJIq)( z?|iX%(GYEV^4$eqa7KQMrAQvUwFKj$8{f0(bi3D_$+5us8k?5fG|ml&;LJ8G(Uxfe zj6D-K+ccW4oOxy7+}fRJo!7E5o%2M()$)qd<@@xtRiG=J^_E{xzB$e56sJ4gukQ^j zV#BdygElt;N5_~y__gHyqwR2v&et9YC`Yb_SIF|?-AEq8{POELFaMnISi@Ooc^NIKkrXrUvSN#n_ zn-jgc+m?tfH=c`;)20Yb2M5emH$^nLD29=vKsj)hh}nI(3&{_i&{SD=IfG`AAeT)f ziM_U2hI`>77N+=|pd-7EZB;+Z$z*yhK%SEx`fCg%1%-HGIh z?hsuBLn^iNFfbO7ohotaKWQiVh^Nvt^HC8HbQ>D#hu;A@{((=Yn*&+!G_=u&j{yGc zA)iK56wJwD_S#NFcj8-?((RtnWtU1p4?BrAWvR;Wn_iuc1NpaCm#+mCZ8|6!xF22f zQ@|g2HM!2GU`{0DAMvnk zK3hmyjED@ZW?*?(Hk186& z9N84qNE7~s)KL=SRXns(qYs;*W!x#^0bXm4>X%Np^nI-auJj@(o z84j^sIK6hb6^&tbt;VsnsxaH^IpQbz5zLv$FUZ5skw*nx?$_y}s5NpJ2l_Q?$Tm*! z6I~h=@hdSg)iWFOF!Qd6;yU~oPQO2vo7ARtDGt3~{lvP&1iQH|a(4|)LKan?6xn + + + + + + LOP + + + $HDA_TABLE_AND_NAME + + AYON + + + diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/TypePropertiesOptions b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/TypePropertiesOptions new file mode 100644 index 0000000000..a6d52acf2a --- /dev/null +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/TypePropertiesOptions @@ -0,0 +1,14 @@ +CheckExternal := 1; +ContentsCompressionType := 1; +ForbidOutsideParms := 1; +GzipContents := 1; +LockContents := 1; +MakeDefault := 1; +ParmsFromVfl := 0; +PrefixDroppedParmLabel := 0; +PrefixDroppedParmName := 0; +SaveCachedCode := 0; +SaveIcon := 1; +SaveSpareParms := 0; +UnlockOnCreate := 0; +UseDSParms := 1; diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/houdini.hdalibrary b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/houdini.hdalibrary new file mode 100644 index 0000000000..e69de29bb2 From f1a3aabfcd7644caef82c0f318437d060a10e904 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 22:57:21 +0200 Subject: [PATCH 14/43] Fix title in help --- .../ayon_8_8Lop_1mute__layers_8_81.0/Help | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help index 71cbb06f69..1dc5f0818b 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help @@ -1,4 +1,4 @@ -= My Asset = += AYON Mute Layers = """Mute USD layers by wildcard path matching.""" From f1bba03274694fbfe07bf99e1d2d3850d32c446e Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 22:57:50 +0200 Subject: [PATCH 15/43] Add related section --- .../ayon_8_8Lop_1mute__layers_8_81.0/Help | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help index 1dc5f0818b..1883e5f817 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help @@ -10,4 +10,9 @@ For example using `*usdAsset_look*` this can ensure to mute all look related lay The `pattern` parameter has a drop-down to easily set or disable often used presets. -@parameters \ No newline at end of file +@parameters + + +@related + +* [Node:lop/configure_stage] \ No newline at end of file From cb7e58c7fa8c398cb08585c0fd0cc8ddac77697b Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 22:58:01 +0200 Subject: [PATCH 16/43] Add Help to Load Shot --- .../ayon_8_8Lop_1load__shot_8_81.0/Help | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help index e69de29bb2..213931f24f 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help @@ -0,0 +1,11 @@ += AYON Load Shot = + +"""Sublayers a USD file, usually a shot.""" + +== Overview == + +*Sublayers* a USD file into the current stage, by default targeting the root layer stack. + +@related + +* [Node:lop/sublayer] \ No newline at end of file From 5443afad34cce11f79e7e6395b1417ee48ce4ce9 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 29 Jul 2024 23:07:34 +0200 Subject: [PATCH 17/43] Make it an actual AYON Loader Plug-in as well --- .../plugins/load/load_shot_lop.py | 52 +++++++++++++++++++ .../DialogScript | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 client/ayon_houdini/plugins/load/load_shot_lop.py diff --git a/client/ayon_houdini/plugins/load/load_shot_lop.py b/client/ayon_houdini/plugins/load/load_shot_lop.py new file mode 100644 index 0000000000..3f9c9ee482 --- /dev/null +++ b/client/ayon_houdini/plugins/load/load_shot_lop.py @@ -0,0 +1,52 @@ +from ayon_core.pipeline import load +from ayon_houdini.api.lib import find_active_network + +import hou + + +class LOPLoadShotLoader(load.LoaderPlugin): + """Load sublayer into Solaris using AYON Load Shot LOP""" + + product_types = {"*"} + label = "Load Shot (LOPs)" + representations = ["usd", "abc", "usda", "usdc"] + order = -10 + icon = "code-fork" + color = "orange" + + def load(self, context, name=None, namespace=None, data=None): + + # Define node name + namespace = namespace if namespace else context["folder"]["name"] + node_name = "{}_{}".format(namespace, name) if namespace else name + + # Create node + network = find_active_network( + category=hou.lopNodeTypeCategory(), + default="/stage" + ) + node = network.createNode("ayon::load_shot", node_name=node_name) + node.moveToGoodPosition() + + # Set representation id + parm = node.parm("representation") + parm.set(context["representation"]["id"]) + parm.pressButton() # trigger callbacks + + nodes = [node] + self[:] = nodes + + def update(self, container, context): + node = container["node"] + + # Set representation id + parm = node.parm("representation") + parm.set(context["representation"]["id"]) + parm.pressButton() # trigger callbacks + + def remove(self, container): + node = container["node"] + node.destroy() + + def switch(self, container, context): + self.update(container, context) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript index 125e8d0cc9..4925cb5338 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript @@ -257,7 +257,7 @@ name "loader" label "Loader" type label - default { "LOPLoadAssetLoader" } + default { "LOPLoadShotLoader" } } parm { name "id" From a612b3f875e9bb30603acc20134ff215279a2e04 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 00:15:51 +0200 Subject: [PATCH 18/43] Update client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help Co-authored-by: Mustafa Taher --- .../ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help index a9ebde486c..67dcde54cd 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help @@ -1,6 +1,6 @@ = AYON Load Asset = -#icon: path/to/icon +#icon: opdef:/ayon::Lop/lop_import::1.0?AYON_icon.png """References a USD file, usually an asset.""" From b92da7e7e7ec3fe78e4451aa6d43aeeba426aab7 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 00:18:11 +0200 Subject: [PATCH 19/43] Rename `sublayer1` node to `sublayer` + fix message node name --- .../Contents.dir/Contents.createtimes | 2 +- .../Contents.dir/Contents.houdini_versions | 2 +- .../Contents.dir/Contents.mime | 16 ++++++++-------- .../Contents.dir/Contents.modtimes | 2 +- .../ayon_8_8Lop_1load__shot_8_81.0/MessageNodes | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes index 0efccf8510..3b50c1d798 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.createtimes @@ -1,5 +1,5 @@ { - "hdaroot/sublayer1.def":1720045839, + "hdaroot/sublayer.def":1720045839, "hdaroot/warn_no_representation_set.def":1708980551, "hdaroot/output0.def":1698215383, "hdaroot.def":1720046536 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.houdini_versions b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.houdini_versions index 231bb00110..c685293feb 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.houdini_versions +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.houdini_versions @@ -2,7 +2,7 @@ "values":["20.0.724" ], "indexes":{ - "hdaroot/sublayer1.userdata":0, + "hdaroot/sublayer.userdata":0, "hdaroot/warn_no_representation_set.userdata":0, "hdaroot/output0.userdata":0 } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime index 57b79f0816..d890e71afa 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.mime @@ -90,11 +90,11 @@ outputsNamed3 } inputsNamed3 { -0 sublayer1 1 1 "input1" +0 sublayer 1 1 "input1" } inputs { -0 sublayer1 0 1 +0 sublayer 0 1 } stat { @@ -206,14 +206,14 @@ Content-Type: text/plain } --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/sublayer1.init" +Content-Disposition: attachment; filename="hdaroot/sublayer.init" Content-Type: text/plain type = sublayer matchesdef = 1 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/sublayer1.def" +Content-Disposition: attachment; filename="hdaroot/sublayer.def" Content-Type: text/plain comment "" @@ -245,7 +245,7 @@ exprlanguage hscript end --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/sublayer1.chn" +Content-Disposition: attachment; filename="hdaroot/sublayer.chn" Content-Type: text/plain { @@ -281,7 +281,7 @@ Content-Type: text/plain } --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/sublayer1.parm" +Content-Disposition: attachment; filename="hdaroot/sublayer.parm" Content-Type: text/plain { @@ -311,7 +311,7 @@ timescale1 [ 0 locks=0 ] ( [ timescale1 1 ] ) } --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/sublayer1.userdata" +Content-Disposition: attachment; filename="hdaroot/sublayer.userdata" Content-Type: text/plain { @@ -328,7 +328,7 @@ Content-Type: text/plain 3 output0 warn_no_representation_set -sublayer1 +sublayer --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.net" diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes index 325435da1d..5ac7842a55 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Contents.dir/Contents.modtimes @@ -1,5 +1,5 @@ { - "hdaroot/sublayer1.def":1720045978, + "hdaroot/sublayer.def":1720045978, "hdaroot/warn_no_representation_set.def":1720045871, "hdaroot/output0.def":1720045871, "hdaroot.def":1720046571 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/MessageNodes b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/MessageNodes index 6941746e05..8aa87c0bb2 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/MessageNodes +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/MessageNodes @@ -1 +1 @@ -warn_no_representation_set reference \ No newline at end of file +warn_no_representation_set sublayer \ No newline at end of file From 745b731666ff6748fd3c99f989c2d8891a19c50c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 00:32:03 +0200 Subject: [PATCH 20/43] Add icons to help pages --- .../ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help | 2 ++ .../ayon_8_8Lop_1mute__layers_8_81.0/Help | 2 ++ 2 files changed, 4 insertions(+) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help index 213931f24f..788ee8949c 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/Help @@ -1,5 +1,7 @@ = AYON Load Shot = +#icon: opdef:/ayon::Lop/load_shot::1.0?AYON_icon.png + """Sublayers a USD file, usually a shot.""" == Overview == diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help index 1883e5f817..fe85ee202c 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help @@ -1,5 +1,7 @@ = AYON Mute Layers = +#icon: opdef:/ayon::Lop/mute_layers::1.0?AYON_icon.png + """Mute USD layers by wildcard path matching.""" == Overview == From c0cbabc7879ccea9b6f9f937960aacf72d7a047a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 00:48:48 +0200 Subject: [PATCH 21/43] Fix unmute layers logic --- .../Contents.dir/Contents.mime | 153 +++++------------- .../DialogScript | 2 +- 2 files changed, 45 insertions(+), 110 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime index c2fcf567ca..98ed42a367 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime @@ -3,14 +3,12 @@ Content-Type: multipart/mixed; boundary="HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F4 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="node_type" -Content-Modified-Time: 1722286048 Content-Type: text/plain Lop --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.init" -Content-Modified-Time: 1722286048 Content-Type: text/plain type = ayon::mute_layers::1.0 @@ -18,23 +16,22 @@ matchesdef = 0 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.def" -Content-Modified-Time: 1722286048 Content-Type: text/plain comment "" -position -3.49676 -0.462294 +position -3.1669 0.213108 connectornextid 1 -flags = lock off model off template off footprint off xray off bypass off display on render off highlight off unload off savedata off compress on colordefault on exposed on debug off +flags = lock off model off template off footprint off xray off bypass off display on render on highlight off unload off savedata off compress on colordefault on exposed on debug off outputsNamed3 { } inputsNamed3 { -0 load_shot1 0 1 "input1" +0 mute_layers1 1 1 "input1" } inputs { -0 load_shot1 0 1 +0 mute_layers1 0 1 } stat { @@ -50,7 +47,6 @@ end --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.userdata" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -62,7 +58,6 @@ Content-Type: text/plain --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.inp" -Content-Modified-Time: 1722286048 Content-Type: text/plain 1 @@ -70,7 +65,6 @@ Content-Type: text/plain --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/output0.init" -Content-Modified-Time: 1722286048 Content-Type: text/plain type = output @@ -78,13 +72,12 @@ matchesdef = 1 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/output0.def" -Content-Modified-Time: 1722286048 Content-Type: text/plain comment "" -position -1.11759e-08 2.91502 +position -1.11759e-08 1.39456 connectornextid 1 -flags = lock off model off template off footprint off xray off bypass off display off render on highlight off unload off savedata off compress on colordefault on exposed on debug off +flags = lock off model off template off footprint off xray off bypass off display on render on highlight off unload off savedata off compress on colordefault on exposed on debug off outputsNamed3 { } @@ -110,7 +103,6 @@ end --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/output0.parm" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -121,7 +113,6 @@ modifiedprims [ 0 locks=0 ] ( "`lopinputprims(\".\", 0)`" ) --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/output0.userdata" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -133,7 +124,6 @@ Content-Type: text/plain --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/get_layers.init" -Content-Modified-Time: 1722286048 Content-Type: text/plain type = pythonscript @@ -141,13 +131,12 @@ matchesdef = 1 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/get_layers.def" -Content-Modified-Time: 1722286048 Content-Type: text/plain comment "" position -1.11759e-08 4.9334 connectornextid 2 -flags = lock off model off template off footprint off xray off bypass off display on render off highlight off unload off savedata off compress on colordefault on exposed on debug off +flags = lock off model off template off footprint off xray off bypass off display off render off highlight off unload off savedata off compress on colordefault on exposed on debug off outputsNamed3 { 1 "output1" @@ -172,88 +161,29 @@ delscript "" exprlanguage hscript end ---HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/get_layers.spareparmdef" -Content-Modified-Time: 1722286048 -Content-Type: text/plain - - parm { - name "pattern" - label "Pattern" - type string - default { "" } - menureplace { - "" "*usdAsset_look*" - "" "*usdAsset_model*" - "" "*usdShot_fx*" - "" "*usdShot_lighting*" - } - parmtag { "script_callback_language" "python" } - } - parm { - name "casesensitive" - label "Case Sensitive" - type toggle - default { "0" } - parmtag { "script_callback_language" "python" } - } - parm { - name "python" - baseparm - label "Python Code" - export none - } - parm { - name "maintainstate" - baseparm - label "Maintain State" - export none - } - ---HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY -Content-Disposition: attachment; filename="hdaroot/get_layers.chn" -Content-Modified-Time: 1722286048 -Content-Type: text/plain - -{ - channel pattern { - lefttype = extend - righttype = extend - defaultString = chs(\"../mute_pattern\") - flags = 0 - start = 40 - segment { length = 0 expr = chs(\"../mute_pattern\") } - } - channel casesensitive { - lefttype = extend - righttype = extend - flags = 0 - start = 40 - segment { length = 0 expr = ch(\"../casesensitive\") } - } - } - --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/get_layers.parm" -Content-Modified-Time: 1722286048 Content-Type: text/plain { version 0.8 python [ 0 locks=0 ] ( "import os -from pxr import Usd +from pxr import Sdf +from typing import List -def get_paths(stage: Usd.Stage, pattern: str, case_sensitive: bool) -> list[str]: +def get_paths( + layers: List[str], + pattern: str, + case_sensitive: bool) -> list[str]: \"\"\"Return matching filepaths used by composed Usd.Stage that match the `pattern`.\"\"\" - if not pattern: + if not pattern or not layers: return [] paths = [] - layers = stage.GetUsedLayers() - for layer in layers: - identifier = layer.identifier + for layer_identifier in layers: + identifier = layer_identifier # Ignore identifiers that are not a file path = identifier.split(\":SDF_FORMAT_ARGS:\")[0] @@ -271,27 +201,39 @@ def get_paths(stage: Usd.Stage, pattern: str, case_sensitive: bool) -> list[str] paths.append(identifier) return paths - - + node = hou.pwd() +parent_node = node.parent() stage = node.editableStage() -pattern = node.evalParm(\"pattern\") -case_sensitive = node.evalParm(\"casesensitive\") -paths = get_paths(stage, pattern, case_sensitive) - -# Update mute layers value on next node -parm = node.parent().parm(\"mutepaths\") -parm.lock(False) -parm.set(\"\\n\".join(paths)) -parm.lock(True)" ) +layers = [layer.identifier for layer in stage.GetUsedLayers()] +pattern = parent_node.evalParm(\"mute_pattern\") +case_sensitive = parent_node.evalParm(\"casesensitive\") + +# Get mute paths +mute_paths = get_paths(layers, pattern, case_sensitive) + +# Get unmute paths (only if needed) +unmute_paths = [] +if parent_node.evalParm(\"editmute\") == \"addremove\": + muted_layers = stage.GetMutedLayers() + unmute_pattern = parent_node.evalParm(\"unmute_pattern\") + unmute_paths = get_paths(muted_layers, unmute_pattern, case_sensitive) + +for parm_name, parm_paths in { + \"mutepaths\": mute_paths, + \"unmutepaths\": unmute_paths +}.items(): + + # Update mute layers value on next node + parm = parent_node.parm(parm_name) + parm.lock(False) + parm.set(\"\\n\".join(parm_paths)) + parm.lock(True)" ) maintainstate [ 0 locks=0 ] ( "off" ) -pattern [ 0 locks=0 ] ( [ pattern "" ] ) -casesensitive [ 0 locks=0 ] ( [ casesensitive 0 ] ) } --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/get_layers.userdata" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -303,7 +245,6 @@ Content-Type: text/plain --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/mute_layers.init" -Content-Modified-Time: 1722286048 Content-Type: text/plain type = configurestage @@ -311,11 +252,10 @@ matchesdef = 1 --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/mute_layers.def" -Content-Modified-Time: 1722286048 Content-Type: text/plain comment "" -position -1.11759e-08 3.99421 +position -1.11759e-08 2.47375 connectornextid 2 flags = lock off model off template off footprint off xray off bypass off display off render off highlight off unload off savedata off compress on colordefault on exposed on debug off outputsNamed3 @@ -344,7 +284,6 @@ end --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/mute_layers.chn" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -360,7 +299,6 @@ Content-Type: text/plain --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/mute_layers.parm" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -379,7 +317,7 @@ unloadpaths [ 0 locks=0 ] ( "" ) separator_mute [ 0 locks=0 ] ( ) editmute [ 0 locks=0 ] ( [ editmute nochange ] ) mutepaths [ 8 locks=0 ] ( `chs(\"../mutepaths\")` ) -unmutepaths [ 0 locks=0 ] ( "" ) +unmutepaths [ 0 locks=0 ] ( `chs(\"../unmutepaths\")` ) separator_resolver [ 0 locks=0 ] ( ) resolvercontextassetpath [ 0 locks=0 ] ( "" ) resolvercontextstringcount [ 0 locks=0 ] ( 0 ) @@ -388,7 +326,6 @@ variantselectioncount [ 0 locks=0 ] ( 0 ) --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot/mute_layers.userdata" -Content-Modified-Time: 1722286048 Content-Type: text/plain { @@ -400,7 +337,6 @@ Content-Type: text/plain --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.order" -Content-Modified-Time: 1722286048 Content-Type: text/plain 3 @@ -410,7 +346,6 @@ mute_layers --HOUDINIMIMEBOUNDARY0xD3ADD339-0x00000F49-0x56B122C9-0x00000001HOUDINIMIMEBOUNDARY Content-Disposition: attachment; filename="hdaroot.net" -Content-Modified-Time: 1722286048 Content-Type: text/plain 1 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript index 0e7436778f..20b8e87667 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/DialogScript @@ -93,7 +93,7 @@ parmtag { "script_callback_language" "python" } } parm { - name "unutepaths" + name "unmutepaths" label "Unmuted Paths" type string default { "" } From c56bbf977126e5bf3ba64c338dd7fca50b78e811 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 00:50:52 +0200 Subject: [PATCH 22/43] Simplify script --- .../ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime index 98ed42a367..f6ba4e1bd5 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Contents.dir/Contents.mime @@ -168,7 +168,6 @@ Content-Type: text/plain { version 0.8 python [ 0 locks=0 ] ( "import os -from pxr import Sdf from typing import List From 3c8509115231c02402fad6677b88dbfa31078fa3 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 01:28:20 +0200 Subject: [PATCH 23/43] Update client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help Co-authored-by: Mustafa Taher --- .../ayon_8_8Lop_1lop__import_8_81.0/Help | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help index 67dcde54cd..1e7eb3de0a 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help @@ -2,14 +2,40 @@ #icon: opdef:/ayon::Lop/lop_import::1.0?AYON_icon.png -"""References a USD file, usually an asset.""" +"""References an AYON USD product, usually an asset or a shot.""" == Overview == -*References* or *Payloads* a USD file into the current USD layer. - -In USD, when referencing, it's good to understand that you load a *single root prim* from the USD file. You will not get the full contents of the USD file if the USD file's content do not live within that single root primitive. By default, it will load a USD file's *default prim* but can be customized using the Load Options on this LOP node. - +*References* or *Payloads* an AYON USD product into the current USD layer. + +This node allows you to select which AYON USD product to load. It does this by utilizing a [Node:lop/reference] to load the specified AYON USD product. + +@parameters +~~~ Choose Product ~~~ +Project: + The name of the AYON project from which to load products. +Folder Path: + The path to the AYON folder (entity) within the project's hierarchy. +Product Type: + The type of AYON product to load (e.g., USD, point cache, camera, etc.). + :note: + Product type can have multiple representations. +Version: + The specific version of the product you want to load. +Representation: + The name of the representation, which refers to the file format (e.g., USD, USDA, ABC). + :note: + we use the representation name to query the file path from AYON. +Refresh: + Click to refresh and retry applying the product load parameters to load the correct file +Reload Files: + Click to reload the contents of all files imported by this node. This also clears the cache of file wilrdcard pattern expansions. +File: + The file path that will be loaded. This is locked by default as it is typically generated by the node. + :tip: + It's locked by default as it should be computed by the node. +Primitive Root: + The referenced prim will be overlayed onto this prim, and the referenced prim’s descendants will become this prim’s descendants. If this prim doesn’t exist, the node will create it. @related From 5ab78f43f987906e0941bd523ad15c95e4f97c12 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 09:16:25 +0200 Subject: [PATCH 24/43] Make select product dialog appear more like popup menu and appear near the mouse. Also auto-select the current value if any matches. --- client/ayon_houdini/api/hda_utils.py | 29 +++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/client/ayon_houdini/api/hda_utils.py b/client/ayon_houdini/api/hda_utils.py index ecc38eea00..a3b557a961 100644 --- a/client/ayon_houdini/api/hda_utils.py +++ b/client/ayon_houdini/api/hda_utils.py @@ -28,7 +28,7 @@ from ayon_houdini.api import lib -from qtpy import QtCore, QtWidgets +from qtpy import QtCore, QtWidgets, QtGui import hou @@ -561,9 +561,10 @@ def __init__(self, project_name, folder_id, parent=None): # Create widgets and layout product_types_widget = QtWidgets.QComboBox() products_widget = QtWidgets.QListWidget() - accept_button = QtWidgets.QPushButton("Accept") + accept_button = QtWidgets.QPushButton("Set product name") main_layout = QtWidgets.QVBoxLayout(self) + main_layout.setContentsMargins(0, 0, 0, 0) main_layout.addWidget(product_types_widget, 0) main_layout.addWidget(products_widget, 1) main_layout.addWidget(accept_button, 0) @@ -579,7 +580,7 @@ def __init__(self, project_name, folder_id, parent=None): # Initialize widgets contents product_types_widget.addItems(self.get_product_types()) product_type = self.get_selected_product_type() - self.set_product_name(product_type) + self.set_product_type(product_type) def get_selected_product(self) -> str: if self.products_widget.currentItem(): @@ -603,9 +604,9 @@ def get_product_types(self) -> List[str]: ] def on_product_type_changed(self, product_type: str): - self.set_product_name(product_type) + self.set_product_type(product_type) - def set_product_name(self, product_type: str): + def set_product_type(self, product_type: str): self.product_types_widget.setCurrentText(product_type) if self.product_types_widget.currentText() != product_type: @@ -618,6 +619,12 @@ def set_product_name(self, product_type: str): if products: self.products_widget.addItems(products) + def set_selected_product_name(self, product_name: str): + matching_items = self.products_widget.findItems( + product_name, QtCore.Qt.MatchFixedString) + if matching_items: + self.products_widget.setCurrentItem(matching_items[0]) + def get_available_products(self, product_type): if product_type == "*": @@ -636,9 +643,11 @@ def get_available_products(self, product_type): def select_a_product(node): + cursor_pos = QtGui.QCursor.pos() + project_name = node.evalParm("project_name") folder_path = node.evalParm("folder_path") - product_parm = node.parm("product_name") + product_parm = node.parm("product_name") folder_entity = ayon_api.get_folder_by_path(project_name, folder_path, @@ -650,7 +659,13 @@ def select_a_product(node): project_name, folder_entity["id"], parent=lib.get_main_window() - ) + ) + dialog.set_selected_product_name(product_parm.eval()) + + dialog.resize(300, 600) + dialog.setWindowFlags(QtCore.Qt.Popup) + pos = dialog.mapToGlobal(cursor_pos - QtCore.QPoint(300, 0)) + dialog.move(pos) result = dialog.exec_() if result != QtWidgets.QDialog.Accepted: From 04430426fd0f92d64a8e31b40ae41b2216a1a75b Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 09:19:05 +0200 Subject: [PATCH 25/43] Refactor `select_a_product` dialog to `select_product_name` + add docstring to function --- client/ayon_houdini/api/hda_utils.py | 6 +++++- .../ayon_8_8Lop_1lop__import_8_81.0/DialogScript | 2 +- .../ayon_8_8Lop_1lop__import_8_81.0/PythonModule | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/ayon_houdini/api/hda_utils.py b/client/ayon_houdini/api/hda_utils.py index a3b557a961..1edbb11f5e 100644 --- a/client/ayon_houdini/api/hda_utils.py +++ b/client/ayon_houdini/api/hda_utils.py @@ -641,7 +641,11 @@ def get_available_products(self, product_type): return list(sorted(product["name"] for product in products)) -def select_a_product(node): +def select_product_name(node): + """Show a modal pop-up dialog to allow user to select a product name + under the current folder entity as defined on the node's parameters. + + Applies the chosen value to the `product_name` parm on the node.""" cursor_pos = QtGui.QCursor.pos() diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript index 85e5c631f4..8af187792d 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript @@ -52,7 +52,7 @@ label "Product" type string default { "usdAsset" } - parmtag { "script_action" "from ayon_houdini.api.hda_utils import select_a_product;select_a_product(kwargs['node'])" } + parmtag { "script_action" "from ayon_houdini.api.hda_utils import select_product_name;select_product_name(kwargs['node'])" } parmtag { "script_action_icon" "BUTTONS_reselect" } parmtag { "script_callback" "hou.phm().set_to_latest_version(kwargs['node'])\nhou.phm().on_representation_parms_changed(kwargs['node'])" } parmtag { "script_callback_language" "python" } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule index ac17b275f9..0e91d023b2 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/PythonModule @@ -5,6 +5,6 @@ from ayon_houdini.api.hda_utils import ( on_representation_parms_changed, setup_flag_changed_callback, get_available_versions, - select_a_product, + select_product_name, set_to_latest_version ) From 6c436e1d6dce1af96de3fa54bf0d111a7f42c56d Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 10:15:05 +0200 Subject: [PATCH 26/43] Update client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help Co-authored-by: Mustafa Taher --- .../ayon_8_8Lop_1lop__import_8_81.0/Help | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help index 1e7eb3de0a..5881ed7bbc 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/Help @@ -16,10 +16,10 @@ Project: The name of the AYON project from which to load products. Folder Path: The path to the AYON folder (entity) within the project's hierarchy. -Product Type: - The type of AYON product to load (e.g., USD, point cache, camera, etc.). +Product : + The name of the AYON product you want to load. :note: - Product type can have multiple representations. + Products can have multiple representations. Version: The specific version of the product you want to load. Representation: From ad6fe6491431b665b1088fe275d1abaa8dc28100 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 11:33:06 +0200 Subject: [PATCH 27/43] Add missing icon --- .../AYON__icon.png | Bin 0 -> 16907 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/AYON__icon.png diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/AYON__icon.png b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/AYON__icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed13aeea527299092c400f18045b11b28c4d23ac GIT binary patch literal 16907 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 Date: Tue, 30 Jul 2024 11:58:04 +0200 Subject: [PATCH 28/43] Fix icon in help Co-authored-by: Mustafa Taher --- .../ExtraFileOptions | 20 +++++++++++++++++++ .../Sections.list | 1 + 2 files changed, 21 insertions(+) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions index 2c63c08510..aaeff3d9f3 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/ExtraFileOptions @@ -1,2 +1,22 @@ { + "AYON_icon.png/Cursor":{ + "type":"intarray", + "value":[0,0] + }, + "AYON_icon.png/IsExpr":{ + "type":"bool", + "value":false + }, + "AYON_icon.png/IsPython":{ + "type":"bool", + "value":false + }, + "AYON_icon.png/IsScript":{ + "type":"bool", + "value":false + }, + "AYON_icon.png/Source":{ + "type":"string", + "value":"AYON_icon.png" + } } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Sections.list b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Sections.list index d0a68c98ea..254039e2e1 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Sections.list +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Sections.list @@ -8,3 +8,4 @@ Help Help Tools.shelf Tools.shelf IconImage IconImage ExtraFileOptions ExtraFileOptions +AYON__icon.png AYON_icon.png From 27b59962ac9d3c8d5fff850813eb278c8a2231ac Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 12:16:23 +0200 Subject: [PATCH 29/43] Fix related URL --- .../ayon_8_8Lop_1mute__layers_8_81.0/Help | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help index fe85ee202c..e53d0cf914 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help +++ b/client/ayon_houdini/startup/otls/ayon_lop_mute_layers.hda/ayon_8_8Lop_1mute__layers_8_81.0/Help @@ -17,4 +17,4 @@ The `pattern` parameter has a drop-down to easily set or disable often used pres @related -* [Node:lop/configure_stage] \ No newline at end of file +* [Node:lop/configurestage] \ No newline at end of file From dda5482c7869539a65c6ccb9b64c1201bdda6649 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 12:20:08 +0200 Subject: [PATCH 30/43] Match Load Shot LOP with recent changes of Load Asset LOP Co-authored-by: Mustafa Taher --- .../DialogScript | 19 ++----------------- .../ayon_8_8Lop_1load__shot_8_81.0/OnCreated | 1 - .../PythonModule | 2 +- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript index 4925cb5338..980e555efb 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/DialogScript @@ -47,28 +47,13 @@ parmtag { "script_callback" "hou.phm().on_representation_parms_changed(kwargs['node'])" } parmtag { "script_callback_language" "python" } } - parm { - name "product_type" - label "Product Type" - type string - default { "usd" } - } parm { name "product_name" label "Product" type string default { "usdShot" } - menureplace { - [ "products = hou.phm().get_available_products(kwargs['node'])" ] - [ "" ] - [ "result = []" ] - [ "for product in products:" ] - [ " result.append(product)" ] - [ " result.append(product)" ] - [ " " ] - [ "return result" ] - language python - } + parmtag { "script_action" "from ayon_houdini.api.hda_utils import select_product_name;select_product_name(kwargs['node'])" } + parmtag { "script_action_icon" "BUTTONS_reselect" } parmtag { "script_callback" "hou.phm().set_to_latest_version(kwargs['node'])\nhou.phm().on_representation_parms_changed(kwargs['node'])" } parmtag { "script_callback_language" "python" } } diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnCreated b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnCreated index 06ccdaa653..bd09a7838b 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnCreated +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/OnCreated @@ -2,5 +2,4 @@ node = kwargs["node"] hda_module = node.hdaModule() hda_module.setup_flag_changed_callback(node) -node.parm("product_type").lock(True) node.parm("file").lock(True) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/PythonModule b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/PythonModule index 934fb2f612..0e91d023b2 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/PythonModule +++ b/client/ayon_houdini/startup/otls/ayon_lop_load_shot.hda/ayon_8_8Lop_1load__shot_8_81.0/PythonModule @@ -5,6 +5,6 @@ from ayon_houdini.api.hda_utils import ( on_representation_parms_changed, setup_flag_changed_callback, get_available_versions, - get_available_products, + select_product_name, set_to_latest_version ) From 296f622344694e7e1b7f8ceb1ff46b457b895a70 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 12:50:04 +0200 Subject: [PATCH 31/43] Make Set Project or Set Folder Path appear as pop-up dialog similar to Set Product Name --- client/ayon_houdini/api/hda_utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/ayon_houdini/api/hda_utils.py b/client/ayon_houdini/api/hda_utils.py index 1edbb11f5e..65d665c0f6 100644 --- a/client/ayon_houdini/api/hda_utils.py +++ b/client/ayon_houdini/api/hda_utils.py @@ -446,7 +446,7 @@ def __init__(self, parent=None): folder_widget = SimpleFoldersWidget(parent=self) - accept_button = QtWidgets.QPushButton("Accept") + accept_button = QtWidgets.QPushButton("Set folder path") main_layout = QtWidgets.QVBoxLayout(self) main_layout.addWidget(project_widget, 0) @@ -502,6 +502,8 @@ def select_folder_path(node): Args: node (hou.OpNode): The HDA node. """ + cursor_pos = QtGui.QCursor.pos() + main_window = lib.get_main_window() project_name = node.evalParm("project_name") @@ -520,6 +522,12 @@ def _select_folder_path(): dialog.setStyleSheet(load_stylesheet()) + # Make it appear like a pop-up near cursor + dialog.resize(300, 600) + dialog.setWindowFlags(QtCore.Qt.Popup) + pos = dialog.mapToGlobal(cursor_pos - QtCore.QPoint(300, 0)) + dialog.move(pos) + result = dialog.exec_() if result != QtWidgets.QDialog.Accepted: return From 0c0e4334832aa3f2c5600ac2c5510ba0bc0e590c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Jul 2024 12:57:54 +0200 Subject: [PATCH 32/43] Make `folder_name` a visible label instead --- .../startup/otls/ayon_lop_import.hda/INDEX__SECTION | 2 +- .../ayon_8_8Lop_1lop__import_8_81.0/DialogScript | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION index 6d9227f48e..f101cdfeb0 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/INDEX__SECTION @@ -10,5 +10,5 @@ Inputs: 0 to 1 Subnet: true Python: false Empty: false -Modified: Mon Jul 29 16:47:13 2024 +Modified: Tue Jul 30 12:57:14 2024 diff --git a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript index 1ce28f8228..c73479e728 100644 --- a/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript +++ b/client/ayon_houdini/startup/otls/ayon_lop_import.hda/ayon_8_8Lop_1lop__import_8_81.0/DialogScript @@ -50,10 +50,8 @@ parm { name "folder_name" label "Folder Name" - type string - invisible + type label default { "`strsplit(chs(\"folder_path\"), \"/\", -1)`" } - parmtag { "script_callback_language" "python" } } parm { name "product_name" From ad41a3000f603b925322d033908cddc38bf66717 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:05:00 +0200 Subject: [PATCH 33/43] bump version to '0.3.11' --- client/ayon_houdini/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_houdini/version.py b/client/ayon_houdini/version.py index 1819a6e4ed..01a2b9bebd 100644 --- a/client/ayon_houdini/version.py +++ b/client/ayon_houdini/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'houdini' version.""" -__version__ = "0.3.11-dev.1" +__version__ = "0.3.11" diff --git a/package.py b/package.py index e1f45c29cf..d2d830b1b4 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "houdini" title = "Houdini" -version = "0.3.11-dev.1" +version = "0.3.11" client_dir = "ayon_houdini" From 56998089202d224a91650987194cca4ea92628b6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:05:25 +0200 Subject: [PATCH 34/43] bump version to '0.3.12-dev.1' --- client/ayon_houdini/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_houdini/version.py b/client/ayon_houdini/version.py index 01a2b9bebd..89bc52e926 100644 --- a/client/ayon_houdini/version.py +++ b/client/ayon_houdini/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'houdini' version.""" -__version__ = "0.3.11" +__version__ = "0.3.12-dev.1" diff --git a/package.py b/package.py index d2d830b1b4..ef979eb493 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "houdini" title = "Houdini" -version = "0.3.11" +version = "0.3.12-dev.1" client_dir = "ayon_houdini" From 51a0417ea88da4f27d7f7b9f9952d095ebf6c961 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 2 Aug 2024 02:00:09 +0200 Subject: [PATCH 35/43] Fix Collect USD Layers logic + transfer `productGroup` to the extra product --- .../plugins/publish/collect_usd_layers.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/ayon_houdini/plugins/publish/collect_usd_layers.py b/client/ayon_houdini/plugins/publish/collect_usd_layers.py index 5fa787fb39..9d3459f084 100644 --- a/client/ayon_houdini/plugins/publish/collect_usd_layers.py +++ b/client/ayon_houdini/plugins/publish/collect_usd_layers.py @@ -114,7 +114,7 @@ def process(self, instance): project_name = context.data["projectName"] variant_base = instance.data["variant"] - subset = get_product_name( + product_name = get_product_name( project_name=project_name, # TODO: This should use task from `instance` task_name=context.data["anatomyData"]["task"]["name"], @@ -125,17 +125,20 @@ def process(self, instance): project_settings=context.data["project_settings"] ) - label = "{0} -> {1}".format(instance.data["name"], subset) + label = "{0} -> {1}".format(instance.data["name"], product_name) family = "usd" layer_inst.data["family"] = family layer_inst.data["families"] = [family] - layer_inst.data["subset"] = subset + layer_inst.data["productName"] = product_name + layer_inst.data["productType"] = instance.data["productType"] layer_inst.data["label"] = label - layer_inst.data["asset"] = instance.data["asset"] + layer_inst.data["folderPath"] = instance.data["folderPath"] layer_inst.data["task"] = instance.data.get("task") layer_inst.data["instance_node"] = instance.data["instance_node"] layer_inst.data["render"] = False layer_inst.data["output_node"] = creator_node + if instance.data.get("productGroup"): + layer_inst.data["productGroup"] = instance.data["productGroup"] # Inherit "use handles" from the source instance # TODO: Do we want to maybe copy full `publish_attributes` instead? From 17c87e0dc07ba2b2bd93265ac8bcc0b39cd897ee Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 2 Aug 2024 12:47:56 +0300 Subject: [PATCH 36/43] set `force_valid_node_name` flag when creating placeholder nodes --- client/ayon_houdini/api/workfile_template_builder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_houdini/api/workfile_template_builder.py b/client/ayon_houdini/api/workfile_template_builder.py index 352dba546d..ac4a70ed65 100644 --- a/client/ayon_houdini/api/workfile_template_builder.py +++ b/client/ayon_houdini/api/workfile_template_builder.py @@ -183,7 +183,8 @@ def create_placeholder_node(self, node_name=None): Feel free to override it in different workfile build plugins. """ - node = hou.node("/out").createNode("null", node_name) + node = hou.node("/out").createNode( + "null", node_name, force_valid_node_name=True) node.moveToGoodPosition() parms = node.parmTemplateGroup() for parm in {"execute", "renderdialog"}: From b44bab8a127cffe34936ee9596b66665697fd0a6 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 2 Aug 2024 15:40:49 +0300 Subject: [PATCH 37/43] fix wrong name when calling `setName` --- client/ayon_houdini/api/workfile_template_builder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_houdini/api/workfile_template_builder.py b/client/ayon_houdini/api/workfile_template_builder.py index ac4a70ed65..a3f95f16cf 100644 --- a/client/ayon_houdini/api/workfile_template_builder.py +++ b/client/ayon_houdini/api/workfile_template_builder.py @@ -231,6 +231,7 @@ def update_placeholder(self, placeholder_item, placeholder_data): # Update node name node_name = self.get_placeholder_node_name(placeholder_data) + node_name = hou.text.variableName(node_name) placeholder_node.setName(node_name, unique_name=True) def delete_placeholder(self, placeholder): From 2f25119f282945692d65e777edf1540e30c51046 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 6 Aug 2024 17:55:26 +0300 Subject: [PATCH 38/43] add `ValidateWaitForRender` --- .../publish/validate_wait_for_render.py | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 client/ayon_houdini/plugins/publish/validate_wait_for_render.py diff --git a/client/ayon_houdini/plugins/publish/validate_wait_for_render.py b/client/ayon_houdini/plugins/publish/validate_wait_for_render.py new file mode 100644 index 0000000000..8eea655b17 --- /dev/null +++ b/client/ayon_houdini/plugins/publish/validate_wait_for_render.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +import hou + +import pyblish.api +from ayon_core.pipeline import PublishValidationError +from ayon_core.pipeline.publish import RepairAction + +from ayon_houdini.api import plugin + + +class EnableWaitForRender(RepairAction): + label = "Enable WaitForRendertoComplete" + icon = "mdi.pencil-plus-outline" + + +class ValidateWaitForRender(plugin.HoudiniInstancePlugin): + """Validate `WaitForRendertoComplete` is enabled. + + Disabling `WaitForRendertoComplete` cause the local render to fail + as the publish execution continues while the render may not be finished yet. + + """ + + order = pyblish.api.ValidatorOrder + families = ["usdrender"] + label = "Validate Wait For Render to Complete" + actions = [EnableWaitForRender] + + def process(self, instance): + + if not instance.data.get("instance_node"): + # Ignore instances without an instance node + # e.g. in memory bootstrap instances + self.log.debug( + "Skipping instance without instance node: {}".format(instance) + ) + return + + if instance.data["creator_attributes"].get("render_target") != "local": + # This validator should work only with local render target. + self.log.debug( + "Skipping Validator, Render target is not 'Local machine rendering'" + ) + return + + invalid = self.get_invalid(instance) + if invalid: + rop = invalid[0] + raise PublishValidationError( + ("ROP node '{}' has 'Wait For Render to Complete' parm disabled." + "Please, enable it.".format(rop.path())), + title=self.label + ) + + @classmethod + def get_invalid(cls, instance): + + rop = hou.node(instance.data["instance_node"]) + if not rop.evalParm("soho_foreground"): + return [rop] + + @classmethod + def repair(cls, instance): + """Enable WaitForRendertoComplete. """ + + rop = hou.node(instance.data["instance_node"]) + rop.parm("soho_foreground").set(True) + From 0c977ba516b6df0663725d9e9e81916415760359 Mon Sep 17 00:00:00 2001 From: Mustafa Jafar Date: Wed, 7 Aug 2024 12:09:19 +0300 Subject: [PATCH 39/43] use f string instead. Co-authored-by: Kayla Man <64118225+moonyuet@users.noreply.github.com> --- client/ayon_houdini/plugins/publish/validate_wait_for_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_houdini/plugins/publish/validate_wait_for_render.py b/client/ayon_houdini/plugins/publish/validate_wait_for_render.py index 8eea655b17..13d6c167d5 100644 --- a/client/ayon_houdini/plugins/publish/validate_wait_for_render.py +++ b/client/ayon_houdini/plugins/publish/validate_wait_for_render.py @@ -32,7 +32,7 @@ def process(self, instance): # Ignore instances without an instance node # e.g. in memory bootstrap instances self.log.debug( - "Skipping instance without instance node: {}".format(instance) + f"Skipping instance without instance node: {instance}" ) return From 9f2c93acaa9b78fe05674bef2517d2ae02b30f49 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 7 Aug 2024 12:18:54 +0300 Subject: [PATCH 40/43] use the default form of repair action --- .../plugins/publish/validate_wait_for_render.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/client/ayon_houdini/plugins/publish/validate_wait_for_render.py b/client/ayon_houdini/plugins/publish/validate_wait_for_render.py index 13d6c167d5..09c54878fe 100644 --- a/client/ayon_houdini/plugins/publish/validate_wait_for_render.py +++ b/client/ayon_houdini/plugins/publish/validate_wait_for_render.py @@ -8,11 +8,6 @@ from ayon_houdini.api import plugin -class EnableWaitForRender(RepairAction): - label = "Enable WaitForRendertoComplete" - icon = "mdi.pencil-plus-outline" - - class ValidateWaitForRender(plugin.HoudiniInstancePlugin): """Validate `WaitForRendertoComplete` is enabled. @@ -24,7 +19,7 @@ class ValidateWaitForRender(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usdrender"] label = "Validate Wait For Render to Complete" - actions = [EnableWaitForRender] + actions = [RepairAction] def process(self, instance): From 69250cbd858f506659e76ac701bc3613af2924e7 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 22 Aug 2024 01:52:38 +0200 Subject: [PATCH 41/43] Collect required data for local and farm render jobs to have a 'colorspace' value specified --- client/ayon_houdini/api/colorspace.py | 68 +++++++++---------- .../plugins/publish/collect_arnold_rop.py | 14 +--- .../plugins/publish/collect_karma_rop.py | 17 +---- .../publish/collect_local_render_instances.py | 48 ++++++++----- .../plugins/publish/collect_mantra_rop.py | 17 +---- .../plugins/publish/collect_redshift_rop.py | 17 +---- .../publish/collect_render_colorspace.py | 41 +++++++++++ .../plugins/publish/collect_usd_render.py | 20 +----- .../plugins/publish/collect_vray_rop.py | 17 +---- 9 files changed, 117 insertions(+), 142 deletions(-) create mode 100644 client/ayon_houdini/plugins/publish/collect_render_colorspace.py diff --git a/client/ayon_houdini/api/colorspace.py b/client/ayon_houdini/api/colorspace.py index ec6e4c2091..31c112c247 100644 --- a/client/ayon_houdini/api/colorspace.py +++ b/client/ayon_houdini/api/colorspace.py @@ -1,59 +1,55 @@ +from typing import List + import attr import hou from ayon_houdini.api.lib import get_color_management_preferences -from ayon_core.pipeline.colorspace import get_display_view_colorspace_name +from ayon_core.pipeline.colorspace import ( + get_display_view_colorspace_name, + get_ocio_config_colorspaces +) + @attr.s class LayerMetadata(object): """Data class for Render Layer metadata.""" - frameStart = attr.ib() - frameEnd = attr.ib() + products: "List[RenderProduct]" = attr.ib() @attr.s class RenderProduct(object): - """Getting Colorspace as - Specific Render Product Parameter for submitting - publish job. - - """ + """Specific Render Product Parameter for submitting.""" colorspace = attr.ib() # colorspace - view = attr.ib() productName = attr.ib(default=None) class ARenderProduct(object): + """This is the minimal data structure required to get + `ayon_core.pipeline.farm.pyblish_functions.create_instances_for_aov` to + work with deadline addon's job submissions.""" + # TODO: The exact data structure should actually be defined in core for all + # addons to align. + def __init__(self, aov_names: List[str]): + colorspace = get_scene_linear_colorspace() + products = [ + RenderProduct(colorspace=colorspace, productName=aov_name) + for aov_name in aov_names + ] + self.layer_data = LayerMetadata(products=products) - def __init__(self): - """Constructor.""" - # Initialize - self.layer_data = self._get_layer_data() - self.layer_data.products = self.get_colorspace_data() - - def _get_layer_data(self): - return LayerMetadata( - frameStart=int(hou.playbar.frameRange()[0]), - frameEnd=int(hou.playbar.frameRange()[1]), - ) - - def get_colorspace_data(self): - """To be implemented by renderer class. - This should return a list of RenderProducts. +def get_scene_linear_colorspace(): + """Return colorspace name for Houdini's OCIO config scene linear role. - Returns: - list: List of RenderProduct + By default, renderers in Houdini render output images in the scene linear + role colorspace. - """ - data = get_color_management_preferences() - colorspace_data = [ - RenderProduct( - colorspace=data["display"], - view=data["view"], - productName="" - ) - ] - return colorspace_data + Returns: + Optional[str]: The colorspace name for the 'scene_linear' role in + the OCIO config Houdini is currently set to. + """ + ocio_config_path = hou.Color.ocio_configPath() + colorspaces = get_ocio_config_colorspaces(ocio_config_path) + return colorspaces["roles"].get("scene_linear", {}).get("colorspace") def get_default_display_view_colorspace(): diff --git a/client/ayon_houdini/plugins/publish/collect_arnold_rop.py b/client/ayon_houdini/plugins/publish/collect_arnold_rop.py index 10c6d91d26..bebdb789de 100644 --- a/client/ayon_houdini/plugins/publish/collect_arnold_rop.py +++ b/client/ayon_houdini/plugins/publish/collect_arnold_rop.py @@ -4,11 +4,8 @@ import hou import pyblish.api -from ayon_houdini.api import colorspace, plugin -from ayon_houdini.api.lib import ( - get_color_management_preferences, - evalParmNoFrame -) +from ayon_houdini.api import plugin +from ayon_houdini.api.lib import evalParmNoFrame class CollectArnoldROPRenderProducts(plugin.HoudiniInstancePlugin): @@ -100,7 +97,6 @@ def process(self, instance): self.log.debug("Found render product: {}".format(product)) instance.data["files"] = list(render_products) - instance.data["renderProducts"] = colorspace.ARenderProduct() # For now by default do NOT try to publish the rendered output instance.data["publishJobState"] = "Suspended" @@ -110,12 +106,6 @@ def process(self, instance): instance.data["expectedFiles"] = list() instance.data["expectedFiles"].append(files_by_aov) - # update the colorspace data - colorspace_data = get_color_management_preferences() - instance.data["colorspaceConfig"] = colorspace_data["config"] - instance.data["colorspaceDisplay"] = colorspace_data["display"] - instance.data["colorspaceView"] = colorspace_data["view"] - def get_render_product_name(self, prefix, suffix): """Return the output filename using the AOV prefix and suffix""" diff --git a/client/ayon_houdini/plugins/publish/collect_karma_rop.py b/client/ayon_houdini/plugins/publish/collect_karma_rop.py index 60fec9d2e0..87b194ae8e 100644 --- a/client/ayon_houdini/plugins/publish/collect_karma_rop.py +++ b/client/ayon_houdini/plugins/publish/collect_karma_rop.py @@ -4,14 +4,8 @@ import hou import pyblish.api -from ayon_houdini.api.lib import ( - evalParmNoFrame, - get_color_management_preferences -) -from ayon_houdini.api import ( - colorspace, - plugin -) +from ayon_houdini.api.lib import evalParmNoFrame +from ayon_houdini.api import plugin class CollectKarmaROPRenderProducts(plugin.HoudiniInstancePlugin): @@ -63,7 +57,6 @@ def process(self, instance): filenames = list(render_products) instance.data["files"] = filenames - instance.data["renderProducts"] = colorspace.ARenderProduct() for product in render_products: self.log.debug("Found render product: %s" % product) @@ -72,12 +65,6 @@ def process(self, instance): instance.data["expectedFiles"] = list() instance.data["expectedFiles"].append(files_by_aov) - # update the colorspace data - colorspace_data = get_color_management_preferences() - instance.data["colorspaceConfig"] = colorspace_data["config"] - instance.data["colorspaceDisplay"] = colorspace_data["display"] - instance.data["colorspaceView"] = colorspace_data["view"] - def get_render_product_name(self, prefix, suffix): product_name = prefix if suffix: diff --git a/client/ayon_houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_houdini/plugins/publish/collect_local_render_instances.py index 931a79535b..35c0e5afff 100644 --- a/client/ayon_houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_houdini/plugins/publish/collect_local_render_instances.py @@ -4,12 +4,15 @@ from ayon_core.pipeline.farm.patterning import match_aov_pattern from ayon_core.pipeline.publish import ( get_plugin_settings, - apply_plugin_settings_automatically + apply_plugin_settings_automatically, + ColormanagedPyblishPluginMixin ) from ayon_houdini.api import plugin +from ayon_houdini.api.colorspace import get_scene_linear_colorspace -class CollectLocalRenderInstances(plugin.HoudiniInstancePlugin): +class CollectLocalRenderInstances(plugin.HoudiniInstancePlugin, + ColormanagedPyblishPluginMixin): """Collect instances for local render. Agnostic Local Render Collector. @@ -49,9 +52,9 @@ def apply_settings(cls, project_settings): # get aov_filter from deadline settings cls.aov_filter = project_settings["deadline"]["publish"]["ProcessSubmittedJobOnFarm"]["aov_filter"] cls.aov_filter = { - item["name"]: item["value"] - for item in cls.aov_filter - } + item["name"]: item["value"] + for item in cls.aov_filter + } def process(self, instance): @@ -74,6 +77,14 @@ def process(self, instance): instance.data["productName"] ) + # NOTE: The assumption that the output image's colorspace is the + # scene linear role may be incorrect. Certain renderers, like + # Karma allow overriding explicitly the output colorspace of the + # image. Such override are currently not considered since these + # would need to be detected in a renderer-specific way and the + # majority of production scenarios these would not be overridden. + # TODO: Support renderer-specific explicit colorspace overrides + colorspace = get_scene_linear_colorspace() for aov_name, aov_filepaths in expectedFiles.items(): product_name = product_group @@ -108,6 +119,21 @@ def process(self, instance): if len(aov_filenames) == 1: aov_filenames = aov_filenames[0] + representation = { + "stagingDir": staging_dir, + "ext": ext, + "name": ext, + "tags": ["review"] if preview else [], + "files": aov_filenames, + "frameStart": instance.data["frameStartHandle"], + "frameEnd": instance.data["frameEndHandle"] + } + + # Set the colorspace for the representation + self.set_representation_colorspace(representation, + context, + colorspace=colorspace) + aov_instance.data.update({ # 'label': label, "task": instance.data["task"], @@ -120,17 +146,7 @@ def process(self, instance): "productGroup": product_group, "families": ["render.local.hou", "review"], "instance_node": instance.data["instance_node"], - "representations": [ - { - "stagingDir": staging_dir, - "ext": ext, - "name": ext, - "tags": ["review"] if preview else [], - "files": aov_filenames, - "frameStart": instance.data["frameStartHandle"], - "frameEnd": instance.data["frameEndHandle"] - } - ] + "representations": [representation] }) # Skip integrating original render instance. diff --git a/client/ayon_houdini/plugins/publish/collect_mantra_rop.py b/client/ayon_houdini/plugins/publish/collect_mantra_rop.py index f7feeee63b..f26768c3e9 100644 --- a/client/ayon_houdini/plugins/publish/collect_mantra_rop.py +++ b/client/ayon_houdini/plugins/publish/collect_mantra_rop.py @@ -4,14 +4,8 @@ import hou import pyblish.api -from ayon_houdini.api.lib import ( - evalParmNoFrame, - get_color_management_preferences -) -from ayon_houdini.api import ( - colorspace, - plugin -) +from ayon_houdini.api.lib import evalParmNoFrame +from ayon_houdini.api import plugin class CollectMantraROPRenderProducts(plugin.HoudiniInstancePlugin): @@ -108,7 +102,6 @@ def process(self, instance): filenames = list(render_products) instance.data["files"] = filenames - instance.data["renderProducts"] = colorspace.ARenderProduct() # For now by default do NOT try to publish the rendered output instance.data["publishJobState"] = "Suspended" @@ -118,12 +111,6 @@ def process(self, instance): instance.data["expectedFiles"] = list() instance.data["expectedFiles"].append(files_by_aov) - # update the colorspace data - colorspace_data = get_color_management_preferences() - instance.data["colorspaceConfig"] = colorspace_data["config"] - instance.data["colorspaceDisplay"] = colorspace_data["display"] - instance.data["colorspaceView"] = colorspace_data["view"] - def get_render_product_name(self, prefix, suffix): product_name = prefix if suffix: diff --git a/client/ayon_houdini/plugins/publish/collect_redshift_rop.py b/client/ayon_houdini/plugins/publish/collect_redshift_rop.py index 96cb6ebeaf..bd43805497 100644 --- a/client/ayon_houdini/plugins/publish/collect_redshift_rop.py +++ b/client/ayon_houdini/plugins/publish/collect_redshift_rop.py @@ -4,14 +4,8 @@ import hou import pyblish.api -from ayon_houdini.api.lib import ( - evalParmNoFrame, - get_color_management_preferences -) -from ayon_houdini.api import ( - colorspace, - plugin -) +from ayon_houdini.api.lib import evalParmNoFrame +from ayon_houdini.api import plugin class CollectRedshiftROPRenderProducts(plugin.HoudiniInstancePlugin): @@ -119,7 +113,6 @@ def process(self, instance): filenames = list(render_products) instance.data["files"] = filenames - instance.data["renderProducts"] = colorspace.ARenderProduct() # For now by default do NOT try to publish the rendered output instance.data["publishJobState"] = "Suspended" @@ -129,12 +122,6 @@ def process(self, instance): instance.data["expectedFiles"] = [] instance.data["expectedFiles"].append(files_by_aov) - # update the colorspace data - colorspace_data = get_color_management_preferences() - instance.data["colorspaceConfig"] = colorspace_data["config"] - instance.data["colorspaceDisplay"] = colorspace_data["display"] - instance.data["colorspaceView"] = colorspace_data["view"] - def get_render_product_name(self, prefix, suffix): """Return the output filename using the AOV prefix and suffix""" diff --git a/client/ayon_houdini/plugins/publish/collect_render_colorspace.py b/client/ayon_houdini/plugins/publish/collect_render_colorspace.py new file mode 100644 index 0000000000..1166243ce3 --- /dev/null +++ b/client/ayon_houdini/plugins/publish/collect_render_colorspace.py @@ -0,0 +1,41 @@ +from ayon_houdini.api import plugin, colorspace + +import pyblish.api + + +class CollectHoudiniRenderColorspace(plugin.HoudiniInstancePlugin): + """Collect Colorspace data for render output images. + + This currently assumes that all render products are in 'scene_linear' + colorspace role - which is the default behavior for renderers in Houdini. + """ + + label = "Collect Render Colorspace" + order = pyblish.api.CollectorOrder + 0.15 + families = ["mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop", + "usdrender"] + + def process(self, instance): + # Set the required data for `ayon_core.pipeline.farm.pyblish_functions` + # functions used for farm publish job processing. + + # Define render products for `create_instances_for_aov` + # which uses it in `_create_instances_for_aov()` to match the render + # product's name to aovs to define the colorspace. + expected_files = instance.data["expectedFiles"] + aov_name = list(expected_files[0].keys()) + render_products_data = colorspace.ARenderProduct(aov_name) + instance.data["renderProducts"] = render_products_data + + # Required data for `create_instances_for_aov` + colorspace_data = colorspace.get_color_management_preferences() + instance.data["colorspaceConfig"] = colorspace_data["config"] + instance.data["colorspaceDisplay"] = colorspace_data["display"] + instance.data["colorspaceView"] = colorspace_data["view"] + + # Used in `create_skeleton_instance()` + instance.data["colorspace"] = colorspace.get_scene_linear_colorspace() diff --git a/client/ayon_houdini/plugins/publish/collect_usd_render.py b/client/ayon_houdini/plugins/publish/collect_usd_render.py index a6e7572a18..2934cce246 100644 --- a/client/ayon_houdini/plugins/publish/collect_usd_render.py +++ b/client/ayon_houdini/plugins/publish/collect_usd_render.py @@ -4,14 +4,8 @@ import hou import pyblish.api -from ayon_houdini.api import ( - colorspace, - plugin -) -from ayon_houdini.api.lib import ( - evalParmNoFrame, - get_color_management_preferences -) +from ayon_houdini.api import plugin +from ayon_houdini.api.lib import evalParmNoFrame class CollectUsdRender(plugin.HoudiniInstancePlugin): @@ -23,9 +17,6 @@ class CollectUsdRender(plugin.HoudiniInstancePlugin): Provides: instance -> ifdFile - instance -> colorspaceConfig - instance -> colorspaceDisplay - instance -> colorspaceView """ @@ -75,12 +66,5 @@ def replace_to_f(match): if "$F" not in export_file: instance.data["splitRenderFrameDependent"] = False - # update the colorspace data - colorspace_data = get_color_management_preferences() - instance.data["colorspaceConfig"] = colorspace_data["config"] - instance.data["colorspaceDisplay"] = colorspace_data["display"] - instance.data["colorspaceView"] = colorspace_data["view"] - # stub required data for Submit Publish Job publish plug-in instance.data["attachTo"] = [] - instance.data["renderProducts"] = colorspace.ARenderProduct() diff --git a/client/ayon_houdini/plugins/publish/collect_vray_rop.py b/client/ayon_houdini/plugins/publish/collect_vray_rop.py index 2f9c2bb18e..ed360b37a5 100644 --- a/client/ayon_houdini/plugins/publish/collect_vray_rop.py +++ b/client/ayon_houdini/plugins/publish/collect_vray_rop.py @@ -4,14 +4,8 @@ import hou import pyblish.api -from ayon_houdini.api.lib import ( - evalParmNoFrame, - get_color_management_preferences -) -from ayon_houdini.api import ( - colorspace, - plugin -) +from ayon_houdini.api.lib import evalParmNoFrame +from ayon_houdini.api import plugin class CollectVrayROPRenderProducts(plugin.HoudiniInstancePlugin): @@ -89,7 +83,6 @@ def process(self, instance): self.log.debug("Found render product: %s" % product) filenames = list(render_products) instance.data["files"] = filenames - instance.data["renderProducts"] = colorspace.ARenderProduct() # For now by default do NOT try to publish the rendered output instance.data["publishJobState"] = "Suspended" @@ -100,12 +93,6 @@ def process(self, instance): instance.data["expectedFiles"].append(files_by_aov) self.log.debug("expectedFiles:{}".format(files_by_aov)) - # update the colorspace data - colorspace_data = get_color_management_preferences() - instance.data["colorspaceConfig"] = colorspace_data["config"] - instance.data["colorspaceDisplay"] = colorspace_data["display"] - instance.data["colorspaceView"] = colorspace_data["view"] - def get_render_product_name(self, prefix, suffix=""): """Return the beauty output filename if render element enabled """ From 3541eb3c0b71938d278aaddf34e2982e8bc0a6d7 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 22 Aug 2024 15:11:31 +0200 Subject: [PATCH 42/43] Force retrieving a default value for `view` if OCIO config is specified --- client/ayon_houdini/api/lib.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/client/ayon_houdini/api/lib.py b/client/ayon_houdini/api/lib.py index 3c2520250d..79935e40a3 100644 --- a/client/ayon_houdini/api/lib.py +++ b/client/ayon_houdini/api/lib.py @@ -579,12 +579,33 @@ def replace(match): def get_color_management_preferences(): """Get default OCIO preferences""" - return { + + preferences = { "config": hou.Color.ocio_configPath(), "display": hou.Color.ocio_defaultDisplay(), "view": hou.Color.ocio_defaultView() } + # Note: For whatever reason they are cases where `view` may be an empty + # string even though a valid default display is set where `PyOpenColorIO` + # does correctly return the values. + # Workaround to get the correct default view + if preferences["config"] and not preferences["view"]: + log.debug( + "Houdini `hou.Color.ocio_defaultView()` returned empty value." + " Falling back to `PyOpenColorIO` to get the default view.") + import PyOpenColorIO + config_path = preferences["config"] + config = PyOpenColorIO.Config.CreateFromFile(config_path) + display = config.getDefaultDisplay() + assert display == preferences["display"], \ + "Houdini default OCIO display must match config default display" + view = config.getDefaultView(display) + preferences["display"] = display + preferences["view"] = view + + return preferences + def get_obj_node_output(obj_node): """Find output node. From efdb4a4855693bb65f47ac6031157c2ba4b8831c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 22 Aug 2024 15:16:50 +0200 Subject: [PATCH 43/43] Do not hard error on Hou 19.5 or below --- client/ayon_houdini/api/lib.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/ayon_houdini/api/lib.py b/client/ayon_houdini/api/lib.py index 79935e40a3..dd89d2a922 100644 --- a/client/ayon_houdini/api/lib.py +++ b/client/ayon_houdini/api/lib.py @@ -594,7 +594,15 @@ def get_color_management_preferences(): log.debug( "Houdini `hou.Color.ocio_defaultView()` returned empty value." " Falling back to `PyOpenColorIO` to get the default view.") - import PyOpenColorIO + try: + import PyOpenColorIO + except ImportError: + log.warning( + "Unable to workaround empty return value of " + "`hou.Color.ocio_defaultView()` because `PyOpenColorIO` is " + "not available.") + return preferences + config_path = preferences["config"] config = PyOpenColorIO.Config.CreateFromFile(config_path) display = config.getDefaultDisplay()