def mirrorModule(): # Mirrors a module. selList = cmds.ls( selection=True, long=True ) if len( selList ) == 1: # Prompt for axis. mirrorAxis = int( cmds.layoutDialog( ui=mirrorObjectPrompt ) ) inBitObj = selList[0] # Check if selected bit is the root. if NodeUtility.attributeCheck( inBitObj, 'frameRoot' ): # This is the root bit of the module. From here we know we can get the # meta node by accessing the frameRoot attribute. metaNode = NodeUtility.getNodeAttrDestination( inBitObj, 'frameRoot' )[0] else: # The selected bit is not the root. Run through each custom attribute # to find one connected to the meta node. attrList = cmds.listAttr( inBitObj, userDefined=True ) for attr in attrList: connection = NodeUtility.getNodeAttrDestination( inBitObj, attr ) if NodeUtility.attributeCheck( connection[0], 'metaType' ): metaNode = connection[0] break # Now that we have the meta node, we need the XML file name and it's location. metaClassPlug = NodeUtility.getPlug( metaNode, 'metaClass' ) metaClassValue = NodeUtility.getPlugValue( metaClassPlug ) metaBuildFolderPlug = NodeUtility.getPlug( metaNode, 'buildFolder' ) metaBuildFolderValue = NodeUtility.getPlugValue( metaBuildFolderPlug ) # Create the target module. ''' NEED TO FIX THIS! targetRootBit = buildFrameModule( metaBuildFolderValue, metaClassValue ) ''' # Loop through each object in the source module. metaRootBit = NodeUtility.getNodeAttrSource( metaNode, 'rootBit' )[0] sourceChildBits = NodeUtility.getFrameRootAllChildren( metaRootBit ) targetChildBits = NodeUtility.getFrameRootAllChildren( targetRootBit ) sourceBits = [] targetBits = [] for i,bit in enumerate( sourceChildBits ): sourceBits.append( bit ) sourceBits.insert( 0, metaRootBit ) for i, bit in enumerate( targetChildBits ): targetBits.append( bit ) targetBits.insert( 0, targetRootBit ) for bit in xrange( len(sourceBits) ): # Mirror the source onto the target. mirrorObject( inSourceObj=sourceBits[bit], inTargetObj=targetBits[bit], inMirrorAxis=mirrorAxis )
def addAttr( inAttrs ): selList = cmds.ls( selection=True ) if len(selList) == 1: for attr in inAttrs: attrName = attr['attrName'] attrType = attr['attrType'] attrDataType = attr['attrDataType'] if NodeUtility.attributeCheck( selList[0], attrName ): sys.stderr.write( 'Skip adding {0} because it already exists'.format( attrName ) ) else: FrameUtility.addPlug( selList[0], attrName, attrType, attrDataType )
def getFrameBitsByAttribute( inList, inAttrib ): ''' Gets all the frame bits with a given attribute. @param inList: String List. Names of frame bits to check. @param inAttrib: String. Name of attribute to check each bit for. @return: List of frame bits that match the search criteria. ''' tempList = [] for frameBit in inList: if NodeUtility.attributeCheck( frameBit, inAttrib ): tempList.append( frameBit ) return tempList
def createSpacer(inBitName, inGroupName="newGroup", inTargetObject=None, inDoParent=False, inPrefix=None): """ Creates an empty group. Optionally, the group's transforms can be matched to another object. @param inGroupName: String. Name to give the new group. @param inTargetObject: String. Name of object to match the group's transforms to. @return: The newly created group. """ # Create empty group. if inPrefix is not None: groupName = inPrefix + "_" + inGroupName else: groupName = inGroupName newGroup = cmds.group(em=True, name=groupName) # Set its transforms. if inTargetObject is not None: # Get target objects matrix. targetMatrix = TransformUtility.getMatrix(inTargetObject, "worldMatrix") # Get groups transform. MFnTrans = OpenMaya.MFnTransform() groupDagPath = NodeUtility.getDagPath(newGroup) MFnTrans.setObject(groupDagPath) # Apply the targets translation to the group. targetTranslation = TransformUtility.getMatrixTranslation(targetMatrix, OpenMaya.MSpace.kWorld) MFnTrans.setTranslation(targetTranslation, OpenMaya.MSpace.kWorld) # Apply the targets rotation to the group. targetRotation = TransformUtility.getMatrixRotation(targetMatrix, "quat") MFnTrans.setRotation(targetRotation, OpenMaya.MSpace.kWorld) # Parent the spacer. if inDoParent: parent = cmds.listRelatives(inBitName, parent=True) if NodeUtility.attributeCheck(parent[0], "controlName"): parentControl = NodeUtility.getFrameBitSettings(parent[0])["controlName"] cmds.parent(newGroup, parentControl, absolute=True) return newGroup
def getCharacterChildrenModules( inCharNode ): ''' Gets all the children of a character node. @return: String[]. Each module component node name. ''' # Get the children bitName = Components.CharacterRootComponent( inCharNode ).parentNode[0] children = cmds.listRelatives( bitName, type='transform', allDescendents=True, fullPath=True ) modules = [] for child in children: childComponents = NodeUtility.getModuleComponentSettings( child ) if childComponents is not None: for comp in childComponents: if NodeUtility.attributeCheck( comp, 'characterRoot' ): aType = cmds.getAttr( '{0}.classType'.format( comp ) ) if aType == 'ModuleRootComponent': modules.append( comp ) return modules
def buildFrameModule( inDir=None, inXMLFile=None ): from marigold.meta.metaNode import MetaNode # Get the XML settings for the frame module. dirPath = XMLUtility.getPresetPath( XMLUtility.FRAME_PRESETS_PATH+inDir ) fullPath = dirPath+'/'+inXMLFile+'.xml' xmlDict = readFrameModuleXML( fullPath ) # Get the metanode. metanode = xmlDict['metanode'] meta = metanode['name'] metaPlugs = metanode['plugs'] metaType = metanode['metaType'] metaClass = metanode['metaClass'] metanode = MetaNode( inNodeName=meta, inNodeMetaType=metaType ) metanode = cmds.ls( selection=True )[0] metaPlugs = xmlDict['metanode']['plugs'] for plug in metaPlugs: if not NodeUtility.attributeCheck( metanode, plug['name'] ): addPlug( metanode, plug['name'], plug['attrType'], plug['attrDataType'] ) if plug['connected'] == 'False': setPlug( metanode, plug['name'], plug['value'], inAttrDataType=plug['attrDataType'] ) # Get the bits. bits = xmlDict['bits'] # Make a group for the module. for bit in bits: if bit['name'] == 'frame_root': for plug in bit['plugs']: if plug['name'] == 'prefix': modulePrefix = plug['value'] break moduleGroup = '|{0}'.format( cmds.group( em=True, name=modulePrefix+'_'+metaClass ) ) # Make each bit. tick = 0 storeBitConnections = [] while tick < len(bits): bitName = bits[0]['name'] if bits[0]['parent'] == 'None': # This is the root bit. The | is there to represent this. We don't need it now. # Plus it causes problems with the full path name stuff (double ||). So we # remove it. bitParent = moduleGroup else: bitParent = moduleGroup+bits[0]['parent'] bitPlugs = bits[0]['plugs'] bitShape = bits[0]['shape'] # Make the bit. if cmds.objExists( bitParent ): newBit = cmds.makeGLBit( name=bitName, objecttype=bits[0]['shapeType'] ) cmds.parent( newBit, bitParent ) # From this point we use the long name for the bit. This avoids any # name clashes. fullBitName = '{0}{1}'.format( bitParent, newBit ) # Get the frame_root for the module. We want to return this at the very end. if bitName == 'frame_root': rootFullName = fullBitName # Setup plugs for transform and custom attributes. for plug in bitPlugs: if not NodeUtility.attributeCheck( fullBitName, plug['name'] ): addPlug( fullBitName, plug['name'], plug['attrType'], plug['attrDataType'] ) if plug['value'] is not None: setPlug( fullBitName, plug['name'], plug['value'], inAttrDataType=plug['attrDataType'] ) else: # Setup position and rotation. setPlug( fullBitName, plug['name'], plug['value'] ) # Connect plug to meta node. for mplug in metaPlugs: if '{0}.{1}'.format(bitName, plug['name']) == mplug['value']: inSourcePlug = fullBitName+'.'+plug['name'] inDestinationPlug = metanode+'.'+mplug['name'] NodeUtility.connectPlugs( inSourcePlug, inDestinationPlug ) # Setup plugs for shape attributes. shapeName = cmds.listRelatives( fullBitName, shapes=True ) fullShapeName = '{0}|{1}'.format( fullBitName, shapeName[0] ) for plug in bitShape: if plug['attrDataType'] == 'TdataCompound': # We skip compound nodes at this stage. They are for the child arrow drawing and must be # hooked up after all the objects are created. connectionChild = '{0}{1}'.format( moduleGroup, plug['value'] ) storeBitConnections.append( { 'parent':fullBitName, 'child':connectionChild } ) else: setPlug( fullShapeName, plug['name'], plug['value'], inAttrDataType=plug['attrDataType'] ) bits.remove( bits[0] ) else: tick = tick+1 pass # Now do the hook ups for the child arrows. for i in storeBitConnections: setBitChild( i['parent'], i['child'] ) return rootFullName
def loadModule( inFolder, inFileName ): ''' Loads a module into the scene. @param inFolder: String. Name for the sub-folder the module XML is located. @param inFileName: String. Name of the module XML. ''' dirPath = getPresetPath( FRAME_PRESETS_PATH+inFolder ) fullPath = dirPath+'/'+inFileName+'.xml' xmlFile = readModuleXML( fullPath ) # Create a temp group to put the module inside while creating. moduleGroup = '|{0}'.format( cmds.group( em=True, name='TEMP' ) ) # Grab all the bits. bits = xmlFile['bits'] # Make each bit. tick = 0 storeBitConnections = [] while tick < len(bits): if bits[0]['parent'] == 'None': bitParent = moduleGroup else: bitParent = moduleGroup+bits[0]['parent'] bitName = bits[0]['name'] bitPlugs = bits[0]['plugs'] shapePlugs = bits[0]['shape'] bitComponents = bits[0]['components'] # Make the bit. if cmds.objExists( bitParent ): newBit = cmds.makeGLBit( name=bitName, objecttype=bits[0]['shapeType'] ) cmds.parent( newBit, bitParent ) # From this point we use the long name for the bit. This avoids any # name clashes. fullBitName = '{0}{1}'.format( bitParent, newBit ) # Setup plugs for transform and custom attributes. for plug in bitPlugs: if not NodeUtility.attributeCheck( fullBitName, plug['name'] ): NodeUtility.addPlug( fullBitName, plug['name'], plug['attrType'], plug['attrDataType'] ) if plug['value'] is not None: NodeUtility.setPlug( fullBitName, plug['name'], plug['value'], inAttrDataType=plug['attrDataType'] ) else: # Setup position and rotation. NodeUtility.setPlug( fullBitName, plug['name'], plug['value'] ) # Setup plugs for shape attributes. shapeName = cmds.listRelatives( fullBitName, shapes=True ) fullShapeName = '{0}|{1}'.format( fullBitName, shapeName[0] ) for plug in shapePlugs: if plug['attrDataType'] == 'TdataCompound' or plug['attrDataType'] == 'matrix': # We skip compound nodes at this stage. They are for the child arrow drawing and must be # hooked up after all the objects are created. connectionChild = '{0}{1}'.format( moduleGroup, plug['value'] ) storeBitConnections.append( { 'parent':fullBitName, 'child':connectionChild } ) elif plug['attrDataType'] == 'message': print 'MESSAGE' else: NodeUtility.setPlug( fullShapeName, plug['name'], plug['value'], inAttrDataType=plug['attrDataType'] ) # Setup bit components. for comp in bitComponents: compType = comp['name'] # We have to special case components that have additional kwargs. if compType == 'CurveControlComponent': # Handle curve control component type. for plug in comp['plugs']: if plug['name'] == 'curveType': curveType = plug['value'] newComp = components.addComponentToObject( compType, inObject=fullBitName, curveType=curveType ) else: # Handle basic component. newComp = components.addComponentToObject( compType, inObject=fullBitName ) for plug in comp['plugs']: # Bit of a hack with the parentName attribute. This attr is setup when the component is created. # So there is no need to apply the stored plug value from the XML. if plug['attrDataType'] == 'message': if plug['name'] != 'parentName': if plug['value'] != 'None': sourcePlug = plug['value'].split('.') NodeUtility.connectNodes( sourcePlug[0], sourcePlug[1], newComp.name(), plug['name'] ) else: NodeUtility.setPlug( newComp.name(), plug['name'], plug['value'], inAttrDataType=plug['attrDataType'] ) # Remove the bit from the list bits.remove( bits[0] ) #tick = tick+1 # Now do the hook ups for the child arrows. for i in storeBitConnections: NodeUtility.setBitChild( i['parent'], i['child'] )