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)
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
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)
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
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)
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()
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)
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 )
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 )
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
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()
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()
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('输入的变形节点不是正确的对象(簇,软变形...)')
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
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
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()
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
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)
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
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
def getDeformerFn(deformer): # Get MFnWeightGeometryFilter deformerObj = getDependNode(deformer) deformerFn = oma.MFnWeightGeometryFilter(deformerObj) # Return result return deformerFn
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)
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
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
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, }
def trimTimeRange(start, end): animCtrl = oma.MAnimControl() startTime = om.MTime(start) endTime = om.MTime(end) animCtrl.setAnimationStartEndTime(startTime, endTime) animCtrl.setMinMaxTime(startTime, endTime)
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)
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))
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