Пример #1
0
	def onDrag(self):
	
		# modifier
		self.mod = cmds.getModifiers()
		
		# positions
		currentPos = cmds.draggerContext(self.dragCtx, query=True, dragPoint=True)
		
		# camera far clip
		currentView = omui.M3dView().active3dView()
		camDP = om.MDagPath()
		
		currentView.getCamera(camDP)
		camFn = om.MFnCamera(camDP)
		farclip = camFn.farClippingPlane()
		
		# screen to world conversion
		worldPos, worldDir = utils().viewToWorld(currentPos[0],currentPos[1])
		
		
		closestHit = None
		closestObj = None
		for obj in self.targetObj:
			state, hit, fnMesh, facePtr, triPtr = utils().intersect(obj, worldPos, worldDir, farclip)
				
			if state is True:
				dif = [hit.x - worldPos[0],hit.y - worldPos[1],hit.z - worldPos[2]]
				distToCam = math.sqrt(math.pow(float(dif[0]),2) + math.pow(float(dif[1]),2) + math.pow(float(dif[2]),2))
				if closestHit == None:
					closestHit = distToCam
					closestObj = [state, hit, fnMesh, facePtr, triPtr]
				elif distToCam < closestHit:
					closestHit = distToCam
					closestObj = [state, hit, fnMesh, facePtr, triPtr]
		if closestObj is not None:
			state, hit, fnMesh, facePtr, triPtr = closestObj
			
			mHit = om.MPoint(hit)
			# get smooth normal
			normal = om.MVector()
			fnMesh.getClosestNormal(mHit, normal, om.MSpace.kWorld, None)
			
			tangent = utils().crossProduct(normal,self.worldUp)
			
			
			
			upAxis = utils().crossProduct(normal,tangent)
			
			# define transformation matrix
			matrix = [tangent.x,tangent.y,tangent.z,0,upAxis.x,upAxis.y,upAxis.z,0,normal.x,normal.y,normal.z,0,hit.x,hit.y,hit.z,0]
			
			# apply matrix
			dist = om.MVector( (hit.x - self.prevHit.x),(hit.y - self.prevHit.y),(hit.z - self.prevHit.z) )
			if utils().magnitude(dist) > self.step:
				if self.mod == 0:
					cmds.curve(self.loc,append=True,p=(hit.x,hit.y,hit.z))
			else:
				hit = self.prevHit
			
			
			if self.mesh is True:
					v1 = cmds.pointPosition(self.loc + '.cv[0]',w=True)
					v2 = cmds.pointPosition(self.loc + '.cv[1]',w=True)
					v = om.MVector(v2[0] - v1[0],v2[1] - v1[1],v2[2] - v1[2])
					v.normalize()
					cmds.setAttr(self.circle[1] + '.normalX',v.x)
					cmds.setAttr(self.circle[1] + '.normalY',v.y)
					cmds.setAttr(self.circle[1] + '.normalZ',v.z)
					
					
					if self.mod == 1:
						mag = utils().magnitude(dist) * self.bMult
						if dist.y < 0:
							mag = -mag
						currentValue = cmds.getAttr(self.circle[1] + '.radius')
						compVal = sorted((0.0001,currentValue + mag))[1]
						self.bRad = compVal
						cmds.setAttr(self.circle[1] + '.radius',compVal)
					
					if self.mod == 4:
						mag = utils().magnitude(dist) * self.bMult
						if dist.y < 0:
							mag = -mag
						currentValue = cmds.getAttr(self.extrude[1] + '.scale')
						compVal = sorted((0.0001,currentValue + mag))[1]
						self.taper = compVal
						cmds.setAttr(self.extrude[1] + '.scale',compVal)
			
			self.prevHit = hit
			# print cmds.timerX(st=self.timer)
			
			# refresh viewport
			currentView.refresh(False,True,False)
Пример #2
0
 def om_get_shape(self, name):
     sllist = om.MSelectionList()
     om.MGlobal.getSelectionListByName(name, sllist)
     dpg = om.MDagPath()
     sllist.getDagPath(0, dpg)
     return dpg
Пример #3
0
def getDagPath( nodeName ):
    selList = OpenMaya.MSelectionList()
    selList.add( nodeName )
    dagPath = OpenMaya.MDagPath()
    selList.getDagPath( 0, dagPath )
    return dagPath
Пример #4
0
    def testCreases(self):

        cortexCube = IECoreScene.MeshPrimitive.createBox(
            imath.Box3f(imath.V3f(-1), imath.V3f(1)))

        cornerIds = [5]
        cornerSharpnesses = [10.0]

        cortexCube.setCorners(IECore.IntVectorData(cornerIds),
                              IECore.FloatVectorData(cornerSharpnesses))

        creaseLengths = [3, 2]
        creaseIds = [1, 2, 3, 4, 5]  # note that these are vertex ids
        creaseSharpnesses = [1, 5]

        cortexCube.setCreases(IECore.IntVectorData(creaseLengths),
                              IECore.IntVectorData(creaseIds),
                              IECore.FloatVectorData(creaseSharpnesses))

        converter = IECoreMaya.ToMayaObjectConverter.create(cortexCube)
        transform = maya.cmds.createNode("transform")
        self.assert_(converter.convert(transform))

        mayaMesh = maya.cmds.listRelatives(transform, shapes=True)[0]

        l = OpenMaya.MSelectionList()
        l.add(mayaMesh)
        p = OpenMaya.MDagPath()
        l.getDagPath(0, p)

        fnMesh = OpenMaya.MFnMesh(p)

        # Test corners

        cornerIds = OpenMaya.MUintArray()
        cornerSharpnesses = OpenMaya.MDoubleArray()
        fnMesh.getCreaseVertices(cornerIds, cornerSharpnesses)

        testIds = OpenMaya.MUintArray()
        testIds.append(5)
        self.assertEqual(cornerIds, testIds)

        testSharpnesses = OpenMaya.MFloatArray()
        testSharpnesses.append(10)
        self.assertEqual(cornerSharpnesses, testSharpnesses)

        # Test edges

        edgeIds = OpenMaya.MUintArray()
        edgeSharpnesses = OpenMaya.MDoubleArray()
        fnMesh.getCreaseEdges(edgeIds, edgeSharpnesses)

        util = OpenMaya.MScriptUtil()

        result = []
        for edgeId, sharpness in zip(edgeIds, edgeSharpnesses):

            edgeVertices = util.asInt2Ptr()
            fnMesh.getEdgeVertices(edgeId, edgeVertices)

            result.append((util.getInt2ArrayItem(edgeVertices, 0, 1),
                           util.getInt2ArrayItem(edgeVertices, 0,
                                                 0), sharpness))

        # we compare sets because maya reorders by edge index
        self.assertEqual(set(result),
                         set([(1, 2, 1.0), (2, 3, 1.0), (4, 5, 5.0)]))
Пример #5
0
    def callbackFunc(self, *args):
        print 'callback'
        mSel = OpenMaya.MSelectionList()
        OpenMaya.MGlobal.getActiveSelectionList(mSel)
        mode = 'fk'
        MItselectionList = OpenMaya.MItSelectionList(mSel,
                                                     OpenMaya.MFn.kDagNode)
        while (not MItselectionList.isDone()):
            mObj = OpenMaya.MObject()
            MItselectionList.getDependNode(mObj)
            #although ik effector is not selectable
            #if ik effector is selected
            #==============================================#
            #if mObj.apiType() == OpenMaya.MFn.kIkEffector:
            #activeIKEffector = mObj
            #mode = 'ik'
            #break
            #==============================================#
            #if ik handle is selected
            if mObj.apiType() == OpenMaya.MFn.kIkHandle:
                self.activeIKHandle = mObj
                mode = 'ik'
                break
            #if pole vector controller is selected
            if mObj.apiType() == OpenMaya.MFn.kTransform:
                mdependNode = OpenMaya.MFnDependencyNode(mObj)
                mPlugArray = OpenMaya.MPlugArray()
                mdependNode.getConnections(mPlugArray)
                for i in range(mPlugArray.length()):
                    mPlug = mPlugArray[i]
                    mPlugArray1 = OpenMaya.MPlugArray()
                    mPlug.connectedTo(mPlugArray1, False, True)
                    #for i in range(mPlugArray1.length()):
                    mPlug = mPlugArray1[0]
                    if mPlug.node().apiType(
                    ) == OpenMaya.MFn.kPoleVectorConstraint:
                        self.poleVector = mPlug.node()
                        self.poleVectorController = mObj
                        #print 'find kPoleVectorConstraint'
                        mode = 'ik'
                        break
            MItselectionList.next()

        #if poleVector controller is found:
        if self.poleVectorController.apiType(
        ) == OpenMaya.MFn.kTransform and self.poleVector.apiType(
        ) == OpenMaya.MFn.kPoleVectorConstraint:
            poleVectorDependNode = OpenMaya.MFnDependencyNode(self.poleVector)
            mPlugArray = OpenMaya.MPlugArray()
            poleVectorDependNode.getConnections(mPlugArray)
            for i in range(mPlugArray.length()):
                mPlug = mPlugArray[i]
                mPlug.connectedTo(mPlugArray, True, False)
                if mPlugArray.length() > 0:
                    if mPlugArray[0].node().apiType(
                    ) == OpenMaya.MFn.kIkHandle:
                        self.activeIKHandle = mPlugArray[0].node()

        #if IKHandle is found:
        if self.activeIKHandle.apiType() == OpenMaya.MFn.kIkHandle:
            #find IKEffector based on IKHandle
            IKHandleDependNode = OpenMaya.MFnDependencyNode(
                self.activeIKHandle)
            connectedPlug = OpenMaya.MPlugArray()
            IKHandleDependNode.getConnections(connectedPlug)
            for i in range(connectedPlug.length()):
                mPlug = connectedPlug[i]
                otherPlug = OpenMaya.MPlugArray()
                mPlug.connectedTo(otherPlug, True, True)
                #find effector
                if otherPlug[0].node().apiType() == OpenMaya.MFn.kIkEffector:
                    self.activeIKEffector = otherPlug[0].node()
                #find poleVectorConstraint
                if otherPlug[0].node().apiType(
                ) == OpenMaya.MFn.kPoleVectorConstraint:
                    self.poleVector = otherPlug[0].node()
                #find the start joint ---> joint1
                if otherPlug[0].node().apiType() == OpenMaya.MFn.kJoint:
                    self.joint1 = otherPlug[0].node()

            #if poleVectorConstaint is found:
            if self.poleVector.apiType() == OpenMaya.MFn.kPoleVectorConstraint:
                poleVectorDependNode = OpenMaya.MFnDependencyNode(
                    self.poleVector)
                poleVectorPlugs = OpenMaya.MPlugArray()
                poleVectorDependNode.getConnections(poleVectorPlugs)
                for i in range(poleVectorPlugs.length()):
                    mPlug = poleVectorPlugs[i]
                    otherPlug = OpenMaya.MPlugArray()
                    mPlug.connectedTo(otherPlug, True, False)
                    if otherPlug.length() > 0:
                        if otherPlug[0].node().apiType(
                        ) == OpenMaya.MFn.kTransform:
                            self.poleVectorController = otherPlug[0].node()
                            break

            #if kIkEffector is found:
            if self.activeIKEffector.apiType() == OpenMaya.MFn.kIkEffector:
                #use to find joint 3
                #based on joint3 and joint 1 ----> joint 2
                effectorNode = OpenMaya.MFnDependencyNode(
                    self.activeIKEffector)
                effectorPlug = OpenMaya.MPlugArray()
                effectorNode.getConnections(effectorPlug)
                for i in range(effectorPlug.length()):
                    mPlug = effectorPlug[i]
                    connectedPlug = OpenMaya.MPlugArray()
                    mPlug.connectedTo(connectedPlug, True, False)
                    if connectedPlug.length() > 0:
                        if connectedPlug[0].node().apiType(
                        ) == OpenMaya.MFn.kJoint:
                            self.joint3 = connectedPlug[0].node()

                if self.joint1.apiType(
                ) == OpenMaya.MFn.kJoint and self.joint3.apiType(
                ) == OpenMaya.MFn.kJoint:
                    #start joint and end joint are both found
                    #next need to locate joint2
                    joint1DependNode = OpenMaya.MFnDependencyNode(self.joint1)
                    joint3DependNOde = OpenMaya.MFnDependencyNode(self.joint3)
                    #find joint2 from joint3
                    inverseScalePlug = joint3DependNOde.findPlug(
                        'inverseScale')
                    otherPlug = OpenMaya.MPlugArray()
                    inverseScalePlug.connectedTo(otherPlug, True, False)
                    if otherPlug.length() > 0:
                        self.joint2 = otherPlug[0].node()
                    #double check joint2 from joint1
                    scalePlug = joint1DependNode.findPlug('scale')
                    scalePlug.connectedTo(otherPlug, False, True)
                    for i in range(otherPlug.length()):
                        if otherPlug[i].node() == self.joint2:
                            print 'find joint2'
                            self.joint2 = otherPlug[i].node()
                    #=============================================================#
                    #here we found all the items for ikfk switch
                    if mode == 'fk':
                        try:
                            IKHandleDependNode = OpenMaya.MFnDependencyNode(
                                self.activeIKHandle)
                            ikBlendPlug = IKHandleDependNode.findPlug(
                                'ikBlend')
                            ikBlendPlugAttr = ikBlendPlug.attribute()
                            ikBlendAttribute = OpenMaya.MFnAttribute(
                                ikBlendPlugAttr)
                            ikBlendPlug.setInt(0)
                            #ikBlendAttribute.setInt(0)
                        except Exception, e:
                            print e
                            pass
                    #mode ---> ik
                    else:
                        try:
                            #get joint2 transform and poleVectorController transform
                            if (self.joint2.apiType() == OpenMaya.MFn.kJoint):
                                mFnTransform_poleVectorController = OpenMaya.MFnTransform(
                                    self.poleVectorController)
                                mFnTransform_joint2 = OpenMaya.MFnTransform(
                                    self.joint2)

                                mDagPath_joint2 = OpenMaya.MDagPath()
                                mFnTransform_joint2.getPath(mDagPath_joint2)
                                mFnTransform_joint2.setObject(mDagPath_joint2)

                                mDagPath_poleVectorController = OpenMaya.MDagPath(
                                )
                                mFnTransform_poleVectorController.getPath(
                                    mDagPath_poleVectorController)
                                mFnTransform_poleVectorController.setObject(
                                    mDagPath_poleVectorController)
                                #?Do not work with freeze translation...
                                mFnTransform_poleVectorController.setTranslation(
                                    mFnTransform_joint2.getTranslation(
                                        OpenMaya.MSpace.kWorld),
                                    OpenMaya.MSpace.kWorld)

                            IKHandleDependNode = OpenMaya.MFnDependencyNode(
                                self.activeIKHandle)
                            ikBlendPlug = IKHandleDependNode.findPlug(
                                'ikBlend')
                            ikBlendPlug.setInt(1)
                            #ikBlendAttribute.setInt(1)
                        except Exception, e:
                            print e
                            pass
Пример #6
0
def blendNormals(sourceObject=None, targetObject=None, threshold=.01):
    """

    :type sourceObject: polygonal
    :param sourceObject: The polygon object to have the normals copied from
    :type targetObject: polygonal
    :param targetObject: The polygon object to have its vertex normals set
    :type threshold: float
    :param threshold: The minimum world space distance that considers vertices "on top" of each other
    :return: None
    """

    # do nothing if we haven't been given a source or target object
    if not sourceObject or not targetObject:
        return

    # get the dag paths to each obj
    sel = om.MSelectionList()
    sel.add(sourceObject)
    sel.add(targetObject)
    dagA = om.MDagPath()
    dagB = om.MDagPath()
    sel.getDagPath(0, dagA)
    sel.getDagPath(1, dagB)

    # create a vertex iterator for our first mesh
    iterA = om.MItMeshVertex(dagA)
    # Create arrays to store the indexes and positions of the boundary vertices on our source object
    boundaryVertsA = om.MIntArray()
    boundaryVertLocsA = om.MPointArray()

    while not iterA.isDone():
        # If the vertex is a boundary vertex (i.e. on the edge of a "hole") then store its information
        if iterA.onBoundary():
            # append that vertex's index
            boundaryVertsA.append(iterA.index())
            # append that vertex's position
            boundaryVertLocsA.append(iterA.position(om.MSpace.kWorld))

        iterA.next()

    # do the same for our target object
    iterB = om.MItMeshVertex(dagB)
    boundaryVertsB = om.MIntArray()
    boundaryVertLocsB = om.MPointArray()

    while not iterB.isDone():
        if iterB.onBoundary():
            boundaryVertsB.append(iterB.index())
            boundaryVertLocsB.append(iterB.position(om.MSpace.kWorld))

        iterB.next()

    # compare the two lists, seeing which vertices are "on top" of each other
    vertPairs = {}

    for i in range(boundaryVertLocsA.length()):
        # make a vector out of our boundary vertex position
        vectorA = om.MVector(boundaryVertLocsA[i].x, boundaryVertLocsA[i].y, boundaryVertLocsA[i].z)
        # iterate through each vertex of our target object
        for j in range(boundaryVertLocsB.length()):
            vectorB = om.MVector(boundaryVertLocsB[j].x, boundaryVertLocsB[j].y, boundaryVertLocsB[j].z)
            # if the length (distance) of the difference between these two vectors is less than the threshold:
            if om.MVector(vectorA - vectorB).length() <= threshold:
                # declare that vertex pairing
                vertPairs[boundaryVertsA[i]] = boundaryVertsB[j]
                # don't waste time comparing to the other vertices
                break

    # now set the vertex normals for each pairing
    fnMeshA = om.MFnMesh(dagA)
    fnMeshB = om.MFnMesh(dagB)

    for vert in vertPairs:
        # vector object to store the vertex normal
        vertNormal = om.MVector()
        # get the vertex normal at the source object's vert index
        fnMeshA.getVertexNormal(vert, vertNormal, om.MSpace.kWorld)
        # set the vertex normal at that source vert's pair
        fnMeshB.setVertexNormal(vertNormal, vertPairs[vert], om.MSpace.kWorld)
Пример #7
0
    def preMultipleDrawPass(self, index):
        self.fCurrentPass = index

        try:
            self.setDisplayAxis(False)
            self.setDisplayAxisAtOrigin(False)
            self.setDisplayCameraAnnotation(False)

            dagPath = OpenMaya.MDagPath()

            if self.fCurrentPass == 0:
                self.getCamera(dagPath)
            else:
                nCameras = self.fCameraList.length()
                if self.fCurrentPass <= nCameras:
                    dagPath = self.fCameraList[self.fCurrentPass - 1]
                else:
                    sys.stderr.write("ERROR: ...too many passes specified\n")
                    return

            self.setCameraInDraw(dagPath)

            self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything, True)

            if dagPath == self.fOldCamera:
                self.fDrawManips = True
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, True)

                self.setFogEnabled(True)

                self.setBackgroundFogEnabled(False)

                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayLights, True)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayCameras, True)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayIkHandles,
                                      True)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayDimensions,
                                      True)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplaySelectHandles,
                                      True)

                textPos = OpenMaya.MPoint(0.0, 0.0, 0.0)
                str = "Main View"
                self.drawText(str, textPos, OpenMayaUI.M3dView.kLeft)
            else:
                self.fDrawManips = False
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, False)

                self.setFogEnabled(True)

                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayLights, False)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayCameras,
                                      False)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayIkHandles,
                                      False)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayDimensions,
                                      False)
                self.setObjectDisplay(OpenMayaUI.M3dView.kDisplaySelectHandles,
                                      False)
        except:
            sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDrawPass\n")
            raise

        # note do not have light test in here

        # self.setLightingMode(OpenMayaUI.kLightDefault)

        if ((self.fCurrentPass % 2) == 0):
            self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsSurfaces,
                                  True)
            self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsCurves, True)

        self.updateViewingParameters()
Пример #8
0
def bSaveVertexSkinValues(inputFile, ignoreSoftSelection):

    timeBefore = time.time()

    print 'saving Vertex skinWeights.. '

    if not ignoreSoftSelection:
        verts, softWeights = getSoftSelection()
    else:
        verts = cmds.ls(selection=True, flatten=True)

    vertIds = vertexToIdList(verts)
    selection = OpenMaya.MSelectionList()
    OpenMaya.MGlobal.getActiveSelectionList(selection)

    iterate = OpenMaya.MItSelectionList(selection)
    dagPath = OpenMaya.MDagPath()
    component = OpenMaya.MObject()
    iterate.getDagPath(dagPath, component)

    skinCluster = bFindSkinCluster(
        OpenMaya.MFnDagNode(dagPath).partialPathName())
    fnSkinCluster = OpenMayaAnim.MFnSkinCluster(skinCluster)

    if not skinCluster.hasFn(OpenMaya.MFn.kSkinClusterFilter):
        print 'no skinCluster found on selected vertices'
        return

    output = open(inputFile, 'w')
    output.write(str(OpenMaya.MItGeometry(bSkinPath).count()) + '\n')

    fnVtxComp = OpenMaya.MFnSingleIndexedComponent()
    vtxComponents = OpenMaya.MObject()
    vtxComponents = fnVtxComp.create(OpenMaya.MFn.kMeshVertComponent)

    WeightArray = OpenMaya.MFloatArray()
    meshIter = OpenMaya.MItMeshVertex(dagPath, component)
    #while not meshIter.isDone():
    for vertId in vertIds:
        fnVtxComp.addElement(vertId)
        #meshIter.next()

    vertexCount = meshIter.count()
    scriptUtil = OpenMaya.MScriptUtil()
    infCountPtr = scriptUtil.asUintPtr()
    fnSkinCluster.getWeights(bSkinPath, vtxComponents, WeightArray,
                             infCountPtr)
    infCount = OpenMaya.MScriptUtil.getUint(infCountPtr)

    weightCheckArray = []
    for i in range(infCount):
        weightCheckArray.append(False)

    for i in range(vertexCount):
        for k in range(infCount):
            if not weightCheckArray[k] and WeightArray[((i * infCount) + k)]:
                weightCheckArray[k] = True

    #joints..
    influentsArray = OpenMaya.MDagPathArray()
    fnSkinCluster.influenceObjects(influentsArray)
    for i in range(infCount):
        if (weightCheckArray[i]):
            output.write(OpenMaya.MFnDagNode(influentsArray[i]).name() + '\n')

    output.write('============\n')

    counter = 0
    weightArrayString = []
    for i in range(len(vertIds)):
        vertId = vertIds[i]
        softWeight = ''
        if not ignoreSoftSelection:
            softWeight = '%f:' % softWeights[i]

        #weightArrayString = '%d:%s' % (vertId, softWeight)
        """
        for k in range(infCount):
            if weightCheckArray[k] == True:
                weightArrayString += str(WeightArray[(counter * infCount) + k]) + ' '
        """
        weightsString = ' '.join([
            '0' if x == 0 else str(x)
            for n, x in enumerate(WeightArray[i * infCount:(i + 1) * infCount])
            if weightCheckArray[n]
        ])
        weightArrayString = "%d:%s%s" % (vertId, softWeight, weightsString)

        output.write(weightArrayString + '\n')
        counter += 1
        meshIter.next()

    output.close()

    print 'done, it took', (time.time() - timeBefore), ' seconds'
Пример #9
0
def bSaveSkinValues(inputFile):

    timeBefore = time.time()

    output = open(inputFile, 'w')

    selection = OpenMaya.MSelectionList()
    OpenMaya.MGlobal.getActiveSelectionList(selection)

    iterate = OpenMaya.MItSelectionList(selection)

    while not iterate.isDone():
        node = OpenMaya.MDagPath()
        component = OpenMaya.MObject()
        iterate.getDagPath(node, component)
        if not node.hasFn(OpenMaya.MFn.kTransform):
            print OpenMaya.MFnDagNode(node).name(
            ) + ' is not a Transform node (need to select transform node of polyMesh)'
        else:
            objectName = OpenMaya.MFnDagNode(node).name()
            newTransform = OpenMaya.MFnTransform(node)
            for childIndex in range(newTransform.childCount()):
                childObject = newTransform.child(childIndex)
                if childObject.hasFn(OpenMaya.MFn.kMesh) or childObject.hasFn(
                        OpenMaya.MFn.kNurbsSurface) or childObject.hasFn(
                            OpenMaya.MFn.kCurve):
                    skinCluster = bFindSkinCluster(
                        OpenMaya.MFnDagNode(childObject).partialPathName())
                    if skinCluster is not False:
                        bSkinPath = OpenMaya.MDagPath()
                        fnSkinCluster = OpenMayaAnim.MFnSkinCluster(
                            skinCluster)
                        fnSkinCluster.getPathAtIndex(0, bSkinPath)
                        influenceArray = OpenMaya.MDagPathArray()
                        fnSkinCluster.influenceObjects(influenceArray)
                        influentsCount = influenceArray.length()
                        output.write(objectName + '\n')

                        for k in range(influentsCount):
                            jointTokens = str(
                                influenceArray[k].fullPathName()).split('|')
                            jointTokens = jointTokens[len(jointTokens) -
                                                      1].split(':')
                            output.write(jointTokens[len(jointTokens) - 1] +
                                         '\n')

                        output.write('============\n')

                        fnVtxComp = OpenMaya.MFnSingleIndexedComponent()
                        vtxComponents = OpenMaya.MObject()
                        vtxComponents = fnVtxComp.create(
                            OpenMaya.MFn.kMeshVertComponent)

                        vertexCount = OpenMaya.MFnMesh(bSkinPath).numVertices()
                        for i in range(vertexCount):
                            fnVtxComp.addElement(i)

                        WeightArray = OpenMaya.MFloatArray()
                        scriptUtil = OpenMaya.MScriptUtil()
                        infCountPtr = scriptUtil.asUintPtr()
                        fnSkinCluster.getWeights(bSkinPath, vtxComponents,
                                                 WeightArray, infCountPtr)
                        infCount = OpenMaya.MScriptUtil.getUint(infCountPtr)

                        for i in range(vertexCount):
                            #saveString = ' '.join(map(str,WeightArray[i*infCount : (i+1)*infCount]))
                            saveString = ' '.join([
                                '0' if x == 0 else str(x) for n, x in
                                enumerate(WeightArray[i * infCount:(i + 1) *
                                                      infCount])
                            ])

                            output.write(saveString + '\n')

                        output.write('\n')

        iterate.next()

    output.close()
    print 'done saving weights, it took ', (time.time() -
                                            timeBefore), ' seconds.'
Пример #10
0
    def loadObjectsSelection(self):
        bLoadSkinValues(True, str(self.objectsFileLine.text()))

    def saveObjects(self):
        bSaveSkinValues(str(self.objectsFileLine.text()))

    def loadVertices(self):
        bLoadVertexSkinValues(str(self.verticesFileLine.text()),
                              self.ignoreJointLocksWhenLoading.isChecked())

    def saveVertices(self):
        bSaveVertexSkinValues(str(self.verticesFileLine.text()),
                              self.ignoreSoftSelectionWhenSaving.isChecked())


bSkinPath = OpenMaya.MDagPath()


def bFindSkinCluster(objectName):
    it = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kSkinClusterFilter)
    while not it.isDone():
        fnSkinCluster = OpenMayaAnim.MFnSkinCluster(it.item())
        fnSkinCluster.getPathAtIndex(0, bSkinPath)

        if OpenMaya.MFnDagNode(bSkinPath.node()).partialPathName(
        ) == objectName or OpenMaya.MFnDagNode(
                OpenMaya.MFnDagNode(bSkinPath.node()).parent(
                    0)).partialPathName() == objectName:
            return it.item()
        it.next()
    return False
Пример #11
0
def bLoadVertexSkinValues(inputFile, ignoreJointLocks):
    timeBefore = time.time()

    line = ''
    fileJoints = []
    weights = []
    splittedStrings = []
    splittedWeights = []
    selectionList = OpenMaya.MSelectionList()
    vertexCount = 0

    OpenMaya.MGlobal.getActiveSelectionList(selectionList)
    node = OpenMaya.MDagPath()
    component = OpenMaya.MObject()
    selectionList.getDagPath(0, node, component)

    if not node.hasFn(OpenMaya.MFn.kTransform):
        print 'select a skinned object'

    NewTransform = OpenMaya.MFnTransform(node)
    if not NewTransform.childCount() or not NewTransform.child(0).hasFn(
            OpenMaya.MFn.kMesh):
        print 'select a skinned object..'

    mesh = NewTransform.child(0)
    objectName = OpenMaya.MFnDagNode(mesh).name()
    skinCluster = bFindSkinCluster(objectName)
    if not skinCluster.hasFn(OpenMaya.MFn.kSkinClusterFilter):
        print 'select a skinned object'

    fnSkinCluster = OpenMayaAnim.MFnSkinCluster(skinCluster)
    input = open(inputFile, 'r')

    fileJoints = []
    weightLines = []
    filePosition = 0

    # getting the weightLines
    #
    fileWeightFloats = []
    fnVtxComp = OpenMaya.MFnSingleIndexedComponent()
    vtxComponents = OpenMaya.MObject()
    vtxComponents = fnVtxComp.create(OpenMaya.MFn.kMeshVertComponent)

    bindVertCount = 0
    didCheckSoftSelection = False
    while True:
        line = input.readline().strip()
        if not line:
            break

        if filePosition == 0:
            vertexCount = int(line)
            if OpenMaya.MItGeometry(node).count() != vertexCount:
                print "vertex counts don't match!"
                return
            filePosition = 1

        elif filePosition == 1:
            if not line.startswith("========"):
                fileJoints.append(line)
            else:
                filePosition = 2

        elif filePosition == 2:
            splittedStrings = line.split(':')

            # do we have softselection?
            if not didCheckSoftSelection:
                if len(splittedStrings) == 3:
                    weightsIndex = 2
                    doSoftSelection = True
                    softWeights = [1.0] * bindVertCount
                else:
                    weightsIndex = 1
                    doSoftSelection = False
                didCheckSoftSelection = True

            # vertId
            vertId = int(splittedStrings[0])
            fnVtxComp.addElement(vertId)

            #softselection
            if doSoftSelection:
                softWeights.append(float(splittedStrings[1]))

            # weights
            splittedWeights = splittedStrings[weightsIndex].split(' ')
            fileWeightFloats.append(map(float, splittedWeights))

            #for k in range(len(fileJoints)):
            #    fileWeightFloats[bindVertCount].append(float(splittedWeights[k]))

            bindVertCount += 1

    #print 'fileWeightFloats: ', fileWeightFloats

    # getting mayaJoints
    #
    influenceArray = OpenMaya.MDagPathArray()
    mayaJoints = []

    infCount = fnSkinCluster.influenceObjects(influenceArray)
    for i in range(infCount):
        mayaJoints.append(
            OpenMaya.MFnDagNode(influenceArray[i]).name().split('|')[-1])

    # getting old weights
    #
    oldWeightDoubles = OpenMaya.MDoubleArray()
    scriptUtil = OpenMaya.MScriptUtil()
    infCountPtr = scriptUtil.asUintPtr()
    fnSkinCluster.getWeights(bSkinPath, vtxComponents, oldWeightDoubles,
                             infCountPtr)

    # making allJoints
    #
    allJoints = list(fileJoints)
    for mayaJoint in mayaJoints:
        if mayaJoint not in fileJoints:
            allJoints.append(mayaJoint)

    # mapping joints and making sure we have all joints in the skinCluster
    #
    allInfluencesInScene = True
    missingInfluencesList = []
    for i in range(len(fileJoints)):
        influenceInScene = False
        for k in range(len(mayaJoints)):
            if mayaJoints[k] == fileJoints[i]:
                influenceInScene = True

        if not influenceInScene:
            allInfluencesInScene = False
            missingInfluencesList.append(fileJoints[i])

    if not allInfluencesInScene:
        print 'There are influences missing:', missingInfluencesList
        return

    # getting allExistInMaya
    #
    allExistInMaya = [-1] * len(allJoints)
    for i in range(len(allJoints)):
        for k in range(len(mayaJoints)):
            if allJoints[i] == mayaJoints[k]:
                allExistInMaya[i] = k
                break

    #print 'allExistInMaya: ', allExistInMaya

    # getting joint locks
    #
    allLocks = [False] * len(allJoints)
    if not ignoreJointLocks:
        for i in range(len(allJoints)):
            allLocks[i] = cmds.getAttr('%s.liw' % allJoints[i])

    weightDoubles = OpenMaya.MDoubleArray(0)

    # copy weights from fileWeightFloats and oldWeightDoubles into weightDoubles (include joint locks) and softWeights lists
    #
    print 'bindVertCount: ', bindVertCount
    for i in range(bindVertCount):
        for k in range(len(allJoints)):

            # fileJoints:
            #
            if k < len(fileJoints):
                if not allLocks[k]:
                    weightDoubles.append(
                        fileWeightFloats[i][k]
                    )  #weightDoubles[k + len(allJoints) * i] = fileWeightFloats[i][k]
                else:
                    if allExistInMaya[k]:
                        weightDoubles.append(
                            oldWeightDoubles[allExistInMaya[k] +
                                             len(mayaJoints) * i])
                    else:
                        weightDoubles.append(0)

            # mayaJoints
            #
            else:
                if not allLocks[k]:
                    weightDoubles.append(0)
                else:
                    if allExistInMaya[k]:
                        weightDoubles.append(
                            oldWeightDoubles[allExistInMaya[k] +
                                             len(mayaJoints) * i])
                    else:
                        weightDoubles.append(0)

    # normalize
    #
    for i in range(bindVertCount):
        sumA = 0
        sumB = 0
        for inf in range(len(allJoints)):
            if not allLocks[inf]:
                sumA += weightDoubles[inf + i * len(allJoints)]
            else:
                sumB += weightDoubles[inf + i * len(allJoints)]

        if sumA > 0.0001:
            sumADenom = 1 / sumA
            for inf in range(len(allJoints)):
                if not allLocks[inf]:
                    weightDoubles[inf +
                                  i * len(allJoints)] *= sumADenom * (1 - sumB)

    # soft selection
    #
    if doSoftSelection:
        for i in range(bindVertCount):
            for inf in range(len(allExistInMaya)):
                index = inf + i * len(allExistInMaya)
                oldWeights = oldWeightDoubles[allExistInMaya[inf] +
                                              len(mayaJoints) * i]

                weightDoubles[index] = weightDoubles[index] * softWeights[
                    i] + oldWeights * (1.0 - softWeights[i])

    #SET WEIGHTS
    #
    allJointsIndices = OpenMaya.MIntArray(len(allExistInMaya))
    for i in range(len(allExistInMaya)):
        allJointsIndices[i] = allExistInMaya[i]

    #print 'mayaJoints: ', mayaJoints
    #print 'allJointsIndices: ', allJointsIndices
    #print 'allJoints: ', allJoints
    #print 'weightDoubles before: ', weightDoubles

    print 'setting weights...'
    fnSkinCluster.setWeights(bSkinPath, vtxComponents, allJointsIndices,
                             weightDoubles, 0)

    # select the vertices
    #
    pointSelectionList = OpenMaya.MSelectionList()
    pointSelectionList.add(OpenMaya.MDagPath(node), vtxComponents)
    OpenMaya.MGlobal.setActiveSelectionList(pointSelectionList)

    print 'done, it took', (time.time() - timeBefore), ' seconds'
Пример #12
0
 def getDagPath(node=None):
     sel = om.MSelectionList()
     sel.add(str(node))
     d = om.MDagPath()
     sel.getDagPath(0, d)
     return d
Пример #13
0
    def callbackFunc(self, *args):
        print "Called"
        # 1. Find active selection in the scene
        mSel = OpenMaya.MSelectionList()
        OpenMaya.MGlobal.getActiveSelectionList(mSel)
        mItSelectionList = OpenMaya.MItSelectionList(mSel,
                                                     OpenMaya.MFn.kDagNode)
        mode = "fk"

        mFnDependencyNode = OpenMaya.MFnDependencyNode()

        # 2. Find IK-Effector
        while (not mItSelectionList.isDone()):
            mObj = OpenMaya.MObject()
            mItSelectionList.getDependNode(mObj)
            # If effector itself is selected
            if mObj.apiTypeStr() == "kIkEffector":
                self.activeEffector = mObj
                mode = "ik"
                break
            # If control curve is selected
            if self.activePoleVectorControl.apiTypeStr() != "kInvalid":
                if OpenMaya.MFnDependencyNode(
                        mObj).name() == OpenMaya.MFnDependencyNode(
                            self.activePoleVectorControl).name():
                    mode = "ik"
                    break
            mFnDependencyNode.setObject(mObj)
            mPlugArray_joint = OpenMaya.MPlugArray()
            mFnDependencyNode.getConnections(mPlugArray_joint)
            # Check If effector is connected to selected object
            for i in xrange(mPlugArray_joint.length()):
                mPlug_joint = mPlugArray_joint[i]
                mPlugArray2 = OpenMaya.MPlugArray()
                mPlug_joint.connectedTo(mPlugArray2, True, True)
                mPlug2 = mPlugArray2[0]
                if mPlug2.node().apiTypeStr() == "kIkEffector":
                    self.activeEffector = mPlug2.node()
                    mode = "ik"
                    break

                mItSelectionList.next()

            # 3. Find IK-Handle
            #print self.activeEffector.apiTypeStr()
            ''' If IK-Effector is found then :
	            - find IK-Handle
	        '''
            if self.activeEffector.apiTypeStr() == "kIkEffector":
                mFnDependencyNode.setObject(self.activeEffector)
                mPlugArray_effector = OpenMaya.MPlugArray()
                mFnDependencyNode.getConnections(mPlugArray_effector)
                for i in xrange(mPlugArray_effector.length()):
                    mPlug_effector = mPlugArray_effector[i]
                    mPlugArray2 = OpenMaya.MPlugArray()
                    mPlug_effector.connectedTo(mPlugArray2, True, True)
                    mPlug2 = mPlugArray2[0]
                    if mPlug2.node().apiTypeStr() == "kIkHandle":
                        self.activeHandle = mPlug2.node()
                        break
                ''' If IK-Handle is found then :
	                - find IK-Blend Plug
	                - find IK-PoleVector 
	            '''

                if self.activeHandle.apiTypeStr() == "kIkHandle":
                    # 4. Find IK-Blend Plug
                    mFnDependNodeHandle = OpenMaya.MFnDependencyNode(
                        self.activeHandle)
                    mPlug_blendAttr = mFnDependNodeHandle.findPlug("ikBlend")
                    mAttr_blendAttr = mPlug_blendAttr.attribute()
                    # make IK-blend attribute "unKeyable" and hidden from Channel box
                    mMFnAttribute = OpenMaya.MFnAttribute(mAttr_blendAttr)
                    mMFnAttribute.setKeyable(0)
                    mMFnAttribute.setChannelBox(0)

                    # 5. Find Pole Vector Constraint
                    mFnDependencyNode.setObject(self.activeHandle)
                    mPlugArray_handle = OpenMaya.MPlugArray()
                    mFnDependencyNode.getConnections(mPlugArray_handle)
                    for i in xrange(mPlugArray_handle.length()):
                        mPlug_handle = mPlugArray_handle[i]
                        mPlugArray2 = OpenMaya.MPlugArray()
                        mPlug_handle.connectedTo(mPlugArray2, True, True)
                        mPlug2 = mPlugArray2[0]
                        if mPlug2.node().apiTypeStr(
                        ) == "kPoleVectorConstraint":
                            self.activePoleVector = mPlug2.node()
                            break
                    ''' If IK-PoleVector is found then :
	                    - find IK-PoleVector Control Curve
	                '''

                    if self.activePoleVector.apiTypeStr(
                    ) == "kPoleVectorConstraint":
                        # 6. Find Curve controlling Pole Vector
                        mFnDependencyNode.setObject(self.activePoleVector)
                        mPlugArray_handle = OpenMaya.MPlugArray()
                        mFnDependencyNode.getConnections(mPlugArray_handle)
                        for i in xrange(mPlugArray_handle.length()):
                            mPlug_handle = mPlugArray_handle[i]
                            mPlugArray2 = OpenMaya.MPlugArray()
                            mPlug_handle.connectedTo(mPlugArray2, True, True)
                            mPlug2 = mPlugArray2[0]
                            if mPlug2.node().apiTypeStr() == "kTransform":
                                self.activePoleVectorControl = mPlug2.node()
                                break
                        ''' If IK-PoleVector Control Curve is found then :
	                        - find middle joint of joint change, to which this control should be attached.
	                    '''
                        if self.activePoleVectorControl.apiTypeStr(
                        ) == "kTransform":
                            # 7. Find Joint2 of the chain.
                            # 7. a : find joint connected to IK-Effector - call it : Joint3
                            # 7. b : find joint connected to IK-Handle   - call it : Joint1
                            # 7. c : find joint connected to Joint1 and Joint3 - call it Joint2

                            # 7. a : find joint connected to IK-Effector - call it : Joint3
                            mFnDependencyNode.setObject(self.activeEffector)
                            mPlugArray_effector = OpenMaya.MPlugArray()
                            mFnDependencyNode.getConnections(
                                mPlugArray_effector)
                            for i in xrange(mPlugArray_effector.length()):
                                mPlug_effector = mPlugArray_effector[i]
                                mPlugArray2 = OpenMaya.MPlugArray()
                                mPlug_effector.connectedTo(
                                    mPlugArray2, True, True)
                                mPlug2 = mPlugArray2[0]
                                if mPlug2.node().apiTypeStr() == "kJoint":
                                    self.joint3 = mPlug2.node()
                                    break
                            # 7. b : find joint connected to IK-Handle   - call it : Joint1
                            mFnDependencyNode.setObject(self.activeHandle)
                            mPlugArray_handle = OpenMaya.MPlugArray()
                            mFnDependencyNode.getConnections(mPlugArray_handle)
                            for i in xrange(mPlugArray_handle.length()):
                                mPlug_handle = mPlugArray_handle[i]
                                mPlugArray2 = OpenMaya.MPlugArray()
                                mPlug_handle.connectedTo(
                                    mPlugArray2, True, True)
                                mPlug2 = mPlugArray2[0]
                                if mPlug2.node().apiTypeStr() == "kJoint":
                                    self.joint1 = mPlug2.node()
                                    break

                            # 7. c : find joint connected to Joint1 and Joint3 - call it Joint2
                            '''
	                        Find joints connected to Joint1 , and if any joint which is connected to Joint1 is also connected to Joint3
	                        then it is Joint2                       
	                        '''
                            mObj_joint1Connections = OpenMaya.MObjectArray()
                            mObj_joint3Connections = OpenMaya.MObjectArray()

                            # Collect child Joints connected to Joint1
                            mFnDependencyNode.setObject(self.joint1)
                            mPlugArray_joint1 = OpenMaya.MPlugArray()
                            mPlug_joint1Scale = mFnDependencyNode.findPlug(
                                "scale")
                            mPlugArray_joint1 = OpenMaya.MPlugArray()
                            mPlug_joint1Scale.connectedTo(
                                mPlugArray_joint1, True, True)
                            for i in xrange(mPlugArray_joint1.length()):
                                if mPlugArray_joint1[i].node().apiTypeStr(
                                ) == "kJoint":
                                    mObj_joint1Connections.append(
                                        mPlugArray_joint1[i].node())

                            # Collect parent Joints connected to Joint3
                            mFnDependencyNode.setObject(self.joint3)
                            mPlugArray_joint3 = OpenMaya.MPlugArray()
                            mPlug_joint3Scale = mFnDependencyNode.findPlug(
                                "inverseScale")
                            mPlugArray_joint3 = OpenMaya.MPlugArray()
                            mPlug_joint3Scale.connectedTo(
                                mPlugArray_joint3, True, True)
                            for i in xrange(mPlugArray_joint3.length()):
                                if mPlugArray_joint3[i].node().apiTypeStr(
                                ) == "kJoint":
                                    mObj_joint3Connections.append(
                                        mPlugArray_joint3[i].node())

                            mFnDependencyNode_temp1 = OpenMaya.MFnDependencyNode(
                            )
                            mFnDependencyNode_temp3 = OpenMaya.MFnDependencyNode(
                            )

                            for i in xrange(mObj_joint1Connections.length()):
                                for j in xrange(
                                        mObj_joint3Connections.length()):
                                    mFnDependencyNode_temp1.setObject(
                                        mObj_joint1Connections[i])
                                    mFnDependencyNode_temp3.setObject(
                                        mObj_joint3Connections[j])
                                    if mFnDependencyNode_temp1.name(
                                    ) == mFnDependencyNode_temp3.name():
                                        self.joint2 = mObj_joint3Connections[j]
                                        break

            if self.activeEffector.apiTypeStr() == "kIkEffector":
                # Control curve 'visibility' plug
                if self.activePoleVectorControl.apiTypeStr() != "kInvalid":
                    mPlug_controlCurveVisibility = OpenMaya.MFnTransform(
                        self.activePoleVectorControl).findPlug("visibility")

                if mode == 'fk':
                    # Because fk is the default mode, even if IK-handle does not exist it will try to set the plug
                    try:
                        mPlug_blendAttr.setInt(0)
                        mPlug_controlCurveVisibility.setBool(False)
                    except:
                        pass
                else:
                    if self.joint2.apiTypeStr() == "kJoint":
                        mFnTransform_poleControl = OpenMaya.MFnTransform(
                            self.activePoleVectorControl)
                        mFnTransform_joint2 = OpenMaya.MFnTransform(
                            self.joint2)

                        # Reading MDagPath from MObject.
                        mDagPath_joint2 = OpenMaya.MDagPath()
                        mFnTransform_joint2.getPath(mDagPath_joint2)
                        mFnTransform_joint2.setObject(mDagPath_joint2)

                        mDagPath_poleControl = OpenMaya.MDagPath()
                        mFnTransform_poleControl.getPath(mDagPath_poleControl)
                        mFnTransform_poleControl.setObject(
                            mDagPath_poleControl)

                        mFnTransform_poleControl.setTranslation(
                            mFnTransform_joint2.getTranslation(
                                OpenMaya.MSpace.kWorld),
                            OpenMaya.MSpace.kWorld)
                        try:
                            mPlug_controlCurveVisibility.setBool(True)
                        except:
                            pass
                    mPlug_blendAttr.setInt(1)
Пример #14
0
	def onPress(self):
		"""
		execute on press
		"""
		# modifier
		self.mod = cmds.getModifiers()
		
		# button
		self.btn = cmds.draggerContext(self.dragCtx, query=True, button=True)
		
		# timer
		self.timer = cmds.timerX()
		initPos = cmds.draggerContext(self.dragCtx, query=True, anchorPoint=True)
		
		# camera far clip
		currentView = omui.M3dView().active3dView()
		camDP = om.MDagPath()
		
		currentView.getCamera(camDP)
		camFn = om.MFnCamera(camDP)
		farclip = camFn.farClippingPlane()
		
		# screen to world conversion
		worldPos, worldDir = utils().viewToWorld(initPos[0],initPos[1])
		
		if self.btn is not 2:
			closestHit = None
			closestObj = None
			for obj in self.targetObj:
				if cmds.objExists(obj):
					state, hit, fnMesh, facePtr, triPtr = utils().intersect(obj, worldPos, worldDir, farclip)
					
					if state is True:
						dif = [hit.x - worldPos[0],hit.y - worldPos[1],hit.z - worldPos[2]]
						distToCam = math.sqrt(math.pow(float(dif[0]),2) + math.pow(float(dif[1]),2) + math.pow(float(dif[2]),2))
						if closestHit == None:
							closestHit = distToCam
							closestObj = [state, hit, fnMesh, facePtr, triPtr]
						elif distToCam < closestHit:
							closestHit = distToCam
							closestObj = [state, hit, fnMesh, facePtr, triPtr]
				else:
					self.targetObj.remove(obj)
			if closestObj is not None:
				state, hit, fnMesh, facePtr, triPtr = closestObj
				
				mHit = om.MPoint(hit)
				# get smooth normal
				normal = om.MVector()
				fnMesh.getClosestNormal(mHit, normal, om.MSpace.kWorld, None)
				
				# get smooth normal
				normal = om.MVector()
				fnMesh.getClosestNormal(mHit, normal, om.MSpace.kWorld, None)
				
				tangent = utils().crossProduct(normal,self.worldUp)
				
				upAxis = utils().crossProduct(normal,tangent)
				
				# define transformation matrix
				matrix = [tangent.x,tangent.y,tangent.z,0,upAxis.x,upAxis.y,upAxis.z,0,normal.x,normal.y,normal.z,0,hit.x,hit.y,hit.z,0]
				
				# create object
				if self.mod == 0:
					self.loc = cmds.curve(p = (hit.x,hit.y,hit.z))
				# cmds.toggle(self.loc, localAxis=True)
				
				# store values
				self.prevHit = hit
				print self.prevHit
				
				self.screenPoint = initPos
				
				self.angle = 0
				
				# draw Mesh
				if self.mesh is True and self.mod == 0:
					self.circle = cmds.circle(center = (hit.x,hit.y,hit.z),radius = self.bRad,d=3)
					self.extrude = cmds.extrude(self.circle[0],self.loc,po=1, ch=True,rn=False,et=2,ucp=0,fpt=0,upn=0,rotation=0,scale=1,rsp=1)
					self.nbTes = cmds.listConnections(self.extrude[1] + '.outputSurface')[0]
					
					cmds.setAttr(self.nbTes + '.polygonType',1)
					cmds.setAttr(self.nbTes + '.format',2)
					cmds.setAttr(self.nbTes + '.polygonCount',200)
					cmds.setAttr(self.nbTes + '.uType',3)
					cmds.setAttr(self.nbTes + '.uNumber',1)
					cmds.setAttr(self.nbTes + '.vType',3)
					cmds.setAttr(self.nbTes + '.vNumber',1)
					cmds.setAttr(self.extrude[1] + '.scale',self.taper)
					
					if self.autoAdd is True and self.extrude[0] not in self.targetObj:
							self.targetObj.append(self.extrude[0])
						
		# refresh viewport
		cmds.refresh(cv=True)
Пример #15
0
'''
Created on Dec 4, 2016

@author: Admin
'''
import maya.cmds as cmds
import maya.OpenMaya as om

sel = cmds.ls(sl=1)

mSel = om.MSelectionList()
for i in range(0, len(sel)):
    mSel.add(sel[i])

mObj = om.MObject()
mDagPath = om.MDagPath()

mSel.getDependNode(0, mObj)
mSel.getDagPath(0, mDagPath)

print mDagPath.fullPathName()

mFnMesh = om.MFnMesh(mDagPath)
print mFnMesh.fullPathName()

mFnDependNode = om.MFnDependencyNode(mObj)
print mFnDependNode.name()

mPlugArray = om.MPlugArray()
mFnMesh.getConnections(mPlugArray)
print mPlugArray[1].name()
Пример #16
0
def bSkinObject(objectName, fileJoints, weights):

    if not cmds.objExists(objectName):
        print objectName, " doesn't exist - skipping. "
        return

    it = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kJoint)

    # quick check if all the joints are in scene
    #
    allInfluencesInScene = True
    sceneJointTokens = []

    for jointIndex in range(len(fileJoints)):
        jointHere = False
        it = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kJoint)
        while not it.isDone():
            sceneJointTokens = str(
                OpenMaya.MFnDagNode(it.item()).fullPathName()).split('|')
            if str(fileJoints[jointIndex]) == str(
                    sceneJointTokens[len(sceneJointTokens) - 1]):
                jointHere = True

            it.next()

        if not jointHere:
            allInfluencesInScene = False
            print 'missing influence: ', fileJoints[jointIndex]

    if not allInfluencesInScene:
        print objectName, " can't be skinned because of missing influences."
        return

    # create some arrays
    #
    allJointsHere = False
    totalJointsCount = len(fileJoints)
    fileJointsMapArray = range(len(fileJoints))
    objectEmptyJoints = []

    # let's check if there's already a skinCluster, let's try to use that - if it contains all the needed joints
    #
    skinCluster = bFindSkinCluster(objectName)
    if type(skinCluster) != type(True):
        fnSkinCluster = OpenMayaAnim.MFnSkinCluster(skinCluster)
        influentsArray = OpenMaya.MDagPathArray()
        infCount = fnSkinCluster.influenceObjects(influentsArray)

        influenceStringArray = []
        for i in range(infCount):
            influenceStringArray.append(
                OpenMaya.MFnDagNode(influentsArray[i]).name())

        allJointsHere = True
        for joint in fileJoints:
            if joint not in influenceStringArray:
                print 'missing a joint (', joint, ', ..)'
                allJointsHere = False
                break

        if not allJointsHere:
            maya.mel.eval("DetachSkin " + objectName)
        else:
            objectFoundJointsInFile = [False] * len(influenceStringArray)

            for i in range(len(fileJoints)):
                for k in range(len(influenceStringArray)):
                    if fileJoints[i] == influenceStringArray[k]:
                        fileJointsMapArray[i] = k
                        objectFoundJointsInFile[k] = True

            for i in range(len(influenceStringArray)):
                if not objectFoundJointsInFile[i]:
                    objectEmptyJoints.append(i)
            totalJointsCount = len(fileJointsMapArray) + len(objectEmptyJoints)

            #print 'jointMapArray: ', fileJointsMapArray

    if not allJointsHere:
        cmd = "select "
        for i in range(len(fileJoints)):
            cmd += " " + fileJoints[i]

        cmd += " " + objectName
        maya.mel.eval(cmd)

        maya.mel.eval("skinCluster -tsb -mi 10")
        maya.mel.eval("select `listRelatives -p " + objectName + "`")
        maya.mel.eval("refresh")
        #maya.mel.eval("undoInfo -st 1")

        skinCluster = bFindSkinCluster(objectName)

    fnSkinCluster = OpenMayaAnim.MFnSkinCluster(skinCluster)
    influentsArray = OpenMaya.MDagPathArray()
    fnSkinCluster.influenceObjects(influentsArray)

    bSkinPath = OpenMaya.MDagPath()
    fnSkinCluster.getPathAtIndex(fnSkinCluster.indexForOutputConnection(0),
                                 bSkinPath)

    weightStrings = []
    vertexIter = OpenMaya.MItGeometry(bSkinPath)

    weightDoubles = OpenMaya.MDoubleArray()

    singleIndexed = True
    vtxComponents = OpenMaya.MObject()
    fnVtxComp = OpenMaya.MFnSingleIndexedComponent()
    fnVtxCompDouble = OpenMaya.MFnDoubleIndexedComponent()

    if bSkinPath.node().apiType() == OpenMaya.MFn.kMesh:
        vtxComponents = fnVtxComp.create(OpenMaya.MFn.kMeshVertComponent)
    elif bSkinPath.node().apiType() == OpenMaya.MFn.kNurbsSurface:
        singleIndexed = False
        vtxComponents = fnVtxCompDouble.create(
            OpenMaya.MFn.kSurfaceCVComponent)
    elif bSkinPath.node().apiType() == OpenMaya.MFn.kNurbsCurve:
        vtxComponents = fnVtxComp.create(OpenMaya.MFn.kCurveCVComponent)

    # nurbs curves..
    #
    counterValue = 0
    if not singleIndexed:
        currentU = 0
        currentV = 0

        cvsU = OpenMaya.MFnNurbsSurface(bSkinPath.node()).numCVsInU()
        cvsV = OpenMaya.MFnNurbsSurface(bSkinPath.node()).numCVsInV()
        formU = OpenMaya.MFnNurbsSurface(bSkinPath.node()).formInU()
        formV = OpenMaya.MFnNurbsSurface(bSkinPath.node()).formInV()

        if formU == 3:
            cvsU -= 3
        if formV == 3:
            cvsV -= 3

    # go through all vertices and append to the weightDoubles array
    #
    vertexIter = OpenMaya.MItGeometry(bSkinPath)
    while not vertexIter.isDone():
        weightStrings = []
        if singleIndexed:
            fnVtxComp.addElement(counterValue)
        else:
            fnVtxCompDouble.addElement(currentU, currentV)
            currentV += 1
            if currentV >= cvsV:
                currentV = 0
                currentU += 1

        weightStrings = weights[counterValue].split(' ')
        for i in range(len(weightStrings)):
            weightDoubles.append(float(weightStrings[i]))
        for i in range(len(objectEmptyJoints)):
            weightDoubles.append(0)

        counterValue += 1
        vertexIter.next()

    # createing the influence Array
    #
    mayafileJointsMapArray = OpenMaya.MIntArray()
    for i in range(len(fileJointsMapArray)):
        mayafileJointsMapArray.append(fileJointsMapArray[i])
    for i in range(len(objectEmptyJoints)):
        mayafileJointsMapArray.append(objectEmptyJoints[i])

    # set the weights
    #
    fnSkinCluster.setWeights(bSkinPath, vtxComponents, mayafileJointsMapArray,
                             weightDoubles, 0)
Пример #17
0
	def connectToDependNode(self, node):
		# Get the DAG path
		dagNodeFn = OpenMaya.MFnDagNode(node)
		dagNodeFn.getPath(self.fNodePath)
		parentNode = dagNodeFn.parent(0)
		parentNodeFn = OpenMaya.MFnDagNode(parentNode)

		# Connect the plugs
		nodeFn = OpenMaya.MFnDependencyNode()
		nodeFn.setObject(node)   

		# FreePointTriadManip
		freePointTriadManipFn = OpenMayaUI.MFnFreePointTriadManip(self.fFreePointTriadManip)
		try:
			translationPlug = parentNodeFn.findPlug("t")
			freePointTriadManipFn.connectToPointPlug(translationPlug)
		except:
			pass

		# DirectionManip
		directionManipFn = OpenMayaUI.MFnDirectionManip()
		directionManipFn.setObject(self.fDirectionManip)
		try:
			directionPlug = nodeFn.findPlug("arrow2Direction")
			directionManipFn.connectToDirectionPlug(directionPlug)
			startPointIndex = directionManipFn.startPointIndex()
			self.addPlugToManipConversion(startPointIndex)
		except:
			pass

		# DistanceManip
		distanceManipFn = OpenMayaUI.MFnDistanceManip()
		distanceManipFn.setObject(self.fDistanceManip)
		try:
			sizePlug = nodeFn.findPlug("size")
			distanceManipFn.connectToDistancePlug(sizePlug)
			startPointIndex = distanceManipFn.startPointIndex()
			self.addPlugToManipConversion(startPointIndex)
		except:
			pass

		# CircleSweepManip
		circleSweepManipFn = OpenMayaUI.MFnCircleSweepManip(self.fCircleSweepManip)
		try:
			arrow1AnglePlug = nodeFn.findPlug("arrow1Angle")
			circleSweepManipFn.connectToAnglePlug(arrow1AnglePlug)
			centerIndex = circleSweepManipFn.centerIndex()
			self.addPlugToManipConversion(centerIndex)
		except:
			pass

		# DiscManip
		discManipFn = OpenMayaUI.MFnDiscManip(self.fDiscManip)
		try:
			arrow3AnglePlug = nodeFn.findPlug("arrow3Angle")
			discManipFn.connectToAnglePlug(arrow3AnglePlug)
			centerIndex = discManipFn.centerIndex()
			self.addPlugToManipConversion(centerIndex)
		except:
			pass

		# StateManip
		stateManipFn = OpenMayaUI.MFnStateManip(self.fStateManip)
		try:
			statePlug = nodeFn.findPlug("state")
			stateManipFn.connectToStatePlug(statePlug)
			positionIndex = stateManipFn.positionIndex()
			self.addPlugToManipConversion(positionIndex)
		except:
			pass

		# ToggleManip
		toggleManipFn = OpenMayaUI.MFnToggleManip(self.fToggleManip)
		try:
			togglePlug = nodeFn.findPlug("toggle")
			toggleManipFn.connectToTogglePlug(togglePlug)
			startPointIndex = toggleManipFn.startPointIndex()
			self.addPlugToManipConversion(startPointIndex)
		except:
			pass

		# Determine the transform node for the locator
		transformPath = OpenMaya.MDagPath(self.fNodePath)
		transformPath.pop()

		transformNode = OpenMaya.MFnTransform(transformPath)

		# RotateManip
		rotateManipFn = OpenMayaUI.MFnRotateManip(self.fRotateManip)
		try:
			rotatePlug = transformNode.findPlug("rotate")
			rotateManipFn.connectToRotationPlug(rotatePlug)
			rotateManipFn.displayWithNode(node)
		except:
			pass

		# ScaleManip
		scaleManipFn = OpenMayaUI.MFnScaleManip(self.fScaleManip)
		try:
			scalePlug = transformNode.findPlug("scale")
			scaleManipFn.connectToScalePlug(scalePlug)
			scaleManipFn.displayWithNode(node)
		except:
			pass

		self.finishAddingManips()
		OpenMayaMPx.MPxManipContainer.connectToDependNode(self, node)
Пример #18
0
def bLoadSkinValues(loadOnSelection, inputFile):

    timeBefore = time.time()

    joints = []
    weights = []
    PolygonObject = ""

    if loadOnSelection == True:
        selectionList = OpenMaya.MSelectionList()
        OpenMaya.MGlobal.getActiveSelectionList(selectionList)
        node = OpenMaya.MDagPath()
        component = OpenMaya.MObject()
        if selectionList.length():
            selectionList.getDagPath(0, node, component)
            if node.hasFn(OpenMaya.MFn.kTransform):
                NewTransform = OpenMaya.MFnTransform(node)
                if NewTransform.childCount():
                    if NewTransform.child(0).hasFn(OpenMaya.MFn.kMesh):
                        PolygonObject = str(
                            OpenMaya.MFnDagNode(
                                NewTransform.child(0)).partialPathName())

    if loadOnSelection and len(PolygonObject) == 0:
        print "You need to select a polygon object"
        return

    input = open(inputFile, 'r')

    FilePosition = 0
    while True:
        line = input.readline()
        if not line:
            break

        line = line.strip()

        if FilePosition is not 0:
            if not line.startswith("============"):
                if FilePosition is 1:
                    joints.append(line)
                elif FilePosition is 2:
                    if len(line) > 0:
                        weights.append(line)
                    else:
                        bSkinObject(PolygonObject, joints, weights)
                        PolygonObject = ""
                        joints = []
                        weights = []
                        FilePosition = 0
                        if loadOnSelection == True:
                            break

            else:  # it's ========
                FilePosition = 2

        else:  #FilePosition is 0
            if not loadOnSelection:
                PolygonObject = line
            FilePosition = 1

            if cmds.objExists(PolygonObject):
                maya.mel.eval("select " + PolygonObject)
                maya.mel.eval("refresh")

    print 'done loading weights, it took ', (time.time() -
                                             timeBefore), ' seconds.'
Пример #19
0
    def preMultipleDraw(self):
        self.fCurrentPass = 0
        self.fDrawManips = False

        dagPath = OpenMaya.MDagPath()

        try:
            oldCamera = OpenMaya.MDagPath()
            self.getCamera(oldCamera)

            self.fOldCamera = oldCamera

            displayHUD(False)

            sList = OpenMaya.MSelectionList()
            OpenMaya.MGlobal.getActiveSelectionList(sList)

            sList.getDagPath(0, dagPath)
        except:
            # sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDraw b\n")
            pass

        try:
            itMeshPolygon = OpenMaya.MItMeshPolygon(
                dagPath, OpenMaya.cvar.MObject_kNullObj)

            if None == itMeshPolygon:
                return

            self.beginGL()

            while not itMeshPolygon.isDone():
                points = OpenMaya.MPointArray()
                itMeshPolygon.getPoints(points, OpenMaya.MSpace.kWorld)
                length = points.length()

                if length == 3:
                    for i in range(length):
                        p = points[i]
                        p1 = points[(i + 1) % length]
                        p2 = points[(i + 2) % length]

                        v1 = OpenMaya.MVector(p1 - p)
                        v2 = OpenMaya.MVector(p2 - p)

                        angle = v1.angle(v2) * 180.0 / math.pi

                        if math.fabs(angle -
                                     self.tol) < 0.0001 or angle < self.tol:
                            glFT.glBegin(OpenMayaRender.MGL_POLYGON)
                            glFT.glVertex3f(points[0].x, points[0].y,
                                            points[0].z)
                            glFT.glVertex3f(points[1].x, points[1].y,
                                            points[1].z)
                            glFT.glVertex3f(points[2].x, points[2].y,
                                            points[2].z)

                            glFT.glNormal3f(points[0].x, points[0].y,
                                            points[0].z)
                            glFT.glNormal3f(points[1].x, points[1].y,
                                            points[1].z)
                            glFT.glNormal3f(points[2].x, points[2].y,
                                            points[2].z)

                            glFT.glTexCoord3f(points[0].x, points[0].y,
                                              points[0].z)
                            glFT.glTexCoord3f(points[1].x, points[1].y,
                                              points[1].z)
                            glFT.glTexCoord3f(points[2].x, points[2].y,
                                              points[2].z)
                            glFT.glEnd()

                itMeshPolygon.next()

            self.endGL()
        except:
            # sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDraw c\n")
            pass
Пример #20
0
def hierarchy():

    assDagDict = {}
    liste = []
    di = om.MItDag(om.MItDag.kDepthFirst, om.MFn.kInvalid)
    while not di.isDone():
        dp = om.MDagPath()
        di.getPath(dp)
        obj = dp.node()
        print "Object", dp.fullPathName()
        if obj.apiType() == om.MFn.kWorld:
            "Object", dp.fullPathName(), "==kWorld"
        if dp.instanceNumber() > 0:
            di.next()
            continue
        dn = om.MFnDagNode(dp.node())

        if dp.node().hasFn(om.MFn.kMesh) or dp.node().hasFn(om.MFn.kTransform):
            node = None
            try:
                node = pm.PyNode(dp.fullPathName())
            except:
                pass
            if node:
                #print dp.fullPathName()
                liste.append(mobject(dp))

        di.next()

    for mo in liste:
        if mo.node.type() == "transform":
            print "Check T", mo.node
            if mo.node.inputs():
                print "Has input"
                mo.assembly = assembly()
                assDagDict[mo.dagNode.fullPathName()] = mo
        if mo.node.type() == "mesh":
            print "Check M", mo.node
        if mo.dagNode.parentCount() > 1:
            print "Has multi parents"
            mo.assembly = assembly()
            assDagDict[mo.dagNode.fullPathName()] = mo

    print assDagDict

    for mo in liste:
        if mo.node.type() == "mesh":
            print "Check Mesh Path", mo.node
            parentNode = mo.dagNode
            while parentNode:
                print "ParentPath", parentNode.fullPathName()
                if assDagDict.has_key(parentNode.fullPathName()):
                    mobj = assDagDict[parentNode.fullPathName()]
                    print "Put", mo.node, "into assembly", mobj.dagNode.fullPathName(
                    )
                    break
                pobj = parentNode.parent(0)
                #print pobj, pobj.apiTypeStr()
                if pobj.apiType() == om.MFn.kWorld:
                    print "Found world", "put node", mo.node, "into scene"
                    break
                parentNode = om.MFnDagNode(pobj)
Пример #21
0
def nameToDag(name):
    selectionList = om.MSelectionList()
    selectionList.add(name)
    path = om.MDagPath()
    selectionList.getDagPath(0, path)
    return path
Пример #22
0
 def getDagPathForNode(nodeName):
     sel = om.MSelectionList();
     sel.add(nodeName)
     obj = om.MDagPath()
     sel.getDagPath(0,obj)
     return obj            
    def export_skeletons(self):
        dag_it = om.MItDependencyNodes(om.MFn.kSkinClusterFilter)
        while not dag_it.isDone():
            obj = dag_it.thisNode()
            joints = om.MDagPathArray()
 
            skin_fn = omanim.MFnSkinCluster(obj)
            num_joints = skin_fn.influenceObjects(joints)
 
 
            # Loop through joints and look in block cache whether
            # a skeleton for this joint has been exported. If not,
            # we will ignore this binding altogether.
            skel = None
            #print('found skin cluster for %s!' % skel)
            for i in range(num_joints):
                #print('affected joint: %s' % joints[i].fullPathName())
                skel = self.block_cache.get(self.get_skeleton_root(joints[i].fullPathName()))
                if skel is not None:
                    break
 
            # Skeleton was found
            if skel is not None:
                #print('found skeleton in cache!')
                #print('num joints: %d' % num_joints)
 
                # Loop through meshes that are influenced by this
                # skeleton, and add weight stream to their mesh data
                num_geoms = skin_fn.numOutputConnections()
                #print('num geoms: %d' % num_geoms)
                for i in range(num_geoms):
                    skin_path = om.MDagPath()
                    skin_fn.getPathAtIndex(i, skin_path)
                    vert_it = om.MItMeshVertex(skin_path)
 
                    #print('skin obj: %s' % skin_path.fullPathName())
 
                    # Check whether a mesh data for this geometry has
                    # been added to the block cache. If not, bindings
                    # for this mesh can be ignored.
                    md = self.block_cache.get(self.get_name(skin_path.fullPathName()))
                    if md is not None:
                        #print('found mesh in cache!')
                        weight_data = []
                        index_data = []

                        self.has_skelanim = True
 
                        while not vert_it.isDone():
                            comp = vert_it.currentItem()
                            weights = om.MDoubleArray()
                            weight_objs = []
 
                            #script_util = om.MScriptUtil()
                            for ii in range(num_joints):
                                skin_fn.getWeights(skin_path, comp, ii, weights)
                                joint_name = joints[ii].fullPathName()
                                joint_idx = self.joint_indices[joint_name.split('|')[-1]]
                                weight_objs.append( (joint_idx, weights[0]) )
 
                            def comp_weight_objs(wo0, wo1):
                                if wo0[1] > wo1[1]: return -1
                                else: return 1
 
                            weight_objs.sort(comp_weight_objs)
 
                            # Normalize top weights
                            weight_objs = weight_objs[0:self.joints_per_vert]
                            sum_obj = reduce(lambda w0,w1: (0, w0[1]+w1[1]), weight_objs)
                            if sum_obj[1] > 0.0:
                                weight_objs = map(lambda w: (w[0], w[1] / sum_obj[1]), weight_objs)
 
                            # Add more empty weight objects if too few
                            if len(weight_objs) != self.joints_per_vert:
                                weight_objs.extend([(0,0)] * (self.joints_per_vert - len(weight_objs)))
 
                            for w_obj in weight_objs:
                                index_data.append(w_obj[0])
                                weight_data.append(w_obj[1])
 
                            vert_it.next()
 
                        weight_stream = []
                        index_stream = []
 
                        # This list contains the old-index of each vertex in the AWD vertex stream
                        vert_indices = self.mesh_vert_indices[skin_path.fullPathName()]
                        for idx in vert_indices:
                            start_idx = idx*self.joints_per_vert
                            end_idx = start_idx + self.joints_per_vert
                            w_tuple = weight_data[start_idx:end_idx]
                            i_tuple = index_data[start_idx:end_idx]
                            weight_stream.extend(w_tuple)
                            index_stream.extend(i_tuple)
 
                        if len(md) == 1:
                            print('Setting streams!')
                            sub = md[0]
                            sub.add_stream(pyawd.geom.STR_JOINT_WEIGHTS, weight_stream)
                            sub.add_stream(pyawd.geom.STR_JOINT_INDICES, index_stream)
                        else:
                            print('skinning not implemented for meshes with <> 1 sub-mesh')
 
            dag_it.next()
Пример #24
0
 def getDagPathToObject(self, objectName):
     selectionList = OpenMaya.MSelectionList()
     OpenMaya.MGlobal.getSelectionListByName(objectName, selectionList)
     dagPath = OpenMaya.MDagPath()
     selectionList.getDagPath(0, dagPath)
     return dagPath
def mirrorVertexWeight():
    vertPosDict = {}

    mDagPath = OpenMaya.MDagPath()
    fnMesh = None
    skinNode = None
    selection = OpenMaya.MSelectionList()
    OpenMaya.MGlobal.getActiveSelectionList(selection)

    if selection.length() > 0:
        selection.getDagPath(0, mDagPath)
        if mDagPath.hasFn(OpenMaya.MFn.kMesh):
            fnMesh = OpenMaya.MFnMesh(mDagPath)

    componentIter = OpenMaya.MItSelectionList(selection,
                                              OpenMaya.MFn.kMeshVertComponent)

    selection_DagPath = OpenMaya.MDagPath()

    componentVert = OpenMaya.MObject()
    selectedMObject = OpenMaya.MObject()

    try:
        componentIter.getDagPath(selection_DagPath, componentVert)
    except:
        pm.warning('select vertices')
        return

    vert_iter = OpenMaya.MItMeshVertex(selection_DagPath, componentVert)
    while not vert_iter.isDone():
        vertPos = vert_iter.position(OpenMaya.MSpace.kWorld)
        vertIndex = vert_iter.index()
        vertPosDict[vertIndex] = vertPos
        vert_iter.next()

    mirrorVertsDict = buildMirrorVert(vertPosDict)

    if fnMesh:
        skinNode = getSkincluster(fnMesh)

    targetWeightsDict = {}

    if skinNode:
        vert_iter.reset()

        skinInf = OpenMaya.MDagPathArray()
        skinNode.influenceObjects(skinInf)

        influenceIndices = OpenMaya.MIntArray()
        for i in range(skinInf.length()):
            influenceIndices.append(i)

        while not vert_iter.isDone():
            vertIndex = vert_iter.index()
            if vertIndex in mirrorVertsDict.keys():
                infCount = OpenMaya.MScriptUtil()
                infCountPtr = infCount.asUintPtr()
                OpenMaya.MScriptUtil.setUint(infCountPtr, 0)
                weights = OpenMaya.MDoubleArray()
                skinNode.getWeights(mDagPath, vert_iter.currentItem(), weights,
                                    infCountPtr)
                targetWeightsDict[vertIndex] = weights

            vert_iter.next()

        vert_iter.reset()

        while not vert_iter.isDone():
            vertIndex = vert_iter.index()
            for key, val in mirrorVertsDict.iteritems():
                if vertIndex == val:
                    skinNode.setWeights(mDagPath, vert_iter.currentItem(),
                                        influenceIndices,
                                        targetWeightsDict[key])
            vert_iter.next()
Пример #26
0
    def testUVConversion(self):

        coreMesh = IECore.Reader.create(
            "test/IECore/data/cobFiles/pSphereShape1.cob").read()

        self.assert_("s" in coreMesh)
        self.assert_("t" in coreMesh)

        coreMesh["testUVSet_s"] = IECore.PrimitiveVariable(
            coreMesh["s"].interpolation, coreMesh["s"].data.copy())
        coreMesh["testUVSet_t"] = IECore.PrimitiveVariable(
            coreMesh["t"].interpolation, coreMesh["t"].data.copy())

        converter = IECoreMaya.ToMayaObjectConverter.create(coreMesh)
        self.assert_(
            converter.isInstanceOf(
                IECoreMaya.ToMayaObjectConverter.staticTypeId()))
        self.assert_(
            converter.isInstanceOf(IECoreMaya.ToMayaConverter.staticTypeId()))
        self.assert_(
            converter.isInstanceOf(IECore.FromCoreConverter.staticTypeId()))

        transform = maya.cmds.createNode("transform")
        self.assert_(converter.convert(transform))
        mayaMesh = maya.cmds.listRelatives(transform, shapes=True)[0]

        self.assertEqual(maya.cmds.polyEvaluate(mayaMesh, vertex=True), 382)
        self.assertEqual(maya.cmds.polyEvaluate(mayaMesh, face=True), 760)

        bb = maya.cmds.polyEvaluate(mayaMesh, boundingBox=True)

        self.assertAlmostEqual(bb[0][0], -1, 4)
        self.assertAlmostEqual(bb[0][1], 1, 4)
        self.assertAlmostEqual(bb[1][0], -1, 4)
        self.assertAlmostEqual(bb[1][1], 1, 4)
        self.assertAlmostEqual(bb[2][0], -1, 4)
        self.assertAlmostEqual(bb[2][1], 1, 4)

        l = OpenMaya.MSelectionList()
        l.add(mayaMesh)
        p = OpenMaya.MDagPath()
        l.getDagPath(0, p)

        fnMesh = OpenMaya.MFnMesh(p)
        u = OpenMaya.MFloatArray()
        v = OpenMaya.MFloatArray()

        fnMesh.getUVs(u, v)

        self.assertEqual(u.length(), 2280)
        self.assertEqual(v.length(), 2280)

        self.assertEqual(u[0], coreMesh["s"].data[0])
        self.assertEqual(v[0], 1.0 - coreMesh["t"].data[0])

        fnMesh.getUVs(u, v, "testUVSet")

        self.assertEqual(u.length(), 2280)
        self.assertEqual(v.length(), 2280)

        self.assertEqual(u[12], coreMesh["testUVSet_s"].data[12])
        self.assertEqual(v[12], 1.0 - coreMesh["testUVSet_t"].data[12])
Пример #27
0
def getWeights(deformer, mapList=None, geometry=None):
    '''
    Gets weights for specified deformers.

    :param deformer: Deformer name
    :type deformer: str
    :param map: Name of influence or deformer map to assing weights to.
    :type map: str | list
    :returns: Returns a weight object that you are able to use or manipulate.
    :rtype: WeightObject
    '''
    weightList = list()
    # make sure there is a mapList
    if not mapList:
        mapList = getMaps(deformer) or list()
    elif not isinstance(mapList, (list, tuple)):
        rigrepo.libs.common.toList(mapList)

    if geometry:
        if not mc.objExists(geometry):
            raise RuntimeError(
                "{} doesn't exists in the current Maya session!".format(
                    geometry))
        # make sure we have the shape of the geometry for all deformers except the skinCluster
        geoDagPath = rigrepo.libs.transform.getDagPath(geometry)
        geoDagPath.extendToShape()
        geometryFullPath = geoDagPath.fullPathName()
    else:
        # get the geometry and the iterator to use for looping through the mesh points for wts.
        geometry = mc.deformer(deformer, q=True, g=True)[0]
        geoDagPath = rigrepo.libs.transform.getDagPath(geometry)
        geoDagPath.extendToShape()
        geometryFullPath = geoDagPath.fullPathName()

    selList = OpenMaya.MSelectionList()
    selList.add(geometryFullPath)
    geoDagPath = OpenMaya.MDagPath()
    selList.getDagPath(0, geoDagPath)
    geoIterator = OpenMaya.MItGeometry(geoDagPath)
    if not mapList:
        weightList = [numpy.array([])]
    else:
        weightList = [numpy.array([]) for map_ in mapList]

    if mc.nodeType(deformer) == 'skinCluster':
        # iterate over the geometry
        while not geoIterator.isDone():
            # find the inf index
            for inf in mapList:
                # get the connections so we can get to the weight list
                infIndex = None
                con = mc.listConnections('{}.worldMatrix[0]'.format(inf),
                                         p=True,
                                         d=True,
                                         s=False)
                for c in con:
                    if deformer + '.matrix' in c:
                        infIndex = c.split('[')[1][:-1]
                if infIndex:
                    weightList[mapList.index(inf)] = numpy.append(
                        weightList[mapList.index(inf)],
                        numpy.array(
                            round(
                                mc.getAttr('{}.wl[{}].w[{}]'.format(
                                    deformer, geoIterator.index(), infIndex)),
                                4)))
            geoIterator.next()

    if mc.nodeType(deformer) == 'cluster':
        # iterate over the geometry
        geometryindex = 0
        if geometry:
            geoList = mc.ls(mc.cluster(deformer, q=True, geometry=True),
                            l=True)

            if geoList and geometryFullPath in geoList:
                geometryindex = geoList.index(geometryFullPath)
        while not geoIterator.isDone():
            weightList[0] = numpy.append(
                weightList[0],
                numpy.array(
                    round(
                        mc.getAttr('{}.wl[{}].w[{}]'.format(
                            deformer, geometryindex, geoIterator.index())),
                        4)))
            geoIterator.next()

    if mc.nodeType(deformer) == 'blendShape':
        # iterate over the geometry
        geometryindex = 0
        targetIndex = rigrepo.libs.blendShape.getTargetIndex(deformer, mapList)

        if geometry:
            geoList = mc.ls(mc.deformer(deformer, q=True, geometry=True),
                            l=True)
            if geoList and geometryFullPath in geoList:
                geometryindex = geoList.index(geometryFullPath)

        while not geoIterator.isDone():
            attr = deformer + '.it[0].itg[{}].tw[{}]'.format(
                targetIndex, geoIterator.index())
            weightList[0] = numpy.append(
                weightList[0], numpy.array(round(mc.getAttr(attr), 4)))
            geoIterator.next()

    return rigrepo.libs.weightObject.WeightObject(maps=mapList,
                                                  weights=weightList)
Пример #28
0
def translatorOptions(parent, action, initialSettings, resultCallback):
    defaults = {
        "activeCamera": "<Current>",
        "exportAnim": False,
        "startFrame": 1,
        "endFrame": 100,
        "stepFrame": 1
    }

    createGlobalNodes()

    if initialSettings:
        logger.debug(
            "Parsing initial translator settings %s" % initialSettings)

        opts = initialSettings.split(";")
        for opt in opts:
            opt = opt.strip()

            if opt == "":
                continue

            name, value = opt.split("=")
            if name in defaults:
                if isinstance(defaults[name], basestring):
                    defaults[name] = value
                elif isinstance(defaults[name], bool):
                    defaults[name] = bool(value)
                elif isinstance(defaults[name], int):
                    defaults[name] = int(value)
                else:
                    logger.warning(
                        "Unhandled param %s in translator options" % name)

    if action == "post":
        mc.setParent(parent)
        mc.setUITemplate("DefaultTemplate", pushTemplate=True)
        mc.columnLayout(adj=True)

        mc.optionMenuGrp(
            "as_exportOpts_activeCamera",
            label="Render camera")
        mc.menuItem(label='<Current>', divider=True)
        for camera in mc.ls(type='camera'):
            if mc.getAttr(camera + '.orthographic'):
                continue
            if not mc.getAttr(camera + ".renderable"):
                continue

            mc.menuItem(label=camera)

        mc.separator(style="single")

        def exportAnimChanged(value):
            mc.intSliderGrp(
                "as_exportOpts_startFrame",
                edit=True,
                enable=value)

            mc.intSliderGrp(
                "as_exportOpts_endFrame",
                edit=True,
                enable=value)

            mc.intSliderGrp(
                "as_exportOpts_stepFrame",
                edit=True,
                enable=value)

        exportAnim = defaults["exportAnim"]
        mc.checkBoxGrp(
            "as_exportOpts_exportAnim",
            numberOfCheckBoxes=1,
            label=" ",
            label1="Animation",
            cc=exportAnimChanged,
            value1=exportAnim)

        mc.intSliderGrp(
            "as_exportOpts_startFrame",
            label="Start:",
            field=True,
            min=1,
            max=1000,
            enable=exportAnim,
            value=defaults["startFrame"])

        mc.intSliderGrp(
            "as_exportOpts_endFrame",
            label="End:",
            field=True,
            min=1,
            max=1000,
            enable=exportAnim,
            value=defaults["endFrame"])

        mc.intSliderGrp(
            "as_exportOpts_stepFrame",
            label="Step:",
            field=True,
            min=1,
            max=100,
            enable=exportAnim,
            value=defaults["stepFrame"])

    elif action == "query":
        options = ""

        value = mc.optionMenuGrp(
            "as_exportOpts_activeCamera", query=True, value=True)

        # Replace current by the active camera.
        if value == "<Current>":
            if om.MGlobal.mayaState() == om.MGlobal.kInteractive:
                camera = om.MDagPath()
                omui.M3dView.active3dView().getCamera(camera)

                if mc.getAttr(camera.partialPathName() + ".renderable"):
                    value = camera.partialPathName()
                else:
                    logger.warning("Active camera not renderable. Ignoring.")
                    value = ""
            else:
                logger.warning("Active camera specified for maya batch.")
                value = ""

        if value:
            options += "activeCamera=" + value + ";"

        exportAnim = mc.checkBoxGrp(
            "as_exportOpts_exportAnim", query=True, value1=True)
        if exportAnim:
            options += "exportAnim=true;"

            value = mc.intSliderGrp(
                "as_exportOpts_startFrame", query=True, value=True)
            options += "startFrame=" + str(value) + ";"

            value = mc.intSliderGrp(
                "as_exportOpts_endFrame", query=True, value=True)
            options += "endFrame=" + str(value) + ";"

            value = mc.intSliderGrp(
                "as_exportOpts_stepFrame", query=True, value=True)
            options += "stepFrame=" + str(value) + ";"

        logger.debug("calling translator callback, options = %s" % options)
        mel.eval('%s "%s"' % (resultCallback, options))
Пример #29
0
 def getDagPath_(self):
     selList = om_.MSelectionList()
     selList.add(com.longNameOf(self.meshTransform))
     dagPath = om_.MDagPath()
     selList.getDagPath(0, dagPath)
     return dagPath
Пример #30
0
def fitView():
    objects = cmds.ls(sl=True)
    if not objects:
        return

    panel = cmds.getPanel(wf=True)
    modelPanels = cmds.getPanel(typ='modelPanel')
    if not panel in modelPanels:
        mel.eval('FrameSelected;')
        return

    # View
    view = getActiveView()
    if not view:
        return

    # Camera.
    cam = OpenMaya.MDagPath()
    view.getCamera(cam)
    camPath = cam.fullPathName()
    camDag = getDagPath(name=camPath)
    camFn = OpenMaya.MFnCamera(camDag)
    camTransform = cmds.listRelatives(camPath, p=True, typ='transform')[0]
    hFov = camFn.horizontalFieldOfView()

    # Create data.
    boundsArray = []
    centerArray = []
    for obj in objects:
        objPath = getDagPath(name=obj)
        try:
            objPath.extendToShape()
        except:
            pass
        objDagFn = OpenMaya.MFnDagNode(objPath)

        # Bounds.
        bBox = objDagFn.boundingBox()
        bBox.transformUsing(objPath.exclusiveMatrix())
        bbCenter = bBox.center()
        bbMin = bBox.min()
        bbMax = bBox.max()

        centerArray.append(OpenMaya.MVector(bbCenter.x, bbCenter.y,
                                            bbCenter.z))

        temp = [
            OpenMaya.MPoint(bbMin[0], bbMin[1], bbMin[2]),
            OpenMaya.MPoint(bbMin[0], bbMin[1], bbMax[2]),
            OpenMaya.MPoint(bbMin[0], bbMax[1], bbMin[2]),
            OpenMaya.MPoint(bbMin[0], bbMax[1], bbMax[2]),
            OpenMaya.MPoint(bbMax[0], bbMin[1], bbMin[2]),
            OpenMaya.MPoint(bbMax[0], bbMin[1], bbMax[2]),
            OpenMaya.MPoint(bbMax[0], bbMax[1], bbMin[2]),
            OpenMaya.MPoint(bbMax[0], bbMax[1], bbMax[2])
        ]
        boundsArray += temp

    camCenter = OpenMaya.MVector(0, 0, 0)
    for center in centerArray:
        camCenter += center
    camCenter /= len(centerArray)

    boundingSphere = .0
    temp = []
    for pIndecs in xrange(len(boundsArray)):
        pp = boundsArray[pIndecs]
        v = bbCenter - pp
        temp.append(v.length())
    boundingSphere = max(temp) * 2.

    camDepth = boundingSphere / math.tan(hFov / 2.0)
    camDepth = OpenMaya.MPoint(0, 0, camDepth)
    if camDepth.z == 0:
        camDepth = OpenMaya.MPoint(0, 0, 5.)

    # Calc start.
    mMatrix = OpenMaya.MMatrix()
    __matrix = cmds.getAttr('%s.worldMatrix' % camTransform)
    OpenMaya.MScriptUtil.createMatrixFromList(__matrix, mMatrix)
    transformMatrix = OpenMaya.MTransformationMatrix(mMatrix)
    transformMatrix.setTranslation(
        OpenMaya.MVector(camCenter.x, camCenter.y, camCenter.z),
        OpenMaya.MSpace.kWorld)
    camMatrix = transformMatrix.asMatrix()
    camPos = camDepth * camMatrix

    cmds.setAttr('%s.t' % camTransform, camPos.x, camPos.y, camPos.z)

    pA = cmds.xform(objects[0], q=True, ws=True, rp=True)
    vA = OpenMaya.MVector(pA[0], pA[1], pA[2])
    pB = cmds.xform(camTransform, q=True, ws=True, rp=True)
    vB = OpenMaya.MVector(pB[0], pB[1], pB[2])
    vAB = vA - vB
    coi = vAB.length()

    cmds.setAttr("%s.coi" % camPath, coi)
    cmds.setAttr("%s.tumblePivot" % camPath, camCenter.x, camCenter.y,
                 camCenter.z)