From dc8cd15f18ec39ae97e83e9381744a44970a5b34 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 2 Aug 2023 17:00:47 +0200 Subject: [PATCH 1/4] nuke: subset name driven form node name also publisher variant change is reflected in node name --- openpype/hosts/nuke/api/pipeline.py | 22 ++++++++++++++++++++++ openpype/hosts/nuke/api/plugin.py | 13 ++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/api/pipeline.py b/openpype/hosts/nuke/api/pipeline.py index fcc3becd2d..2871f8afbc 100644 --- a/openpype/hosts/nuke/api/pipeline.py +++ b/openpype/hosts/nuke/api/pipeline.py @@ -564,6 +564,9 @@ def list_instances(creator_id=None): if creator_id and instance_data["creator_identifier"] != creator_id: continue + # node name could change, so update subset name data + _update_subset_name_data(instance_data, node) + if "render_order" not in node.knobs(): subset_instances.append((node, instance_data)) continue @@ -589,6 +592,25 @@ def list_instances(creator_id=None): return ordered_instances +def _update_subset_name_data(instance_data, node): + """Update subset name data in instance data. + + Args: + instance_data (dict): instance creator data + node (nuke.Node): nuke node + """ + # make sure node name is subset name + old_subset_name = instance_data["subset"] + old_variant = instance_data["variant"] + subset_name_root = old_subset_name.replace(old_variant, "") + + new_subset_name = node.name() + new_variant = new_subset_name.replace(subset_name_root, "") + + instance_data["subset"] = new_subset_name + instance_data["variant"] = new_variant + + def remove_instance(instance): """Remove instance from current workfile metadata. diff --git a/openpype/hosts/nuke/api/plugin.py b/openpype/hosts/nuke/api/plugin.py index cfdb407d26..4a7bb03216 100644 --- a/openpype/hosts/nuke/api/plugin.py +++ b/openpype/hosts/nuke/api/plugin.py @@ -212,9 +212,20 @@ class NukeCreator(NewCreator): created_instance["creator_attributes"].pop(key) def update_instances(self, update_list): - for created_inst, _changes in update_list: + for created_inst, changes in update_list: instance_node = created_inst.transient_data["node"] + changed_keys = { + key: changes[key].new_value + for key in changes.changed_keys + } + + # update instance node name if subset name changed + if "subset" in changed_keys: + instance_node["name"].setValue( + changed_keys["subset"] + ) + # in case node is not existing anymore (user erased it manually) try: instance_node.fullName() From df78b060149dff6db27440aca8cee402be94cb0b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 2 Aug 2023 17:32:50 +0200 Subject: [PATCH 2/4] Nuke: improve ordering publishing instances --- openpype/hosts/nuke/api/pipeline.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/nuke/api/pipeline.py b/openpype/hosts/nuke/api/pipeline.py index 2871f8afbc..045f7ec85d 100644 --- a/openpype/hosts/nuke/api/pipeline.py +++ b/openpype/hosts/nuke/api/pipeline.py @@ -539,6 +539,8 @@ def list_instances(creator_id=None): """ instances_by_order = defaultdict(list) subset_instances = [] + instance_ids = set() + for node in nuke.allNodes(recurseGroups=True): if node.Class() in ["Viewer", "Dot"]: @@ -564,6 +566,11 @@ def list_instances(creator_id=None): if creator_id and instance_data["creator_identifier"] != creator_id: continue + if instance_data["instance_id"] in instance_ids: + instance_data.pop("instance_id") + else: + instance_ids.add(instance_data["instance_id"]) + # node name could change, so update subset name data _update_subset_name_data(instance_data, node) @@ -575,19 +582,20 @@ def list_instances(creator_id=None): instances_by_order[order].append((node, instance_data)) # Sort instances based on order attribute or subset name. + # TODO: remove in future Publisher enhanced with sorting ordered_instances = [] for key in sorted(instances_by_order.keys()): - instances_by_subset = {} - for node, data in instances_by_order[key]: - instances_by_subset[data["subset"]] = (node, data) + instances_by_subset = defaultdict(list) + for node, data_ in instances_by_order[key]: + instances_by_subset[data_["subset"]].append((node, data_)) for subkey in sorted(instances_by_subset.keys()): - ordered_instances.append(instances_by_subset[subkey]) + ordered_instances.extend(instances_by_subset[subkey]) - instances_by_subset = {} - for node, data in subset_instances: - instances_by_subset[data["subset"]] = (node, data) + instances_by_subset = defaultdict(list) + for node, data_ in subset_instances: + instances_by_subset[data_["subset"]].append((node, data_)) for key in sorted(instances_by_subset.keys()): - ordered_instances.append(instances_by_subset[key]) + ordered_instances.extend(instances_by_subset[key]) return ordered_instances From 9e008a80e0cb45f25d06f29d626e5657e199cf69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Thu, 3 Aug 2023 10:33:09 +0200 Subject: [PATCH 3/4] Update openpype/hosts/nuke/api/plugin.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- openpype/hosts/nuke/api/plugin.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/openpype/hosts/nuke/api/plugin.py b/openpype/hosts/nuke/api/plugin.py index 4a7bb03216..18e48ec79d 100644 --- a/openpype/hosts/nuke/api/plugin.py +++ b/openpype/hosts/nuke/api/plugin.py @@ -215,15 +215,10 @@ class NukeCreator(NewCreator): for created_inst, changes in update_list: instance_node = created_inst.transient_data["node"] - changed_keys = { - key: changes[key].new_value - for key in changes.changed_keys - } - # update instance node name if subset name changed - if "subset" in changed_keys: + if "subset" in changes: instance_node["name"].setValue( - changed_keys["subset"] + changes["subset"].new_value ) # in case node is not existing anymore (user erased it manually) From 9a8a16eed89d321c631aff3bd1379700afbd901c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 3 Aug 2023 10:35:36 +0200 Subject: [PATCH 4/4] use better list to check from --- openpype/hosts/nuke/api/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/api/plugin.py b/openpype/hosts/nuke/api/plugin.py index 18e48ec79d..85a4046823 100644 --- a/openpype/hosts/nuke/api/plugin.py +++ b/openpype/hosts/nuke/api/plugin.py @@ -216,7 +216,7 @@ class NukeCreator(NewCreator): instance_node = created_inst.transient_data["node"] # update instance node name if subset name changed - if "subset" in changes: + if "subset" in changes.changed_keys: instance_node["name"].setValue( changes["subset"].new_value )