Пример #1
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()
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
    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)
Пример #5
0
    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()
Пример #6
0
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)
Пример #7
0
    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
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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)
Пример #11
0
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
Пример #12
0
 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)
Пример #13
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)
Пример #14
0
 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
Пример #15
0
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)
Пример #16
0
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)
Пример #17
0
 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
Пример #18
0
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
Пример #19
0
 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)
Пример #20
0
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)
Пример #21
0
 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)
Пример #22
0
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
Пример #23
0
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)
Пример #24
0
        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)
Пример #25
0
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)
Пример #26
0
 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
Пример #27
0
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)
Пример #28
0
    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)
Пример #29
0
    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()
Пример #30
0
 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