def projectSelection(self): hiliteOrig = pm.ls(hilite=True) selOrig = pm.ls(selection=True) selPre = pm.polyListComponentConversion(selOrig, tv=True) try: pm.select(self.referenceXformNode, replace=True) pm.select(selPre, add=True) selForTransfer = pm.ls(selection=True) pm.transferAttributes( transferPositions=1, transferNormals=0, transferUVs=0, transferColors=0, sampleSpace=0, searchMethod=0 ) objsToAddToSelection = [] for o in selForTransfer: # s = str( type(o) ) # print "y" + s + "y" if str(type(o)) == "<class 'pymel.core.general.MeshVertex'>": n = o.name().split(".")[0] objsToAddToSelection.append(n) for obj in objsToAddToSelection: pm.select(obj, add=True) pm.delete(ch=True) ##was #pm.mel.eval( "DeleteHistory;" ) print(selForTransfer) pm.select(selOrig, replace=True) pm.hilite(hiliteOrig) except: pm.select(selOrig) pm.hilite(hiliteOrig) print( "Please ensure that you have a valid reference mesh selected, and that you have verticies or objects select to project." )
def sd_transfer_attributes(self, selection): new_sel = selection.pop(0) for obj in selection: transfer_from = [new_sel, obj] pm.select(transfer_from) pm.transferAttributes( transferPositions=0, transferNormals=0, transferUVs=1, sourceUvSet="tiling", targetUvSet="map1", transferColors=0, sampleSpace=5, sourceUvSpace="tiling", targetUvSpace="map1", searchMethod=3, flipUVs=0, colorBorders=1 ) pm.delete(ch=True)
@classmethod def convertMelToPython(cls, melStr=""): #import pymel.tools.mel2py as mel2py is at top of file pyStr = mel2py.mel2pyStr( melStr ) return pyStr @classmethod def doTransfer( cls, spa="", uvs=1, colors=0, positions=0, normals=0, srcUvSet=None, targetUvSet=None ): osel = pm.ls(selection=True) objs = osel[:] src = objs.pop(0) if type(spa)==type(1): spa = spa else: spa = 5 for obj in objs: try: o = obj.getShape() except: o = obj try: s = src.getShape() except: s = src try: if srcUvSet == None: suvs = pm.polyUVSet( s, query=True, currentUVSet=True ) else: suvs = srcUvSet if targetUvSet == None: tuvs = pm.polyUVSet( o, query=True, currentUVSet=True ) else: tuvs = targetUvSet pm.transferAttributes( s, o, transferUVs=uvs, transferColors=colors, transferPositions=positions, transferNormals=normals, sourceUvSpace=str(suvs),
def projectSelection(self): hiliteOrig = pm.ls(hilite=True) selOrig = pm.ls(selection=True) selPre = pm.polyListComponentConversion(selOrig, tv=True) try: pm.select(self.referenceXformNode, replace=True) pm.select(selPre, add=True) selForTransfer = pm.ls(selection=True) pm.transferAttributes(transferPositions=1, transferNormals=0, transferUVs=0, transferColors=0, sampleSpace=0, searchMethod=0) objsToAddToSelection = [] for o in selForTransfer: #s = str( type(o) ) #print "y" + s + "y" if str(type(o)) == "<class 'pymel.core.general.MeshVertex'>": n = o.name().split('.')[0] objsToAddToSelection.append(n) for obj in objsToAddToSelection: pm.select(obj, add=True) pm.delete(ch=True) ##was #pm.mel.eval( "DeleteHistory;" ) print(selForTransfer) pm.select(selOrig, replace=True) pm.hilite(hiliteOrig) except: pm.select(selOrig) pm.hilite(hiliteOrig) print( "Please ensure that you have a valid reference mesh selected, and that you have verticies or objects select to project." )
def project_curves_onto_mesh2( mesh, source_mesh, direction ) : # duplicate sources_mesh dup_source_mesh = pm.duplicate( source_mesh )[0] dup_source_mesh.setParent(None) # create curve around mesh edge_curves = [] for edge in mesh.getShape().e : edge_curves.append( pm.curve( # name=n, degree=1, ws=True, point=[ v.getPosition(space='world') for v in edge.connectedVertices() ] ) ) merged_curve = pm.attachCurve( edge_curves, method=1, keepMultipleKnots=False, ch=False )[0] merged_curve = pm.duplicate( merged_curve ) pm.delete( edge_curves ) # project curve onto dup_source_mesh projected_curves = projected_curves = pm.polyProjectCurve( dup_source_mesh, merged_curve, direction=direction )[0] # pm.delete( projected_curves.getChildren()[1:] ) projected_curve = projected_curves.getChildren()[0] split_mesh = pm.polySplit( dup_source_mesh, detachEdges=0, projectedCurve=projected_curve ) split_mesh = split_mesh[0] # delete faces not within mesh bounds # faces_to_delete = [] pm.select(None) for face in split_mesh.f : face_center = ( 0.0, 0.0, 0.0 ) for v in face.connectedVertices() : face_center += v.getPosition( space='world' ) face_center /= len( face.connectedVertices() ) if( point_in_rect_bb( face_center, mesh.getBoundingBox( space='world' ) ) ) : # faces_to_delete.append( face ) dot = face.getNormal( space='world' ).dot( mesh.f[0].getNormal( space='world' ) ) if( dot > 0.0 ) : pm.select(face, add=True) # for face in faces_to_delete : # dot = face.getNormal( space='world' ).dot( mesh.f[0].getNormal( space='world' ) ) # if( dot > 0.0 ) : # pm.select(face, add=True) pm.runtime.InvertSelection() pm.delete() # transfer UVs from mesh to dup_source_mesh pm.transferAttributes( mesh, split_mesh, transferUVs=2 ) # assign mesh material to dup_source_mesh # rename dup_source_mesh to mesh pm.delete( split_mesh, ch=True ) n = mesh.name() p = mesh.getParent() pm.delete( mesh ) split_mesh.rename( n ) for attr in split_mesh.listAttr() : if attr.isLocked() : attr.setLocked(False) # cleanup pm.delete( projected_curves ) pm.delete( merged_curve ) pm.delete( dup_source_mesh ) # split_mesh.centerPivots( True ) # t = split_mesh.getPivots( worldSpace=1 )[0] # split_mesh.setTranslation((-t[0], -t[1], -t[2]), space='world') # pm.makeIdentity( split_mesh, apply=True ) # split_mesh.setParent( p ) # split_mesh.setTranslation( ( 0,0,0 ) ) # pm.makeIdentity( split_mesh, apply=True ) # position bodge split_mesh.setTranslation( ( 0, 0, 1 ), space='world' ) split_mesh.setParent( p ) pm.polyTriangulate( split_mesh ) if( not split_mesh.hasAttr( THU_MFT_SPRITE_ATTR ) ) : split_mesh.addAttr( THU_MFT_SPRITE_ATTR, dt='string' ) split_mesh.setAttr( THU_MFT_SPRITE_ATTR, split_mesh.name().replace( '.png', '' ) )
def project_curves_onto_mesh2(mesh, source_mesh, direction): # duplicate sources_mesh dup_source_mesh = pm.duplicate(source_mesh)[0] dup_source_mesh.setParent(None) # create curve around mesh edge_curves = [] for edge in mesh.getShape().e: edge_curves.append( pm.curve( # name=n, degree=1, ws=True, point=[ v.getPosition(space='world') for v in edge.connectedVertices() ])) merged_curve = pm.attachCurve(edge_curves, method=1, keepMultipleKnots=False, ch=False)[0] merged_curve = pm.duplicate(merged_curve) pm.delete(edge_curves) # project curve onto dup_source_mesh projected_curves = projected_curves = pm.polyProjectCurve( dup_source_mesh, merged_curve, direction=direction)[0] # pm.delete( projected_curves.getChildren()[1:] ) projected_curve = projected_curves.getChildren()[0] split_mesh = pm.polySplit(dup_source_mesh, detachEdges=0, projectedCurve=projected_curve) split_mesh = split_mesh[0] # delete faces not within mesh bounds # faces_to_delete = [] pm.select(None) for face in split_mesh.f: face_center = (0.0, 0.0, 0.0) for v in face.connectedVertices(): face_center += v.getPosition(space='world') face_center /= len(face.connectedVertices()) if (point_in_rect_bb(face_center, mesh.getBoundingBox(space='world'))): # faces_to_delete.append( face ) dot = face.getNormal(space='world').dot( mesh.f[0].getNormal(space='world')) if (dot > 0.0): pm.select(face, add=True) # for face in faces_to_delete : # dot = face.getNormal( space='world' ).dot( mesh.f[0].getNormal( space='world' ) ) # if( dot > 0.0 ) : # pm.select(face, add=True) pm.runtime.InvertSelection() pm.delete() # transfer UVs from mesh to dup_source_mesh pm.transferAttributes(mesh, split_mesh, transferUVs=2) # assign mesh material to dup_source_mesh # rename dup_source_mesh to mesh pm.delete(split_mesh, ch=True) n = mesh.name() p = mesh.getParent() pm.delete(mesh) split_mesh.rename(n) for attr in split_mesh.listAttr(): if attr.isLocked(): attr.setLocked(False) # cleanup pm.delete(projected_curves) pm.delete(merged_curve) pm.delete(dup_source_mesh) # split_mesh.centerPivots( True ) # t = split_mesh.getPivots( worldSpace=1 )[0] # split_mesh.setTranslation((-t[0], -t[1], -t[2]), space='world') # pm.makeIdentity( split_mesh, apply=True ) # split_mesh.setParent( p ) # split_mesh.setTranslation( ( 0,0,0 ) ) # pm.makeIdentity( split_mesh, apply=True ) # position bodge split_mesh.setTranslation((0, 0, 1), space='world') split_mesh.setParent(p) pm.polyTriangulate(split_mesh) if (not split_mesh.hasAttr(THU_MFT_SPRITE_ATTR)): split_mesh.addAttr(THU_MFT_SPRITE_ATTR, dt='string') split_mesh.setAttr(THU_MFT_SPRITE_ATTR, split_mesh.name().replace('.png', ''))