示例#1
0
 def createWeigthListFromTransform(mesh,transform):
     
     meshPath = GenAPI.getDagPath(mesh)
     transformPath = GenAPI.getDagPath(transform)
     
     transformFn = om.MFnTransform(transformPath)
     origTransform = transformFn.transformation()
     transformFn.set(om.MTransformationMatrix.identity)
     
     geoItr = om.MItGeometry(meshPath)
     origPositions = om.MPointArray()
     geoItr.allPositions(origPositions,om.MSpace.kWorld)
        
     translateVector = om.MVector(1,0,0)
     transformFn.translateBy(translateVector,om.MSpace.kWorld)
     
     geoItr = om.MItGeometry(meshPath)
     deltaPositions = om.MPointArray()
     geoItr.allPositions(deltaPositions,om.MSpace.kWorld)
     
     weightList = []
     for i in range(origPositions.length()):
         
         weight = MeasuringTool.getVectorLengthBetween(origPositions[i],deltaPositions[i])
         weightList.append(weight)
    
     transformFn.set(origTransform)
     return weightList
示例#2
0
    def transferReverseWeightList(geo, fromDeformer, toDeformer):
        '''
        method for quickly transfering reversed weightList
        input python string (mesh)
        input pythin string (fromDeformer)
        input python string (toDeformer)
        '''

        geoPath = GenAPI.getDagPath(geo)
        deformerObjectFrom = GenAPI.getMObject(fromDeformer)
        deformerObjectTo = GenAPI.getMObject(toDeformer)
        vertItr = om.MItMeshVertex(geoPath)
        deformerWeightFn = oma.MFnWeightGeometryFilter()

        while not vertItr.isDone():

            componentObject = vertItr.currentItem()
            weights = om.MFloatArray()
            deformerWeightFn.setObject(deformerObjectFrom)
            deformerWeightFn.getWeights(geoPath, componentObject, weights)

            if weights[0] > 0.000:
                weights[0] = abs(weights[0] - 1.0)

            deformerWeightFn.setObject(deformerObjectTo)
            deformerWeightFn.setWeight(geoPath, componentObject, weights)
            vertItr.next()
示例#3
0
    def createWeightListFromMesh(fromMesh,toMesh):
        
        fromMeshPath = GenAPI.getDagPath(fromMesh)
        toMeshPath = GenAPI.getDagPath(toMesh)
        
        fromVertItr = om.MItMeshVertex(fromMeshPath)
        toVertItr = om.MItMeshVertex(toMeshPath)
        util = om.MScriptUtil()
        intPtr = util.asIntPtr()
        
        weightList = []

        progressWin = UILib.ProgressWin()
        progressWin.itr = fromVertItr.count()
        
        while not fromVertItr.isDone():
            
            
            toVertItr.setIndex(fromVertItr.index(),intPtr)
            
            currentFromVertPoint = fromVertItr.position()
            currentToVertPoint = toVertItr.position()
            
            length = MeasuringTool.getVectorLengthBetween(currentFromVertPoint, currentToVertPoint)
            weight = max(min(length, 1), 0)
            weightList.append(weight)
            
            progressWin.message = '%s.vtx[%i]'%(fromMesh, fromVertItr.index())
            progressWin.inc = fromVertItr.index()
            progressWin.progress()
            
            fromVertItr.next()
        
        progressWin.end()
        return weightList
示例#4
0
 def getInfluencesAffectingPointsFromLists(self,selectionList):
    
     ''' 
     returns influences that affect components
     input MSelectionList
     output MSelectionList
     '''
         
     array = []
     selectionList.getSelectionStrings(array)
     flattenedArray = GenAPI.flattenList(array)
             
     influences = self.getInfluencesFromSkincluster()
     influencdSelectionList = om.MSelectionList()
     weights = om.MDoubleArray()
     
     outputSelectionList = om.MSelectionList()
     
     for component in flattenedArray:
         
         for i in range(influences.length()):
             
             self.skinclusterFn.getPointsAffectedByInfluence(influences[i],influencdSelectionList,weights)
             tempArray = []
             influencdSelectionList.getSelectionStrings(tempArray)
             tempFlattenedArray = GenAPI.flattenList(tempArray)
             
             for tempComponent in tempFlattenedArray:
                 
                 if tempComponent == component:
                     outputSelectionList.add(influences[i])
                    
     return outputSelectionList
示例#5
0
    def getInfluencesAffectingPointsFromLists(self, selectionList):
        ''' 
        returns influences that affect components
        input MSelectionList
        output MSelectionList
        '''

        array = []
        selectionList.getSelectionStrings(array)
        flattenedArray = GenAPI.flattenList(array)

        influences = self.getInfluencesFromSkincluster()
        influencdSelectionList = om.MSelectionList()
        weights = om.MDoubleArray()

        outputSelectionList = om.MSelectionList()

        for component in flattenedArray:

            for i in range(influences.length()):

                self.skinclusterFn.getPointsAffectedByInfluence(
                    influences[i], influencdSelectionList, weights)
                tempArray = []
                influencdSelectionList.getSelectionStrings(tempArray)
                tempFlattenedArray = GenAPI.flattenList(tempArray)

                for tempComponent in tempFlattenedArray:

                    if tempComponent == component:
                        outputSelectionList.add(influences[i])

        return outputSelectionList
示例#6
0
 def createWeigthListFromInfluence(mesh,transform):
     
     meshPath = GenAPI.getDagPath(mesh)
     transformPath = GenAPI.getDagPath(transform)
     
     transformFn = om.MFnTransform(transformPath)
     
     geoItr = om.MItGeometry(meshPath)
     
     weightList = []
     
     translateVector = om.MVector(1,0,0)
     
     while not geoItr.isDone():
         
         transformFn.set(om.MTransformationMatrix.identity)
         vertStartPos = geoItr.position(om.MSpace.kWorld)
         
         transformFn.translateBy(translateVector,om.MSpace.kWorld)
         vertEndPos = geoItr.position(om.MSpace.kWorld)
         
         length = MeasuringTool.getVectorLengthBetween(vertStartPos, vertEndPos)
         
         weightList.append(length)
         transformFn.set(om.MTransformationMatrix.identity)
         
         geoItr.next()
     
     return weightList
示例#7
0
 def transferReverseWeightList(geo,fromDeformer,toDeformer):
     
     '''
     method for quickly transfering reversed weightList
     input python string (mesh)
     input pythin string (fromDeformer)
     input python string (toDeformer)
     '''
     
     geoPath = GenAPI.getDagPath(geo)
     deformerObjectFrom = GenAPI.getMObject(fromDeformer)
     deformerObjectTo = GenAPI.getMObject(toDeformer)
     vertItr = om.MItMeshVertex(geoPath)
     deformerWeightFn = oma.MFnWeightGeometryFilter()
     
     while not vertItr.isDone():
         
         componentObject = vertItr.currentItem()
         weights = om.MFloatArray()
         deformerWeightFn.setObject(deformerObjectFrom)
         deformerWeightFn.getWeights(geoPath,componentObject,weights)
         
         if weights[0] > 0.000:
             weights[0] = abs(weights[0] - 1.0)
             
         deformerWeightFn.setObject(deformerObjectTo)
         deformerWeightFn.setWeight(geoPath,componentObject,weights)
         vertItr.next()   
示例#8
0
def loadClusters(clusterDicts):

    for clusterDict in clusterDicts:

        clusterHandleName = clusterDict.get('clusterHandle')
        clusterName = clusterDict.get('clusterName')
        pos = clusterDict.get('pos')
        dagMembers = clusterDict.get('dagMembers')

        selectionList = om.MSelectionList()

        for member in dagMembers:

            meshPath = GenAPI.getDagPath(member)
            verts = GenAPI.getMObjectAllVerts(member)
            selectionList.add(meshPath, verts)

        om.MGlobal.setActiveSelectionList(selectionList)

        #creating cluster
        cluster = cmds.cluster()
        clusterShape = cmds.listRelatives(cluster[1], type='shape')

        cmds.setAttr('%s.originX' % clusterShape[0], pos[0])
        cmds.setAttr('%s.originY' % clusterShape[0], pos[1])
        cmds.setAttr('%s.originZ' % clusterShape[0], pos[2])

        cmds.setAttr('%s.rotatePivotX' % cluster[1], pos[0])
        cmds.setAttr('%s.rotatePivotY' % cluster[1], pos[1])
        cmds.setAttr('%s.rotatePivotZ' % cluster[1], pos[2])

        cmds.setAttr('%s.scalePivotX' % cluster[1], pos[0])
        cmds.setAttr('%s.scalePivotY' % cluster[1], pos[1])
        cmds.setAttr('%s.scalePivotZ' % cluster[1], pos[2])

        inc = 0

        progressWin = UILib.ProgressWin()
        progressWin.itr = len(dagMembers)
        progressWin.setTitle('Loading Clusters')

        for member in dagMembers:

            deformerTool = WeightListTool(member, cluster[0])
            weightList = clusterDict.get('weightList')[inc]
            membershipList = clusterDict.get('membershipList')[inc]
            deformerTool.setMembershipList(membershipList)
            deformerTool.setWeightList(weightList)
            inc += 1

            progressWin.message = member
            progressWin.inc = inc
            progressWin.progress()

        cmds.rename(cluster[0], clusterName)
        cmds.rename(cluster[1], clusterHandleName)

        progressWin.end()
        om.MGlobal.displayInfo('Successfully loaded clusters.')
示例#9
0
    def __init__(self, transformNodes=[]):

        self.transformNodes = transformNodes

        for node in self.transformNodes:

            self.transformObjects.append(GenAPI.getMObject(node))
            self.transformDagPaths.append(GenAPI.getDagPath(node))
示例#10
0
    def __init__(self,transformNodes = []):

        self.transformNodes = transformNodes
        
        for node in self.transformNodes:
            
            self.transformObjects.append(GenAPI.getMObject(node))
            self.transformDagPaths.append(GenAPI.getDagPath(node))
示例#11
0
def skinclusterFromMesh(meshFrom,meshTo,joints):
    
    floatingJointList = []
    constraintList = []
    weightLists = []
    
    progressWin = UILib.ProgressWin()
    progressWin.setTitle('Mesh To Skincluster')
    
    
    cmds.select(cl = True)
    for joint in joints:
        
        transformFn = om.MFnTransform(GenAPI.getDagPath(joint))
        position = transformFn.getTranslation(om.MSpace.kWorld)
        
        floatingJoint = cmds.joint()
        floatingJointPath = GenAPI.getDagPath(floatingJoint)
        transformFn.setObject(floatingJointPath)
        transformFn.setTranslation(position,om.MSpace.kWorld)
        floatingJointList.append(floatingJoint)
        
        parentConstraint = cmds.parentConstraint(floatingJoint,joint,mo = True)
        constraintList.append(parentConstraint)
        cmds.select(cl = True)
        
    baseJoint = cmds.joint() 
    skincluster = cmds.skinCluster(meshTo,baseJoint)[0]
    skinningTool = SkinningTool(skincluster,meshTo)
    
    cmds.setAttr('%s.liw'%baseJoint, 0)
    
    progressWin.itr = len(joints)
    
    inc = 0
    
    for i in range(len(floatingJointList)):
        
        weightList = MeasuringLib.MeasuringTool.createWeigthListFromInfluence2(meshFrom, floatingJointList[i])
        cmds.skinCluster(skincluster,e = True , weight = 0,addInfluence = joints[i])
        weightLists.append(weightList)
        
        cmds.setAttr('%s.liw'%joints[i], 0)   
        skinningTool.setWeights(GenAPI.getDagPath(joints[i]), weightList)
        cmds.setAttr('%s.liw'%joints[i], 1)
        
        inc += 1
        progressWin.inc = inc
        progressWin.progress()
        
    for i in range(len(floatingJointList)):  
        cmds.delete(constraintList[i])
        cmds.delete(floatingJointList[i])
        
    progressWin.end()
    
示例#12
0
    def __init__(self, startJoint='', endJoint=''):

        self.startJoint = startJoint
        self.endJoint = endJoint

        self.startJointObject = GenAPI.getMObject(startJoint)
        self.startJointPath = GenAPI.getDagPath(startJoint)

        self.endJointObject = GenAPI.getMObject(endJoint)
        self.endJointPath = GenAPI.getDagPath(endJoint)
示例#13
0
 def __init__(self,startJoint = '',endJoint = ''):
     
     self.startJoint = startJoint
     self.endJoint = endJoint
     
     self.startJointObject = GenAPI.getMObject(startJoint)
     self.startJointPath = GenAPI.getDagPath(startJoint)
     
     self.endJointObject = GenAPI.getMObject(endJoint)
     self.endJointPath = GenAPI.getDagPath(endJoint)
示例#14
0
 def __init__(self,mesh = '',deformer = ''):
     
     self.mesh = mesh
     self.deformer = deformer
     self.meshPath = GenAPI.getDagPath(mesh)
     self.meshObject = GenAPI.getMObject(mesh)
     self.deformerObject = GenAPI.getMObject(deformer) 
     
     if self.meshObject.apiTypeStr() == 'kTransform':
         
         shape = cmds.listRelatives(mesh,type = 'shape')[0]
         self.meshPath  = GenAPI.getDagPath(shape)
         self.meshObject = GenAPI.getMObject(shape)
示例#15
0
    def __init__(self, mesh='', deformer=''):

        self.mesh = mesh
        self.deformer = deformer
        self.meshPath = GenAPI.getDagPath(mesh)
        self.meshObject = GenAPI.getMObject(mesh)
        self.deformerObject = GenAPI.getMObject(deformer)

        if self.meshObject.apiTypeStr() == 'kTransform':

            shape = cmds.listRelatives(mesh, type='shape')[0]
            self.meshPath = GenAPI.getDagPath(shape)
            self.meshObject = GenAPI.getMObject(shape)
示例#16
0
    def __init__(self, skincluster='', shape=''):

        self.skincluster = skincluster
        self.shape = shape

        if not self.skincluster == '':

            self.skinclusterObject = GenAPI.getMObject(skincluster)
            self.skinclusterFn = oma.MFnSkinCluster(self.skinclusterObject)

        if not self.shape == '':

            self.shapePath = GenAPI.getDagPath(self.shape)
            self.shapeObject = GenAPI.getMObject(self.shape)
示例#17
0
 def __init__(self,skincluster = '',shape = ''):
     
     self.skincluster = skincluster
     self.shape = shape
     
     if not self.skincluster == '':
         
         self.skinclusterObject = GenAPI.getMObject(skincluster)
         self.skinclusterFn = oma.MFnSkinCluster(self.skinclusterObject)
         
     if not self.shape == '':
         
         self.shapePath = GenAPI.getDagPath(self.shape)
         self.shapeObject = GenAPI.getMObject(self.shape)
示例#18
0
    def getQuaternionRotation(dagObject,space = 'world'):
        
        mDagPath = GenAPI.getDagPath(dagObject)

        transformFn = om.MFnTransform(mDagPath)
        mSpace = om.MSpace()
        quatSpace = ''
        
        if(space == 'world'):
            quatSpace = mSpace.kWorld
            
        else:
            quatSpace = mSpace.kObject


        utilX = om.MScriptUtil()
        ptrX = utilX.asDoublePtr()

        utilY = om.MScriptUtil()
        ptrY = utilY.asDoublePtr()

        utilZ = om.MScriptUtil()
        ptrZ = utilZ.asDoublePtr()

        utilW = om.MScriptUtil()
        ptrW = utilW.asDoublePtr()

        transformFn.getRotationQuaternion(ptrX,ptrY,ptrZ,ptrW,quatSpace)

        quatX = utilX.getDouble(ptrX)
        quatY = utilY.getDouble(ptrY)
        quatZ = utilZ.getDouble(ptrZ)
        quatW = utilW.getDouble(ptrW)

        return [quatX,quatY,quatZ,quatW]
示例#19
0
 def getWeightsFromLattice(self,influence):
     
     '''
     method for returning weightlist of given influence from a lattice
     input MDagPath (influence) 
     output python list (weights)  
     '''
     
     weightList = []
     
     latticePntSelection = GenAPI.getLatticePoints(self.shapePath)
     selectionItr = om.MItSelectionList(latticePntSelection) 
     
     index = self.skinclusterFn.indexForInfluenceObject(influence)
     weights = om.MFloatArray()
     
     intArray = om.MIntArray()
     intArray.append(index)
     
     mdagPath = om.MDagPath()
     component = om.MObject()
         
     
     while not selectionItr.isDone():
         
         selectionItr.getDagPath(mdagPath,component)
         
         self.skinclusterFn.getWeights(self.shapePath,component,index,weights)
         
         weightList.append(weights[0])
         selectionItr.next()
     
     return weightList
示例#20
0
    def setWeightsForLattice(self, influence, weightList):
        '''
        method for setting skinWeight value for lattice points
        input MDagPath (influence)
        input python float list (weightList) 
        '''

        latticePntSelection = GenAPI.getLatticePoints(self.shapePath)
        selectionItr = om.MItSelectionList(latticePntSelection)

        index = self.skinclusterFn.indexForInfluenceObject(influence)

        oldValues = om.MFloatArray()

        mdagPath = om.MDagPath()
        component = om.MObject()

        itrIndex = 0

        while not selectionItr.isDone():

            selectionItr.getDagPath(mdagPath, component)

            self.skinclusterFn.setWeights(self.shapePath, component, index,
                                          weightList[itrIndex], True,
                                          oldValues)

            itrIndex += 1
            selectionItr.next()
示例#21
0
    def getSkinCluster(shape):
        
        '''
        get skinCluster from shape
        input python string (shape)
        out mObject (skincluster)
        '''
        
        shapeObject = GenAPI.getMObject(shape)
        
        depItr = om.MItDependencyGraph(shapeObject,om.MFn.kSkinClusterFilter,
                                       om.MItDependencyGraph.kUpstream,om.MItDependencyGraph.kDepthFirst,
                                       om.MItDependencyGraph.kNodeLevel)
    

        return depItr.currentItem(),GenAPI.getStringFromMObject(depItr.currentItem())
示例#22
0
    def getWeightsFromLattice(self, influence):
        '''
        method for returning weightlist of given influence from a lattice
        input MDagPath (influence) 
        output python list (weights)  
        '''

        weightList = []

        latticePntSelection = GenAPI.getLatticePoints(self.shapePath)
        selectionItr = om.MItSelectionList(latticePntSelection)

        index = self.skinclusterFn.indexForInfluenceObject(influence)
        weights = om.MFloatArray()

        intArray = om.MIntArray()
        intArray.append(index)

        mdagPath = om.MDagPath()
        component = om.MObject()

        while not selectionItr.isDone():

            selectionItr.getDagPath(mdagPath, component)

            self.skinclusterFn.getWeights(self.shapePath, component, index,
                                          weights)

            weightList.append(weights[0])
            selectionItr.next()

        return weightList
示例#23
0
    def getSkinCluster(shape):
        '''
        get skinCluster from shape
        input python string (shape)
        out mObject (skincluster)
        '''

        shapeObject = GenAPI.getMObject(shape)

        depItr = om.MItDependencyGraph(shapeObject, om.MFn.kSkinClusterFilter,
                                       om.MItDependencyGraph.kUpstream,
                                       om.MItDependencyGraph.kDepthFirst,
                                       om.MItDependencyGraph.kNodeLevel)

        return depItr.currentItem(), GenAPI.getStringFromMObject(
            depItr.currentItem())
示例#24
0
    def pointOnCurveLocCV(name,curve):
        
        if not cmds.nodeType(curve) == 'shape':
            
            curve = cmds.listRelatives(curve, type = 'shape')[0]
            
        mobject = GenAPI.getMObject(curve)
        iterCVs = om.MItCurveCV(mobject)
        
        while not iterCVs.isDone():

            index = iterCVs.index()
            nameIndex = index + 1            
            moPath = cmds.createNode('motionPath')
            
            moPath = cmds.createNode('motionPath',n = '%s_0%i_MotionPath'%(name,nameIndex))
            cmds.connectAttr('%s.worldSpace[0]'%curve,'%s.geometryPath'%moPath)
            
            locator = cmds.spaceLocator(n = '%s_0%i_MP_Loc'%(name,nameIndex))
            cmds.addAttr(locator[0],ln = "Offset" ,at = 'double')
            cmds.setAttr('%s.Offset'%locator[0], e = True, keyable = True)
            upLocator = cmds.spaceLocator(n = '%s_0%i_MP_Up_Loc'%(name,nameIndex))
                        
            cmds.connectAttr('%s.allCoordinates'%moPath,'%s.translate'%locator[0])
            cmds.connectAttr('%s.rotate'%moPath,'%s.rotate'%locator[0])
            cmds.connectAttr('%s.rotateOrder'%moPath, '%s.rotateOrder'%locator[0])
            
            uValue = MeasuringTool.curveCVtoU(curve,index)
            cmds.setAttr('%s.uValue'%moPath, uValue)
            cmds.setAttr('%s.worldUpType'%moPath, 2)
            cmds.setAttr ('%s.frontAxis'%moPath,0)
            cmds.setAttr ('%s.upAxis'%moPath,2)
            
            offsetMD = cmds.createNode('multiplyDivide', n = '%s_0%i_Offset_MD'%(locator[0],nameIndex))
            cmds.connectAttr('%s.Offset'%locator[0],'%s.input1X'%offsetMD)
            cmds.setAttr('%s.input2X'%offsetMD, 0.1)
            offsetPMA = cmds.createNode('plusMinusAverage', n = '%s_0%i_Offset_PMA'%(locator[0],nameIndex))
            cmds.connectAttr('%s.outputX'%offsetMD,'%s.input1D[0]'%offsetPMA )
            cmds.setAttr('%s.input1D[1]'%offsetPMA,uValue)
            cmds.connectAttr('%s.output1D'%offsetPMA, '%s.uValue'%moPath)
            
            
            locPos = cmds.xform(locator[0], q = True, ws = True, translation = True)
            locOrient = cmds.xform(locator[0], q = True, ws = True, rotation = True)
            
            cmds.setAttr ('%s.worldUpVectorX'%moPath,0)
            cmds.setAttr ('%s.worldUpVectorY'%moPath,0)
            cmds.setAttr ('%s.worldUpVectorZ'%moPath,1)
            cmds.connectAttr('%s.worldMatrix[0]'%upLocator[0], '%s.worldUpMatrix'%moPath)
            
            nullGroup = cmds.group(empty = True, n = '%s_Group'%upLocator[0])
            cmds.move(locPos[0], locPos[1],locPos[2],nullGroup)
            cmds.rotate(locOrient[0],locOrient[1],locOrient[2], nullGroup)
            
            cmds.parent(upLocator[0], nullGroup,r = True)
            cmds.move(0,0,10,upLocator[0], a = True, os = True)
            
            cmds.group(locator[0],nullGroup,n = '%s_0%i_MP_Loc_Group'%(name,nameIndex))
            
            iterCVs.next()
示例#25
0
 def getDagMembers(deformer):
     
     '''
     method for gathering dag members from a deformer
     output members (pythonList[python string])
     '''
     
     dagList = []
     deformerObject = GenAPI.getMObject(deformer)
     
     geoFilter = oma.MFnGeometryFilter(deformerObject)
     deformerSet = geoFilter.deformerSet()
     deformerSetFn = om.MFnSet(deformerSet)
     
     selectionList = om.MSelectionList()
     deformerSetFn.getMembers(selectionList, False)
     
     selectionItr = om.MItSelectionList(selectionList)
     
     while not selectionItr.isDone():
         
         dagPath = om.MDagPath()
         selectionItr.getDagPath(dagPath)
         
         dagList.append(dagPath.partialPathName())
         
         selectionItr.next()
     
     return dagList
示例#26
0
    def getDagMembers(deformer):
        '''
        method for gathering dag members from a deformer
        output members (pythonList[python string])
        '''

        dagList = []
        deformerObject = GenAPI.getMObject(deformer)

        geoFilter = oma.MFnGeometryFilter(deformerObject)
        deformerSet = geoFilter.deformerSet()
        deformerSetFn = om.MFnSet(deformerSet)

        selectionList = om.MSelectionList()
        deformerSetFn.getMembers(selectionList, False)

        selectionItr = om.MItSelectionList(selectionList)

        while not selectionItr.isDone():

            dagPath = om.MDagPath()
            selectionItr.getDagPath(dagPath)

            dagList.append(dagPath.partialPathName())

            selectionItr.next()

        return dagList
    def getTranslationVectors(self, fromMesh):
        '''
    method build an array of vectors for translation
    input fromMesh (python string)
    '''
        fromMeshPath = GenAPI.getDagPath(fromMesh)
        geoItr = om.MItGeometry(fromMeshPath)
        pointArrayA = om.MPointArray()
        geoItr.allPositions(pointArrayA, om.MSpace.kObject)

        if cmds.nodeType(self.baseMesh) == 'transform':
            shape = cmds.listRelatives(shape, type='shape')[0]
        else:
            shape = self.baseMesh

        pointArrayB = ShapeTool.getPointArray(self.baseMesh)

        if pointArrayA.length() == pointArrayB.length():
            outVectorArray = om.MVectorArray()
            itr = 0
            while itr <= pointArrayA.length():
                vectorA = pointArrayA[itr]
                vectorB = pointArrayB[itr]
                vectorC = vectorA - vectorB
                outVectorArray.append(vectorC)
                itr += 1
        return outVectorArray
示例#28
0
    def setWeightsForLattice(self,influence,weightList):
        
        '''
        method for setting skinWeight value for lattice points
        input MDagPath (influence)
        input python float list (weightList) 
        '''

        latticePntSelection = GenAPI.getLatticePoints(self.shapePath)
        selectionItr = om.MItSelectionList(latticePntSelection) 
        
        index = self.skinclusterFn.indexForInfluenceObject(influence)
        
        oldValues = om.MFloatArray()
        
        mdagPath = om.MDagPath()
        component = om.MObject()
        
        itrIndex = 0
        
        while not selectionItr.isDone():
            
            selectionItr.getDagPath(mdagPath,component)

            self.skinclusterFn.setWeights(self.shapePath,component,index,weightList[itrIndex],True,oldValues)
            
            itrIndex += 1 
            selectionItr.next()
示例#29
0
    def getTranslationVectors(self,fromMesh):
        
        '''
        method build an array of vectors for trnaslation
        input fromMesh (python string)
        '''
        
        fromMeshPath = GenAPI.getDagPath(fromMesh)
        geoItr = om.MItGeometry(fromMeshPath)
        pointArrayA = om.MPointArray()
        geoItr.allPositions(pointArrayA, om.MSpace.kWorld)
        
        pointArrayB = self.getPointArray()

        if pointArrayA.length() == pointArrayB.length():
 
            outVectorArray = om.MVectorArray()
            itr = 0
             
            while itr <= pointArrayA.length():
                 
                vectorA = pointArrayA[itr]
                vectorB = pointArrayB[itr]
                vectorC = vectorA - vectorB
    
                outVectorArray.append(vectorC)
                itr += 1
                
        return  outVectorArray
示例#30
0
    def optimizeMembership(deformer, prune=0.001):

        deformerObject = GenAPI.getMObject(deformer)
        geoFilter = oma.MFnGeometryFilter(deformerObject)
        deformerSet = geoFilter.deformerSet()
        deformerSetFn = om.MFnSet(deformerSet)

        addSelectionList = om.MSelectionList()
        removeSelectionList = om.MSelectionList()

        dagMembers = WeightListTool.getDagMembers(deformer)

        progressWindow = UILib.ProgressWin()
        progressWindow.setTitle('Optimizing Deformer')
        progressWindow.itr = len(dagMembers)

        for i in range(len(dagMembers)):

            dagPath = GenAPI.getDagPath(dagMembers[i])
            vertItr = om.MItGeometry(dagPath)
            weightListTool = WeightListTool(dagPath.fullPathName(), deformer)
            weightList = weightListTool.getWeightList()

            while not vertItr.isDone():
                index = vertItr.index()
                component = vertItr.currentItem()

                if weightList[index] < prune:
                    removeSelectionList.add(dagPath, component)

                else:
                    addSelectionList.add(dagPath, component)

                vertItr.next()

            if not addSelectionList.isEmpty():
                deformerSetFn.addMembers(addSelectionList)

            if not removeSelectionList.isEmpty():
                deformerSetFn.removeMembers(removeSelectionList)

            progressWindow.inc = i
            progressWindow.message = '%s...%s' % (deformer, dagMembers[i])
            progressWindow.progress()

        progressWindow.end()
示例#31
0
 def curveCVtoU (curveShape,curveCVIndex):
 
     curveFn = om.MFnNurbsCurve(GenAPI.getMObject(curveShape))
     mpoint = om.MPoint()
     curveFn.getCV(curveCVIndex,mpoint)
     uValue =  om.MScriptUtil()
     uValueNull = uValue.asDoublePtr()
     curveFn.closestPoint(mpoint,uValueNull)
     return uValue.getDouble(uValueNull)
示例#32
0
 def getMPoint(dagObject):
 
     mDagPath = GenAPI.getDagPath(dagObject)
     
     transformFn = om.MFnTransform(mDagPath)
     space = om.MSpace()
     
     mpoint = transformFn.rotatePivot(space.kWorld)
     return mpoint       
示例#33
0
    def addDagMember(mesh, deformer):
        '''
        method for adding dagObject to deformer
        input meshPath (python string)
        input defrormer(python string)
        '''

        deformerObject = GenAPI.getMObject(deformer)
        meshPath = GenAPI.getDagPath(mesh)
        vertObjects = GenAPI.getMObjectAllVerts(mesh)

        geoFilter = oma.MFnGeometryFilter(deformerObject)
        deformerSet = geoFilter.deformerSet()
        deformerSetFn = om.MFnSet(deformerSet)

        for vert in vertObjects:

            deformerSetFn.addMember(meshPath, vert)
示例#34
0
 def __init__(self,shape):
     
     self.shape = shape
     self.shapePath = GenAPI.getDagPath(shape)
     
     geoItr = om.MItGeometry(self.shapePath)
     pointArray = om.MPointArray()
     geoItr.allPositions(pointArray, om.MSpace.kWorld)
     
     self.origPointArray = pointArray
示例#35
0
 def addDagMember(mesh,deformer):
     
     '''
     method for adding dagObject to deformer
     input meshPath (python string)
     input defrormer(python string)
     '''
     
     deformerObject = GenAPI.getMObject(deformer)
     meshPath = GenAPI.getDagPath(mesh)
     vertObjects = GenAPI.getMObjectAllVerts(mesh)
     
     geoFilter = oma.MFnGeometryFilter(deformerObject)
     deformerSet = geoFilter.deformerSet()
     deformerSetFn = om.MFnSet(deformerSet)
     
     for vert in vertObjects:
     
         deformerSetFn.addMember(meshPath,vert)
示例#36
0
    def getVertNormal(geo,vert,name):

        #find dag path
        polyPath = GenAPI.getDagPath(geo)
        vertexObject = GenAPI.getComponentsFromList(geo,[vert])

        #create vector instance for vert iterator
        vertNormalVector = om.MVector()

        vertIterator = om.MItMeshVertex(polyPath,vertexObject)
        
        #MIntArray for face indexes
        faceIndexArray = om.MIntArray()
        vertIterator.getNormalIndices(faceIndexArray)

        faceIndexList = []

        for i in faceIndexArray:
            faceIndexList.append(i)

        #store normal vector in MVector instance
        vertIterator.getNormal(vertNormalVector,faceIndexList[0],om.MSpace.kObject)
        vertPos = vertIterator.position(om.MSpace.kWorld)

        #create new vectors form queries
        v1 = om.MVector(vertNormalVector.x,vertNormalVector.y,vertNormalVector.z)
        v2 = om.MVector(vertPos.x,vertPos.y,vertPos.z)
        #add vector1 to vector2 for offset
        v3 = v1 + v2

        #create locators
        vertLoc = cmds.spaceLocator(n = '%s_VertPos_Loc'%(name))
        normalVectorLoc = cmds.spaceLocator(n = '%s_VertNormalVec_Loc'%(name))
        tempLoc = cmds.spaceLocator()

        #move locators into position
        cmds.move(v1.x,v1.y,v1.z,tempLoc[0],ws = True)
        cmds.move(v2.x,v2.y,v2.z,vertLoc[0],ws = True)
        cmds.move(v3.x,v3.y,v3.z,normalVectorLoc[0],ws = True)

        #aim locator2 at locator1
        cmds.aimConstraint(normalVectorLoc,vertLoc, aimVector = (1,0,0), upVector = (0,1,0))
示例#37
0
 def setTranslation(mesh,vectorArray):
     
     meshPath = GenAPI.getDagPath(mesh)
     
     vertItr = om.MItMeshVertex(meshPath)
     
     while not vertItr.isDone():
         
         index = vertItr.index()
         vertItr.translateBy(vectorArray[index],om.MSpace.kWorld)
         vertItr.next()
示例#38
0
    def getMemberSet(self, filePath):

        output = open(filePath, 'wb')

        setsToDump = []

        for objectSet in self.sets:

            print 'saving %s set...' % objectSet

            setObject = GenAPI.getMObject(objectSet)
            self.__setFn.setObject(setObject)

            selectionList = om.MSelectionList()
            self.__setFn.getMembers(selectionList, True)
            selectionListItr = om.MItSelectionList(selectionList)

            members = dict()
            members['setName'] = objectSet
            members['dagMembers'] = []
            members['components'] = []

            while not selectionListItr.isDone():

                dagPath = om.MDagPath()
                component = om.MObject()

                selectionListItr.getDagPath(dagPath, component)

                pathName = dagPath.partialPathName()

                if not component.isNull():

                    if component.apiTypeStr() == 'kMeshPolygonComponent':

                        componentFn = om.MFnSingleIndexedComponent(component)
                        elementArray = om.MIntArray()
                        componentFn.getElements(elementArray)

                        for element in elementArray:

                            members['components'].append('%s.f[%i]' %
                                                         (pathName, element))

                else:
                    members['dagMembers'].append(pathName)

                selectionListItr.next()

            setsToDump.append(members)

        pickle.dump(setsToDump, output)
        output.close()
        print 'I\'m Done!'
示例#39
0
    def createWeigthListFromInfluence2(mesh,transform):
        
        meshPath = GenAPI.getDagPath(mesh)
        transformPath = GenAPI.getDagPath(transform)
        
        transformFn = om.MFnTransform(transformPath)
        origTransform = transformFn.transformation()
        transformFn.set(om.MTransformationMatrix.identity)
        
        vertItr = om.MItMeshVertex(meshPath)
        
        startPoints = []
        
        translateVector = om.MVector(1,0,0)
        
        while not vertItr.isDone():
            
            vertStartPos = vertItr.position(om.MSpace.kWorld)
            startPoints.append(vertStartPos)
            vertItr.next()
        
        vertItr.reset()     
        transformFn.translateBy(translateVector,om.MSpace.kObject)
        
        weightList = []
        index = 0
        

        while not vertItr.isDone():
            
            vertEndPos = vertItr.position(om.MSpace.kWorld)
            length = MeasuringTool.getVectorLengthBetween(startPoints[index], vertEndPos)
            
            weightList.append(length)
        
            index += 1
            vertItr.next()
        
        transformFn.set(origTransform)

        return weightList
示例#40
0
def createClusterFromMesh(fromMesh,toMesh):
    
    '''
    Function for creating cluster from another duplicate modified mesh
    input fromMesh (python string)
    input toMesh (python string)
    '''
    
    
    toMeshPath = GenAPI.getDagPath(toMesh)
    
    fromVerts = GenAPI.getMObjectAllVerts(toMesh)
    selectionList = om.MSelectionList()
    
    selectionList.add(toMeshPath,fromVerts)
    om.MGlobal.setActiveSelectionList(selectionList)
    
    #creating cluster   
    cluster = cmds.cluster()
    transformPosition = cmds.xform(fromMesh,q = True,ws = True, rp = True)
    
    clusterShape = cmds.listRelatives(cluster[1],type = 'shape')
    
    cmds.setAttr('%s.originX'%clusterShape[0],transformPosition[0])
    cmds.setAttr('%s.originY'%clusterShape[0],transformPosition[1])
    cmds.setAttr('%s.originZ'%clusterShape[0],transformPosition[2])
    
    cmds.setAttr('%s.rotatePivotX'%cluster[1],transformPosition[0])
    cmds.setAttr('%s.rotatePivotY'%cluster[1],transformPosition[1])
    cmds.setAttr('%s.rotatePivotZ'%cluster[1],transformPosition[2])
    
    cmds.setAttr('%s.scalePivotX'%cluster[1],transformPosition[0])
    cmds.setAttr('%s.scalePivotY'%cluster[1],transformPosition[1])
    cmds.setAttr('%s.scalePivotZ'%cluster[1],transformPosition[2])
    
    weightList = MeasuringLib.MeasuringTool.createWeightListFromMesh(fromMesh, toMesh)
    deformerTool = WeightListTool(toMesh,cluster[0])
    deformerTool.setWeightList(weightList)
    
    om.MGlobal.displayInfo('Created cluster from %s'%fromMesh)
示例#41
0
 def getWeights(self,verts,influence):
     
     '''
     get influence value
     input MObject (verts)
     input MDagPath (influence)
     returns MDoubleArray (weights)
     '''
     
     index = self.indexForInfluenceObject(influence)
     weights = om.MDoubleArray()
     self.skinclusterFn.getWeights(GenAPI.getDagPath(self.shape),verts,index,weights)
     return weights
示例#42
0
def createClusterFromMesh(fromMesh, toMesh):
    '''
    Function for creating cluster from another duplicate modified mesh
    input fromMesh (python string)
    input toMesh (python string)
    '''

    toMeshPath = GenAPI.getDagPath(toMesh)

    fromVerts = GenAPI.getMObjectAllVerts(toMesh)
    selectionList = om.MSelectionList()

    selectionList.add(toMeshPath, fromVerts)
    om.MGlobal.setActiveSelectionList(selectionList)

    #creating cluster
    cluster = cmds.cluster()
    transformPosition = cmds.xform(fromMesh, q=True, ws=True, rp=True)

    clusterShape = cmds.listRelatives(cluster[1], type='shape')

    cmds.setAttr('%s.originX' % clusterShape[0], transformPosition[0])
    cmds.setAttr('%s.originY' % clusterShape[0], transformPosition[1])
    cmds.setAttr('%s.originZ' % clusterShape[0], transformPosition[2])

    cmds.setAttr('%s.rotatePivotX' % cluster[1], transformPosition[0])
    cmds.setAttr('%s.rotatePivotY' % cluster[1], transformPosition[1])
    cmds.setAttr('%s.rotatePivotZ' % cluster[1], transformPosition[2])

    cmds.setAttr('%s.scalePivotX' % cluster[1], transformPosition[0])
    cmds.setAttr('%s.scalePivotY' % cluster[1], transformPosition[1])
    cmds.setAttr('%s.scalePivotZ' % cluster[1], transformPosition[2])

    weightList = MeasuringLib.MeasuringTool.createWeightListFromMesh(
        fromMesh, toMesh)
    deformerTool = WeightListTool(toMesh, cluster[0])
    deformerTool.setWeightList(weightList)

    om.MGlobal.displayInfo('Created cluster from %s' % fromMesh)
示例#43
0
    def matchSpace(dagObject,name):
    
        translation = MeasuringTool.getWorldTranslation(dagObject)
        rotation = MeasuringTool.getWorldEulerRotation(dagObject)
        rotationOrder = MeasuringTool.getRotationOrder(dagObject)

        newTransform = cmds.group(empty = True, n = '%s_Group'%(name))
        dagPath = GenAPI.getDagPath(newTransform)
        transformFn = om.MFnTransform(dagPath)

        transformFn.setTranslation(translation,om.MSpace.kWorld)
        transformFn.setRotation(rotation,rotationOrder)
        transformFn.setRotationOrder(rotationOrder,1)
示例#44
0
def getLatticePointPos(latticeShape):
    
    dagPath = GenAPI.getDagPath(latticeShape)
    geoItr = om.MItGeometry(dagPath)
    
    latPointPos = []
    
    while not geoItr.isDone():
        
        position = geoItr.position(om.MSpace.kWorld)
        latPointPos.append([position.x,position.y,position.z])
        geoItr.next()
        
    return latPointPos
示例#45
0
    def mirrorDeformerWeightMultiMesh(self, geoTo, axis='x', table=[-1, 1, 1]):
        '''
        method for mirroring deformer...only works on meshes mirrored across given axis
        input python string (geoFrom)
        imput python string (geoTo)
        input python string (deformer)
        input python string (axis)
        input python int list (table)
        '''

        nodePathTo = GenAPI.getDagPath(geoTo)
        vertItr = om.MItMeshVertex(self.meshPath)

        deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject)

        util = om.MScriptUtil()

        progressWin = UILib.ProgressWin()
        progressWin.itr = vertItr.count()
        progressWin.setTitle('Mirror Deformer')

        while not vertItr.isDone():

            inComponent = vertItr.currentItem()
            currentPosition = vertItr.position(om.MSpace.kWorld)

            inComponent = vertItr.currentItem()
            mirrorVert = MeasuringLib.MeasuringTool.getSymVertFromClosestPoint(
                nodePathTo, currentPosition, table)
            weights = om.MFloatArray()

            tempItr = om.MItMeshVertex(nodePathTo)
            intPtr = util.asIntPtr()
            tempItr.setIndex(mirrorVert[0], intPtr)
            outComponent = tempItr.currentItem()

            if self.checkMembership(inComponent):

                self.addComponentToMembershipList(outComponent)

            deformerWeightFn.getWeights(self.meshPath, inComponent, weights)
            deformerWeightFn.setWeight(nodePathTo, outComponent, weights)

            progressWin.inc = vertItr.index()
            progressWin.message = '%s.vtx[%i]' % (self.mesh, progressWin.inc)
            progressWin.progress()

            vertItr.next()

        progressWin.end()
示例#46
0
 def mirrorDeformerWeightMultiMesh(self,geoTo,axis = 'x',table = [-1,1,1]):
     
     '''
     method for mirroring deformer...only works on meshes mirrored across given axis
     input python string (geoFrom)
     imput python string (geoTo)
     input python string (deformer)
     input python string (axis)
     input python int list (table)
     '''
     
     nodePathTo = GenAPI.getDagPath(geoTo)
     vertItr = om.MItMeshVertex(self.meshPath)
     
     deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject)
     
     util = om.MScriptUtil()
     
     progressWin = UILib.ProgressWin()
     progressWin.itr = vertItr.count()
     progressWin.setTitle('Mirror Deformer')
     
     while not vertItr.isDone():
         
         inComponent = vertItr.currentItem()
         currentPosition = vertItr.position(om.MSpace.kWorld)
         
         inComponent = vertItr.currentItem()
         mirrorVert = MeasuringLib.MeasuringTool.getSymVertFromClosestPoint(nodePathTo, currentPosition, table)     
         weights = om.MFloatArray()
         
         tempItr = om.MItMeshVertex(nodePathTo)
         intPtr = util.asIntPtr()
         tempItr.setIndex(mirrorVert[0],intPtr)
         outComponent = tempItr.currentItem()
         
         if self.checkMembership(inComponent):
             
             self.addComponentToMembershipList(outComponent)
         
         deformerWeightFn.getWeights(self.meshPath,inComponent,weights)
         deformerWeightFn.setWeight(nodePathTo,outComponent,weights)
         
         progressWin.inc = vertItr.index()
         progressWin.message = '%s.vtx[%i]'%(self.mesh,progressWin.inc)
         progressWin.progress() 
 
         vertItr.next()
         
     progressWin.end()
示例#47
0
    def setWeightList(self, weightList):
        '''
        method for setting wieght list to mesh
        input python float list (weightList)  
        '''
        floatArray = om.MFloatArray()

        util = om.MScriptUtil()
        util.createFloatArrayFromList(weightList, floatArray)

        components = GenAPI.getMObjectAllVerts(self.meshPath)

        deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject)
        deformerWeightFn.setWeight(self.meshPath, components, floatArray)
示例#48
0
 def getComponentPoints(mesh):
     
     meshPath = GenAPI.getDagPath(mesh)
     vertItr = om.MItMeshVertex(meshPath)
     
     pointArray = []
     
     while not vertItr.isDone():
         
         point = vertItr.position(om.MSpace.kWorld)
         pointArray.append([point.x,point.y,point.z])
         vertItr.next()
         
     return pointArray
示例#49
0
def getLatticePointPos(latticeShape):

    dagPath = GenAPI.getDagPath(latticeShape)
    geoItr = om.MItGeometry(dagPath)

    latPointPos = []

    while not geoItr.isDone():

        position = geoItr.position(om.MSpace.kWorld)
        latPointPos.append([position.x, position.y, position.z])
        geoItr.next()

    return latPointPos
示例#50
0
def setLatticePointPos(latticeShape, positions):

    dagPath = GenAPI.getDagPath(latticeShape)
    geoItr = om.MItGeometry(dagPath)

    latPointPos = []

    while not geoItr.isDone():

        index = geoItr.index()
        position = positions[index]
        mpoint = om.MPoint(position[0], position[1], position[2])
        geoItr.setPosition(mpoint, om.MSpace.kWorld)

        geoItr.next()
示例#51
0
    def setWeightList(self,weightList):
        
        '''
        method for setting wieght list to mesh
        input python float list (weightList)  
        '''
        floatArray = om.MFloatArray()
        
        util = om.MScriptUtil()
        util.createFloatArrayFromList(weightList,floatArray)
        
        components = GenAPI.getMObjectAllVerts(self.meshPath)

        deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject)
        deformerWeightFn.setWeight(self.meshPath,components,floatArray)
示例#52
0
def setLatticePointPos(latticeShape,positions):
    
    dagPath = GenAPI.getDagPath(latticeShape)
    geoItr = om.MItGeometry(dagPath)
    
    latPointPos = []
    
    while not geoItr.isDone():
        
        index = geoItr.index()
        position = positions[index]
        mpoint = om.MPoint(position[0],position[1],position[2])
        geoItr.setPosition(mpoint,om.MSpace.kWorld)
        
        geoItr.next()      
    def getPointArray(shape):
        '''
      method gathers point array from verts
      output pointArray(mPointArray)
      '''
        if cmds.nodeType(shape) == 'transform':
            shape = cmds.listRelatives(shape, type='shape')[0]

        geoPath = GenAPI.getDagPath(shape)
        geoItr = om.MItGeometry(geoPath)
        pointArray = om.MPointArray()

        geoItr.allPositions(pointArray, om.MSpace.kObject)

        return pointArray
示例#54
0
    def getAllAnimation():

        animCurveTU = cmds.ls(type='animCurveTU')
        animCurveTA = cmds.ls(type='animCurveTA')
        animCurveTL = cmds.ls(type='animCurveTU')

        animCurves = animCurveTU + animCurveTA + animCurveTL

        objectArray = om.MObjectArray()

        for curve in animCurves:

            mobject = GenAPI.getMObject(curve)
            objectArray.add(mobject)

        return objectArray
示例#55
0
    def reverseWeightList(self):
        '''method for reversing weighList on current mesh'''

        deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject)
        weightList = om.MFloatArray()
        verts = GenAPI.getMObjectAllVerts(self.mesh)
        deformerWeightFn.getWeights(self.meshPath, verts, weightList)

        reverseWeightList = []

        for i in range(weightList.length()):

            reverseWeight = abs(weightList[i] - 1.00000)
            reverseWeightList.append(reverseWeight)

        return reverseWeightList
示例#56
0
 def setWeightList(self,influence,weightList):
     
     '''
     set influence value ONLY WORKS FOR POLY MESH
     input MDagPath (influence)
     input python float list (weightList)
     '''
     
     index = self.indexForInfluenceObject(influence)
     mIntArray = om.MIntArray()
     mIntArray.append(index)
     util = om.MScriptUtil()
     weights = om.MFloatArray()        
     util.createFloatArrayFromList(weightList,weights)
     oldValues = om.MFloatArray()    
     verts = GenAPI.getMObjectAllVerts(self.shape)   
     self.skinclusterFn.setWeights(self.shapePath,verts,mIntArray,weights,True,oldValues)
示例#57
0
    def createBlankList(mesh, floatVal, boolVal):
        '''
        method for creating a blank weight and membershipList
        output blankList (python list)
        '''

        meshPath = GenAPI.getDagPath(mesh)
        vertItr = om.MItMeshVertex(meshPath)
        blankWeightList = []
        blankMemberList = []

        while not vertItr.isDone():

            blankWeightList.append(floatVal)
            blankMemberList.append(boolVal)
            vertItr.next()

        return [blankWeightList, blankMemberList]