Пример #1
0
def copy_joint_weights_to_cluster(skin_mel_node, joint_mel_node):
    '''
    '''
    #- initlize api nodes
    skin_mfn_node = OpenMayaAnim.MFnSkinCluster(
        pymel.core.PyNode(skin_mel_node).__apiobject__())
    joint_dag_path = OpenMaya.MDagPath(
        pymel.core.PyNode(joint_mel_node).__apiobject__())

    #- get joint influcenced points and weight values
    components = OpenMaya.MSelectionList()
    weights = OpenMaya.MDoubleArray()
    skin_mfn_node.getPointsAffectedByInfluence(joint_dag_path, components,
                                               weights)

    #- create cluster
    component_strings = list()
    components.getSelectionStrings(component_strings)
    cluster_mel_node = mc.cluster(component_strings)[0]
    clus_mfn_node = OpenMayaAnim.MFnWeightGeometryFilter(
        pymel.core.PyNode(cluster_mel_node).__apiobject__())

    #- get geometry's dagpath and component
    geo_dag_path = OpenMaya.MDagPath()
    geo_comp_obj = OpenMaya.MObject()
    components.getDagPath(0, geo_dag_path, geo_comp_obj)

    #- convert skinweights type to cluster weights type
    cluster_weights_array = OpenMaya.MFloatArray()
    for v in weights:
        cluster_weights_array.append(v)

    #- set weights
    clus_mfn_node.setWeight(geo_dag_path, geo_comp_obj, cluster_weights_array)
Пример #2
0
    def get_keyframable_channel_object(node_obj,
                                       channel_obj,
                                       force_create=True):
        connections = OpenMaya.MPlugArray()
        channel_obj.connectedTo(connections, True, False)
        if bool(connections.length()):
            try:
                mfna = OpenMayaAnim.MFnAnimCurve(channel_obj)
                # check if the node is referenced. Support for unitless input
                # animation curves is not available yet
                allow_ref = MayaPreferences.use_referenced_anim_curves
                if ((not allow_ref and mfna.isFromReferencedFile())
                        or mfna.isUnitlessInput()):
                    return None
                return mfna
            except:
                return None
        elif force_create:
            try:
                curve_node = OpenMayaAnim.MFnAnimCurve().create(
                    channel_obj, MayaUndoHelper.dg_modifier)
            except:
                warnings.warn(
                    "Cannot create animation curve node for %s ." %
                    channel_obj.partialName(True), FacadeWarning)
                return None

            return OpenMayaAnim.MFnAnimCurve(curve_node)
        return None
Пример #3
0
 def key_callback(self, attributes, clientData):
     """Everything is put into a try statement for general safety reasons
     @param attributes: edited attributes
     @param clientData: additionalData, not used by the onionSkin, so always
                        defaults to None
     @type clientData: None
     """
     # try:
     for i in range(attributes.length()):
         attribute = attributes[i]
         keyframe_delta = OpenMayaAnim.MFnKeyframeDelta(attribute)
         animcurve = OpenMayaAnim.MFnAnimCurve(keyframe_delta.paramCurve())
         object_name = cmds.listConnections(animcurve.name())[0]
         trans_name = object_name
         obj = None
         for c in cmds.listConnections(object_name):
             if '_BSP' in c:
                 obj = c.split('_BSP')[0].split('CHAR_')[1]
                 break
         if obj is None:
             return
         table = self.tabs[obj][1]
         trans_name = trans_name.split('SF_CHAR_')[1].split('_CTL')[0]
         item = table.findItems(trans_name, QtCore.Qt.MatchExactly)
         key_timeline = None
         for c in table.cellWidget(item[0].row(),
                                   self.column_timeline).children():
             if type(c) is dwidget.DragSupportWidget:
                 for tl in self.timelines:
                     if tl.timeline is c:
                         key_timeline = tl
                 # end for tl in self.timelines
         # end for c in table.cellWidget(item[0].row(), self.column_timeline).children()
         if key_timeline is not None:
             key_timeline.refresh_buttons(animcurve)
Пример #4
0
 def create_animation_curve(self, mplug) :
     anim_curve = self.get_anim_curve(mplug)
     if anim_curve:
         mfn_anim_curve = OpenMayaAnim.MFnAnimCurve(anim_curve)       
     else:
         mfn_anim_curve = OpenMayaAnim.MFnAnimCurve()    
         anim_curve_type = mfn_anim_curve.timedAnimCurveTypeForPlug(mplug)            
         mfn_anim_curve.create(mplug, anim_curve_type)            
     return mfn_anim_curve
Пример #5
0
def bdMain():
	dagPath = om.MDagPath()
	mObj = om.MObject()
	selection = om.MSelectionList()
	
	status = om.MGlobal.getActiveSelectionList(selection)

	try:
		status = selection.getDependNode(0,mObj)
	except:
		sys.stderr.write('Nothing is selected, you need to select the IK handle')
		return
	
	if mObj.hasFn(om.MFn.kIkHandle):
		ikHandleFn = oma.MFnIkHandle(mObj)
		startJointPath = om.MDagPath()
		ikHandleFn.getStartJoint(startJointPath)
		
		startJointTransformNode = startJointPath.transform()
		startJointTransformFn = om.MFnTransform(startJointTransformNode)
				
		print startJointTransformFn.name()
		
		
		rotateOrientation = startJointTransformFn.rotateOrientation(om.MSpace.kTransform)
		rotateOrientationEuler = rotateOrientation .asEulerRotation()
		
		print 'Rotation axis', math.degrees(rotateOrientationEuler.x), math.degrees(rotateOrientationEuler.y), math.degrees(rotateOrientationEuler.z)
		
		matrix = om.MTransformationMatrix(startJointTransformFn.transformationMatrix())
		rotOrderAxis = matrix.rotationOrder()
		
		print rotOrderAxis
		quatRotation  = om.MQuaternion()
		startJointTransformFn.getRotation(quatRotation)
		eulerRotation = quatRotation.asEulerRotation()
	
		print 'Local Rotation ', math.degrees(eulerRotation.x), math.degrees(eulerRotation.y), math.degrees(eulerRotation.z)
		
		translation = matrix.getTranslation(om.MSpace.kWorld)
		print 'World transation', translation.x, translation.y, translation.z
		

		ikJoint = oma.MFnIkJoint(startJointTransformNode)
		jointOrient = om.MEulerRotation()
		quatJointOrient = om.MQuaternion()
		ikJoint.getRotation(quatJointOrient)
		ikJoint.getOrientation(jointOrient)
		
		print 'Joint orientation', math.degrees(jointOrient.x) , math.degrees(jointOrient.y), math.degrees(jointOrient.z)

		globalRot = om.MQuaternion()
		globalRot = rotateOrientation * quatRotation * quatJointOrient
		globalRotEuler = globalRot.asEulerRotation()
		print 'World orientation', math.degrees(globalRot.x) , math.degrees(globalRot.y), math.degrees(globalRot.z)
		
		print bdGetChainLength(ikJoint)
Пример #6
0
    def redoIt(self):
        ''' Create and manipulate the nodes to form the joint chain. '''

        # Perform the operations enqueued within our reference to MDagModifier.
        self.dagModifier.doIt()

        # =======================================
        # JOINT MANIPULATION
        # =======================================
        # We can now use the function sets on the newly created DAG objects.
        jointFn = OpenMayaAnim.MFnIkJoint()

        for i in range(1, len(self.jointObjects)):
            jointFn.setObject(self.jointObjects[i])
            # We set the orientation for our joint to be 'jointOrientation' degrees, to form an arc.
            # We use MFnIkJoint.setOrientation() instead of MFnTransform.setRotation() to let the
            # inverse-kinematic handle maintain the curvature.
            global jointOrientation
            rotationAngle = OpenMaya.MAngle(jointOrientation,
                                            OpenMaya.MAngle.kDegrees)
            jointFn.setOrientation(
                OpenMaya.MEulerRotation(rotationAngle.asRadians(), 0, 0,
                                        OpenMaya.MEulerRotation.kXYZ))

            # We translate the joint by 'jointDistance' units along its parent's y axis.
            global jointDistance
            translationVector = OpenMaya.MVector(0, jointDistance, 0)
            jointFn.setTranslation(translationVector,
                                   OpenMaya.MSpace.kTransform)

        # =======================================
        # IK HANDLE MANIPULATION
        # =======================================
        # We will use the MEL command 'ikHandle' to create the handle which will move our joint chain. This command
        # will be enqueued in our reference to the MDagModifier so that it can be undone in our call to MDagModifier.undoIt().

        # Obtain the DAG path of the first joint.
        startJointDagPath = OpenMaya.MDagPath()
        jointFn.setObject(self.jointObjects[0])
        jointFn.getPath(startJointDagPath)

        # Obtain the DAG path of the effector.
        effectorDagPath = OpenMaya.MDagPath()
        effectorFn = OpenMayaAnim.MFnIkEffector(self.effectorObj)
        effectorFn.getPath(effectorDagPath)

        # Enqueue the following MEL command with the DAG paths of the start joint and the end effector.
        self.dagModifier.commandToExecute('ikHandle -sj ' +
                                          startJointDagPath.fullPathName() +
                                          ' -ee ' +
                                          effectorDagPath.fullPathName())

        # We call MDagModifier.doIt() to effectively execute the MEL command and create the ikHandle.
        self.dagModifier.doIt()
Пример #7
0
 def setClusterWeights(self, dag_path, cluster_mobject, weights):
     if not isinstance(dag_path, OpenMaya.MDagPath):
         dag_path = self.getDagPath(dag_path)
     if not isinstance(cluster_mobject, OpenMaya.MObject):
         cluster_mobject = self.getMObject(cluster_mobject)
     components = self.getVertexsMObjects(dag_path)
     mfn_geo_filter = OpenMayaAnim.MFnGeometryFilter(cluster_mobject)
     deformer_set = mfn_geo_filter.deformerSet()
     mfn_set = OpenMaya.MFnSet(deformer_set)
     mfn_set.addMember(dag_path, components)
     weight_geometry_filter = OpenMayaAnim.MFnWeightGeometryFilter(
         cluster_mobject)
     weight_geometry_filter.setWeight(dag_path, components, weights)
Пример #8
0
def doTest2():
    
    minTime = om.MTime()
    maxTime = om.MTime()
    currentTime = om.MTime()
    
    minTime = omAnim.MAnimControl().minTime()
    maxTime = omAnim.MAnimControl().maxTime()
    currentTime = omAnim.MAnimControl().currentTime()
    
    print minTime.value()
    print maxTime.value()
    print currentTime.asUnits( 8 )
Пример #9
0
	def __init__(self) :
		# get the currently selected objects and make sure we have only one object
		selected = OM.MSelectionList()
		OM.MGlobal.getActiveSelectionList(selected)
		self.selectedObjects = []
		selected.getSelectionStrings(self.selectedObjects)
		if len(self.selectedObjects) == 0 :
			cmds.confirmDialog( title='No objects Selected', message='Select a Mesh Object', button=['Ok'], defaultButton='Ok', cancelButton='Ok', dismissString='Ok' )
		elif len(self.selectedObjects) > 1 :
			cmds.confirmDialog( title='Select One Object', message='Only One Mesh mat be exported at a time', button=['Ok'], defaultButton='Ok', cancelButton='Ok', dismissString='Ok' )
		# now we have the correct criteria we can proceed with the export
		else :
			# get the start and end values for our UI sliders
			anim=OMA.MAnimControl()
			minTime=anim.minTime()
			maxTime=anim.maxTime()
			self.m_start=int(minTime.value())
			self.m_end=int(maxTime.value())
			# now we create a window ready to populate the components
			self.m_window = cmds.window( title='NCCA Pointbake Export' )
			# create a layout
			cmds.columnLayout()
			# create two sliders for start and end we also attach methods to be called when the slider
			# changes
			self.m_startSlider=cmds.intSliderGrp( changeCommand=self.startChanged,field=True, label='Start Frame', minValue=self.m_start, maxValue=self.m_end, fieldMinValue=self.m_start, fieldMaxValue=self.m_end, value=self.m_start )
			self.m_endSlider=cmds.intSliderGrp( changeCommand=self.endChanged ,field=True, label='End Frame', minValue=self.m_start, maxValue=self.m_end, fieldMinValue=self.m_end, fieldMaxValue=self.m_end, value=self.m_end )
			# create a button and add the method called when pressed
			cmds.button( label='Export', command=self.export )
			# finally show the window
			cmds.showWindow( self.m_window )
Пример #10
0
    def get_skin_cluster(self):
        '''
        Also returns the dag path to the inCurve, that is needed for 
        skinCluster.getWeights()
        '''
        # 1 - get the skinCluster attached to the in curve
        # - first, get the plug of the curve
        fnDep = om.MFnDependencyNode(self.thisMObject())
        pInCrv = fnDep.findPlug(curveDeformer.aInCrv)
        itDg = om.MItDependencyGraph(pInCrv, om.MItDependencyGraph.kDownstream, om.MItDependencyGraph.kPlugLevel)
        
        # - then, get the curve as a MDagPath. The reason why we do all this
        #   crap is because the dataHandle.asNurbsCurve() returns a 
        #   kNurbsCurveData, and MDagPath or everything else requires a kNurbsCurve.
        dpInCrv = om.MDagPath()
        plugs = om.MPlugArray()
        pInCrv.connectedTo(plugs, True, False)
        plug = plugs[0]
        oInCrv_asNurbsCurve = plug.node()
        fnDagInCrv = om.MFnDagNode(oInCrv_asNurbsCurve)
        fnDagInCrv.getPath(dpInCrv)
        
        # - now we have this dag path, let's grab the skinCluster
        scs = []
        while not itDg.isDone():
            oCurrent = itDg.currentItem()
            if oCurrent.hasFn(om.MFn.kSkinClusterFilter):
                scs.append(oCurrent)
            itDg.next()
        if not scs:
            raise TypeError, 'No skin cluster found. Returns'
        fnSc = omAnim.MFnSkinCluster(scs[0])

        return fnSc, dpInCrv
Пример #11
0
    def transferReverseWeightList(geo, fromDeformer, toDeformer):
        '''
        method for quickly transfering reversed weightList
        input python string (mesh)
        input pythin string (fromDeformer)
        input python string (toDeformer)
        '''

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

        while not vertItr.isDone():

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

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

            deformerWeightFn.setObject(deformerObjectTo)
            deformerWeightFn.setWeight(geoPath, componentObject, weights)
            vertItr.next()
Пример #12
0
def findInputShape(shape):
    '''
	Return the input shape ('...ShapeOrig') for the specified shape node.
	This function assumes that the specified shape is affected by at least one valid deformer.
	@param shape: The shape node to find the corresponding input shape for.
	@type shape: str
	'''
    # Get MObject for shape
    shapeObj = getMObject(shape)

    # Get inMesh connection
    inMeshConn = mc.listConnections(shape + '.inMesh')
    if not inMeshConn:
        raise Exception('Mesh attribute "' + shape +
                        '.inMesh" has no incoming connections!')

    # Find connected deformer
    deformerObj = getMObject(inMeshConn[0])
    if not deformerObj.hasFn(OpenMaya.MFn.kGeometryFilt):
        deformerHist = mc.ls(mc.listHistory(shape), type='geometryFilter')
        if not deformerHist:
            raise Exception('Shape node "' + shape +
                            '" is not affected by any valid deformers!')
        else:
            deformerObj = getMObject(deformerHist[0])

    # Get deformer function set
    deformerFn = OpenMayaAnim.MFnGeometryFilter(deformerObj)

    # Get input shape for deformer
    geomIndex = deformerFn.indexForOutputShape(shapeObj)
    inputShapeObj = deformerFn.inputShapeAtIndex(geomIndex)

    # Return result
    return OpenMaya.MFnDependencyNode(inputShapeObj).name()
Пример #13
0
    def __init__(self, DeformerNode, geo):
        #获得一个组件列表
        cmp_list = [universal.intoComponents(i) for i in universal.translateToName(geo)]
        #检查组件列表的数量
        if len(cmp_list)<1:
            raise EOFError('geo没有任何对象')
        #建立一个组件选择列表
        sel_list = om.MSelectionList()
        [sel_list.add(i) for i in cmp_list]
        if int(sel_list.length())>1:
            raise EOFError('%s 不在一个mesh或者其他对象上'%geo)
            return 1
        self.path = om.MDagPath()
        self.comp = om.MObject()
        sel_list.getDagPath(0,self.path,self.comp)

        #获得变形节点
        obj = om.MObject()
        sel_list.add(DeformerNode)
        sel_list.getDependNode(1,obj)

        try:
            self.weightGeo = oma.MFnWeightGeometryFilter(obj)
        except:
            raise EOFError('输入的变形节点不是正确的对象(簇,软变形...)')
Пример #14
0
 def _GetAnimCurveFnForPlugName(self, depNodeFn, plugName):
     plug = depNodeFn.findPlug(plugName)
     animObjs = OpenMaya.MObjectArray()
     OpenMayaAnim.MAnimUtil.findAnimation(plug, animObjs)
     self.assertEqual(animObjs.length(), 1)
     animCurveFn = OpenMayaAnim.MFnAnimCurve(animObjs[0])
     return animCurveFn
Пример #15
0
def get_influence_ids(skin_cluster):
    """
    Collects all influences and its ids from a skinCluster.

    Returns:
        A dictionary: {id(int):inf_name(string)}
    """
    has_infs = get_influences(skin_cluster)
    if not has_infs:
        return {}

    skin_cluster_mobj = to_mobject(skin_cluster)
    mfn_skin_cluster = OpenMayaAnim.MFnSkinCluster(skin_cluster_mobj)

    inf_mdag_paths = OpenMaya.MDagPathArray()
    mfn_skin_cluster.influenceObjects(inf_mdag_paths)

    inf_ids = {}

    for i in range(inf_mdag_paths.length()):
        inf_id = int(
            mfn_skin_cluster.indexForInfluenceObject(inf_mdag_paths[i]))
        inf_ids[inf_id] = inf_mdag_paths[i].partialPathName()

    return inf_ids
Пример #16
0
def findInputShape1(shape):
    """
    Return the input shape ('...ShapeOrig') for the specified shape node based on deformer data.
    This function assumes that the specified shape is affected by at least one valid deformer.
    @param shape: The shape node to find the corresponding input shape for.
    @type shape: str
    """
    # Get MObject for shape
    shapeObj = glTools.utils.base.getMObject(shape)

    # Get inMesh connection
    inConn = cmds.listConnections(shape, s=True, d=False)
    if not inConn: return shape

    # Find connected deformer
    deformerHist = cmds.ls(cmds.listHistory(shape), type='geometryFilter')
    if not deformerHist:
        raise Exception(
            'Shape node "' + shape +
            '" is not affected by any valid deformers! Unable to determine input shape'
        )
    deformerObj = glTools.utils.base.getMObject(deformerHist[0])

    # Get deformer function set
    deformerFn = OpenMayaAnim.MFnGeometryFilter(deformerObj)

    # Get input shape for deformer
    geomIndex = deformerFn.indexForOutputShape(shapeObj)
    inputShapeObj = deformerFn.inputShapeAtIndex(geomIndex)

    # Return result
    return OpenMaya.MFnDagNode(inputShapeObj).partialPathName()
Пример #17
0
    def get_deviation_anim_curve_fn(self):
        """
        Get the MFnAnimCurve object for the deviation
        attribute animCurve.

        .. note:: Returned object is Maya API 1.0.

        :returns: Maya animCurve function set.
        :rtype: maya.OpenMayaAnim.MFnAnimCurve or None
        """
        animFn = self._MFnAnimCurve_deviation
        if animFn is None:
            node = self.get_node()
            if node is None:
                msg = 'Could not get Marker node. self=%r'
                LOG.warning(msg, self)
                return animFn
            plug_name = '{0}.{1}'.format(node,
                                         const.MARKER_ATTR_LONG_NAME_DEVIATION)
            animCurves = maya.cmds.listConnections(plug_name,
                                                   type='animCurveTU') or []
            if len(animCurves) > 0:
                mobj = node_utils.get_as_object(animCurves[0])
                animFn = OpenMayaAnim.MFnAnimCurve(mobj)
        return animFn
Пример #18
0
    def redoIt(self):
        '''
        Get weights on mesh from skinCluster deformer passed in and return dictionary
        with all data stored.
        '''
        mSkinClsObject = self.__getSkinClusterObject(self.__mesh)

        #get the skincluster object
        self.__mFnScls = OpenMayaAnim.MFnSkinCluster(mSkinClsObject)

        #check which operation we want to return to the user
        if self.__returnWeights or self.__returnBlendWeights or self.__setBlendWeights:
            dagPath, components = self.__getComponents()

        if self.__returnWeights:
            influence = None
            if self.__returnInfluenceWeights:
                influence = self._influnceNode
            weights = self.__getWeights(dagPath, components, influence)
            self.setResult(weights)
            self.getCurrentResult(OpenMaya.MDoubleArray())
        elif self.__returnBlendWeights:
            weights = self.__getBlendWeights(dagPath, components)
            self.setResult(weights)
            self.getCurrentResult(OpenMaya.MDoubleArray())
        elif self.__returnInfluence:
            influenceNames = self.__getInfluences()
            self.setResult(influenceNames)
            self.getCurrentResult(list())
        elif self.__setVertWeights:
            self.__setWeights(self.__weights, self.__influenceNames, True)
        elif self.__setVertBlendWeights:
            self.__setBlendWeights(dagPath, components, self.__blendWeights)
Пример #19
0
def getGeomIndex(geometry, deformer):
    '''
	Returns the geometry index of a shape to a specified deformer.
	@param geometry: Name of shape or parent transform to query
	@type geometry: str
	@param deformer: Name of deformer to query
	@type deformer: str
	'''
    # Verify input
    if not isDeformer(deformer):
        raise Exception('Object "' + deformer + '" is not a valid deformer!')

    # Check geometry
    geo = geometry
    if mc.objectType(geometry) == 'transform':
        try:
            geometry = mc.listRelatives(geometry, s=True, ni=True, pa=True)[0]
        except:
            raise Exception('Object "' + geo + '" is not a valid geometry!')
    geomObj = glTools.utils.base.getMObject(geometry)

    # Get geometry index
    deformerObj = glTools.utils.base.getMObject(deformer)
    deformerFn = OpenMayaAnim.MFnGeometryFilter(deformerObj)
    try:
        geomIndex = deformerFn.indexForOutputShape(geomObj)
    except:
        raise Exception('Object "' + geometry +
                        '" is not affected by deformer "' + deformer + '"!')

    # Retrun result
    return geomIndex
Пример #20
0
def getAffectedGeometry(deformer, returnShapes=False, fullPathNames=False):
    # Verify input
    if not isDeformer(deformer):
        raise UserInputError('Object "' + deformer +
                             '" is not a valid deformer!')

    # Clear return array (dict)
    affectedObjects = {}

    # Get MFnGeometryFilter
    deformerObj = getDependNode(deformer)
    geoFilterFn = oma.MFnGeometryFilter(deformerObj)

    # Get output geometry
    outputObjectArray = om.MObjectArray()
    geoFilterFn.getOutputGeometry(outputObjectArray)

    # Iterate through affected geometry
    for i in xrange(outputObjectArray.length()):
        outputIndex = geoFilterFn.indexForOutputShape(outputObjectArray[i])
        outputNode = om.MFnDagNode(outputObjectArray[i])

        # Check return shapes
        if not returnShapes: outputNode = om.MFnDagNode(outputNode.parent(0))

        # Check full path
        if fullPathNames:
            affectedObjects[outputNode.fullPathName()] = outputIndex
        else:
            affectedObjects[outputNode.partialPathName()] = outputIndex

    # Return result
    return affectedObjects
Пример #21
0
def getDeformerFn(deformer):
    # Get MFnWeightGeometryFilter
    deformerObj = getDependNode(deformer)
    deformerFn = oma.MFnWeightGeometryFilter(deformerObj)

    # Return result
    return deformerFn
Пример #22
0
    def setMembershipList(self, membershipList):
        '''
        method for setting membership list for deformer sets
        input python bool list (membership list) 
        '''

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

        addSelectionList = om.MSelectionList()
        removeSelectionList = om.MSelectionList()
        vertItr = om.MItGeometry(self.meshPath)

        while not vertItr.isDone():

            index = vertItr.index()
            component = vertItr.currentItem()

            if membershipList[index]:

                addSelectionList.add(self.meshPath, component)

            else:

                removeSelectionList.add(self.meshPath, component)

            vertItr.next()

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

        if not removeSelectionList.isEmpty():
            deformerSetFn.removeMembers(removeSelectionList)
Пример #23
0
def getLatticePoints(latticePath):

    selectionList = om.MSelectionList()

    latticeFn = oma.MFnLattice(latticePath)

    utilS = om.MScriptUtil()
    SintPtr = utilS.asUintPtr()

    utilT = om.MScriptUtil()
    TintPtr = utilT.asUintPtr()

    utilU = om.MScriptUtil()
    UintPtr = utilU.asUintPtr()

    latticeFn.getDivisions(SintPtr, TintPtr, UintPtr)

    SVal = utilS.getUint(SintPtr)
    TVal = utilT.getUint(TintPtr)
    UVal = utilU.getUint(UintPtr)

    for s in range(SVal):

        for u in range(UVal):

            for t in range(TVal):

                latticeShapeString = latticePath.fullPathName()
                component = getMObjectComponent('%s.pt[%i][%i][%i]' %
                                                (latticeShapeString, s, t, u))
                selectionList.add(latticePath, component, False)

    return selectionList
Пример #24
0
def get_set_members(deformer_name="", index=False, uv=False, position=False):
    """
    finds the deformers associated with the mesh name.
    :param deformer_name: <str> the name of the deformer to get set data from.
    :param index: <bool> if True, return index components.
    :param uv: <bool> if True, return UV components.
    :param position: <bool> if True, return position components.
    :return: <dict> setName: (array of components) data.
    """
    deform_fn = OpenMayaAnim.MFnGeometryFilter(
        object_utils.get_m_obj(deformer_name))
    set_obj = deform_fn.deformerSet()
    set_fn = OpenMaya.MFnSet(set_obj)

    members = OpenMaya.MSelectionList()
    set_fn.getMembers(members, False)

    sel_iter = OpenMaya.MItSelectionList(members)
    data_dict = {}
    while not sel_iter.isDone():
        path = OpenMaya.MDagPath()
        components = OpenMaya.MObject()
        sel_iter.getDagPath(path, components)
        data_dict[set_fn.name()] = mesh_utils.get_data(path,
                                                       components,
                                                       index=index,
                                                       uv=uv,
                                                       position=position)
        sel_iter.next()
    return data_dict
Пример #25
0
    def __init__(self, shape=None):
        """Constructor"""
        if not shape:
            try:
                shape = cmds.ls(sl=True)[0]
            except:
                raise RuntimeError('No shape selected')

        self.shape = getShape(shape)
        if not self.shape:
            raise RuntimeError('No shape connected to %s' % shape)

        # Get the skinCluster node attached to the shape
        self.node = SkinCluster.getSkinCluster(shape)
        if not self.node:
            raise ValueError('No skinCluster attached to %s' % self.shape)

        # Get the skinCluster MObject
        selectionList = OpenMaya.MSelectionList()
        selectionList.add(self.node)
        self.mobject = OpenMaya.MObject()
        selectionList.getDependNode(0, self.mobject)
        self.fn = OpenMayaAnim.MFnSkinCluster(self.mobject)
        self.data = {
            'weights': {},
            'blendWeights': [],
            'name': self.node,
        }
Пример #26
0
def trimTimeRange(start, end):

    animCtrl = oma.MAnimControl()
    startTime = om.MTime(start)
    endTime = om.MTime(end)
    animCtrl.setAnimationStartEndTime(startTime, endTime)
    animCtrl.setMinMaxTime(startTime, endTime)
Пример #27
0
def setClusterWeights(meshName, weights, clusterName=None):
    """ asdf """

    sel = OpenMaya.MSelectionList()
    sel.add(meshName)

    if clusterName is None:
        sel.add(getClusterFromMesh())
    else:
        sel.add(clusterName)

    dagPath = OpenMaya.MDagPath()
    mObj = OpenMaya.MObject()
    sel.getDagPath(0, dagPath)
    sel.getDependNode(1, mObj)

    fn_c = OpenMaya.MFnSingleIndexedComponent()
    c_obj = fn_c.create(OpenMaya.MFn.kMeshVertComponent)

    fnMesh = OpenMaya.MFnMesh(dagPath)
    numVerts = fnMesh.numVertices()

    indexArray = OpenMaya.MIntArray()

    for i in range(numVerts):
        indexArray.append(i)
    fn_c.addElements(indexArray)

    cluster = OpenMayaAnim.MFnWeightGeometryFilter()
    cluster.setObject(mObj)
    cluster.setWeight(dagPath, c_obj, weights)
Пример #28
0
def OutputAnimationData(obj, outfilepath, sf, ef):
    dagNode = OpenMaya.MFnDagNode(obj)
    dagPath = dagNode.fullPathName()

    namefix = cleanMayaLongName(dagPath[1:])

    outfilepath = 'C://'  #DEBUG DEBUG

    fHandle = open((outfilepath + '/' + namefix + '.chan'), "w")
    MANIM = OpenMayaAnim.MAnimControl()
    for i in range(sf, ef):
        MANIM.setCurrentTime(OpenMaya.MTime(i))
        fn = OpenMaya.MFnTransform(obj)

        TRANSLATION = fn.getTranslation(0)
        oiler = OpenMaya.MEulerRotation()
        ROTATION = fn.getRotation(oiler)
        ROTVEC = OpenMaya.MVector(oiler.asVector())
        line = (str(TRANSLATION[0]) + ' ' + str(TRANSLATION[1]) + ' ' +
                str(TRANSLATION[2]) + ' ' + str(radian_to_degree(ROTVEC[0])) +
                ' ' + str(radian_to_degree(ROTVEC[1])) + ' ' +
                str(radian_to_degree(ROTVEC[2])) + '\n')
        fHandle.write(line)
    fHandle.close()
    MANIM.setCurrentTime(OpenMaya.MTime(0))
Пример #29
0
  def __init__(self):
    self.skinCluster = ''
    self.obj = ''
    self.mitVex = ''
    
    # select the skinned geo
    selection = om.MSelectionList()
    om.MGlobal.getActiveSelectionList( selection )

    # get dag path for selection
    dagPath = om.MDagPath()
    components = om.MObject()
    array = om.MIntArray()
    selection.getDagPath( 0, dagPath, components )
    self.obj = dagPath
    dagPath.extendToShape()
    
    # currentNode is MObject to your mesh
    currentNode = dagPath.node()
    self.mitVtx = om.MItMeshVertex (dagPath)
    
    # get skincluster from shape
    try:
      itDG = om.MItDependencyGraph(currentNode, om.MFn.kSkinClusterFilter, om.MItDependencyGraph.kUpstream)
      while not itDG.isDone():
        oCurrentItem = itDG.currentItem()
        fnSkin = oma.MFnSkinCluster(oCurrentItem)
        self.skinCluster = fnSkin
        break
    except:
      om.MGlobal.displayError("No SkinCluster to paint on")
def get_influence_ids(skin_cluster):
    """
    Collects all influences and its ids from a skinCluster.
    
    Args:
        skin_cluster(string): A skinCluster's name.
    
    Returns:
        A dictionary: {id(int):inf_name(string)}
    """
    has_infs = cmds.skinCluster(skin_cluster, q=True, influence=True) or []
    if not has_infs:
        return []

    skin_cluster_node = to_m_object(skin_cluster)
    skin_cluster_fn = OpenMayaAnim.MFnSkinCluster(skin_cluster_node)

    # Collect influences
    inf_array = OpenMaya.MDagPathArray()
    skin_cluster_fn.influenceObjects(inf_array)

    # {inf_name(string):id(int)}
    inf_ids = {}

    for x in range(inf_array.length()):
        inf_path = inf_array[x].partialPathName()
        inf_id = int(skin_cluster_fn.indexForInfluenceObject(inf_array[x]))
        inf_ids[inf_id] = inf_path

    return inf_ids