[Maya Mel/Python] look up array attribute connections
Maya list / lookup multi attribute connections in MEL & Python - 01/2022 - #Maya
MEL
Consider this node and connections to the array (multi) attribute .matrix
:
MEL command to list every DG nodes connected to a multi attribute (a.k.a array attribute):
string $joint_names[] = `listConnections ($skincluster+".matrix")`; // example output: {'joint1', 'joint2'}
Now here is how to list the "logical" indices of an array attribute that are connected to a node:
int $joint_indices[] = `getAttr -multiIndices ($skincluster+".matrix")`; // example output: {0, 2}
Note: you may recall that array attributes can be sparse, for instance:
array_attribute[2] : [ joint1, joint2] Logical indices : { 0, 2} Physical indices : { 0, 1}
Summary
This is how to transfer the connections of a multi (i.e. array) attribute from one Maya node to another:string $joint_names[] = `listConnections ($source_skincluster+".matrix")`; int $joint_indices[] = `getAttr -multiIndices ($source_skincluster+".matrix")`; // Loop through the nodes connected to the attribute '$source_skincluster+".matrix[]"' for( $i = 0; $i < size($joint_indices); ++$i) { int $idx = $joint_indices[$i]; string $name = $joint_names[$i]; // Reconnect joints to another skin cluster while preserving the original indices of the joints: connectAttr ($name+".worldMatrix[0]") ($destination_skincluster+".matrix["+$idx+"]") }
Python 2.0 API
The above MEL code translates as follows:
from maya.api.OpenMaya import * # get_MObject() and get_MPlug() are utilities I define below obj = get_MObject("skinCluster1") plug = get_MPlug(obj, "matrix") for i in range(plug.numElements()): plug_element = plug.elementByPhysicalIndex(i) print( "name: " + plug_element.name() ) print( "logical index: " + str(plug_element.logicalIndex()) ) print( "physical index: " + str(i) ) print( "" )
Output:
# name: skinCluster1.matrix[0] # logical index: 0 # physical index: 0 # # name: skinCluster1.matrix[2] # logical index: 2 # physical index: 1
from maya.api.OpenMaya import * def get_MObject(node_name): if isinstance(node_name, MObject): return node_name if isinstance(node_name, MDagPath): return node_name.node() slist = MSelectionList() try: slist.add(node_name) except RuntimeError: assert False, 'The node: "'+node_name+'" could not be found.' matches = slist.length() assert (matches == 1), 'Multiple nodes found for the same name: '+node_name obj = slist.getDependNode(0) return obj # ----------------- def get_MPlug(obj, attribute): if not isinstance(obj, MObject): assert False, "expected MObject" dep = MFnDependencyNode(obj) plug = MPlug() try: plug = dep.findPlug( attribute, True) except RuntimeError: assert False, 'The attribute: "'+attribute+'" could not be found.' assert (not plug.isNull), 'The attribute: "'+attribute+'" could not be found.' return plug # -----------------
No comments