def compute(self, plug, dataBlock): #Inputs mode = dataBlock.inputValue(Mnt_GroupNode.modeAttr).asShort() componentType = dataBlock.inputValue(Mnt_GroupNode.componentTypeAttr).asShort() componentID = dataBlock.inputValue(Mnt_GroupNode.componentAttribute).asShort() componentsListStr = dataBlock.inputValue(Mnt_GroupNode.componentListAttr).asString() # Outputs if (plug == Mnt_GroupNode.componentOutputsAttr or plug == Mnt_GroupNode.modeAttr): ouputComponentsHandle = dataBlock.outputValue(Mnt_GroupNode.componentOutputsAttr) singleIndexedComponent = OpenMaya.MFnSingleIndexedComponent() if componentType == 0: componentsObj = singleIndexedComponent.create(OpenMaya.MFn.kMeshVertComponent) if componentType == 1:#Add else statement componentsObj = singleIndexedComponent.create(OpenMaya.MFn.kMeshEdgeComponent) if componentType == 2: componentsObj = singleIndexedComponent.create(OpenMaya.MFn.kMeshPolygonComponent) if mode == 0: singleIndexedComponent.addElement(componentID) if mode == 1: singleIndexedComponent.addElements(self.convertStringToIntArray(componentsListStr)) componentsListData = OpenMaya.MFnComponentListData() componentsListObj = componentsListData.create() componentsListData.add(componentsObj) ouputComponentsHandle.setMObject(componentsListObj) dataBlock.setClean(plug) return None
def redoIt(self): MSelectionList = OpenMaya.MSelectionList() MActiveList = OpenMaya.MGlobal.getActiveSelectionList() if MActiveList.length() == 0: return MObj = MActiveList.getDependNode(0) MposeScopeMeshObj = self.get_poseScopeMesh() MGroupNodeObj = self.get_groupNode() MTransformNode = self.get_transformNode() if not MGroupNodeObj: return nodeDNFn = OpenMaya.MFnDependencyNode(MGroupNodeObj) outputsComponentPlug = nodeDNFn.findPlug('outputsComponent', False) outputsComponent = outputsComponentPlug.asMObject() componentListData = OpenMaya.MFnComponentListData(outputsComponent) for i in range(0, componentListData.length()): MSelectionList.add( (OpenMaya.MDagPath.getAPathTo(MposeScopeMeshObj), componentListData.get(i))) MSelectionList.add(OpenMaya.MDagPath.getAPathTo(MTransformNode)) OpenMaya.MGlobal.setComponentSelectionMask( OpenMaya.MSelectionMask.kSelectMeshFaces) OpenMaya.MGlobal.setSelectionMode( OpenMaya.MGlobal.kSelectComponentMode) OpenMaya.MGlobal.setHiliteList(MSelectionList) OpenMaya.MGlobal.setActiveSelectionList(MSelectionList)
def getInputFaces(self): inputMeshPlug = self.node.findPlug('inputMesh', False) connections = inputMeshPlug.connectedTo(True, False) for i in range(0, len(connections)): node = connections[i].node() if node.hasFn(OpenMaya.MFn.kMesh): self.inputMeshFn = OpenMaya.MFnMesh(node) self.shape = node break inputFaceComponentsPlug = self.node.findPlug('inputFaceComponents', False) try: inputFaceComponentsListObj = inputFaceComponentsPlug.asMObject() inputFaceComponentsListFn = OpenMaya.MFnComponentListData( inputFaceComponentsListObj) self.fComponent = OpenMaya.MFnSingleIndexedComponent() self.fComponent.create(OpenMaya.MFn.kMeshPolygonComponent) for i in range(0, inputFaceComponentsListFn.length()): inputFaceComponentsObj = inputFaceComponentsListFn.get(i) tmpSingleIndexedComponent = OpenMaya.MFnSingleIndexedComponent( inputFaceComponentsObj) elements = tmpSingleIndexedComponent.getElements() self.fComponent.addElements(elements) except: OpenMaya.MGlobal.displayWarning( 'No Input Face Components! Please add some.') return
sel_list = om2.MGlobal.getSelectionListByName(shape) obj = sel_list.getDependNode(0) dag_path = sel_list.getDagPath(0) fn = om2.MFnDependencyNode(obj) inst_groups = fn.findPlug('instObjGroups', False) for i in xrange(inst_groups.numElements()): inst_group = inst_groups.elementByLogicalIndex(i) obj_groups = inst_group.child(0) for j in xrange(obj_groups.numElements()): obj_group = obj_groups.elementByLogicalIndex(j) print om2.MFnDependencyNode( obj_group.connectedTo(False, True)[0].node()).name() for k in xrange(obj_group.numChildren()): child = obj_group.child(k) if child.name().endswith('.objectGrpCompList'): comps = om2.MFnComponentListData(child.asMObject()) for l in xrange(comps.length()): comp = comps.get(l) iter = om2.MItMeshPolygon(dag_path, comp) while not iter.isDone(): print iter.index() iter.next(iter) break
def _get_component_list_data(mplug): # type: (_om2.MPlug) -> Tuple[int] mfn = _om2.MFnComponentListData(mplug.asMObject()) return tuple(mfn.get(i) for i in range(mfn.length()))
def redoIt(self): ''' This method helps the user to create a symmetrical poseScope on a syemmtrical geometry The geometry should have an identity transformation matrix ''' inputMeshFn = None inputMeshShape = None MSelection = OpenMaya.MGlobal.getActiveSelectionList() if MSelection.length() == 0: OpenMaya.MGlobal.displayError( 'Nothing selected. Please select a posescope controller first.' ) return # Loops over of the selected nodes for i in range(MSelection.length()): # If nothing selected, display error and returns try: MObj = MSelection.getDependNode(i) except: OpenMaya.MGlobal.displayError( 'Nothing selected. Please select a posescope controller first.' ) return MDagPath = OpenMaya.MDagPath.getAPathTo(MObj) symFaceListStr = None for i in range(MDagPath.childCount()): child = MDagPath.child(i) if child.apiTypeStr != 'kPluginShape': continue childFn = OpenMaya.MFnDependencyNode(child) # When a poseScope is found, we can get its inputs nodes and stop the loop if childFn.typeName == 'mnt_poseScope': # Gets input mesh inputMeshPlug = childFn.findPlug('inputMesh', False) connections = inputMeshPlug.connectedTo(True, False) for i in range(0, len(connections)): node = connections[i].node() if node.hasFn(OpenMaya.MFn.kMesh): inputMeshShape = node inputMeshFn = OpenMaya.MFnMesh(node) break # _______________ # ________________________________________________________________________ # Creates MPointOnMesh and MMeshIntersector to find opposite faces IDs '''meshPt = OpenMaya.MPointOnMesh()''' meshIntersector = OpenMaya.MMeshIntersector() meshIntersector.create(inputMeshShape, OpenMaya.MMatrix.kIdentity) # ____________________________________________________________________ # Gets opposite faces IDs components inputFaceComponentsPlug = childFn.findPlug( 'inputFaceComponents', False) inputFaceComponentsListDataHandle = inputFaceComponentsPlug.asMObject( ) componentsListData = OpenMaya.MFnComponentListData( inputFaceComponentsListDataHandle) for i in range(componentsListData.length()): component = componentsListData.get(i) singleIndexedComponent = OpenMaya.MFnSingleIndexedComponent( component) for faceComponent in singleIndexedComponent.getElements(): vertices = inputMeshFn.getPolygonVertices( faceComponent) faceCenter = OpenMaya.MVector((0.0, 0.0, 0.0)) for vertex in vertices: position = inputMeshFn.getPoint(vertex) faceCenter = faceCenter.__add__( OpenMaya.MVector(position[0] / len(vertices), position[1] / len(vertices), position[2] / len(vertices))) symPoint = OpenMaya.MPoint( (-faceCenter[0], faceCenter[1], faceCenter[2])) closestPoint = meshIntersector.getClosestPoint( symPoint) symFace = closestPoint.face if symFaceListStr == None: symFaceListStr = str(symFace) else: symFaceListStr = symFaceListStr + ' ' + str( symFace) # _________________________ # __________________________________ # Creates mnt_groupNode DG node. DGModifier = OpenMaya.MDGModifier() self.groupNodeObj = DGModifier.createNode('mnt_groupNode') groupNode = OpenMaya.MFnDependencyNode(self.groupNodeObj) groupNode.findPlug('mode', False).setInt(1) groupNode.findPlug('componentsList', False).setString(symFaceListStr) # ______________________________ # Creates mnt_poseScope DAG node. poseScopeDagNodeFn = OpenMaya.MFnDagNode() self.poseScopeDagNodeObj = poseScopeDagNodeFn.create( 'mnt_poseScope') poseScopeNodePath = OpenMaya.MFnDagNode( self.poseScopeDagNodeObj).getPath().extendToShape() poseScopeNode = OpenMaya.MFnDependencyNode( poseScopeNodePath.node()) poseScopeNode.findPlug('colorR', False).setDouble( childFn.findPlug('colorG', False).asDouble()) poseScopeNode.findPlug('colorG', False).setDouble( childFn.findPlug('colorB', False).asDouble()) poseScopeNode.findPlug('colorB', False).setDouble( childFn.findPlug('colorR', False).asDouble()) poseScopeNode.findPlug('opacity', False).setFloat( childFn.findPlug('opacity', False).asFloat()) # _______________________________ # Creates connections. DGModifier.connect( groupNode.findPlug('outputsComponent', False), poseScopeNode.findPlug('inputFaceComponents', False)) DGModifier.connect(inputMeshFn.findPlug('outMesh', False), poseScopeNode.findPlug('inputMesh', False)) # ____________________ DGModifier.doIt() # If an opposite transform node exists (_L_ or _R_), parent the new node to it. if '_L_' in MDagPath.__str__(): oppositeTransformNode = MDagPath.__str__().replace('_L_', '_R_') elif 'L_' in MDagPath.__str__(): oppositeTransformNode = MDagPath.__str__().replace('L_', 'R_') elif '_L' in MDagPath.__str__(): oppositeTransformNode = MDagPath.__str__().replace('_L', '_R') elif '_R_' in MDagPath.__str__(): oppositeTransformNode = MDagPath.__str__().replace('_R_', '_L_') elif 'R_' in MDagPath.__str__(): oppositeTransformNode = MDagPath.__str__().replace('R_', 'L_') elif '_R' in MDagPath.__str__(): oppositeTransformNode = MDagPath.__str__().replace('_R', '_L') else: oppositeTransformNode = MDagPath.__str__() + "_copy" try: oppositeSel = OpenMaya.MSelectionList() oppositeSel.add(oppositeTransformNode) oppositeSel.add( OpenMaya.MFnDagNode( self.poseScopeDagNodeObj).getPath().extendToShape()) oppositeTransformNodeObj = oppositeSel.getDependNode(0) posescopeShapeObj = oppositeSel.getDependNode(1) oppositeTransformDagNode = OpenMaya.MFnDagNode( oppositeTransformNodeObj) for i in range(0, oppositeTransformDagNode.childCount()): try: childDNFn = OpenMaya.MFnDependencyNode( oppositeTransformDagNode.child(i)) if OpenMaya.MFnDependencyNode( oppositeTransformDagNode.child( i)).typeName == 'mnt_poseScope': OpenMaya.MGlobal.deleteNode( oppositeTransformDagNode.child(i)) except: pass oppositeTransformDagNode.addChild(posescopeShapeObj, 0, False) OpenMaya.MGlobal.deleteNode(self.poseScopeDagNodeObj) except: DGModifier = OpenMaya.MDGModifier() DGModifier.renameNode(self.poseScopeDagNodeObj, oppositeTransformNode) DGModifier.doIt() # _____________________________________________________________________________ return