def transfer_outgoing_connections(src, dst):
"""Connect outgoing connections from `src` to `dst`
Connections that cannot be made are ignored.
Arguments:
src (str): Absolute path to source node
dst (str): Absolute path to destination node
"""
for destination in cmds.listConnections(src,
source=False,
plugs=True) or []:
for source in cmds.listConnections(destination,
destination=False,
plugs=True) or []:
try:
cmds.connectAttr(source.replace(src, dst),
destination, force=True)
except RuntimeError:
continue
python类listConnections()的实例源码
def get_unused_utility_nodes():
u"""?????????????????????
:return: ??????????????????
:rtype: list of unicode
"""
utility_node_types = cmds.listNodeTypes("utility")
utility_nodes = []
for ul in utility_node_types:
nodes = cmds.ls(type=ul)
if not nodes:
continue
utility_nodes.extend(nodes)
unused = []
for u in utility_nodes:
if not [x for x in cmds.listConnections(u) if x != "defaultRenderUtilityList1"]:
unused.append(u)
return unused
def get_unused_shading_engines():
u"""????ShadingEngine???????
:return: ????ShadingEngine????
:rtype: list of unicode
"""
shading_engines = cmds.ls(type="shadingEngine")
unused_shading_engines = []
for s in shading_engines:
if s in _DEFAULT_SHADING_ENGINES:
continue
unused = True
for c in cmds.listConnections(s):
node_type = cmds.nodeType(c)
if "shader" in cmds.getClassification(node_type)[0]:
unused = False
break
if unused:
unused_shading_engines.append(s)
return unused_shading_engines
def BT_ConnectSetup(set = None):
if not set or not cmds.objExists(set):
return False
if BT_IsSetupConnected(set = set):
cmds.warning('Setup already connected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
for i in range(0, len(transforms)):
try:
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
except:
pass
mults = cmds.listConnections(btNode, d = True, type = 'multiplyDivide')
if mults:
cmds.delete(mults)
return True
def BT_ConnectSetup(set = None):
if not set or not cmds.objExists(set):
return False
if BT_IsSetupConnected(set = set):
cmds.warning('Setup already connected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
for i in range(0, len(transforms)):
try:
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
except:
pass
mults = cmds.listConnections(btNode, d = True, type = 'multiplyDivide')
if mults:
cmds.delete(mults)
return True
def BT_ConnectSetup(set = None):
if not set or not cmds.objExists(set):
return False
if BT_IsSetupConnected(set = set):
cmds.warning('Setup already connected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
for i in range(0, len(transforms)):
try:
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
except:
pass
mults = cmds.listConnections(btNode, d = True, type = 'multiplyDivide')
if mults:
cmds.delete(mults)
return True
def BT_ConnectSetup(set = None):
if not set or not cmds.objExists(set):
return False
if BT_IsSetupConnected(set = set):
cmds.warning('Setup already connected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
for i in range(0, len(transforms)):
try:
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
except:
pass
mults = cmds.listConnections(btNode, d = True, type = 'multiplyDivide')
if mults:
cmds.delete(mults)
return True
def copyShader(src = "", tgts = [], *args):
"""
gets the shader from the src and assigns it to the tgt objs
Args:
src (string): the object we're getting the shader FROM
tgts (list[strings]): the objects we're setting the shaders TO
"""
confirm = confirmDialog("Should I copy shaders?")
if confirm == "Yes":
for tgt in tgts:
shp = cmds.listRelatives(src, s=True)[0]
sg = cmds.listConnections(shp, t="shadingEngine")[0]
tshp = cmds.listRelatives(tgt, s=True)[0]
cmds.sets(tshp, e=True, forceElement=sg)
else:
print "Copy shader assignment cancelled"
return()
def delete_later_keys(obj, frame, *args):
"""sets a key at 'frame' and then deletes all subsequent keys in the timeline (time based only)"""
animTypes = ["animCurveTL","animCurveTA", "animCurveTT", "animCurveTU"]
animNodes = cmds.listConnections(obj, type="animCurve")
if not animNodes:
return()
for a in animNodes:
if (cmds.objectType(a)in animTypes):
cmds.setKeyframe(a, time=frame)
cmds.cutKey(a,clear=1, time=(frame + 1, 100000))
def get_channel_attributes(obj, chnl):
"""
gets and returns attributes of given channel on given object
"""
attrType = cmds.attributeQuery(chnl, node=obj, at=True)
hasMin = cmds.attributeQuery(chnl, node=obj, mne=True)
hasMin = cmds.attributeQuery(chnl, node=obj, mne=True)
hasMax = cmds.attributeQuery(chnl, node=obj, mxe=True)
attrMin = None
if hasMin:
attrMin = cmds.attributeQuery(chnl, node=obj, min=True)
attrMax = None
if hasMax:
attrMax = cmds.attributeQuery(chnl, node=obj, max=True)
value = cmds.getAttr("{0}.{1}".format(obj, chnl))
inConnection = cmds.listConnections("{0}.{1}".format(obj, chnl), plugs=True, destination=False, source=True)
outConnection = cmds.listConnections("{0}.{1}".format(obj, chnl), plugs=True, destination=True, source=False)
locked = cmds.getAttr("{0}.{1}".format(obj, chnl), lock=True)
return (attrType, hasMin, attrMin, hasMax, attrMax, value, inConnection, outConnection, locked)
def getRootAndCOM(node):
'''
Given either the root or COM, return root and COM based on connections.
'''
com = None
root = None
if mc.attributeQuery(COM_ATTR, node=node, exists=True):
com = node
messageCon = mc.listConnections(com+'.'+COM_ATTR, source=True, destination=False)
if not messageCon:
raise RuntimeError('Could not determine root from COM, please select root and run again.')
root = messageCon[0]
else:
messageCon = mc.listConnections(node+'.message', source=False, destination=True, plugs=True)
if messageCon:
for each in messageCon:
eachNode, attr = each.rsplit('.',1)
if attr == COM_ATTR:
com = eachNode
root = node
break
return root, com
def listAnimCurves(objOrAttrs):
'''
This lists connections to all types of animNodes
'''
animNodes = list()
tl = mc.listConnections(objOrAttr, s=True, d=False, type='animCurveTL')
ta = mc.listConnections(objOrAttr, s=True, d=False, type='animCurveTA')
tu = mc.listConnections(objOrAttr, s=True, d=False, type='animCurveTU')
if tl:
animNodes.extend(tl)
if ta:
animNodes.extend(ta)
if tu:
animNodes.extend(tu)
return animNodes
def pivot_driver_attr(node):
'''
Start with supporting pivots driven by remap value nodes, more support in the future as requested.
'''
#rpSrc = mc.listConnections(node+'.rotatePivot', source=True, destination=False, plugs=True)
#if rpSrc and rpSrc[0].endswith('.translate') and mc.getAttr(rpSrc[0], keyable=True):
#return rpSrc[0]
for each in ('rotatePivotX', 'rotatePivotY', 'rotatePivotZ'):
src = mc.listConnections(node+'.'+each, source=True, destination=False)
if not src:
continue
srcType = mc.nodeType(src[0])
if srcType == 'remapValue':
src = mc.listConnections(src[0]+'.inputValue', source=True, destination=False, plugs=True)
if src and mc.getAttr(src[0], keyable=True) and not mc.getAttr(src[0], lock=True):
return src[0]
return None
def createPipe(self, spans):
# We set the transform and shape to the class variables
self.transform, self.shape = cmds.polyPipe(subdivisionsAxis=spans)
# I didn't like having to find the constructor from the extrude node
# Lets just find it now and save it to the class because it won't change
for node in cmds.listConnections('%s.inMesh' % self.transform):
if cmds.objectType(node) == 'polyPipe':
self.constructor = node
break
def get_shape(node, intermediate=False):
"""Get the shape node of a tranform
This is useful if you don't want to have to check if a node is a shape node
or transform. You can pass in a shape node or transform and the function
will return the shape node.
:param node: node The name of the node.
:param intermediate: intermediate True to get the intermediate shape
:return: The name of the shape node.
"""
if cmds.nodeType(node) == 'transform':
shapes = cmds.listRelatives(node, shapes=True, path=True)
if not shapes:
shapes = []
for shape in shapes:
is_intermediate = cmds.getAttr('%s.intermediateObject' % shape)
if intermediate and is_intermediate and cmds.listConnections(shape, source=False):
return shape
elif not intermediate and not is_intermediate:
return shape
if shapes:
return shapes[0]
elif cmds.nodeType(node) in ['mesh', 'nurbsCurve', 'nurbsSurface']:
is_intermediate = cmds.getAttr('%s.intermediateObject' % node)
if is_intermediate and not intermediate:
node = cmds.listRelatives(node, parent=True, path=True)[0]
return get_shape(node)
else:
return node
return None
def get_stack_count(node):
"""Get the number of transforms in the stack.
:param node: Node to query.
:return: The number of transforms in the stack.
"""
connections = cmds.listConnections('{0}.message'.format(node), plugs=True) or []
count = 0
for connection in connections:
connected_node, attribute = connection.split('.')
if attribute == STACK_ATTRIBUTE:
count += 1
return count
def add_from_selected(self, field_layout):
# Get parentConstraints from the selected nodes
sel = cmds.ls(sl=True) or []
constraints = [x for x in sel if cmds.nodeType(x) == 'parentConstraint']
transforms = [x for x in sel if cmds.nodeType(x) in ['transform', 'joint']]
for transform in transforms:
constraints += (cmds.listConnections(transform, type='parentConstraint') or [])
constraints = list(set(constraints))
for constraint in constraints:
# Update the UI with the added constraint
data = constraint_data(constraint)
self.constraints.add_element(data=data, field_layout=field_layout)
def constraint_data(constraint):
"""Gets the parentConstraint data dictionary of the given constraint.
The data dictionary can be used as input into the Component.
:param constraint: Name of a parentConstraint node.
:return: The parentConstraint data dictionary.
"""
data = {
'drivers': cmds.parentConstraint(constraint, q=True, targetList=True),
'driven': cmds.listConnections('{0}.constraintParentInverseMatrix'.format(constraint), d=False)[0],
'maintain_offset': False,
'skip_tx': False,
'skip_ty': False,
'skip_tz': False,
'skip_rx': False,
'skip_ry': False,
'skip_rz': False,
}
offset = cmds.getAttr('{0}.target[0].targetOffsetTranslate'.format(constraint))[0]
offset += cmds.getAttr('{0}.target[0].targetOffsetRotate'.format(constraint))[0]
for value in offset:
if abs(value) > 0.000001:
data['maintain_offset'] = True
break
for x in 'xyz':
connection = cmds.listConnections('{0}.t{1}'.format(data['driven'], x), d=False)
if not connection or connection[0] != constraint:
data['skip_t{0}'.format(x)] = True
connection = cmds.listConnections('{0}.r{1}'.format(data['driven'], x), d=False)
if not connection or connection[0] != constraint:
data['skip_r{0}'.format(x)] = True
return data
def BT_IsSetupConnected(set = None):
if not set or not cmds.objExists(set):
return None
#test the first transform in the set
setItems = cmds.listConnections(set +'.dagSetMembers')
if not setItems:
return None
connections = cmds.listConnections(setItems[0], source = True, type = 'BlendTransforms')
if connections:
return True
return False
def BT_Setup(set = None):
if not set:
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
if not transforms:
return False
if not cmds.attributeQuery('Blend_Node', n = set, ex = True):
cmds.addAttr(set, ln = 'Blend_Node', k = False, h = True, dt = 'string')
else:
return False
btNode = cmds.createNode("BlendTransforms")
cmds.setAttr(set +'.Blend_Node', btNode, type = "string")
for i in range(0, len(transforms)):
baseMatrix = cmds.xform(transforms[i], q = True, m = True)
baseScale = cmds.getAttr(transforms[i] +'.scale')[0]
baseRotOffset = [0.0, 0.0, 0.0]
if cmds.objectType(transforms[i], isType = 'joint'):
baseRotOffset = cmds.getAttr(transforms[i] +'.jointOrient')[0]
btAttr = 'transforms[' +str(i) +'].baseMatrix'
btScaleAttr = 'transforms[' +str(i) +'].baseScale'
btRotOffsetAttr = 'transforms[' +str(i) +'].baseRotOffset'
BT_MatrixValuesToNode(values = baseMatrix, node = btNode, attr = btAttr)
BT_Double3ValuesToNode(values = baseScale, node = btNode, attr = btScaleAttr)
BT_Double3ValuesToNode(values = baseRotOffset, node = btNode, attr = btRotOffsetAttr)
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
return True
def BT_IsSetupConnected(set = None):
if not set or not cmds.objExists(set):
return None
#test the first transform in the set
setItems = cmds.listConnections(set +'.dagSetMembers')
if not setItems:
return None
connections = cmds.listConnections(setItems[0], source = True, type = 'BlendTransforms')
if connections:
return True
return False
def BT_Setup(set = None):
if not set:
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
if not transforms:
return False
if not cmds.attributeQuery('Blend_Node', n = set, ex = True):
cmds.addAttr(set, ln = 'Blend_Node', k = False, h = True, dt = 'string')
else:
return False
btNode = cmds.createNode("BlendTransforms")
cmds.setAttr(set +'.Blend_Node', btNode, type = "string")
for i in range(0, len(transforms)):
baseMatrix = cmds.xform(transforms[i], q = True, m = True)
baseScale = cmds.getAttr(transforms[i] +'.scale')[0]
baseRotOffset = [0.0, 0.0, 0.0]
if cmds.objectType(transforms[i], isType = 'joint'):
baseRotOffset = cmds.getAttr(transforms[i] +'.jointOrient')[0]
btAttr = 'transforms[' +str(i) +'].baseMatrix'
btScaleAttr = 'transforms[' +str(i) +'].baseScale'
btRotOffsetAttr = 'transforms[' +str(i) +'].baseRotOffset'
BT_MatrixValuesToNode(values = baseMatrix, node = btNode, attr = btAttr)
BT_Double3ValuesToNode(values = baseScale, node = btNode, attr = btScaleAttr)
BT_Double3ValuesToNode(values = baseRotOffset, node = btNode, attr = btRotOffsetAttr)
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
return True
def BT_DisconnectSetup(set = None):
if not set:
return False
if not BT_IsSetupConnected(set = set):
cmds.warning('Setup already disconnected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
numOutputs = cmds.getAttr(btNode +'.output', size = True)
print numOutputs
tempMult = None
for i in range(0, numOutputs):
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputT', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputT', conns[0] +'.translate')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputT', tempMult +'.input1')
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputR', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputR', conns[0] +'.rotate')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputR', tempMult +'.input1')
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputS', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputS', conns[0] +'.scale')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputS', tempMult +'.input1')
cmds.select(cl = True)
return True
def BT_IsSetupConnected(set = None):
if not set or not cmds.objExists(set):
return None
#test the first transform in the set
setItems = cmds.listConnections(set +'.dagSetMembers')
if not setItems:
return None
connections = cmds.listConnections(setItems[0], source = True, type = 'BlendTransforms')
if connections:
return True
return False
def BT_Setup(set = None):
if not set:
return False
transforms = cmds.listConnections(set +'.dagSetMembers')
if not transforms:
return False
if not cmds.attributeQuery('Blend_Node', n = set, ex = True):
cmds.addAttr(set, ln = 'Blend_Node', k = False, h = True, dt = 'string')
else:
return False
btNode = cmds.createNode("BlendTransforms")
cmds.setAttr(set +'.Blend_Node', btNode, type = "string")
for i in range(0, len(transforms)):
baseMatrix = cmds.xform(transforms[i], q = True, m = True)
baseScale = cmds.getAttr(transforms[i] +'.scale')[0]
baseRotOffset = [0.0, 0.0, 0.0]
if cmds.objectType(transforms[i], isType = 'joint'):
baseRotOffset = cmds.getAttr(transforms[i] +'.jointOrient')[0]
btAttr = 'transforms[' +str(i) +'].baseMatrix'
btScaleAttr = 'transforms[' +str(i) +'].baseScale'
btRotOffsetAttr = 'transforms[' +str(i) +'].baseRotOffset'
BT_MatrixValuesToNode(values = baseMatrix, node = btNode, attr = btAttr)
BT_Double3ValuesToNode(values = baseScale, node = btNode, attr = btScaleAttr)
BT_Double3ValuesToNode(values = baseRotOffset, node = btNode, attr = btRotOffsetAttr)
BT_ConnectOutputs(index = i, node = btNode, transform = transforms[i])
return True
def BT_DisconnectSetup(set = None):
if not set:
return False
if not BT_IsSetupConnected(set = set):
cmds.warning('Setup already disconnected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
numOutputs = cmds.getAttr(btNode +'.output', size = True)
print numOutputs
tempMult = None
for i in range(0, numOutputs):
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputT', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputT', conns[0] +'.translate')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputT', tempMult +'.input1')
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputR', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputR', conns[0] +'.rotate')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputR', tempMult +'.input1')
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputS', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputS', conns[0] +'.scale')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputS', tempMult +'.input1')
cmds.select(cl = True)
return True
def BT_IsSetupConnected(set = None):
if not set or not cmds.objExists(set):
return None
#test the first transform in the set
setItems = cmds.listConnections(set +'.dagSetMembers')
if not setItems:
return None
connections = cmds.listConnections(setItems[0], source = True, type = 'BlendTransforms')
if connections:
return True
return False
def BT_DisconnectSetup(set = None):
if not set:
return False
if not BT_IsSetupConnected(set = set):
cmds.warning('Setup already disconnected!')
return False
btNode = cmds.getAttr(set +'.Blend_Node')
if not btNode or not cmds.objExists(btNode):
return False
numOutputs = cmds.getAttr(btNode +'.output', size = True)
print numOutputs
tempMult = None
for i in range(0, numOutputs):
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputT', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputT', conns[0] +'.translate')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputT', tempMult +'.input1')
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputR', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputR', conns[0] +'.rotate')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputR', tempMult +'.input1')
conns = cmds.listConnections(btNode +'.output[' +str(i) +'].outputS', s = False, d = True)
if conns:
tempMult = cmds.createNode('multiplyDivide')
cmds.disconnectAttr(btNode +'.output[' +str(i) +'].outputS', conns[0] +'.scale')
cmds.connectAttr(btNode +'.output[' +str(i) +'].outputS', tempMult +'.input1')
cmds.select(cl = True)
return True
def inColor(self):
inputs = cmds.listConnections(self.attr('inColor'), d=False, s=True)
if inputs:
return inputs[0]
def inputs(self, **kws):
kws["source"] = True
kws.pop("s", None)
kws["destination"] = False
kws.pop("d", None)
return self.listConnections(**kws)