def growWithWarning(self, log=False): ## This grow function will increase total size if required. self.applyUiNumbers() ## Double the value of the UI field f = self.widgets['spacingFloatField'] f.setValue(2.0 * f.getValue()) ## Double the actual grid spacing MmmmToolsMod.Static.Grid.grow(setManip=True, log=log) ## Check to make sure the spacing isn't too big ## if the grid spacing is too large, adjust the whole grid size to accomadate spacingOfActualGrid = pm.grid(query=True, spacing=True) / pm.grid( query=True, divisions=True) wholeSizeOfActualGrid = pm.grid(query=True, size=True) multiplier = self.getMultiplierFromUi() w = self.widgets['wholeSizeFloatField'] if spacingOfActualGrid > wholeSizeOfActualGrid: spacing = self.getSpacingFromUi() newWholeSizeNoMultiplier = spacing newWholeSizeWithMultiplier = newWholeSizeNoMultiplier * self.getMultiplierFromUi( ) pm.grid(size=newWholeSizeWithMultiplier) w.setValue(newWholeSizeNoMultiplier) if log: pm.warning("(You can safely ignore this) Grid size set to: " + str(MmmmToolsMod.Static.Grid.getSpacing()))
def growWithWarning(self, log=False): ## This grow function will increase total size if required. self.applyUiNumbers() ## Double the value of the UI field f = self.widgets['spacingFloatField'] f.setValue( 2.0 * f.getValue() ) ## Double the actual grid spacing MmmmToolsMod.Static.Grid.grow(setManip=True,log=log) ## Check to make sure the spacing isn't too big ## if the grid spacing is too large, adjust the whole grid size to accomadate spacingOfActualGrid = pm.grid( query=True, spacing=True ) / pm.grid( query=True, divisions=True ) wholeSizeOfActualGrid = pm.grid( query=True, size=True ) multiplier=self.getMultiplierFromUi() w = self.widgets['wholeSizeFloatField'] if spacingOfActualGrid>wholeSizeOfActualGrid: spacing = self.getSpacingFromUi() newWholeSizeNoMultiplier = spacing newWholeSizeWithMultiplier = newWholeSizeNoMultiplier * self.getMultiplierFromUi() pm.grid( size=newWholeSizeWithMultiplier ) w.setValue( newWholeSizeNoMultiplier ) if log: pm.warning( "(You can safely ignore this) Grid size set to: "+ str(MmmmToolsMod.Static.Grid.getSpacing() ) )
def main(): sel = pm.ls(os=True, fl=True) if len(sel) != 3: pm.warning("Select 3 vertices in order of origin, x, and y") return shape = pm.listRelatives(sel[0], parent=True)[0] transformNode = pm.listRelatives(shape, parent=True)[0] piv = pm.xform(transformNode, q=True, ws=True, rp=True) p0 = sel[0].getPosition() p1 = sel[1].getPosition() p2 = sel[2].getPosition() X = p1 - p0 # X-axis Y = p2 - p0 # Y-axis Z = X ^ Y # Z-axis P = pm.datatypes.Point(piv[0], piv[1], piv[2]) X.normalize() Y.normalize() Z.normalize() M = pm.datatypes.Matrix( X.x, X.y, X.z, 0, Y.x, Y.y, Y.z, 0, Z.x, Z.y, Z.z, 0, P.x, P.y, P.z, 1) pm.xform(transformNode, matrix=M.inverse()) pm.select(transformNode, r=True) pm.makeIdentity(apply=True, t=True, r=True, s=False, n=False) pm.xform(transformNode, ws=True, piv=(0, 0, 0)) pm.xform(transformNode, matrix=M)
def shrinkWithWarning(self, log=False): self.applyUiNumbers() ## Half the UI fields f = self.widgets['spacingFloatField'] f.setValue( 0.5 * f.getValue() ) ## Half the actual Maya size MmmmToolsMod.Static.Grid.shrink(setManip=True,log=log) if log: pm.warning( "(You can safely ignore this) Grid size set to: "+ str(MmmmToolsMod.Static.Grid.getSpacing() ) )
def Create(obj, targetColor, control, attr, offset): shape = obj.getShape() name = obj.name() if (type(shape) == pm.Mesh): outVerts = [] verts = shape.vtx[:] for i, vert in enumerate(verts): if (vert.getColor() == targetColor): outVerts.append(vert) # this needs rewriting # what shells does this vert eblong to? # out of teh verts we have, which shell contains the most? uvShellsList = shape.getUvShellsIds()[0] uvList = [] outUvShellList = [] for vert in outVerts: uvs = vert.getUVIndices() for uv in uvs: uvList.append(uv) outUvShellList.append(uvShellsList[uv]) outUvList = [] mostCommonShell = Counter(outUvShellList).most_common(1)[0][0] for i, uvshell in enumerate(outUvShellList): if (uvshell == mostCommonShell): outUvList.append(shape.map[uvList[i]]) # print outUvList # return if (len(outVerts) > 0): moveUV = pm.polyMoveUV(outUvList)[0] moveUV.rename('%s_%s_moveUV' % (name, attr)) crv = pm.AnimCurveTU(name='%s_%s_animCurveTU' % (name, attr)) pm.setKeyframe(crv, t=0.0, v=0.0, itt='linear', ott='linear') pm.setKeyframe(crv, t=20.0, v=-offset * 20, itt='linear', ott='linear') control.attr(attr) >> crv.input crv.output >> moveUV.translateV return moveUV else: pm.warning('No verts found with color %s' % (targetColor)) else: pm.warning('The target must be a mesh')
def shrinkWithWarning(self, log=False): self.applyUiNumbers() ## Half the UI fields f = self.widgets['spacingFloatField'] f.setValue(0.5 * f.getValue()) ## Half the actual Maya size MmmmToolsMod.Static.Grid.shrink(setManip=True, log=log) if log: pm.warning("(You can safely ignore this) Grid size set to: " + str(MmmmToolsMod.Static.Grid.getSpacing()))
def ConnectToAttr(src, trgt, attr): moveUVs = src.getShape().history(type='polyMoveUV') try: attr = pm.PyNode(trgt).attr(attr).getChildren() except: attr = [pm.PyNode(trgt).attr(attr)] if (len(moveUVs) > len(attr)): pm.warning( 'There are more polyMoveUV nodes that attrs to connect to %s:%s' % (len(moveUVs), len(attr))) else: for i, moveUV in enumerate(moveUVs): moveUV.translateV >> attr[i]
def __create_shelf_frame(shelf_file, shelf_name, layout): shelf_function = os.path.basename(shelf_file).replace('.mel', '') shelf_frame = pm.frameLayout(label=shelf_name, collapsable=True, p=layout) shelf_layout = pm.gridLayout(ag=True, nc=8) if ('Script found' in pm.mel.whatIs(shelf_file)): pm.mel.eval('source "%s"' % (shelf_file)) if ('Mel procedure found' in pm.mel.whatIs(shelf_function)): pm.mel.eval('%s()' % (shelf_function)) else: pm.warning('Could not find shelf function : %s' % (shelf_function)) else: pm.warning('Could not find shelf file : %s' % (shelf_file)) return shelf_frame
def project_curves_onto_mesh(mesh, curves_grp, direction): # projected_curves = [] mesh = mesh old_meshes = [] for i, curve in enumerate(curves_grp.getChildren()): try: if (not type(curve.getShape()) is pm.NurbsCurve): continue except: continue while True: nv = len(mesh.vtx) mesh = delete_vertex(mesh) if (len(mesh.vtx) == nv): break projected_curves = pm.polyProjectCurve(mesh, curve, direction=direction)[0] pm.delete(projected_curves.getChildren()[1:]) projected_curve = projected_curves.getChildren()[0] split_mesh = pm.polySplit(mesh, detachEdges=0, projectedCurve=projected_curve) # print projected_curve split_mesh = split_mesh[0] pm.delete(split_mesh, ch=True) old_meshes.append(mesh) mesh = split_mesh if (projected_curves): pm.delete(projected_curves) # if( i == 10 ) : return for old_mesh in old_meshes: try: pm.delete(old_mesh) except: pm.warning('Could not delete %s' % (old_mesh)) pm.polyTriangulate(mesh) # pm.polyQuad( mesh ) # -ver 1 -trm 0 -p 50 -vct 0 -tct 0 -shp 0.5326 -keepBorder 1 -keepMapBorder 1 -keepColorBorder 1 -keepFaceGroupBorder 1 -keepHardEdge 1 -keepCreaseEdge 1 -keepBorderWeight 0.5 -keepMapBorderWeight 0.5 -keepColorBorderWeight 0.5 -keepFaceGroupBorderWeight 0.5 -keepHardEdgeWeight 0.5 -keepCreaseEdgeWeight 0.5 -useVirtualSymmetry 0 -symmetryTolerance 0.01 -sx 0 -sy 1 -sz 0 -sw 0 -preserveTopology 1 -keepQuadsWeight 1 -vertexMapName "" -replaceOriginal 1 -cachingReduce 1 -ch 1 # pm.polyReduce( mesh, ver=True, trm=False, p=50, replaceOriginal=True, kb=True, kbw=1.0, kmb=True, kmw=1.0, kfb=True, kfw=1.0, kqw=1.0 ) pm.polySoftEdge(mesh, a=180, ch=True) pm.delete(mesh, ch=True)
def splitSelection() : __st(0) workingList, sel = getMeshesRecursivelyFromSelection() gMainProgressBar = pm.PyUI(pm.mel.eval( '$tmp = $gMainProgressBar' )) gMainProgressBar.setMaxValue( len(workingList) ) if( len(workingList) > 0 ) : try : outputGrp = pm.PyNode(OUTPUT_GRP_NAME) except (pm.MayaNodeError) : outputGrp = pm.group(name=OUTPUT_GRP_NAME, world=True, empty=True) outputContents = outputGrp.getChildren() for child in outputContents : pm.delete(child) pm.uitypes.ProgressBar.beginProgress( gMainProgressBar, status="Splitting meshes..." ) gMainProgressBar.step(0) pm.refresh() for mesh in workingList : splitByMaterials(mesh, outputGrp) gMainProgressBar.step(1) pm.refresh() materialGroups = outputGrp.getChildren() for group in materialGroups : mergeGroup(group) else : pm.warning( 'No meshes found in selection' ) gMainProgressBar.endProgress() # pm.select(sel) pm.select(outputGrp) print 'Splitting mesh by material COMPLETE' __et(0, 'Total')
def project_curves_onto_mesh( mesh, curves_grp, direction ) : # projected_curves = [] mesh = mesh old_meshes = [] for i, curve in enumerate( curves_grp.getChildren( ) ) : try : if( not type(curve.getShape()) is pm.NurbsCurve ) : continue except : continue while True : nv = len(mesh.vtx) mesh = delete_vertex(mesh) if( len(mesh.vtx) == nv ) : break projected_curves = pm.polyProjectCurve( mesh, curve, direction=direction )[0] pm.delete( projected_curves.getChildren()[1:] ) projected_curve = projected_curves.getChildren()[0] split_mesh = pm.polySplit( mesh, detachEdges=0, projectedCurve=projected_curve ) # print projected_curve split_mesh = split_mesh[0] pm.delete( split_mesh, ch=True ) old_meshes.append( mesh ) mesh = split_mesh if( projected_curves ) : pm.delete( projected_curves ) # if( i == 10 ) : return for old_mesh in old_meshes : try : pm.delete( old_mesh ) except : pm.warning( 'Could not delete %s' % (old_mesh) ) pm.polyTriangulate( mesh ) # pm.polyQuad( mesh ) # -ver 1 -trm 0 -p 50 -vct 0 -tct 0 -shp 0.5326 -keepBorder 1 -keepMapBorder 1 -keepColorBorder 1 -keepFaceGroupBorder 1 -keepHardEdge 1 -keepCreaseEdge 1 -keepBorderWeight 0.5 -keepMapBorderWeight 0.5 -keepColorBorderWeight 0.5 -keepFaceGroupBorderWeight 0.5 -keepHardEdgeWeight 0.5 -keepCreaseEdgeWeight 0.5 -useVirtualSymmetry 0 -symmetryTolerance 0.01 -sx 0 -sy 1 -sz 0 -sw 0 -preserveTopology 1 -keepQuadsWeight 1 -vertexMapName "" -replaceOriginal 1 -cachingReduce 1 -ch 1 # pm.polyReduce( mesh, ver=True, trm=False, p=50, replaceOriginal=True, kb=True, kbw=1.0, kmb=True, kmw=1.0, kfb=True, kfw=1.0, kqw=1.0 ) pm.polySoftEdge( mesh, a=180, ch=True ) pm.delete( mesh, ch=True )
def __create_clean_object( obj ) : dup_obj = obj.duplicate()[0] ok_type_list = [ pm.Transform ] for dup_child in dup_obj.getChildren( ad=True, type='transform' ) : ok = True if( not type(dup_child) in ok_type_list ) : ok = False if( FFU_E_SETTINGS.get( 'hidden_ignore_bool' ).value ) : if( not dup_child.isVisible() ) : ok = False if( ok ) : dup_child_translation = dup_child.getTranslation() dup_child_rotation = dup_child.getRotation() for i, axis in enumerate( [ 'x', 'y', 'z' ] ) : flipsetting = 'flip'+axis if( FFU_E_FFEXPORT_SETTINGS.get(flipsetting).value ) : dup_child_translation[i] = -dup_child_translation[i] # dup_child_rotation[i] = -dup_child_rotation[i] dup_child.setTranslation( dup_child_translation ) dup_child.setRotation( dup_child_rotation ) if( type( dup_child.getShape() ) == pm.Mesh ) : # removed this to try fixing positions by applying appropriate flipping - see above # dup_child.setPivots( ( 0,0,0 ), ws=True ) # pm.makeIdentity( dup_child, translate=True, apply=True ) try : pm.polyTriangulate( dup_child ) except : pm.warning( 'Could not triangulate %s' % ( dup_child ) ) # pm.delete( dup_child, ch=True ) # pm.bakePartialHistory( dup_child, prePostDeformers=True ) else : pm.delete( dup_child ) return dup_obj
def wrn( _message ) : caller = _get_caller() _message = caller + ' : ' + _message pm.warning( _message )
def shrinkWithWarning(self, log=False): self.parent.shrink(setManip=True,log=log) if log: pm.warning( "(You can safely ignore this) Grid size set to: "+ str(self.parent.getSpacing() ) )
def shrinkWithWarning(self, log=False): self.parent.shrink(setManip=True, log=log) if log: pm.warning("(You can safely ignore this) Grid size set to: " + str(self.parent.getSpacing()))
def err( _message ) : caller = _get_caller() _message = caller + ' : ' + _message if( settings.should_error ) : pm.error( _message ) else : pm.warning( _message )
def splitByMaterials( mesh, outputGrp ) : materials = mesh.listConnections(type=pm.nodetypes.ShadingEngine) print mesh.name() materials = list(set(materials)) for material in materials : # print '----- ' + material.name() __st(1) faces = material.members( flatten=True ) outmesh = None for facelist in faces : if( type( facelist ) is pm.Mesh ) : facelist = facelist.f[:] shape = facelist.node() if( shape == mesh ) : __st(6) duplicate = facelist.node().getTransform().duplicate()[0] if( duplicate is None ) : pm.warning( "%s could not be duplicated" % mesh.name() ) continue duplicate.setParent(outputGrp) dupfacelist = facelist.indices() dupallfaces = duplicate.f[:].indices() deletefacelist = duplicate.f[facelist.indices()] __et(6, 'initTime') __st(2) # deletefacelist = [ duplicate.f[face] for face in dupallfaces if face not in dupfacelist ] pm.select(deletefacelist) pm.runtime.InvertSelection() # deletefacelist = pm.ls(sl=True, fl=True) __et(2, 'obtainFaceListTime') __st(3) pm.delete() __et(3, 'deleteFaceTime') # pm.filterExpand(dupfacelist, sm=34) __st(4) # pm.mel.select( duplicate.f[:] ) # pm.hyperShade(assign=material) pm.sets( material, fe=duplicate.f[:] ) __et(4, 'assignMaterialTime') outmesh = duplicate __st(5) try: outmeshGrp = pm.PyNode( '%s|%s' % ( OUTPUT_GRP_NAME, material.name() + '_split' ) ) except (pm.MayaNodeError) : outmeshGrp = pm.group(name=material.name() + '_split', parent=pm.PyNode(OUTPUT_GRP_NAME), empty=True) outmesh.setParent(outmeshGrp) __et(5, 'tidyUpTime') __et( 1, material.name() + ' done' )