Skip to content

Instantly share code, notes, and snippets.

@ben-hearn-sb
Created September 30, 2016 16:07
Show Gist options
  • Save ben-hearn-sb/907a8d6647392794e48c026917e6267e to your computer and use it in GitHub Desktop.
Save ben-hearn-sb/907a8d6647392794e48c026917e6267e to your computer and use it in GitHub Desktop.
import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import maya.cmds as cmds
import maya.mel as mel
from collections import deque
class Super_Stitcher():
def __init__(self):
#mel.eval('doMenuComponentSelection("pCube1", "facet");')
self.ctx = 'myCtx'
self.selectedMesh = None
self.selectedTransform = None
self.fnMesh = None
self.fnPolys = None
self.uvSets = []
self.fDeq = deque([], 2)
self.sewEdge = False
self.setupInitialData()
if cmds.draggerContext(self.ctx, exists=True):
cmds.deleteUI(self.ctx)
cmds.draggerContext(self.ctx, dragCommand=self.onDrag, name=self.ctx, cursor='crossHair')
cmds.setToolTo(self.ctx)
def setupInitialData(self):
""" Setting up our initial data set for our selected mesh """
self.selectedTransform = cmds.ls(sl=True)[0]
self.selectedMesh = cmds.listRelatives(self.selectedTransform, s=True)[0]
selectionList = om.MSelectionList()
selectionList.add(self.selectedMesh)
dagPath = om.MDagPath()
selectionList.getDagPath(0, dagPath)
self.fnMesh = om.MFnMesh(dagPath)
self.fnVerts = om.MItMeshVertex(dagPath)
self.fnPolys = om.MItMeshPolygon(dagPath)
self.fnMesh.getUVSetNames(self.uvSets)
def onDrag(self):
vpX, vpY, _ = cmds.draggerContext(self.ctx, query=True, dragPoint=True)
pos = om.MPoint()
dir = om.MVector()
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
raySource = om.MFloatPoint(pos2)
rayDirection = om.MFloatVector(dir)
faceIds = None
triIds = None
idsSorted = False
maxParamPtr = 99999999
testBothDirections = False
accelParams = None
hitpoint = om.MFloatPoint()
hitRayParam = None
hitFacePtr = om.MScriptUtil().asIntPtr()
hitTriangle = None
hitBary1 = None
hitBary2 = None
intersection = self.fnMesh.closestIntersection(raySource,
rayDirection,
faceIds,
triIds,
idsSorted,
om.MSpace.kWorld,
maxParamPtr,
testBothDirections,
accelParams,
hitpoint,
hitRayParam,
hitFacePtr,
hitTriangle,
hitBary1,
hitBary2)
if intersection:
fId = om.MScriptUtil.getInt(hitFacePtr)
#cmds.select('%s.f[%d]' % (self.selectedMesh, fId))
indexUtilPtr = om.MScriptUtil().asIntPtr()
self.fnPolys.setIndex(fId, indexUtilPtr)
edgeList = om.MIntArray()
self.fnPolys.getEdges(edgeList)
if not len(self.fDeq):
self.fDeq.append(edgeList)
else:
self.appendDeq(index=len(self.fDeq)-1, inputEdges=edgeList)
#self.fDeq.append(edgeList)
if len(self.fDeq) == 2:
prev = list(self.fDeq[0])
curr = list(self.fDeq[1])
matchingEdge = list(set(curr).intersection(prev))
# TODO: Match edge function should only run once
if matchingEdge:
if self.sewEdge:
print 'match edge', matchingEdge
matchingEdge = matchingEdge[0]
#cmds.select('%s.e[%d]' % (self.selectedTransform, matchingEdge), replace=True)
print 'Sewing'
cmds.polyMapSew()
#polyMapSewMove -nf 10 -lps 0 -ch 1 pCube1.e[31];
#mel.eval('polyMapSewMove -nf 10 -lps 0 -ch 1 %s.e[%s];'%(self.selectedMesh, matchingEdge))
#cmds.polyMapSewMove('%s.e[%d]' % (self.selectedTransform, matchingEdge), uvs='map1', ch=1)
cmds.refresh()
print 'sewedddd'
self.sewEdge = False
def appendDeq(self, index=0, inputEdges=None):
if self.fDeq[index] != inputEdges:
if self.fDeq[index] != inputEdges:
self.fDeq.append(inputEdges)
self.sewEdge = True
def main():
Super_Stitcher()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment