From a9e2e7392295cf8edfcfd1345c31a14b41a12939 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 26 Nov 2022 20:24:53 +0000 Subject: [PATCH 1/4] Maintain time connections on update. --- openpype/hosts/maya/api/plugin.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/maya/api/plugin.py b/openpype/hosts/maya/api/plugin.py index 39d821f620..985cddaa08 100644 --- a/openpype/hosts/maya/api/plugin.py +++ b/openpype/hosts/maya/api/plugin.py @@ -217,7 +217,7 @@ class ReferenceLoader(Loader): # Need to save alembic settings and reapply, cause referencing resets # them to incoming data. - alembic_attrs = ["speed", "offset", "cycleType"] + alembic_attrs = ["speed", "offset", "cycleType", "time"] alembic_data = {} if representation["name"] == "abc": alembic_nodes = cmds.ls( @@ -226,7 +226,17 @@ class ReferenceLoader(Loader): if alembic_nodes: for attr in alembic_attrs: node_attr = "{}.{}".format(alembic_nodes[0], attr) - alembic_data[attr] = cmds.getAttr(node_attr) + connections = cmds.listConnections(node_attr, plugs=True) + data = { + "connected": False, + "attribute": None, + "value": cmds.getAttr(node_attr) + } + if connections: + data["connected"] = True + data["attribute"] = connections[0] + + alembic_data[attr] = data else: self.log.debug("No alembic nodes found in {}".format(members)) @@ -263,8 +273,14 @@ class ReferenceLoader(Loader): "{}:*".format(namespace), type="AlembicNode" ) if alembic_nodes: - for attr, value in alembic_data.items(): - cmds.setAttr("{}.{}".format(alembic_nodes[0], attr), value) + for attr, data in alembic_data.items(): + node_attr = "{}.{}".format(alembic_nodes[0], attr) + if data["connected"]: + cmds.connectAttr( + data["attribute"], node_attr, force=True + ) + else: + cmds.setAttr(node_attr, data["value"]) # Fix PLN-40 for older containers created with Avalon that had the # `.verticesOnlySet` set to True. From 9a439d408bbdb1ed2b32a61b1ab63f1740a72f65 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Wed, 30 Nov 2022 17:36:51 +0000 Subject: [PATCH 2/4] Improvements - account for time attribute reconnection. - simpler data collection --- openpype/hosts/maya/api/plugin.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/maya/api/plugin.py b/openpype/hosts/maya/api/plugin.py index 985cddaa08..66b525bad1 100644 --- a/openpype/hosts/maya/api/plugin.py +++ b/openpype/hosts/maya/api/plugin.py @@ -226,15 +226,13 @@ class ReferenceLoader(Loader): if alembic_nodes: for attr in alembic_attrs: node_attr = "{}.{}".format(alembic_nodes[0], attr) - connections = cmds.listConnections(node_attr, plugs=True) + inputs = cmds.listConnections( + node_attr, plugs=True, destination=False + ) data = { - "connected": False, - "attribute": None, + "input": None if inputs is None else inputs[0], "value": cmds.getAttr(node_attr) } - if connections: - data["connected"] = True - data["attribute"] = connections[0] alembic_data[attr] = data else: @@ -275,11 +273,16 @@ class ReferenceLoader(Loader): if alembic_nodes: for attr, data in alembic_data.items(): node_attr = "{}.{}".format(alembic_nodes[0], attr) - if data["connected"]: + if data["input"]: cmds.connectAttr( - data["attribute"], node_attr, force=True + data["input"], node_attr, force=True ) else: + inputs = cmds.listConnections( + node_attr, plugs=True, destination=False + ) + if inputs: + cmds.disconnectAttr(inputs[0], node_attr) cmds.setAttr(node_attr, data["value"]) # Fix PLN-40 for older containers created with Avalon that had the From 3acbd9bd0cc00811e10f8b48e1da60a129b2109c Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 10 Dec 2022 09:20:53 +0000 Subject: [PATCH 3/4] Prevent warning about already connected time attribute --- openpype/hosts/maya/api/plugin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/api/plugin.py b/openpype/hosts/maya/api/plugin.py index 66b525bad1..fe30001a96 100644 --- a/openpype/hosts/maya/api/plugin.py +++ b/openpype/hosts/maya/api/plugin.py @@ -273,7 +273,12 @@ class ReferenceLoader(Loader): if alembic_nodes: for attr, data in alembic_data.items(): node_attr = "{}.{}".format(alembic_nodes[0], attr) - if data["input"]: + + # Prevent warning about connecting to the time attribute + # cause Maya connects to this attribute by default. + if attr == "time": + continue + elif data["input"]: cmds.connectAttr( data["input"], node_attr, force=True ) From b833025a625ec2720da0822f76b4de24faae457f Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 10 Dec 2022 09:30:42 +0000 Subject: [PATCH 4/4] Improve readability --- openpype/hosts/maya/api/lib.py | 5 +++++ openpype/hosts/maya/api/plugin.py | 30 +++++++++++------------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/openpype/hosts/maya/api/lib.py b/openpype/hosts/maya/api/lib.py index 2530021eba..04b0ad35f1 100644 --- a/openpype/hosts/maya/api/lib.py +++ b/openpype/hosts/maya/api/lib.py @@ -3436,3 +3436,8 @@ def iter_visible_nodes_in_range(nodes, start, end): # If no more nodes to process break the frame iterations.. if not node_dependencies: break + + +def get_attribute_input(attr): + connections = cmds.listConnections(attr, plugs=True, destination=False) + return connections[0] if connections else None diff --git a/openpype/hosts/maya/api/plugin.py b/openpype/hosts/maya/api/plugin.py index fe30001a96..82df85a8be 100644 --- a/openpype/hosts/maya/api/plugin.py +++ b/openpype/hosts/maya/api/plugin.py @@ -226,11 +226,8 @@ class ReferenceLoader(Loader): if alembic_nodes: for attr in alembic_attrs: node_attr = "{}.{}".format(alembic_nodes[0], attr) - inputs = cmds.listConnections( - node_attr, plugs=True, destination=False - ) data = { - "input": None if inputs is None else inputs[0], + "input": lib.get_attribute_input(node_attr), "value": cmds.getAttr(node_attr) } @@ -271,23 +268,18 @@ class ReferenceLoader(Loader): "{}:*".format(namespace), type="AlembicNode" ) if alembic_nodes: + alembic_node = alembic_nodes[0] # assume single AlembicNode for attr, data in alembic_data.items(): - node_attr = "{}.{}".format(alembic_nodes[0], attr) - - # Prevent warning about connecting to the time attribute - # cause Maya connects to this attribute by default. - if attr == "time": - continue - elif data["input"]: - cmds.connectAttr( - data["input"], node_attr, force=True - ) + node_attr = "{}.{}".format(alembic_node, attr) + input = lib.get_attribute_input(node_attr) + if data["input"]: + if data["input"] != input: + cmds.connectAttr( + data["input"], node_attr, force=True + ) else: - inputs = cmds.listConnections( - node_attr, plugs=True, destination=False - ) - if inputs: - cmds.disconnectAttr(inputs[0], node_attr) + if input: + cmds.disconnectAttr(input, node_attr) cmds.setAttr(node_attr, data["value"]) # Fix PLN-40 for older containers created with Avalon that had the