Created
December 2, 2013 11:35
-
-
Save anonymous/7748253 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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