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 getWeightsFromEnvelope(self, origin_dag_path, envelope_dag_path, attribute=None): print 'origin_dag_path\t', origin_dag_path if not isinstance(origin_dag_path, OpenMaya.MDagPath): origin_dag_path = self.getDagPath(origin_dag_path) if not isinstance(envelope_dag_path, OpenMaya.MDagPath): envelope_dag_path = self.getDagPath(envelope_dag_path) mfn_origin_mesh = OpenMaya.MFnMesh(origin_dag_path) origin_point_array = OpenMaya.MFloatPointArray() mfn_origin_mesh.getPoints(origin_point_array, OpenMaya.MSpace.kObject) if attribute: node, attribute = attribute.split('.') mplug = self.getPlug(node, attribute) mplug.setInt(mplug.asInt() + 1) mfn_envelope_mesh = OpenMaya.MFnMesh(envelope_dag_path) envelope_point_array = OpenMaya.MFloatPointArray() mfn_envelope_mesh.getPoints( envelope_point_array, OpenMaya.MSpace.kObject) if attribute: mplug.setInt(mplug.asInt() - 1) if envelope_point_array.length() != origin_point_array.length(): raise Exception('# Target does not match with base.') return weights = OpenMaya.MFloatArray() for index in range(origin_point_array.length()): origin_mvector = OpenMaya.MVector(origin_point_array[index]) envelope_mvector = OpenMaya.MVector(envelope_point_array[index]) length = origin_mvector - envelope_mvector weights.append(length.length()) return weights
def read_weight(self, mcluster): mfn_weight_filter = OpenMayaAnim.MFnWeightGeometryFilter(mcluster) dag_paths = self.getDagPathMembers(mcluster) weights = {} for index in range(dag_paths.length()): mit_geometry = OpenMaya.MItGeometry(dag_paths[index]) membership_list = [] weight_list = [] while not mit_geometry.isDone(): component = mit_geometry.currentItem() float_array = OpenMaya.MFloatArray() membership = self.hasMembership(mcluster, dag_paths[index], component) if membership: mfn_weight_filter.getWeights(dag_paths[index], component, float_array) else: float_array = [0, 0, 0] membership_list.append(membership) weight_list.append(float_array[0]) mit_geometry.next() weight = {} weight['weights'] = weight_list weight['memberships'] = membership_list geometry = dag_paths[index].fullPathName().encode() weights.setdefault(geometry, weight) return weights
def skin_cluster(self): source_mobject = self.getMObject(self.source_geometry) if not self.target_deformers: self.target_deformers = [] for x in range(len(self.source_deformers)): self.target_deformers.append(None) loop = min([len(self.target_deformers), len(self.source_deformers)]) from smartDeformer_maya2019.modules import skincluster skinclu = skincluster.Skincluster() for index in range(loop): _targt_deformer = self.target_deformers[index] if not self.target_deformers[index]: name = '%s_skincluster_cluster' % self.source_deformers[ index].replace('.', '_') cluster, clusterhandle = self.create(name, clear=True) x, y, z = self.getJointPosition(self.source_deformers[index]) self.setClusterPosition(clusterhandle, [x, y, z]) _targt_deformer = clusterhandle joint_dag_path = self.getDagPath(self.source_deformers[index]) cluster_mobject = self.getDependences(_targt_deformer, OpenMaya.MFn.kClusterFilter) weight_data = skinclu.get_weight(joint_dag_path) weight_object = weight_data['geometry'].keys()[0] weights = weight_data['geometry'][weight_object]['weights'] weight_array = OpenMaya.MFloatArray() mscript_util = OpenMaya.MScriptUtil() mscript_util.createFloatArrayFromList(weights, weight_array) self.setClusterWeights(self.target_geometrys[0], cluster_mobject[0], weight_array)
def setWeightsForLattice(self,influence,weightList): ''' method for setting skinWeight value for lattice points input MDagPath (influence) input python float list (weightList) ''' latticePntSelection = GenAPI.getLatticePoints(self.shapePath) selectionItr = om.MItSelectionList(latticePntSelection) index = self.skinclusterFn.indexForInfluenceObject(influence) oldValues = om.MFloatArray() mdagPath = om.MDagPath() component = om.MObject() itrIndex = 0 while not selectionItr.isDone(): selectionItr.getDagPath(mdagPath,component) self.skinclusterFn.setWeights(self.shapePath,component,index,weightList[itrIndex],True,oldValues) itrIndex += 1 selectionItr.next()
def setWeights(deformer,weights,geometry=None): ''' Set the weights for the specified deformer using the input value list @param deformer: Deformer to set weights for @type deformer: str @param weights: Input weight value list @type weights: list @param geometry: Target geometry to apply weights to. If None, use first affected geometry. @type geometry: str ''' # Check Deformer if not isDeformer(deformer): raise Exception('Object "'+deformer+'" is not a valid deformer!') # Check Geometry if not geometry: geometry = getAffectedGeometry(deformer).keys()[0] # Get Geometry Shape geoShape = geometry geoObj = glTools.utils.base.getMObject(geometry) if geometry and geoObj.hasFn(OpenMaya.MFn.kTransform): geoShape = mc.listRelatives(geometry,s=True,ni=True)[0] # Get deformer function set and members deformerFn = getDeformerFn(deformer) deformerSetMem = getDeformerSetMembers(deformer,geoShape) # Build weight array weightList = OpenMaya.MFloatArray() [weightList.append(i) for i in weights] # Set weights deformerFn.setWeight(deformerSetMem[0],deformerSetMem[1],weightList)
def getWeightList(self): ''' returns current weightList of mesh output python float list (weightList) ''' deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject) vertItr = om.MItGeometry(self.meshPath) weightList = [] while not vertItr.isDone(): component = vertItr.currentItem() if not self.checkMembership(component): weightList.append(0) else: floatArray = om.MFloatArray() deformerWeightFn.getWeights(self.meshPath, component, floatArray) weightList.append(floatArray[0]) vertItr.next() return weightList
def set_weights(deformer, dataWeights): """Set the weight map from a given deformers It supports multiple objects/weight maps for one sigle deformer Args: deformer (PyNode or str): Name or pynode of a deformer with weight map """ if isinstance(deformer, string_types): deformer = pm.PyNode(deformer) fnSet = OpenMaya.MFnSet(deformer.__apimfn__().deformerSet()) members = OpenMaya.MSelectionList() fnSet.getMembers(members, False) dagPath = OpenMaya.MDagPath() components = OpenMaya.MObject() members.getDagPath(0, dagPath, components) for m in range(members.length()): dagPath = OpenMaya.MDagPath() members.getDagPath(m, dagPath, components) dw = dataWeights[dagPath.fullPathName()] weights = OpenMaya.MFloatArray(len(dw)) for x in range(len(dw)): weights.set(dw[x], int(x)) deformer.__apimfn__().setWeight(dagPath, components, weights)
def getWeights(deformer,geometry=None): ''' Get the weights for the specified deformer. Weights returned as a python list object @param deformer: Deformer to get weights for @type deformer: str @param geometry: Target geometry to get weights from @type geometry: str ''' # Check Deformer if not isDeformer(deformer): raise Exception('Object "'+deformer+'" is not a valid deformer!') # Check Geometry if not geometry: geometry = getAffectedGeometry(deformer).keys()[0] # Get Geometry Shape geoShape = geometry if geometry and mc.objectType(geoShape) == 'transform': geoShape = mc.listRelatives(geometry,s=True,ni=True)[0] # Get deformer function set and members deformerFn = getDeformerFn(deformer) deformerSetMem = getDeformerSetMembers(deformer,geoShape) # Get weights weightList = OpenMaya.MFloatArray() deformerFn.getWeights(deformerSetMem[0],deformerSetMem[1],weightList) # Return result return list(weightList)
def setWeights(deformer,weights,geometry=''): ''' Set the weights for the specified deformer using the input value list @param deformer: Deformer to set weights for @type deformer: str @param weights: Input weight value list @type weights: list @param geometry: Target geometry to apply weights to @type geometry: str ''' # Get geoShape geoShape = geometry geoObj = glTools.utils.base.getMObject(geometry) if geometry and geoObj.hasFn(OpenMaya.MFn.kTransform): geoShape = mc.listRelatives(geometry,s=True,ni=True)[0] # Get deformer function set and members deformerFn = getDeformerFn(deformer) deformerSetMem = getDeformerSetMembers(deformer,geoShape) # Build weight array weightList = OpenMaya.MFloatArray() [weightList.append(i) for i in weights] # Set weights deformerFn.setWeight(deformerSetMem[0],deformerSetMem[1],weightList)
def get_weights(deformer): """Get the weight map from a given deformers It supports multiple objects/weight maps for one sigle deformer Args: deformer (PyNode or str): Name or pynode of a deformer with weight map Returns: dict: The weights dictionary """ if isinstance(deformer, string_types): deformer = pm.PyNode(deformer) fnSet = OpenMaya.MFnSet(deformer.__apimfn__().deformerSet()) members = OpenMaya.MSelectionList() fnSet.getMembers(members, False) dagPath = OpenMaya.MDagPath() components = OpenMaya.MObject() members.getDagPath(0, dagPath, components) dataDic = {} for m in range(members.length()): dagPath = OpenMaya.MDagPath() members.getDagPath(m, dagPath, components) weights = OpenMaya.MFloatArray() deformer.__apimfn__().getWeights(dagPath, components, weights) dataDic[dagPath.fullPathName()] = [ weights[i] for i in range(weights.length()) ] return dataDic
def to_skincluster(self): source_mobject = self.getMObject(self.source_geometry) if not self.target_deformers: self.target_deformers = [] for x in range(len(self.source_deformers)): self.target_deformers.append(None) loop = min([len(self.target_deformers), len(self.source_deformers)]) for index in range(loop): _targt_deformer = self.target_deformers[index] if not self.target_deformers[index]: name = '%s_skincluster_joint' % self.source_deformers[ index].replace('.', '_') joint_dag_path, joint_name = self.create(name, clear=True) x, y, z = self.getJointPosition(self.source_deformers[index]) self.setJointPosition(joint_name, [x, y, z]) self.addInfluence(joint_name, self.target_geometrys) _targt_deformer = joint_name jnt_dag_path = self.getDagPath(self.source_deformers[index]) weight_data = self.get_weight(jnt_dag_path) weight_object = weight_data['geometry'].keys()[0] weights = weight_data['geometry'][weight_object]['weights'] weight_array = OpenMaya.MFloatArray() mscript_util = OpenMaya.MScriptUtil() mscript_util.createFloatArrayFromList(weights, weight_array) for each_geometry in self.target_geometrys: self.setSkinclusterWeights(each_geometry, _targt_deformer, weight_array)
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 getWeightsFromLattice(self,influence): ''' method for returning weightlist of given influence from a lattice input MDagPath (influence) output python list (weights) ''' weightList = [] latticePntSelection = GenAPI.getLatticePoints(self.shapePath) selectionItr = om.MItSelectionList(latticePntSelection) index = self.skinclusterFn.indexForInfluenceObject(influence) weights = om.MFloatArray() intArray = om.MIntArray() intArray.append(index) mdagPath = om.MDagPath() component = om.MObject() while not selectionItr.isDone(): selectionItr.getDagPath(mdagPath,component) self.skinclusterFn.getWeights(self.shapePath,component,index,weights) weightList.append(weights[0]) selectionItr.next() return weightList
def setWeights(deformer, weights, geometry=None): ''' Set the weights for the specified deformer using the input value list :param deformer str: Deformer to set weights for :param weights list: Input weight value list :param geometry str: Target geometry to apply weights to. If None, use first affected geometry. ''' # Verify input if not isDeformer(deformer): raise Exception('Object {0} is not a valid deformer!'.format(deformer)) # Check Geometry if not geometry: geometry = getAffectedGeometry(deformer).keys()[0] # Get Geometry Shape geoShape = geometry geoObj = getMObject(geometry) if geometry and geoObj.hasFn(om.MFn.kTransform): geoShape = cmds.listRelatives(geometry, s=True, ni=True)[0] # Get deformer function set and members deformerFn = getDeformerFn(deformer) deformerSetMem = getDeformerSetMembers(deformer, geoShape) # Build weight array weightList = om.MFloatArray() [weightList.append(i) for i in weights] # Set weights deformerFn.setWeight(deformerSetMem[0], deformerSetMem[1], weightList)
def getWeights(deformer, geometry=None): ''' Get the weights for the specified deformer :param deformer str: Deformer to get weights for :param geometry str: Target geometry to get weights from :return: list of weights for specified deformer :rtype: list ''' # Verify input if not isDeformer(deformer): raise Exception('Object {0} is not a valid deformer!'.format(deformer)) # Check Geometry if not geometry: geometry = getAffectedGeometry(deformer).keys()[0] # Get Geometry Shape geoShape = geometry if geometry and cmds.objectType(geoShape) == 'transform': geoShape = cmds.listRelatives(geometry, s=True, ni=True)[0] # Get deformer function set and members deformerFn = getDeformerFn(deformer) deformerSetMem = getDeformerSetMembers(deformer, geoShape) # Get weights weightList = om.MFloatArray() deformerFn.getWeights(deformerSetMem[0], deformerSetMem[1], weightList) # Return result return list(weightList)
def get_polygon_mesh(self, m_dag_path): mfn_mesh = OpenMaya.MFnMesh(m_dag_path) point_array = OpenMaya.MFloatPointArray() mfn_mesh.getPoints(point_array, OpenMaya.MSpace.kObject) vertex_count = OpenMaya.MIntArray() vertex_array = OpenMaya.MIntArray() mfn_mesh.getVertices(vertex_count, vertex_array) set_names = [] mfn_mesh.getUVSetNames(set_names) uvs_data = {} for index in range(len(set_names)): u_array = OpenMaya.MFloatArray() v_array = OpenMaya.MFloatArray() mfn_mesh.getUVs(u_array, v_array, set_names[index]) uv_counts = OpenMaya.MIntArray() uv_ids = OpenMaya.MIntArray() mfn_mesh.getAssignedUVs(uv_counts, uv_ids, set_names[index]) current_set = {} current_set['set_name'] = set_names[index] current_set['u_array'] = list(u_array) current_set['v_array'] = list(v_array) current_set['uv_counts'] = list(uv_counts) current_set['uv_ids'] = list(uv_ids) uvs_data.setdefault(index, current_set) vertice_list = [] for index in range(point_array.length()): vertice_list.append((point_array[index].x, point_array[index].y, point_array[index].z, point_array[index].w)) parent_mobject = mfn_mesh.parent(0) parent_mfn_dag_node = OpenMaya.MFnDagNode(parent_mobject) data = {} data['name'] = { 'transform': parent_mfn_dag_node.name().encode(), 'shape': mfn_mesh.name().encode() } data['vertices'] = vertice_list data['vertex_count'] = list(vertex_count) data['vertex_list'] = list(vertex_array) data['uvs'] = uvs_data data['num_edges'] = mfn_mesh.numEdges() data['num_face_vertices'] = mfn_mesh.numFaceVertices() data['num_polygons'] = mfn_mesh.numPolygons() data['num_normals'] = mfn_mesh.numNormals() data['num_uv_sets'] = mfn_mesh.numUVSets() data['num_uvs'] = mfn_mesh.numUVs() data['num_vertices'] = mfn_mesh.numVertices() return data
def validateUVs(mesh): ''' ''' # Initiate check check = 0 # Get meshFn meshFn = glTools.utils.mesh.getMeshFn(mesh) # Get UV Sets uvSetList = mc.polyUVSet(mesh, q=True, allUVSets=True) if not uvSetList: print('No UV Set : ' + mesh) check += 1 for uvSet in uvSetList: # Get UV values uArray = OpenMaya.MFloatArray() vArray = OpenMaya.MFloatArray() meshFn.getUVs(uArray, vArray, uvSet) # Check empty UV set if not uArray.length() and not vArray.length(): print('Empty UV Set : ' + mesh + ' - ' + uvSet) check += 1 # Check U values for i in range(uArray.length()): if math.isnan(uArray[i]): print('Found NaN : ' + mesh + '.uv[' + str(i) + ']') check += 1 if math.isinf(uArray[i]): print('Found INF : ' + mesh + '.uv[' + str(i) + ']') check += 1 # Check V values for i in range(vArray.length()): if math.isnan(vArray[i]): print('Found NaN : ' + mesh + '.uv[' + str(i) + ']') check += 1 if math.isinf(vArray[i]): print('Found INF : ' + mesh + '.uv[' + str(i) + ']') check += 1 # Return result return check
def write_weight(self, joint_dag_path, geometry_data): for each_geometry, geometrys in geometry_data.items(): weights = geometrys['weights'] mfloat_array = OpenMaya.MFloatArray() mscript_util = OpenMaya.MScriptUtil() mscript_util.createFloatArrayFromList(weights, mfloat_array) self.setSkinclusterWeights(each_geometry, joint_dag_path, mfloat_array)
def setCurvePreset(attributeName, valueString): nodeName = attributeName.split(".", 1) thisNode = getMObjectFromName(nodeName[0]) arrayValues = valueString.split(",", -1) val = om.MFloatArray() pos = om.MFloatArray() for i in range(0, len(arrayValues), 2): position = float(arrayValues[i]) pos.append(position) curVal = float(arrayValues[i + 1]) val.append(curVal) curveWidget = getFalloffCurveAttr(thisNode, nodeName[1]) setCurveAttr(curveWidget, pos, val)
def setWeightList(self,influence,weightList): ''' set influence value ONLY WORKS FOR POLY MESH input MDagPath (influence) input python float list (weightList) ''' index = self.indexForInfluenceObject(influence) mIntArray = om.MIntArray() mIntArray.append(index) util = om.MScriptUtil() weights = om.MFloatArray() util.createFloatArrayFromList(weightList,weights) oldValues = om.MFloatArray() verts = GenAPI.getMObjectAllVerts(self.shape) self.skinclusterFn.setWeights(self.shapePath,verts,mIntArray,weights,True,oldValues)
def createRopeUvs( ropesCount, pointsCount, ropeStrength, uvCapSize ): """docstring for createRopeUvs""" angle = om.MAngle(( 180.0 / ropesCount ), om.MAngle.kDegrees) distanceToMoveRope = math.cos(om.MAngle(( 180.0 / ropesCount ), om.MAngle.kDegrees).asRadians() ) singleRopeRadius = math.sin( angle.asRadians() ) uArray = om.MFloatArray() vArray = om.MFloatArray() for d in range( 1, ropesCount + 1 ): ropePoints = createHalfRope( pointsCount, singleRopeRadius ) for ropP in range( ropePoints.length() ): ropP = ropePoints[ ropP ] ropP = om.MVector( ropP.x, ropP.y, ropP.z * ropeStrength ) + om.MVector( 0,0,-1 ) * distanceToMoveRope ropV = om.MVector( ropP ).rotateBy( om.MVector.kYaxis, om.MAngle(( 360.0 / ropesCount * d ), om.MAngle.kDegrees).asRadians() ) ropV = ropV * 0.5 * uvCapSize uArray.append( ropV.x + 0.5 ) vArray.append( ropV.z + 0.5 ) return uArray, vArray
def resetTypeCurve(attributeName, curveName): nodeName = attributeName.split(".", 1) thisNode = getMObjectFromName(nodeName[0]) val = om.MFloatArray() pos = om.MFloatArray() if curveName == "extrudeCurveCurve": pos.append(0.0) pos.append(0.333) pos.append(0.667) pos.append(1.0) val.append(0.50) val.append(0.50) val.append(0.50) val.append(0.50) #attribute name curveWidget = getFalloffCurveAttr(thisNode, "extrudeCurve") setCurveAttr(curveWidget, pos, val) else: pos.append(0.0) pos.append(0.5) pos.append(1.0) pos.append(1.0) val.append(1.0) val.append(1.0) val.append(0.50) val.append(0.00) if curveName == "frontBevelCurveCurve": curveWidget = getFalloffCurveAttr(thisNode, "frontBevelCurve") setCurveAttr(curveWidget, pos, val) elif curveName == "backBevelCurveCurve": curveWidget = getFalloffCurveAttr(thisNode, "backBevelCurve") setCurveAttr(curveWidget, pos, val) elif curveName == "offsetBevelCurveCurve": curveWidget = getFalloffCurveAttr(thisNode, "offsetBevelCurve") setCurveAttr(curveWidget, pos, val) elif curveName == "outerBevelCurveCurve": curveWidget = getFalloffCurveAttr(thisNode, "outerBevelCurve") setCurveAttr(curveWidget, pos, val)
def searchArea(startPoint, endPoint, step, rayDirection, voxelCenterPositions): for point_Zcoord in floatRange(startPoint.z, endPoint.z, step): for point_Xcoord in floatRange(startPoint.x, endPoint.x, step): for point_Ycoord in floatRange(startPoint.y, endPoint.y, step): #create ray source and direction raySource = OpenMaya.MFloatPoint( point_Xcoord, point_Ycoord, point_Zcoord) #rayDirection = OpenMaya.MFloatVector(0,0,-1) hitPointArray = OpenMaya.MFloatPointArray() hitRayParams = OpenMaya.MFloatArray() tolerance = 1e-6 mMeshObj.allIntersections( raySource, #raySource rayDirection, #rayDirection None, #faceIds do not need to filter the face None, #triDis do not need to filter the tris False, # do not need to sort the IDs OpenMaya.MSpace. kTransform, #ray source and direction are specified in the mesh local coordinates float(9999), #the range of the ray False, #do not need to test both directions None, #do not need accelParams False, #do not need to sort hits hitPointArray, #return the hit point array hitRayParams, #return hit point distance params None, #do not need hit faces ids None, #do not need hit tris ids None, #do not need barycentric coordinates of faces None, #do not need barycentric coordinates of tris tolerance #hit tolerance ) #add the inside raysouce into list for voxel placement if (hitPointArray.length() % 2 == 1): voxelCenterPositions.append(raySource) #also need to query the intersection geometry color #find nearest intersection point #http://www.chadvernon.com/blog/resources/maya-api-programming/mscriptutil/ #Since the Maya API is designed as a C++ library, it has many pointers and references #that are passed into and returned from various functions. uvPoint = util.asFloat2Ptr() mPoint = OpenMaya.MPoint(raySource) mMeshObj.getUVAtPoint(mPoint, uvPoint) if self.skinCluster: pointWeight = self.getClosetPointWeight(mPoint) pointBlendWeight = self.getClosetPointBlendWeight( mPoint) voxelWeights.append(pointWeight) voxelBlendWeights.append(pointBlendWeight) u = util.getFloat2ArrayItem(uvPoint, 0, 0) v = util.getFloat2ArrayItem(uvPoint, 0, 1) uv = [u, v] uvArray.append(uv)
def bdGetComMain(): mDagObject = om.MDagPath() mSelList = om.MSelectionList() mDagPointInside = om.MDagPath() mSelList.add('pointInsideLoc') mSelList.getDagPath(0, mDagPointInside) #mDagPointInside.pop() mTransformPointInside = om.MFnTransform(mDagPointInside) mPointInsideVector = mTransformPointInside.getTranslation(om.MSpace.kWorld) print mDagPointInside.fullPathName() om.MGlobal.getActiveSelectionList(mSelList) numSel = mSelList.length() if numSel == 1: mSelList.getDagPath(0, mDagObject) #print mDagObject.fullPathName() if mDagObject.hasFn(om.MFn.kMesh): mFnMesh = om.MFnMesh(mDagObject) volumes = om.MFloatArray() centers = om.MVectorArray() for i in range(mFnMesh.numPolygons()): mVertsId = om.MIntArray() mFnMesh.getPolygonVertices(i, mVertsId) mVertPosArray = om.MVectorArray() for vert in mVertsId: mVertPos = om.MPoint() mFnMesh.getPoint(vert, mVertPos) mPointVector = om.MVector(mVertPos) mVertPosArray.append(mPointVector) volumes.append( bdCalculateVolume(mVertPosArray, mPointInsideVector)) centers.append( bdCalculateCenter(mVertPosArray, mPointInsideVector)) totalVolume = 0 for vol in volumes: totalVolume += vol print 'Total Volume :', totalVolume centerMass = om.MVector() for i in range(mFnMesh.numPolygons()): centerMass += centers[i] * volumes[i] centerMass = centerMass / totalVolume print centerMass.x, centerMass.y, centerMass.z mSelList.add('comLoc') mComLoc = om.MDagPath() mSelList.getDagPath(1, mComLoc) mTransformComLoc = om.MFnTransform(mComLoc) print mComLoc.fullPathName() mTransformComLoc.translateBy(centerMass, om.MSpace.kWorld)
def createEmptyWeights(self, dag_path): if not isinstance(dag_path, OpenMaya.MDagPath): dag_path = self.getDagPath(dag_path) mmit_mesh_vertex = OpenMaya.MItMeshVertex(dag_path) weights = OpenMaya.MFloatArray() memberships = OpenMaya.MIntArray() while not mmit_mesh_vertex.isDone(): weights.append(0) memberships.append(False) mmit_mesh_vertex.next() return weights, memberships
def setDeformerWeigth(DeformerNode,geo,weights): #获得一个组件列表 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 path = om.MDagPath() comp = om.MObject() sel_list.getDagPath(0,path,comp) #获得变形节点 obj = om.MObject() sel_list.add(DeformerNode) sel_list.getDependNode(1,obj) try: weightGeo = oma.MFnWeightGeometryFilter(obj) except: raise EOFError('输入的变形节点不是正确的对象(簇,软变形...)') float_array = om.MFloatArray() append = float_array.append try: [append(i) for i in weights] except: raise EOFError('输入权重列表错误') try: undoIt_float_array = om.MFloatArray() weightGeo.getWeights(path,comp,undoIt_float_array) except: raise EOFError('获得原始权重列表失败') doIt_def = functools.partial(weightGeo.setWeight,path,comp,float_array) undoIt_def = functools.partial(weightGeo.setWeight,path,comp,undoIt_float_array) return cmc.addCommand(doIt_def,undoIt_def)
def postConstructor(self): """This is called when the node has been added to the scene.""" # Populate bulge shape ramp attribute with default values. node = self.thisMObject() bulgeshape_handle = OpenMaya.MRampAttribute(node, self.bulgeshape_attr) positions = OpenMaya.MFloatArray() values = OpenMaya.MFloatArray() interps = OpenMaya.MIntArray() positions.append(float(0.0)) positions.append(float(1.0)) values.append(float(0.0)) values.append(float(1.0)) interps.append(OpenMaya.MRampAttribute.kSpline) interps.append(OpenMaya.MRampAttribute.kSpline) bulgeshape_handle.addEntries(positions, values, interps)
def mirrorDeformerWeightSingleMesh(self, axis='x', direction='>', table=[-1, 1, 1]): ''' method for mirroring deformer weights for one deformer...only works on single symetrical mesh input python string (axis) input python int list (table) ''' vertItr = om.MItMeshVertex(self.meshPath) deformerWeightFn = oma.MFnWeightGeometryFilter(self.deformerObject) util = om.MScriptUtil() progressWin = UILib.ProgressWin() progressWin.itr = vertItr.count() progressWin.setTitle('Mirror Deformer') while not vertItr.isDone(): inComponent = vertItr.currentItem() currentPosition = vertItr.position(om.MSpace.kWorld) if eval('currentPosition.%s%s0.00000' % (axis, direction)): currentIndex = vertItr.index() inComponent = vertItr.currentItem() mirrorVert = MeasuringLib.MeasuringTool.getSymVert( self.meshPath, currentIndex, table) weights = om.MFloatArray() tempItr = om.MItMeshVertex(self.meshPath) intPtr = util.asIntPtr() tempItr.setIndex(mirrorVert[0], intPtr) outComponent = tempItr.currentItem() if self.checkMembership(inComponent): self.addComponentToMembershipList(outComponent) deformerWeightFn.getWeights(self.meshPath, inComponent, weights) deformerWeightFn.setWeight(self.meshPath, outComponent, weights) progressWin.inc = vertItr.index() progressWin.message = '%s.vtx[%i]' % (self.mesh, progressWin.inc) progressWin.progress() vertItr.next() progressWin.end()
def get_kuv(self, mobject): mfn_mesh = OpenMaya.MFnMesh(mobject) set_names = [] mfn_mesh.getUVSetNames(set_names) data = {} for index, set_name in enumerate(set_names): u_array = OpenMaya.MFloatArray() v_array = OpenMaya.MFloatArray() mfn_mesh.getUVs(u_array, v_array, set_name) uv_counts = OpenMaya.MIntArray() uv_ids = OpenMaya.MIntArray() mfn_mesh.getAssignedUVs(uv_counts, uv_ids, set_name) uvset_data = { 'u_array': list(u_array), 'v_array': list(v_array), 'uv_counts': list(uv_counts), 'uv_ids': list(uv_ids), 'order': index } data.setdefault(set_name, uvset_data) return data