我们从Python开源项目中,提取了以下33个代码示例,用于说明如何使用maya.cmds.listAttr()。
def set_defaults(*args): """Set currently selected values from channel box to their default value If no channel is selected, default all keyable attributes. """ for node in cmds.ls(selection=True): selected_channels = read_selected_channels() for channel in (selected_channels or cmds.listAttr(node, keyable=True)): try: default = cmds.attributeQuery(channel, node=node, listDefault=True)[0] except Exception: continue else: cmds.setAttr(node + "." + channel, default)
def clone_special(*args): """Clone in localspace, and preserve user-defined attributes""" for transform in cmds.ls(selection=True, long=True): if cmds.nodeType(transform) != "transform": cmds.warning("Skipping '%s', not a `transform`" % transform) continue shape = _find_shape(transform) type = cmds.nodeType(shape) if type not in ("mesh", "nurbsSurface", "nurbsCurve"): cmds.warning("Skipping '{transform}': cannot clone nodes " "of type '{type}'".format(**locals())) continue cloned = commands.clone(shape, worldspace=False) new_transform = cmds.listRelatives(cloned, parent=True, fullPath=True)[0] new_transform = cmds.rename(new_transform, new_transform.rsplit(":", 1)[-1]) for attr in cmds.listAttr(transform, userDefined=True) or list(): try: cmds.addAttr(new_transform, longName=attr, dataType="string") except Exception: continue value = cmds.getAttr(transform + "." + attr) cmds.setAttr(new_transform + "." + attr, value, type="string") # Connect visibility cmds.connectAttr(transform + ".visibility", new_transform + ".visibility")
def get_stack_parent(node): """Get the parent of the transform stack belonging to the given node. :param node: Node to query. :return: The parent node or None if there is no parent. """ previous_parent = cmds.listRelatives(node, parent=True, path=True) if not previous_parent: return None previous_parent = previous_parent[0] while previous_parent and STACK_ATTRIBUTE in (cmds.listAttr(previous_parent, ud=True) or []): parent = cmds.listRelatives(previous_parent, parent=True, path=True) if parent: parent = parent[0] previous_parent = parent return previous_parent
def read(node): """Return user-defined attributes from `node` """ data = dict() for attr in cmds.listAttr(node, userDefined=True) or list(): try: value = cmds.getAttr(node + "." + attr) except: # Some attributes cannot be read directly, # such as mesh and color attributes. These # are considered non-essential to this # particular publishing pipeline. value = None data[attr] = value return data
def clearShaderConnections(ts="", geo="", *args): myShape = cmds.listRelatives(geo, s=True)[0] tsList = cmds.listAttr(ts, m=True, st=["*input*"]) if tsList: # delete empty entries? ? # for tsInput in tsList: # shpList = cmds.connectionInfo("{0}.{1}.inShape".format(ts, tsInput), sfd=True) # if not shpList: # cmds.removeMultiInstance("blinn1_TripleSwitch.{0}".format(tsInput)) for tsInput in tsList: shpList = cmds.connectionInfo("{0}.{1}.inShape".format(ts, tsInput), sfd=True).partition(".") shp = "" if shpList: shp = shpList[0] if shp == myShape: # clear out the shape node cmds.disconnectAttr("{0}.instObjGroups[0]".format(shp), "{0}.{1}.inShape".format(ts, tsInput)) # clear out the texture (delete if we can) txt = cmds.connectionInfo("{0}.{1}.inTriple".format(ts, tsInput), sfd=True).partition(".")[0] cmds.disconnectAttr("{0}.outColor".format(txt), "{0}.{1}.inTriple".format(ts, tsInput)) p2d = cmds.connectionInfo("{0}.uvCoord".format(txt), sfd=True).partition(".")[0] cmds.delete(txt, p2d)
def read(node): """Return user-defined attributes from `node`""" data = dict() for attr in cmds.listAttr(node, userDefined=True) or list(): try: value = cmds.getAttr(node + "." + attr) except ValueError: # Some attributes cannot be read directly, # such as mesh and color attributes. These # are considered non-essential to this # particular publishing pipeline. value = None data[attr] = value return data
def getNodeAttributes(node): ''' Get Maya node attributes ''' attributes = cmds.listAttr(node) attr = {} attr['nodeName'] = node attr['nodeType'] = cmds.nodeType(node) for attribute in attributes: if '.' in attribute: continue try: val = cmds.getAttr(node + '.' + attribute) except RuntimeError: continue attr[attribute] = val return attr
def channels(self): ''' The keySelection's channels list. ''' if not self._channels: if self._curves: for c in self._curves: self._channels.append(getChannelFromAnimCurve(c)) elif self._nodes: for obj in self._nodes: keyable = mc.listAttr(obj, keyable=True, unlocked=True, hasData=True, settable=True) if keyable: for attr in keyable: self._channels.append('.'.join((obj, attr))) return self._channels
def connect_matching_attributes(source, target): """Connect matching attributes from source to target Arguments: source (str): Absolute path to node from which to connect target (str): Target node Example: >>> # Select two matching nodes >>> source = cmds.createNode("transform", name="source") >>> target = cmds.createNode("transform", name="target") >>> cmds.select([source, target], replace=True) >>> source, target = cmds.ls(selection=True) >>> connect_matching_attributes(source, target) """ dsts = cmds.listAttr(target, keyable=True) for src in cmds.listAttr(source, keyable=True): if src not in dsts: continue try: src = "." + src cmds.connectAttr(source + src, target + src, force=True) except RuntimeError as e: cmds.warning("Could not connect %s: %s" % (src, e))
def create_transform_stack(node, count=2): """Creates a transform stack above the given node. Any previous transform stack will be deleted. :param node: Node to parent into a transform stack. :param count: Number of transforms to add in the stack. :return: A list of the transform nodes created starting from top to bottom. """ previous_parent = cmds.listRelatives(node, parent=True, path=True) if previous_parent: previous_parent = previous_parent[0] while previous_parent and STACK_ATTRIBUTE in (cmds.listAttr(previous_parent, ud=True) or []): parent = cmds.listRelatives(previous_parent, parent=True, path=True) if parent: cmds.parent(node, parent) parent = parent[0] else: cmds.parent(node, world=True) cmds.delete(previous_parent) previous_parent = parent nulls = [] for i in reversed(range(count)): name = '_'.join(node.split('_')[:-1]) name = '{0}_{1}nul'.format(name, i+1) null = cmds.createNode('transform', name=name) nulls.append(null) cmds.addAttr(null, ln=STACK_ATTRIBUTE, at='message') cmds.connectAttr('{0}.message'.format(node), '{0}.{1}'.format(null, STACK_ATTRIBUTE)) cmds.delete(cmds.parentConstraint(node, null)) if previous_parent: cmds.parent(null, previous_parent) previous_parent = null cmds.parent(node, previous_parent) return nulls
def BT_GetPosesFromSet(set = None): if not set: return False allUserDefined = cmds.listAttr(set, ud = True) if not allUserDefined: return '' btUserDefined = [x[3:] for x in allUserDefined if x.startswith('BT_')] if not btUserDefined: return '' return btUserDefined
def listAttrStr(self, *args, **kwds): _name = self.name() attrnames = [] if args: attrnames = cmds.listAttr([_name+"."+attr.split(".")[-1] for attr in args], **kwds) else: attrnames = cmds.listAttr(_name, **kwds) if not attrnames: return [] else: return attrnames
def doSpaceMatch(*args): #check for correct attrs obj = cmds.textFieldButtonGrp(widgets["objTFG"], q=True, tx=True) #look for message attr re: constraint if (cmds.attributeQuery("spaceConstraint", node=obj, exists=True)): constraint = cmds.listConnections("%s.spaceConstraint"%obj) else: cmds.warning("this object has no \"spaceConstraint\" message attribute and thus is not set up for this matching") #----------look for string attributes for weights of constraints #get ws pos of obj before ws1Pos = cmds.xform(obj, q=True, ws=True, t=True) ws1Rot = cmds.xform(obj, q=True, ws=True, ro=True) #pull the constraint info from the message and string attrs #attr = cmds.listAttr(sel,ud=True ) #-----------here just key the space value!!! #switch the spaces, set up "cases", i.e. if world, then set all to 0 except world, etc cmds.setAttr("group1_parentConstraint1.pCube1W0", 0) cmds.setAttr("group1_parentConstraint1.pCube2W1", 1) #set ws pos, rot of obj after cmds.xform(obj, ws=True, t=ws1Pos) cmds.xform(obj, ws=True, ro=ws1Rot) #add in scriptjob? #-----------try this #set up constraints as normal, maybe DO NOT have to moniter them specifically, set them up as SDKs #constraint goes in as message mapped "spaceConstraint" #create string attrs for constraint, each space attrname = space , attrVal = constraintAttr(ie. nameW1) #Create one tab to set it up #creat one tab to do it - get spaces
def getSpaceSwitchData(node): data = {} attrs = mc.listAttr(node, userDefined=True, keyable=True) if not attrs: return data ssAttrs = [x for x in attrs if 'paceSwitch' in x] for attr in ssAttrs: enumValues = [] spaceEnum = 'space' if attr == 'spaceSwitch': if not 'space' in attrs: spaceEnum = 'spaceSwitch' enumValues = mc.attributeQuery(spaceEnum, node=node, listEnum=True) elif 'SpaceSwitch' in attr: baseName = attr.replace('SpaceSwitch','') if baseName + 'Space' in attrs: spaceEnum = baseName+'Space' else: spaceEnum = attr if spaceEnum in attrs and mc.attributeQuery(spaceEnum, node=node, attributeType=True) == 'enum': enumValues = mc.attributeQuery(spaceEnum, node=node, listEnum=True) if not enumValues: continue data[attr] = {} data[attr]['enumValues'] = enumValues[0].split(':') data[attr]['currentValue'] = mc.getAttr(node+'.'+spaceEnum, asString=True) return data
def copyPose(fromNode, toNode, flip=False): attrs = mc.listAttr(fromNode, keyable=True) if not attrs: return #if attributes are aliased, get the real names for mirroring axis aliases = mc.aliasAttr(fromNode, query=True) if aliases: for alias,real in zip(aliases[::2],aliases[1::2]): if alias in attrs: attrs.remove(alias) attrs.append(real) axis = getMirrorAxis(toNode) for attr in attrs: if attr == 'mirrorAxis': continue if not mc.attributeQuery(attr, node=toNode, exists=True): continue fromPlug = '{}.{}'.format(fromNode, attr) toPlug = '{}.{}'.format(toNode, attr) fromValue = mc.getAttr(fromPlug) toValue = mc.getAttr(toPlug) if attr in axis: fromValue *= -1.0 toValue *= -1.0 try: utl.setAnimValue(toPlug, fromValue) except:pass if flip: try: utl.setAnimValue(fromPlug, toValue) except:pass
def constrain(source, destination, translate=True, rotate=True, scale=False): ''' Constrain two objects, even if they have some locked attributes. ''' transAttr = None rotAttr = None scaleAttr = None if translate: transAttr = mc.listAttr(destination, keyable=True, unlocked=True, string='translate*') if rotate: rotAttr = mc.listAttr(destination, keyable=True, unlocked=True, string='rotate*') if scale: scaleAttr = mc.listAttr(destination, keyable=True, unlocked=True, string='scale*') rotSkip = list() transSkip = list() for axis in ['x','y','z']: if transAttr and not 'translate'+axis.upper() in transAttr: transSkip.append(axis) if rotAttr and not 'rotate'+axis.upper() in rotAttr: rotSkip.append(axis) if not transSkip: transSkip = 'none' if not rotSkip: rotSkip = 'none' constraints = list() if rotAttr and transAttr and rotSkip == 'none' and transSkip == 'none': constraints.append(mc.parentConstraint(source, destination)) else: if transAttr: constraints.append(mc.pointConstraint(source, destination, skip=transSkip)) if rotAttr: constraints.append(mc.orientConstraint(source, destination, skip=rotSkip)) return constraints
def transferKeytimes(source, destinations): if not isinstance(destinations, (list, tuple)): destinations = [destinations] attributes = mc.listAttr(source, keyable=True, unlocked=True) keytimes = dict() start = None end = None for a in attributes: currKeytimes = mc.keyframe(source, attribute=a, query=True, timeChange=True) if not currKeytimes: continue if start == None or currKeytimes[0] < start: start = currKeytimes[0] if end == None or currKeytimes[-1] > end: end = currKeytimes[-1] keytimes[a] = currKeytimes #allKeyTimes.extend(currKeytimes) if not keytimes: return with utl.IsolateViews(): mc.bakeResults(destinations, time=(start,end), sampleBy=1, preserveOutsideKeys=True, simulation=True) #euler filter mc.filterCurve(mc.listConnections(destinations,type='animCurve')) #go through all keys and delete for k in keytimes: for f in range(int(start), int(end)): if not f in keytimes[k]: mc.cutKey(destinations, attribute=k, time=(f,))
def showAll(*args): sel = mc.ls(sl=True) if not sel: return for each in sel: attrs = mc.listAttr(each, keyable=True, unlocked=True) if attrs: for a in attrs: mc.selectionConnection('graphEditor1FromOutliner', edit=True, select=each+'.'+a)
def main(selectedChannels=True, transformsOnly=False, excludeChannels=None): ''' Resets selected channels in the channel box to default, or if nothing's selected, resets all keyable channels to default. ''' gChannelBoxName = mm.eval('$temp=$gChannelBoxName') sel = mc.ls(sl=True) if not sel: return if excludeChannels and not isinstance(excludeChannels, (list, tuple)): excludeChannels = [excludeChannels] chans = None if selectedChannels: chans = mc.channelBox(gChannelBoxName, query=True, sma=True) testList = ['translateX','translateY','translateZ','rotateX','rotateY','rotateZ','scaleX','scaleY','scaleZ', 'tx','ty','yz','rx','ry','rz','sx','sy','sz'] for obj in sel: attrs = chans if not chans: attrs = mc.listAttr(obj, keyable=True, unlocked=True) if excludeChannels: attrs = [x for x in attrs if x not in excludeChannels] if transformsOnly: attrs = [x for x in attrs if x in testList] if attrs: for attr in attrs: try: default = mc.attributeQuery(attr, listDefault=True, node=obj)[0] mc.setAttr(obj+'.'+attr, default) except StandardError: pass utl.deselectChannels()
def process(self, context): from maya import cmds for objset in cmds.ls("*.id", long=True, # Produce full names type="objectSet", # Only consider objectSets recursive=True, # Include namespace objectsOnly=True): # Return objectSet, rather # than its members is_empty = cmds.sets(objset, query=True) is None if is_empty: self.log.info("%s skipped, it was empty." % objset) continue if not cmds.objExists(objset + ".id"): continue if cmds.getAttr(objset + ".id") not in ( "pyblish.avalon.instance", # Backwards compatibility "pyblish.mindbender.instance"): continue # The developer is responsible for specifying # the family of each instance. assert cmds.objExists(objset + ".family"), ( "\"%s\" was missing a family" % objset) data = dict() # Apply each user defined attribute as data for attr in cmds.listAttr(objset, userDefined=True) or list(): try: value = cmds.getAttr(objset + "." + attr) except Exception: # Some attributes cannot be read directly, # such as mesh and color attributes. These # are considered non-essential to this # particular publishing pipeline. value = None data[attr] = value name = cmds.ls(objset, long=False)[0] # Use short name instance = context.create_instance(data.get("name", name)) instance[:] = cmds.sets(objset, query=True) or list() instance.data.update(data) # Produce diagnostic message for any graphical # user interface interested in visualising it. self.log.info("Found: \"%s\" " % instance.data["name"])
def rebuild_joints(*args): if not cmds.objExists(ORIENT_GROUP): return nodes = cmds.listRelatives(ORIENT_GROUP, ad=True, path=True) or [] joints = [] for node in nodes: attrs = cmds.listAttr(node, ud=True) or [] if MESSAGE_ATTRIBUTE not in attrs: continue joint = cmds.listConnections('{0}.{1}'.format(node, MESSAGE_ATTRIBUTE), d=False)[0] joints.append(joint) rotation = cmds.getAttr('{0}.rx'.format(node)) children = cmds.listRelatives(joint, children=True, shapes=False, path=True) if children: # First unparent children so change in joint orient does not affect children children = [cmds.parent(child, world=True)[0] for child in children] # Add rotation offset to joint orient orient_x = cmds.getAttr('{0}.jointOrientX'.format(joint)) orient_x += rotation while orient_x > 180.0: orient_x -= 360.0 while orient_x < -180.0: orient_x += 360.0 cmds.setAttr('{0}.jointOrientX'.format(joint), orient_x) # Reparent child for child in children: cmds.parent(child, joint) else: # tip joint, just zero out joint orient cmds.setAttr('%s.jointOrientX' % joint, 0) cmds.setAttr('%s.jointOrientY' % joint, 0) cmds.setAttr('%s.jointOrientZ' % joint, 0) # Untemplate cmds.setAttr('{0}.template'.format(joint), 0) # Delete arrow group cmds.delete(ORIENT_GROUP) cmds.select(joints)
def BT_DeletePose(set = None, poseIndex = None): if not set or poseIndex is None: return False if not cmds.attributeQuery('Blend_Node', ex = True, n = set): return False if BT_IsSetupConnected(set): cmds.warning('Disconnect setup first!') return False blendNode = cmds.getAttr(set +'.Blend_Node') if not cmds.objExists(blendNode) or not cmds.objExists(set): return False numTransforms = cmds.getAttr(blendNode +'.transforms', size = True) if not numTransforms: return False numPoses = cmds.getAttr(blendNode +'.transforms[0].poses', size = True) allUserDefined = cmds.listAttr(set, ud = True) btUserDefined = [x for x in allUserDefined if x.startswith('BT_')] if poseIndex >= numPoses: return False connectionsToBreak = cmds.listConnections(set +'.' +btUserDefined[poseIndex], d = True, s = False, p = True) for ctb in connectionsToBreak: cmds.disconnectAttr(set +'.' +btUserDefined[poseIndex], ctb) cmds.deleteAttr(set +'.' +btUserDefined[poseIndex]) for i in range(0, numTransforms): for p in range(poseIndex, numPoses-1): #get the next items vales matrix = cmds.getAttr(blendNode +'.transforms[' +str(i) +'].poses[' +str(p+1) +'].matrix') scale = cmds.getAttr(blendNode +'.transforms[' +str(i) +'].poses[' +str(p+1) +'].scale')[0] conn = cmds.listConnections(blendNode +'.transforms[' +str(i) +'].poses[' +str(p+1) +'].weight', s = True, d = False, p = True)[0] cmds.setAttr(blendNode +'.transforms[' +str(i) +'].poses[' +str(p) +'].matrix', matrix, type = 'matrix') cmds.setAttr(blendNode +'.transforms[' +str(i) +'].poses[' +str(p) +'].scale', scale[0], scale[1], scale[2], type = 'double3') cmds.connectAttr(conn, blendNode +'.transforms[' +str(i) +'].poses[' +str(p) +'].weight', force = True) cmds.disconnectAttr(conn, blendNode +'.transforms[' +str(i) +'].poses[' +str(p+1) +'].weight') return True
def process(self, context): from maya import cmds try: # Assertion also made in pyblish_starter.install() # but as plug-ins can be used vanilla, the check # must also be made here. import pyblish_maya assert pyblish_maya.is_setup() except (ImportError, AssertionError): raise RuntimeError("pyblish-starter requires pyblish-maya " "to have been setup.") for objset in cmds.ls("*.id", long=True, # Produce full names type="objectSet", # Only consider objectSets recursive=True, # Include namespace objectsOnly=True): # Return objectSet, rather # than its members if not cmds.objExists(objset + ".id"): continue if not cmds.getAttr(objset + ".id") == "pyblish.starter.instance": continue # The developer is responsible for specifying # the family of each instance. assert cmds.objExists(objset + ".family"), ( "\"%s\" was missing a family" % objset) name = cmds.ls(objset, long=False)[0] # Use short name instance = context.create_instance(name) instance[:] = cmds.sets(objset, query=True) or list() # Apply each user defined attribute as data for attr in cmds.listAttr(objset, userDefined=True) or list(): try: value = cmds.getAttr(objset + "." + attr) except: # Some attributes cannot be read directly, # such as mesh and color attributes. These # are considered non-essential to this # particular publishing pipeline. value = None instance.data[attr] = value # Produce diagnostic message for any graphical # user interface interested in visualising it. self.log.info("Found: \"%s\" " % instance.data["name"])
def zbw_mmListCurrentMessages(tfbg, *args): """ lists the message attrs in the base obj and sets up rt-click menus to change them and a button to delete them """ if (cmds.rowColumnLayout("mmRCListLayout", q=True, ex=True)): cmds.deleteUI("mmRCListLayout") cmds.rowColumnLayout("mmRCListLayout", w=600, nc=3, cw=[(1, 250),(2,250),(3,100)],p="existingMessages") #get the base object baseObj = cmds.textFieldButtonGrp(tfbg, q=True, tx=True) #find all attr of type message for base obj userAttrs = cmds.listAttr(baseObj, ud=True) #print(udAttrs) messageAttrs = [] messageObjs = [] if userAttrs: for attr in userAttrs: isMsg = cmds.attributeQuery(attr, n=baseObj, msg=True) if isMsg: fullMsgAttr = baseObj + "." + attr messageAttrs.append(fullMsgAttr) targetObj = cmds.listConnections(fullMsgAttr) if not targetObj: targetObj = ["no Connection"] messageObjs.append(targetObj[0]) sizeMsgs = len(messageObjs) for i in range(0, sizeMsgs): thisObj = messageObjs[i] thisAttr = messageAttrs[i] #create textField based on num already there, non-editable attrId = "listAttrTFG" + str(i) objId = "listObjTFG" + str(i) buttonId = "listButton" + str(i) cmds.separator(h=15, style="single") cmds.separator(h=15, style="single") cmds.separator(h=15, style="single") #create text field for attr cmds.textFieldGrp(attrId, p="mmRCListLayout", l=i, cw=[(1,10), (2,190)], ed=False, tx=thisAttr) #create popup for text field cmds.popupMenu(("attrPUM"+str(i)), b=3) cmds.menuItem(l="change attr name", p=("attrPUM"+str(i)), c=partial(zbw_mmChangeConnectAttrUI, baseObj, thisAttr, thisObj)) #create textField obj based on num, non-editable cmds.textFieldGrp(objId, p="mmRCListLayout", w=200, ed=False, tx=thisObj) #create pop up cmds.popupMenu(("objPUM"+str(i)), b=3) cmds.menuItem(l="change obj", p=("objPUM"+str(i)), c=partial(zbw_mmChangeConnectObjUI, baseObj, thisAttr, thisObj)) #create button to delete attr cmds.button(buttonId, l="delete", w=50, c=partial(zbw_mmDeleteMsgAttr, thisAttr)) else: cmds.text("no message attributes on this object", p="mmRCListLayout")
def spaceMatchUI(): if (cmds.window("spaceMatchWin", exists=True)): cmds.deleteUI("spaceMatchWin", window=True) widgets["window"] = cmds.window("spaceMatchWin", title="Space Matcher", w=250, h=300) widgets["mainLO"] = cmds.columnLayout() widgets["tabLO"] = cmds.tabLayout() widgets["getObjCLO"] = cmds.columnLayout() widgets["instruct"] = cmds.text("get obj, then attr, then space then do it") cmds.separator(h=10) #----------fill with selection automatically? widgets["objTFG"] = cmds.textFieldGrp(l="select obj", cw=([1,50],[2,150],[3,50]), cal=([1,"left"], [2,"left"],[3,"left"]), cc=clearList) widgets["matchObjButton"] = cmds.button(l="select object", c=partial(getObj, widgets["objTFG"])) cmds.separator(h=10) #-----------maybe here have it catch the selected obj by default #-----------and/or have a field for the attribute (default to "follow") widgets["getAttrButton"] = cmds.button(w=250, al="center", h=20, l="select enum space attr from obj", bgc= (.5, .5, 0), c=getAttr) #-----------when the attr is selected list the attrs automagically, widgets["spacesTSL"] = cmds.textScrollList(w=250, h=200, nr=8, ams=False, bgc=(.2, .2, .2)) widgets["matchButton"] = cmds.button(w=250, al="center", h=40, bgc= (0,.5,0), l="space switch/match", c= doSpaceMatch) #tab for creation/setup of matching cmds.setParent(widgets["tabLO"]) #----------in this tab, create frames. One (closable) to create constraint and fill items, check boxes for orient, position (with user selecting objects), one frame (maybe already filled out) (always open) for setting up attrs (message, strings) widgets["setupCLO"] = cmds.columnLayout() #frame layout for creating the constraints widgets["createFrameLO"] = cmds.frameLayout(l="create Constrants", collapsable=True, w=250) cmds.text("have em select for constraint") widgets["posRotCBG"] = cmds.checkBoxGrp(ncb=2, l1="translation", v1=True, l2="rotation", v2=True) #----------this button should just create the constraints on the objects in question, but then fill in what parts of the lower half it can widgets["createSetupButton"] = cmds.button(l="create constraints") cmds.setParent(widgets["setupCLO"]) #frameLayout for setting up the attrs widgets["setupFrameLO"] = cmds.frameLayout(l="setup matching", collapsable=False, w=250, h=250) widgets["setupObjTFG"] = cmds.textFieldGrp(l="select ctrl obj", cw=([1,100],[2,150]), cal=([1,"left"], [2,"left"])) widgets["setupObjButton"] = cmds.button(l="get ctrl object", h=40, c= partial(getObj, widgets["setupObjTFG"])) widgets["setupConstrTFG"] = cmds.textFieldGrp(l="constraint", cw=([1,100],[2,150]), cal=([1,"left"], [2,"left"])) widgets["setupConstrButton"] = cmds.button(l="get constraint", h=40, c= partial(getObj, widgets["setupConstrTFG"])) #create list of attrs on constraint #attr = cmds.listAttr(sel,ud=True ) #create list of spaces on obj attr cmds.tabLayout(widgets["tabLO"], e=True, tabLabel = ((widgets["getObjCLO"], "change spaces"),(widgets["setupCLO"], "setup matching"))) cmds.showWindow(widgets["window"]) cmds.window(widgets["window"], e=True, w=250, h=300)
def shift_attr(mode, *args): """ shifts the selected attr up or down """ obj = cmds.channelBox('mainChannelBox', q=True, mainObjectList=True) if obj: attr = cmds.channelBox('mainChannelBox', q=True, selectedMainAttributes=True) if attr: for eachObj in obj: udAttr = cmds.listAttr(eachObj, ud=True) if not attr[0] in udAttr: sys.exit('selected attribute is static and cannot be shifted') # temp unlock all user defined attributes attrLock = cmds.listAttr(eachObj, ud=True, l=True) if attrLock: for alck in attrLock: cmds.setAttr(eachObj + '.' + alck, lock=0) # shift down if mode == 0: if len(attr) > 1: attr.reverse() sort = attr if len(attr) == 1: sort = attr for i in sort: attrLs = cmds.listAttr(eachObj, ud=True) attrSize = len(attrLs) attrPos = attrLs.index(i) cmds.deleteAttr(eachObj, at=attrLs[attrPos]) cmds.undo() for x in range(attrPos + 2, attrSize, 1): cmds.deleteAttr(eachObj, at=attrLs[x]) cmds.undo() # shift up if mode == 1: for i in attr: attrLs = cmds.listAttr(eachObj, ud=True) attrSize = len(attrLs) attrPos = attrLs.index(i) if attrLs[attrPos - 1]: cmds.deleteAttr(eachObj, at=attrLs[attrPos - 1]) cmds.undo() for x in range(attrPos + 1, attrSize, 1): cmds.deleteAttr(eachObj, at=attrLs[x]) cmds.undo() # relock all user defined attributes if attrLock: for alck in attrLock: cmds.setAttr(eachObj + '.' + alck, lock=1)
def swapAnimation(fromNode, toNode): if not mc.keyframe(fromNode, query=True, name=True): mc.cutKey(toNode, clear=True) return attrs = mc.listAttr(fromNode, keyable=True) if not attrs: return for attr in attrs: if not mc.attributeQuery(attr, node=toNode, exists=True): mc.cutKey(fromNode, attribute=attr, clear=True) continue fromPlug = '{}.{}'.format(fromNode, attr) toPlug = '{}.{}'.format(toNode, attr) srcCurve = mc.listConnections(fromPlug, source=True, destination=False, type='animCurve') dstCurve = mc.listConnections(toPlug, source=True, destination=False, type='animCurve') copySrc=None copyDst=None if srcCurve: copySrc = mc.duplicate(srcCurve[0])[0] if dstCurve: copyDst = mc.duplicate(dstCurve[0])[0] if copySrc: try: mc.cutKey(copySrc) mc.pasteKey(toNode, attribute=attr, option='replaceCompletely') except:pass if copyDst: try: mc.cutKey(copyDst) mc.pasteKey(fromNode, attribute=attr, option='replaceCompletely') except:pass for axis in getMirrorAxis(toNode): mc.scaleKey(toNode, attribute=axis, valueScale=-1) mc.scaleKey(fromNode, attribute=axis, valueScale=-1)
def isolate(option): sel = mc.ls(sl=True) if not sel: return graphVis = mc.selectionConnection('graphEditor1FromOutliner', query=True, obj=True) channels = list() wildCard = str() alreadyIsolated = True if graphVis: for c in graphVis: if not '.' in c and mc.objExists(c): attrs = mc.listAttr(c, keyable=True, unlocked=True) if attrs: channels.extend([c+'.'+a for a in attrs]) else: attr = c.split('.')[-1] if attr.startswith(option): channels.append(c) if not wildCard: wildCard = option+'*' elif attr.endswith(option): channels.append(c) if not wildCard: wildCard = '*'+option elif attr == option: channels.append(c) if not wildCard: wildCard = option else: #found a curve that is outside our search parameters alreadyIsolated = False if channels and alreadyIsolated: #if the option is already the only thing being displayed, then show everything that matches the option for obj in sel: attrs = mc.listAttr(obj, keyable=True, unlocked=True, string=wildCard) if attrs: channels.extend([obj+'.'+a for a in attrs]) if not channels: for obj in sel: attrs = mc.listAttr(obj, keyable=True, unlocked=True) for a in attrs: if a==option or a.startswith(option) or a.endswith(option): channels.append(obj+'.'+a) clear() for c in channels: mc.selectionConnection('graphEditor1FromOutliner', edit=True, select=c)