def getGeomIndex(geo, deformer): ''' Returns the geometry index of a shape to a specified deformer. :param geometry str: Name of shape or parent transform to query :param deformer str: Name of deformer to query :return: the geometry index of a shape on specified deformer :rtype: str ''' # Verify input if not isDeformer(deformer): raise Exception('Object {0} is not a valid deformer!'.format(deformer)) # Check geometry if cmds.objectType(geo) == 'transform': try: geo = cmds.listRelatives(geo, s=True, ni=True, pa=True)[0] except: raise Exception('Object {0} is not a valid geometry!'.format(geo)) geomObj = easy.getMObject(geo) # Get geometry index deformerObj = easy.getMObject(deformer) deformerFn = oma.MFnGeometryFilter(deformerObj) try: geomIndex = deformerFn.indexForOutputShape(geomObj) except: raise Exception('Object {0} is not affected by deformer {1}'.format( geo, deformer)) # return result return geomIndex
def getComponentStrList(geometry,componentIndexList=[]): ''' Return a string list containing all the component points of the specified geometry object :param geometry str: Geometry to return components for :param componentIndexList list: Component indices to return names for. If empty, all components will be returned :return: string list w/ all points of specified geo :rtype: list ''' # Check object if not cmds.objExists(geometry): raise Exception('Object {0} does not exist!'.format(geometry)) # Check transform mObj = easy.getMObject(geometry) if mObj.hasFn(om.MFn.kTransform): geometry = easy.getShapes(geometry,True,False) if geometry: geometry = geometry[0] else: raise Exception('Object {0} is not a valid geometry object!'.format(geometry)) # Check type mObj = easy.getMObject(geometry) if not mObj.hasFn(om.MFn.kShape): raise Exception('Object {0} is not a valid geometry object!'.format(geometry)) # Get component multiIndex list componentStrList = [] componentList = [] if not componentIndexList: componentList = getComponentIndexList(geometry)[geometry] else: for i in componentIndexList: index = getMultiIndex(geometry,i) if len(index) == 1: componentList.append( index[0] ) else: componentList.append( index ) objType = cmds.objectType(geometry) for i in componentList: # Mesh if objType == 'mesh': componentStrList.append('{0}.vtx[{1}]'.format(geometry, str(i))) # Curve if objType == 'nurbsCurve': componentStrList.append('{0}.cv[{1}]'.format(geometry, str(i))) # Surface if objType == 'nurbsSurface': componentStrList.append("{0}.cv[{1}][{2}]".format(geometry, str(i[0]), str(i[1]))) # Lattice if objType == 'lattice': componentStrList.append("{0}.pt[{1}][{2}][{3}]".format(geometry, str(i[0]), str(i[2]))) # Return Component String List return componentStrList
def setWeights(deformer, weights, geometry=None): ''' Set the weights for the specified deformer using the input value list :param deformer str: Deformer to set weights for :param weights list: Input weight value list :param geometry str: Target geometry to apply weights to. If None, use first affected geometry. ''' # Verify input if not isDeformer(deformer): raise Exception('Object {0} is not a valid deformer!'.format(deformer)) # Check Geometry if not geometry: geometry = getAffectedGeometry(deformer).keys()[0] # Get Geometry Shape geoShape = geometry geoObj = easy.getMObject(geometry) if geometry and geoObj.hasFn(om.MFn.kTransform): geoShape = cmds.listRelatives(geometry, s=True, ni=True)[0] # Get deformer function set and members deformerFn = getDeformerFn(deformer) deformerSetMem = getDeformerSetMembers(deformer, geoShape) # Build weight array weightList = om.MFloatArray() [weightList.append(i) for i in weights] # Set weights deformerFn.setWeight(deformerSetMem[0], deformerSetMem[1], weightList)
def getDeformerSetFn(deformer): ''' Initialize and return an MFnSet function set attached to the deformer set of the specified deformer :param deformer str: Name of deformer attached to the deformer set to create function set for :return: the deformerSetFn :rtype: str ''' # Checks if not cmds.objExists(deformer): raise Exception('Deformer {0} does not exist!'.format(deformer)) # Get deformer set deformerSet = getDeformerSet(deformer) # Get MFnWeightGeometryFilter deformerSetObj = easy.getMObject(deformerSet) deformerSetFn = om.MFnSet(deformerSetObj) # Return result return deformerSetFn
def getAffectedGeometry(deformer, returnShapes=False, fullPathNames=False): ''' Return a dictionary containing information about geometry affected by a specified deformer. Dictionary keys correspond to affected geometry names, values indicate geometry index to deformer. :param deformer str: Name of deformer to query :param returnShapes bool: Return shape instead of parent transform name :param fullPathNames bool: Return full path names of affected objects :return: dictionary of affected geo :rtype: dict ''' # Verify Input if not isDeformer(deformer): raise Exception('Object {0} is not a valid deformer!'.format(deformer)) # Initialize Return Array (dict) affectedObjects = {} # Get MFnGeometryFilter deformerObj = easy.getMObject(deformer) geoFilterFn = oma.MFnGeometryFilter(deformerObj) # Get Output Geometry outputObjectArray = om.MObjectArray() geoFilterFn.getOutputGeometry(outputObjectArray) # Iterate Over Affected Geometry for i in range(outputObjectArray.length()): # Get Output Connection at Index outputIndex = geoFilterFn.indexForOutputShape(outputObjectArray[i]) outputNode = om.MFnDagNode(outputObjectArray[i]) # Check Return Shapes if not returnShapes: outputNode = om.MFnDagNode(outputNode.parent(0)) # Check Full Path if fullPathNames: affectedObjects[outputNode.fullPathName()] = outputIndex else: affectedObjects[outputNode.partialPathName()] = outputIndex # Return Result return affectedObjects
def getDeformerFn(deformer): ''' Initialize and return an MFnWeightGeometryFilter function set attached to the specified deformer :param deformer str: Name of deformer to create function set for :return: MFnWeightGeometryFilter function set on deformer :rtype: class obj ''' # Checks if not cmds.objExists(deformer): raise Exception('Deformer {0} does not exist!'.format(deformer)) # Get MFnWeightGeometryFilter deformerObj = easy.getMObject(deformer) try: deformerFn = oma.MFnWeightGeometryFilter(deformerObj) except: raise Exception( 'Could not get a geometry filter for deformer {0}!'.format( deformer)) # Return result return deformerFn
def getDeformerSet(deformer): ''' Return the deformer set name associated with the specified deformer :param deformer str: Name of deformer to return the deformer set for ''' # Checks if not cmds.objExists(deformer): raise Exception('Deformer {0} does not exist!'.format(deformer)) # Verify input if not isDeformer(deformer): raise Exception('Object {0} is not a valid deformer!'.format(deformer)) # Get Deformer Set deformerObj = easy.getMObject(deformer) deformerFn = oma.MFnGeometryFilter(deformerObj) deformerSetObj = deformerFn.deformerSet() if deformerSetObj.isNull(): raise Exception( 'Unable to determine deformer set for {0}!'.format(deformer)) # Return Result return om.MFnDependencyNode(deformerSetObj).name()