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
Esempio n. 4
0
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
Esempio n. 5
0
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