Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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()