Skip to content

Commit

Permalink
Attribute.get_node() returns correct long names for non-unique paths.
Browse files Browse the repository at this point in the history
Issue #153.
  • Loading branch information
david-cattermole committed Oct 11, 2020
1 parent c234878 commit f9aca58
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 3 deletions.
13 changes: 10 additions & 3 deletions python/mmSolver/_api/attribute.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,20 @@ def __repr__(self):

def get_node(self, full_path=True):
node = None
node_uuid = None
if self._dependFn is not None:
try:
node = self._dependFn.name()
node_uuid = self._dependFn.uuid().asString()
except RuntimeError:
pass
if node is not None and full_path is True:
node = node_utils.get_long_name(node)
if node_uuid is not None:
if full_path is True:
node = node_utils.get_long_name(node_uuid)
else:
nodes = maya.cmds.ls(node_uuid) or []
if len(nodes) > 0:
node = nodes[0]
assert node is None or isinstance(node, basestring)
return node

def get_node_uid(self):
Expand Down
45 changes: 45 additions & 0 deletions tests/test/test_api/test_attribute.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,51 @@ def test_get_state(self):
self.assertEqual(ry.is_animated(), True)
self.assertEqual(rz.is_locked(), True)

def test_non_unique_node_name(self):
"""
Test for identical child node names causing Attribute class to
incorrectly return the wrong node name.
-> top_node
`-> left
`-> same
`-< right
`-> same
See GitHub issue #153.
"""
top_node = maya.cmds.createNode(
'transform', name='top_node')
top_node = node_utils.get_long_name(top_node)

left_node = maya.cmds.createNode(
'transform', name='left', parent=top_node)
left_node = node_utils.get_long_name(left_node)

right_node = maya.cmds.createNode(
'transform', name='right', parent=top_node)
right_node = node_utils.get_long_name(right_node)

# Same name as right_same_node
left_same_node = maya.cmds.createNode(
'transform', name='same', parent=left_node)
left_same_node = node_utils.get_long_name(left_same_node)

# Same name as left_same_node
right_same_node = maya.cmds.createNode(
'transform', name='same', parent=right_node)
right_same_node = node_utils.get_long_name(right_same_node)

left_attr = attribute.Attribute(node=left_same_node, attr='translateX')
right_attr = attribute.Attribute(node=right_same_node, attr='translateX')

self.assertEqual(left_attr.get_node(), '|top_node|left|same')
self.assertEqual(left_attr.get_name(), '|top_node|left|same.translateX')

self.assertEqual(right_attr.get_node(), '|top_node|right|same')
self.assertEqual(right_attr.get_name(), '|top_node|right|same.translateX')
return


if __name__ == '__main__':
prog = unittest.main()

0 comments on commit f9aca58

Please sign in to comment.