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)
def om_get_shape(self, name): sllist = om.MSelectionList() om.MGlobal.getSelectionListByName(name, sllist) dpg = om.MDagPath() sllist.getDagPath(0, dpg) return dpg
def getDagPath( nodeName ): selList = OpenMaya.MSelectionList() selList.add( nodeName ) dagPath = OpenMaya.MDagPath() selList.getDagPath( 0, dagPath ) return dagPath
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)]))
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
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)
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()
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'
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.'
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
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'
def getDagPath(node=None): sel = om.MSelectionList() sel.add(str(node)) d = om.MDagPath() sel.getDagPath(0, d) return d
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)
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)
''' 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()
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)
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)
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.'
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
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)
def nameToDag(name): selectionList = om.MSelectionList() selectionList.add(name) path = om.MDagPath() selectionList.getDagPath(0, path) return path
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()
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()
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])
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)
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))
def getDagPath_(self): selList = om_.MSelectionList() selList.add(com.longNameOf(self.meshTransform)) dagPath = om_.MDagPath() selList.getDagPath(0, dagPath) return dagPath
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)