Skip to content

Instantly share code, notes, and snippets.

Created December 2, 2013 11:35
Show Gist options
  • Save anonymous/7748253 to your computer and use it in GitHub Desktop.
Save anonymous/7748253 to your computer and use it in GitHub Desktop.
import maya.cmds as cmds
import maya.mel as mel
from getUVShells import *
import pymel.core.runtime
from pymel.core import *
def mdSetupMesh(argQuadDefField, selMesh = None):
meshRes = intField( argQuadDefField, q=True, v=True )
if selMesh == None:
selMesh = cmds.ls(sl=True)[0]
mdMeshGrp = cmds.group(em=True,n='mdMesh')
meshCpy = cmds.duplicate(selMesh)
cmds.parent(meshCpy,mdMeshGrp)
mesh = cmds.duplicate(meshCpy, n='%sPlanar' % selMesh)[0]
mdSeparateShells(mesh)
#remove 1st shape (its the original geo)
childShapes = cmds.listRelatives(mesh,f=True,c=True)
cmds.delete(childShapes[0])
#remove history
cmds.select(mesh)
cmds.delete(ch=True)
# get panels
apanels = cmds.listRelatives(mesh,f=True,c=True)
# leave a copy
meshOrig = cmds.duplicate(mesh, n='%sOrig' % selMesh)[0]
# set the panels to UV space
for apanel in apanels:
mdSetToUvSpace(apanel)
# get the orig panels
opanels = cmds.listRelatives(meshOrig,f=True,c=True)
blendShapes = []
# create a blendshape to blend from UV to World space
for i in range(0,len(opanels)):
cmds.select(opanels[i],r=True)
cmds.select(apanels[i],add=True)
blendShapes.append(cmds.CreateBlendShape())
panName = opanels[i].split('|')[-1]
pMesh = makePlanarMesh(apanels[i],meshRes)
pMesh = cmds.parent(pMesh,mdMeshGrp)
pMesh = cmds.rename(pMesh,'%sQuad' % panName)
#cmds.polyBoolOp('pCube1','polySurface1648', op=3, ch=1, useThresholds=0, preserveColor=0)
#makePlanarMesh(cmds.ls(sl=True)[0],100)
def makePlanarMesh(mesh, subdivs):
cMesh = cmds.duplicate(mesh)[0]
nf = cmds.polyEvaluate(cMesh,f=True)
cmds.polyExtrudeFacet('%s.f[0:%d]' % (cMesh,nf),ltz=0.4,kft=True)
cmds.delete(cMesh,ch=True)
pPlane = cmds.polyCube(w=1,h=1,d=0.05,sx=subdivs,sy=subdivs,sz=0,ch=0)[0]
cmds.move(0.5,0.5,0.1,pPlane)
bMesh = cmds.polyBoolOp(cMesh,pPlane, op=3, ch=1, useThresholds=0, preserveColor=0)[0]
cmds.delete(bMesh,ch=True)
nf = cmds.polyEvaluate(bMesh,f=True)
nv = cmds.polyEvaluate(bMesh,v=True)
# shift back to z plane
cmds.polyMoveVertex( '%s.vtx[0:%d]' % (bMesh,nv), tz=-0.075 )
toDel = []
for f in range(0,nf):
face = '%s.f[%d]' % (bMesh,f)
pos = cmds.xform(face,q=True,ws=True,t=True)
z = 0
for i in range(0,len(pos),3):
z += pos[i+2]
if abs(z) > 0.01:
toDel.append(face)
if toDel != []:
cmds.delete(toDel)
return cMesh
def makePlanarMeshNurbs(mesh):
ne = cmds.polyEvaluate(mesh,e=True)
cmds.select('%s.e[0:%d]' % (mesh,ne))
cmds.SelectPolygonSelectionBoundary()
curves = []
for edge in cmds.ls(sl=True,fl=True):
curve = cmds.duplicateCurve(edge,ch=1,rn=0, local=0)
curves.append(curve[0])
attCurve = cmds.attachCurve(curves,ch=0, rpo=0, kmk=1, m= 1, bb=0.5, bki=0, p= 0.1)
cmds.delete(curves)
plan = cmds.planarSrf(attCurve, ch=0, d=3, ko=0, tol=0.01, rn=0, po=0)
tes = cmds.nurbsToPoly( plan, ch=True,ntr=False,f=2,ut =0,vt=0,un=12,vn=12,pt=1)
#cmds.delete(plan[0])
cmds.delete(attCurve)
return tes[0]
#makePlanarMesh('triMeshPlanar|polySurface1636',100)
def mdSetToUvSpace(mesh):
nv = cmds.polyEvaluate(mesh,v=True)
for v in range(0,nv):
vert = '%s.vtx[%d]' % (mesh,v)
uvComps = cmds.polyListComponentConversion(vert,tuv=True)
uvs = cmds.polyEditUV(uvComps[0],q=True)
if uvs:
cmds.xform(vert,ws=True,t=(uvs[0],uvs[1],0))
def mdSeparateShells(mesh):
cmds.select(mesh)
# find UV shells
print 'getting UV shells for %s' % mesh
shells = findUvShells()
shellMembers = []
for i in range(0,shells[1]):
shellMembers.append([])
shellData = shells[2]
for i in range(0,len(shellData)):
shellMembers[shellData[i]].append(i)
#separate UV shells into seperate meshes
shellFaces = []
for shell in shellMembers:
cmds.select(cl=True)
for uv in shell:
cmds.select('%s.map[%d]' % (mesh,uv),add=True)
faces = cmds.polyListComponentConversion(tf=True)
#shellFaces.append(faces)
cmds.polyChipOff( faces, dup=True)
cmds.polySeparate(mesh,ch=0)
def mdFlatToCloth(selMesh = None):
if selMesh == None:
selMesh = ls(sl=True)
flatGarmentNode = selMesh[0]
flatQuadNode = selMesh[1]
print flatGarmentNode
print flatQuadNode
transferAttributes(flatGarmentNode, flatQuadNode
,transferPositions=0
,transferNormals= 0
,transferUVs= 1
,sourceUvSet= "map1"
,targetUvSet= "map1"
,transferColors= 0
,sampleSpace= 0
,sourceUvSpace= "map1"
,targetUvSpace= "map1"
,searchMethod= 3
,flipUVs= 0
,colorBorders= 1)
select(cl=True)
select( flatQuadNode )
delete(ch=True)
select(cl=True)
transferAttributes(flatGarmentNode, flatQuadNode
,transferPositions= 1
,transferNormals= 1
,transferUVs= 0
,transferColors= 0
,sampleSpace= 3
,sourceUvSpace= "map1"
,targetUvSpace= "map1"
,searchMethod= 3
,flipUVs= 0
,colorBorders= 1 )
blendShapeNode = flatGarmentNode.getShape().listConnections(s=True, t='blendShape')[0]
print blendShapeNode
blendShapeNode.attr( flatGarmentNode.name().replace(flatGarmentNode.getParent().name(),'').replace('|','') ).set(1)
select(cl=True)
select( flatQuadNode )
delete(ch=True)
select(cl=True)
def qm_selConstraint_uselessVert():
polySelectConstraint(m=1, order=1, orb=(0,2))
def qm_selConstraint_borderEdges():
polySelectConstraint(m=1,w=1)
def qm_selConstraint_reset():
polySelectConstraint(dis=True)
marvelousToolsWindow = window( title="Exode MD to Cloth", iconName='exodeMarvTools', widthHeight=(300, 320) )
columnLayout( adjustableColumn=True )
frameLayout( label='Marvelous Garment to Quads', cl=False, cll=True, bs='etchedIn' )
flowLayout()
text(label=' Quad Definition : ')
argQuadDefField = intField(minValue=20, maxValue=400, value=200)
setParent('..')
button( label='Selection --> flat QuadMeshes', c='mdSetupMesh(argQuadDefField)')
text(label=' Select a flat garment shape, then a flat quad Shape: ')
button( label='Selection --> Quad Cloth', c='mdFlatToCloth()')
setParent('..')
frameLayout( label='Sew Edges and Clean Model', cl=False, cll=True, bs='etchedIn' )
text(label='Set Selection Mode to: ')
flowLayout()
button( label='Vertices with two Edges', c='qm_selConstraint_uselessVert()', width=140)
button( label='Border Edges', c='qm_selConstraint_borderEdges()', width=102)
button( label='Reset', c='qm_selConstraint_reset()', width=50)
setParent('..')
button( label='Plugin: Make new Vertices along Selected Border', c='mel.eval("avMergeEdges();")' )
button( label='Convert Selection and Sew Edges' )
button( label='Merge Vertices along Seam' )
button( label='Clean Mesh')
setParent('..')
showWindow( marvelousToolsWindow )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment