3358 lines
144 KiB
Python
3358 lines
144 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import maya.cmds as cmds # type: ignore
|
||
|
import maya.mel as mel # type: ignore
|
||
|
import maya.OpenMaya as om # type: ignore
|
||
|
import re, math
|
||
|
import maya.OpenMayaUI as omui # type: ignore
|
||
|
import maya.api.OpenMaya as oma # type: ignore
|
||
|
import maya.api.OpenMayaUI as omuia # type: ignore
|
||
|
mel.eval('source "dagMenuProc"')
|
||
|
|
||
|
|
||
|
def X23():
|
||
|
getVexList = cmds.filterExpand(ex=1, sm=31)
|
||
|
getEdgeList = cmds.filterExpand(ex=1, sm=32)
|
||
|
tokens = ''
|
||
|
if getVexList:
|
||
|
for g in getVexList:
|
||
|
cmds.select(g)
|
||
|
X43('')
|
||
|
cmds.select(getVexList)
|
||
|
tokens = getVexList[0].split(".")
|
||
|
cmd = 'doMenuComponentSelectionExt("' + tokens[0] + '", "vertex", 0);'
|
||
|
mel.eval(cmd)
|
||
|
if getEdgeList and len(getEdgeList) == 2:
|
||
|
X56()
|
||
|
currentSet = cmds.ls(sl=1,fl=1)
|
||
|
tokens = currentSet[0].split(".")
|
||
|
cmd = 'doMenuComponentSelectionExt("' + tokens[0] + '", "edge", 0);'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(currentSet,r=1)
|
||
|
elif getEdgeList and len(getEdgeList) == 1:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(getEdgeList, tv=1),fl=1)
|
||
|
for g in listVtx:
|
||
|
cmds.select(g)
|
||
|
X43(getEdgeList[0])
|
||
|
cmds.select(getEdgeList)
|
||
|
tokens = getEdgeList[0].split(".")
|
||
|
cmd = 'doMenuComponentSelectionExt("' + tokens[0] + '", "edge", 0);'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(getEdgeList)
|
||
|
|
||
|
def X56():
|
||
|
selEdges = cmds.ls(sl=1,fl=1)
|
||
|
cmds.polyBridgeEdge(ch=1, divisions=1, twist=0, taper=1, curveType=0, smoothingAngle=30, direction=0, sourceDirection=0, targetDirection=0)
|
||
|
selEdges = cmds.ls(sl=1,fl=1)
|
||
|
rings = cmds.polySelectSp(ring=1)
|
||
|
cmds.select(selEdges, d=1)
|
||
|
midEdge = cmds.ls(sl=1,fl=1)
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(midEdge, tv=1),fl=1)
|
||
|
for i in listVtx:
|
||
|
cmds.select(i)
|
||
|
X43('')
|
||
|
cmds.select(midEdge)
|
||
|
|
||
|
def X43(unwantEdges):
|
||
|
selPoint = cmds.ls(sl=1,fl=1)
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
if unwantEdges:
|
||
|
unwantLoop = cmds.ls(cmds.polySelectSp(unwantEdges,loop=1,q=1),fl=1)
|
||
|
cmds.select(unwantLoop,d=1)
|
||
|
selEdgeCheck = cmds.ls(sl=1,fl=1)
|
||
|
findA = ''
|
||
|
findB = ''
|
||
|
goSharp = 0
|
||
|
if len(selEdgeCheck) == 3:
|
||
|
cmds.polySelectConstraint(m=2,w=1,t=0x8000)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
selEdge = cmds.ls(sl=1,fl=1)
|
||
|
findA = selEdge[0]
|
||
|
findB = selEdge[1]
|
||
|
goSharp = 1
|
||
|
elif len(selEdgeCheck) == 2:
|
||
|
findA = selEdgeCheck[0]
|
||
|
findB = selEdgeCheck[1]
|
||
|
goSharp = 1
|
||
|
elif len(selEdgeCheck) > 3:
|
||
|
cmds.select(selPoint)
|
||
|
if goSharp == 1:
|
||
|
#selEdgeCheck.remove(findA)
|
||
|
#selEdgeCheck.remove(findB)
|
||
|
#cmds.select(selEdgeCheck)
|
||
|
#X32()
|
||
|
#X32()
|
||
|
#unwantRing = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(findA,findB )
|
||
|
XI9("plus")
|
||
|
XI9("plus")
|
||
|
#cmds.polySelectConstraint(type=0x8000, propagate=4, m2a=180, m3a=180, ed=2)
|
||
|
loopACheck = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(findA,findB)
|
||
|
edgelist = []
|
||
|
vertexAB = cmds.ls(cmds.polyListComponentConversion(findA,findB, tv=1),fl=1)
|
||
|
for a in loopACheck:
|
||
|
checkVex = cmds.ls(cmds.polyListComponentConversion(a, tv=1),fl=1)
|
||
|
for c in checkVex:
|
||
|
if c in vertexAB:
|
||
|
edgelist.append(a)
|
||
|
#cmds.select(edgelist)
|
||
|
listVtx = X8I(edgelist)
|
||
|
checkA = X79(listVtx[1],listVtx[0],listVtx[-1])
|
||
|
angleA = math.degrees(checkA)
|
||
|
checkB = X79(listVtx[-2],listVtx[-1],listVtx[0])
|
||
|
angleB = math.degrees(checkB)
|
||
|
angleC = 180 - angleA -angleB
|
||
|
distanceC = X3o(listVtx[0],listVtx[-1])
|
||
|
distanceA = distanceC / math.sin(math.radians(angleC)) * math.sin(math.radians(angleA))
|
||
|
distanceB = distanceC / math.sin(math.radians(angleC)) * math.sin(math.radians(angleB))
|
||
|
oldDistA = X3o(listVtx[-2],listVtx[-1])
|
||
|
oldDistB = X3o(listVtx[0],listVtx[1])
|
||
|
scalarB = distanceB / oldDistB
|
||
|
pA = cmds.pointPosition(listVtx[0], w =1)
|
||
|
pB = cmds.pointPosition(listVtx[1], w =1)
|
||
|
newP = [0,0,0]
|
||
|
newP[0] = ((pB[0]-pA[0])*scalarB) + pA[0]
|
||
|
newP[1] = ((pB[1]-pA[1])*scalarB) + pA[1]
|
||
|
newP[2] = ((pB[2]-pA[2])*scalarB) + pA[2]
|
||
|
cmds.move(newP[0],newP[1],newP[2],selPoint[0], absolute = 1 )
|
||
|
cmds.select(selPoint)
|
||
|
|
||
|
|
||
|
def XoI():
|
||
|
number = cmds.floatField("refInsertLength", q=1, v = 1)
|
||
|
selEdge = cmds.ls(sl=True, fl=True)
|
||
|
|
||
|
if len(selEdge) == 1:
|
||
|
PD_points = cmds.ls(cmds.polyListComponentConversion(selEdge, tv=True),fl=1)
|
||
|
PD_coord1 = cmds.pointPosition(PD_points[0])
|
||
|
PD_coord2 = cmds.pointPosition(PD_points[1])
|
||
|
PD_distance = ((PD_coord1[0] - PD_coord2[0])**2 + (PD_coord1[1] - PD_coord2[1])**2 + (PD_coord1[2] - PD_coord2[2])**2)**0.5
|
||
|
n = int(PD_distance / number)
|
||
|
if n > 0:
|
||
|
cmds.polySelectSp(selEdge[0], ring=True)
|
||
|
cmds.polySplitRing(ch=True, splitType=2, divisions=n, useEqualMultiplier=True, smoothingAngle=30, fixQuads=False)
|
||
|
|
||
|
elif len(selEdge) > 1:
|
||
|
confirmString = cmds.confirmDialog(title="Confirm", message="Warning!! More than one edge selected?", button=["Continues", "Abort"], defaultButton="Abort", cancelButton="Abort", dismissString="Abort")
|
||
|
if confirmString == "Continues":
|
||
|
for s in selEdge:
|
||
|
PD_points = cmds.ls(cmds.polyListComponentConversion(s, tv=True),fl=1)
|
||
|
PD_coord1 = cmds.pointPosition(PD_points[0])
|
||
|
PD_coord2 = cmds.pointPosition(PD_points[1])
|
||
|
PD_distance = ((PD_coord1[0] - PD_coord2[0])**2 + (PD_coord1[1] - PD_coord2[1])**2 + (PD_coord1[2] - PD_coord2[2])**2)**0.5
|
||
|
n = int(PD_distance / number)
|
||
|
if n > 0:
|
||
|
cmds.polySelectSp(s, ring=True)
|
||
|
cmds.polySplitRing(ch=True, splitType=2, divisions=n, useEqualMultiplier=True, smoothingAngle=30, fixQuads=False)
|
||
|
cmds.BakeNonDefHistory()
|
||
|
|
||
|
def X92():
|
||
|
global selInitialGeo
|
||
|
global storeAllEdges
|
||
|
selInitialGeo = []
|
||
|
storeAllEdges = []
|
||
|
testAnySel = cmds.ls(sl=1)
|
||
|
if testAnySel:
|
||
|
checkCurrentSelEdge = cmds.filterExpand(sm=32)
|
||
|
checkCurrentSelPoly = cmds.filterExpand(sm=12)
|
||
|
checkCurrentSelOther =cmds.filterExpand(sm=(31,34,35) )
|
||
|
if checkCurrentSelEdge:
|
||
|
checkEdgeLoopGrp = XlO(checkCurrentSelEdge)
|
||
|
if len(checkEdgeLoopGrp) == 1:
|
||
|
listAAA = ''
|
||
|
try:
|
||
|
listAAA = X8I(checkCurrentSelEdge)
|
||
|
except:
|
||
|
pass
|
||
|
if listAAA:
|
||
|
storeAllEdges = checkCurrentSelEdge
|
||
|
checkCurrentSelPoly = cmds.ls(hl=1)
|
||
|
selInitialGeo.append(checkCurrentSelPoly[0])
|
||
|
if not cmds.attributeQuery('start', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long', ln='start')
|
||
|
if not cmds.attributeQuery('end', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='end')
|
||
|
if not cmds.attributeQuery('nearest', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='nearest')
|
||
|
if not cmds.attributeQuery('closeTo', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='closeTo')
|
||
|
if not cmds.attributeQuery('firstRun', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='firstRun')
|
||
|
cmds.setAttr((selInitialGeo[0]+'.firstRun'),0)
|
||
|
X67()
|
||
|
else:
|
||
|
cmds.select(checkCurrentSelEdge)
|
||
|
else:
|
||
|
cmds.select(checkCurrentSelEdge)
|
||
|
else:
|
||
|
if checkCurrentSelOther:
|
||
|
checkCurrentSelPoly = cmds.ls(hl=1)
|
||
|
selInitialGeo.append(checkCurrentSelPoly[0])
|
||
|
CMD = 'doMenuComponentSelectionExt("' + str(checkCurrentSelPoly[0])+ '", "edge", 0);'
|
||
|
mel.eval(CMD)
|
||
|
cmds.select(cl=1)
|
||
|
cmds.polyCrease((checkCurrentSelPoly[0]+'.e[*]'), value=0)
|
||
|
if not cmds.attributeQuery('start', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long', ln='start')
|
||
|
if not cmds.attributeQuery('end', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='end')
|
||
|
if not cmds.attributeQuery('nearest', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='nearest')
|
||
|
if not cmds.attributeQuery('closeTo', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='closeTo')
|
||
|
if not cmds.attributeQuery('firstRun', node = selInitialGeo[0], ex=True ):
|
||
|
cmds.addAttr(selInitialGeo[0], at = 'long',ln='firstRun')
|
||
|
else:
|
||
|
selShortestLoop = []
|
||
|
print('no selection')
|
||
|
cmds.setAttr((selInitialGeo[0]+'.firstRun'),0)
|
||
|
cmds.scriptJob ( runOnce=True, event = ["SelectionChanged", selShortestLoop])
|
||
|
else:
|
||
|
print('no selection')
|
||
|
def X67():
|
||
|
global ctx
|
||
|
global storeAllEdges
|
||
|
global selInitialGeo
|
||
|
global storeCameraPosition
|
||
|
global initialList
|
||
|
initialList = []
|
||
|
storeAllEdges = cmds.ls(sl=1,fl=1)
|
||
|
listVtx = X8I(storeAllEdges)
|
||
|
initialList = listVtx
|
||
|
startID = listVtx[0].split('[')[-1].split(']')[0]
|
||
|
endID = listVtx[-1].split('[')[-1].split(']')[0]
|
||
|
cmds.setAttr((selInitialGeo[0]+'.start'),int(startID))
|
||
|
cmds.setAttr((selInitialGeo[0]+'.end'),int(endID))
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
storeCameraPosition = cmds.xform(cameraTrans,q=1,ws=1,rp=1)
|
||
|
if cmds.objExists('preSelDisp')==0:
|
||
|
cmds.createNode("creaseSet")
|
||
|
cmds.rename("preSelDisp")
|
||
|
cmds.sets((selInitialGeo[0]+".e[*]"),remove="preSelDisp")
|
||
|
cmds.sets(storeAllEdges,forceElement="preSelDisp")
|
||
|
cmds.setAttr("preSelDisp.creaseLevel", 1)
|
||
|
cmds.polyOptions(dce=1)
|
||
|
ctx = 'Click2dTo3dCtx'
|
||
|
if cmds.draggerContext(ctx, exists=True):
|
||
|
cmds.deleteUI(ctx)
|
||
|
cmds.draggerContext(ctx, ppc= X46 ,rc = X46, dragCommand = X8l, fnz = X4I ,name=ctx, cursor='crossHair',undoMode='step')
|
||
|
cmds.setToolTo(ctx)
|
||
|
|
||
|
def X8l():
|
||
|
global selInitialGeo
|
||
|
global ctx
|
||
|
global screenX,screenY
|
||
|
global storeCameraPosition
|
||
|
global storeAllEdges
|
||
|
modifiers = cmds.getModifiers()
|
||
|
if selInitialGeo:
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, dragPoint=True)
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
checkHit = 0
|
||
|
finalMesh = []
|
||
|
finalX = 0
|
||
|
finalY = 0
|
||
|
finalZ = 0
|
||
|
shortDistance = 10000000000
|
||
|
distanceBetween = 1000000000
|
||
|
hitFacePtr = om.MScriptUtil().asIntPtr()
|
||
|
hitFace = []
|
||
|
for mesh in selInitialGeo:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
intersection = fnMesh.closestIntersection(
|
||
|
om.MFloatPoint(pos2),
|
||
|
om.MFloatVector(dir),
|
||
|
None,
|
||
|
None,
|
||
|
False,
|
||
|
om.MSpace.kWorld,
|
||
|
99999,
|
||
|
False,
|
||
|
None,
|
||
|
hitpoint,
|
||
|
None,
|
||
|
hitFacePtr,
|
||
|
None,
|
||
|
None,
|
||
|
None)
|
||
|
if intersection:
|
||
|
x = hitpoint.x
|
||
|
y = hitpoint.y
|
||
|
z = hitpoint.z
|
||
|
finalX = x
|
||
|
finalY = y
|
||
|
finalZ = z
|
||
|
hitFace = om.MScriptUtil(hitFacePtr).asInt()
|
||
|
hitFaceName = (selInitialGeo[0] + '.f[' + str(hitFace) +']')
|
||
|
cpX,cpY,cpZ = Xl5(hitFaceName)
|
||
|
shortDistanceCheck = 10000
|
||
|
checkCVDistance = 10000
|
||
|
cvList = (cmds.polyInfo(hitFaceName , fv=True )[0]).split(':')[-1].split(' ')
|
||
|
cvListX = [x for x in cvList if x.strip()]
|
||
|
|
||
|
for v in cvListX:
|
||
|
checkNumber = ''.join([n for n in v.split('|')[-1] if n.isdigit()])
|
||
|
if len(checkNumber) > 0:
|
||
|
cvPoint = (selInitialGeo[0] + '.vtx[' + str(checkNumber) +']')
|
||
|
cvPosition = cmds.pointPosition(cvPoint)
|
||
|
checkCVDistance = math.sqrt( ((float(cvPosition[0]) - finalX)**2) + ((float(cvPosition[1]) - finalY)**2) + ((float(cvPosition[2]) - finalZ)**2))
|
||
|
if checkCVDistance < shortDistanceCheck:
|
||
|
shortDistanceCheck = checkCVDistance
|
||
|
mostCloseCVPoint = cvPoint
|
||
|
mostCloseCVPointPos = cvPosition
|
||
|
|
||
|
newID = mostCloseCVPoint.split('[')[-1].split(']')[0]
|
||
|
cmds.setAttr((selInitialGeo[0]+'.nearest'),int(newID))
|
||
|
checkRun = cmds.getAttr(selInitialGeo[0]+'.firstRun')
|
||
|
|
||
|
if checkRun == 1:
|
||
|
checkCloseTo = cmds.getAttr(selInitialGeo[0]+'.nearest')
|
||
|
checkStart = cmds.getAttr(selInitialGeo[0]+'.start')
|
||
|
checkEnd = cmds.getAttr(selInitialGeo[0]+'.end')
|
||
|
|
||
|
startPosition = cmds.pointPosition( (selInitialGeo[0] + '.vtx[' + str(checkStart) +']'))
|
||
|
endPosition = cmds.pointPosition( (selInitialGeo[0] + '.vtx[' + str(checkEnd) +']'))
|
||
|
nearPosition = cmds.pointPosition( (selInitialGeo[0] + '.vtx[' + str(checkCloseTo) +']'))
|
||
|
|
||
|
distA = math.sqrt( ((float(nearPosition[0]) - startPosition[0])**2) + ((float(nearPosition[1]) - startPosition[1])**2) + ((float(nearPosition[2]) - startPosition[2])**2))
|
||
|
distB = math.sqrt( ((float(nearPosition[0]) - endPosition[0])**2) + ((float(nearPosition[1]) - endPosition[1])**2) + ((float(nearPosition[2]) - endPosition[2])**2))
|
||
|
if distA > distB:
|
||
|
cmds.setAttr((selInitialGeo[0]+'.end'),checkEnd)
|
||
|
cmds.setAttr((selInitialGeo[0]+'.start'),checkStart)
|
||
|
else:
|
||
|
cmds.setAttr((selInitialGeo[0]+'.end'),checkStart)
|
||
|
cmds.setAttr((selInitialGeo[0]+'.start'),checkEnd)
|
||
|
checkStart = cmds.getAttr(selInitialGeo[0]+'.start')
|
||
|
checkEnd = cmds.getAttr(selInitialGeo[0]+'.end')
|
||
|
checkNearest = cmds.getAttr(selInitialGeo[0]+'.nearest')
|
||
|
#get shortest
|
||
|
cmds.select(cl=1)
|
||
|
cmds.sets((selInitialGeo[0]+".e[*]"),remove="preSelDisp")
|
||
|
sortList = []
|
||
|
if modifiers == 4: # "press Ctrl"
|
||
|
PA = (selInitialGeo[0] + '.vtx[' + str(checkEnd) +']')
|
||
|
PB = (selInitialGeo[0] + '.vtx[' + str(checkNearest) +']')
|
||
|
UVA = cmds.polyListComponentConversion(PA,fv =1 ,tuv=1)
|
||
|
UVB = cmds.polyListComponentConversion(PB,fv =1 ,tuv=1)
|
||
|
startUVID = UVA[0].split('[')[-1].split(']')[0]
|
||
|
endUVID = UVB[0].split('[')[-1].split(']')[0]
|
||
|
#cmds.polySelect(selInitialGeo[0] , shortestEdgePathUV=(int(startUVID), int(endUVID)))
|
||
|
listShort = cmds.polySelect(selInitialGeo[0] ,q=1, shortestEdgePathUV=(int(startUVID), int(endUVID)))
|
||
|
if listShort:
|
||
|
for l in listShort:
|
||
|
sortList.append(selInitialGeo[0]+'.e['+ str(l) +']' )
|
||
|
else:
|
||
|
#cmds.polySelect(selInitialGeo[0] , shortestEdgePath=(int(checkEnd), int(checkNearest)))
|
||
|
#maya run faster without select
|
||
|
listShort = cmds.polySelect(selInitialGeo[0] ,q=1, shortestEdgePath=(int(checkEnd), int(checkNearest)))
|
||
|
if listShort:
|
||
|
for l in listShort:
|
||
|
sortList.append(selInitialGeo[0]+'.e['+ str(l) +']' )
|
||
|
getC = storeAllEdges + sortList
|
||
|
cmds.select(getC)
|
||
|
cmds.sets(getC,forceElement="preSelDisp")
|
||
|
if modifiers == 1: # "press Shelf"
|
||
|
liveList = cmds.sets("preSelDisp",q=1)
|
||
|
liveList = cmds.ls(liveList,fl=1)
|
||
|
listVtx = X8I(liveList)
|
||
|
checkEndID = listVtx[-1].split('[')[-1].split(']')[0]
|
||
|
extEdgeA = []
|
||
|
extEdgeB = []
|
||
|
if int(checkEndID) == checkNearest:
|
||
|
extEdgeA = cmds.polyListComponentConversion(listVtx[-1],fv =1 ,te=1)
|
||
|
extEdgeB = cmds.polyListComponentConversion(listVtx[-2],fv =1 ,te=1)
|
||
|
else:
|
||
|
extEdgeA = cmds.polyListComponentConversion(listVtx[0],fv =1 ,te=1)
|
||
|
extEdgeB = cmds.polyListComponentConversion(listVtx[1],fv =1 ,te=1)
|
||
|
extEdgeA = cmds.ls(extEdgeA,fl=1)
|
||
|
extEdgeB = cmds.ls(extEdgeB,fl=1)
|
||
|
extEdge = list(set(extEdgeA) - (set(extEdgeA)-set(extEdgeB)))
|
||
|
checkExtLoop = cmds.polySelectSp(extEdge,q=1, loop=1)
|
||
|
checkExtLoop = cmds.ls(checkExtLoop,fl=1)
|
||
|
otherList = list(set(checkExtLoop) - set(liveList))
|
||
|
checkEdgeLoopGrp = XlO(otherList)
|
||
|
if checkEdgeLoopGrp:
|
||
|
if len(checkEdgeLoopGrp) > 0:
|
||
|
if len(checkEdgeLoopGrp) == 1:
|
||
|
cmds.sets(otherList,forceElement="preSelDisp")
|
||
|
elif len(checkEdgeLoopGrp)> 1:
|
||
|
for c in checkEdgeLoopGrp:
|
||
|
cvList = cmds.polyListComponentConversion (c,fe=1,tv=1)
|
||
|
cvList = cmds.ls(cvList,fl=1)
|
||
|
if (selInitialGeo[0]+'.vtx['+ str(checkNearest) +']' ) in cvList:
|
||
|
cmds.sets(c,forceElement="preSelDisp")
|
||
|
cmds.select("preSelDisp", add=1)
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
def X46():
|
||
|
global storeAllEdges
|
||
|
global selInitialGeo
|
||
|
global initialList
|
||
|
checkRun = cmds.getAttr(selInitialGeo[0]+'.firstRun')
|
||
|
if checkRun == 0:
|
||
|
cmds.setAttr((selInitialGeo[0]+'.firstRun'),1)
|
||
|
else:
|
||
|
cmds.setAttr((selInitialGeo[0]+'.firstRun'),2)
|
||
|
getEdgeList = cmds.ls(sl=1,fl=1)
|
||
|
storeAllEdges = getEdgeList
|
||
|
listVtx = X8I(getEdgeList)
|
||
|
if len(listVtx)>0:
|
||
|
listHead = listVtx[0]
|
||
|
listEnd = listVtx[-1]
|
||
|
if listHead in initialList:
|
||
|
cmds.setAttr((selInitialGeo[0]+'.start'),int(listVtx[0].split('[')[-1].split(']')[0]))
|
||
|
cmds.setAttr((selInitialGeo[0]+'.end'),int(listVtx[-1].split('[')[-1].split(']')[0]))
|
||
|
|
||
|
else:
|
||
|
cmds.setAttr((selInitialGeo[0]+'.start'),int(listVtx[-1].split('[')[-1].split(']')[0]))
|
||
|
cmds.setAttr((selInitialGeo[0]+'.end'),int(listVtx[0].split('[')[-1].split(']')[0]))
|
||
|
else:
|
||
|
X4I()
|
||
|
def X4I():
|
||
|
cmds.setToolTo("moveSuperContext")
|
||
|
cmds.polyOptions(dce=0)
|
||
|
if cmds.objExists('preSelDisp'):
|
||
|
cmds.setAttr("preSelDisp.creaseLevel", 0)
|
||
|
cmds.delete('preSelDisp')
|
||
|
def Xl5(faceName):
|
||
|
meshFaceName = faceName.split('.')[0]
|
||
|
findVtx = cmds.polyInfo(faceName, fv=1)
|
||
|
getNumber = []
|
||
|
checkNumber = ((findVtx[0].split(':')[1]).split('\n')[0]).split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([n for n in c.split('|')[-1] if n.isdigit()])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
centerX = 0
|
||
|
centerY = 0
|
||
|
centerZ = 0
|
||
|
for g in getNumber:
|
||
|
x,y,z = cmds.pointPosition((meshFaceName + '.vtx['+g + ']'),w=1)
|
||
|
centerX = centerX + x
|
||
|
centerY = centerY + y
|
||
|
centerZ = centerZ + z
|
||
|
|
||
|
centerX = centerX/len(getNumber)
|
||
|
centerY = centerY/len(getNumber)
|
||
|
centerZ = centerZ/len(getNumber)
|
||
|
return centerX,centerY,centerZ
|
||
|
|
||
|
def X98():
|
||
|
global storeEdge
|
||
|
global currentArcCurve
|
||
|
if cmds.objExists('arcCurve*'):
|
||
|
arcCurveList = cmds.ls( "arcCurve*", transforms =1 )
|
||
|
a = arcCurveList[0]
|
||
|
for a in arcCurveList:
|
||
|
if 'BaseWire' not in a:
|
||
|
shapeNode = cmds.listRelatives(a, fullPath=True )
|
||
|
hist = cmds.listConnections(cmds.listConnections(shapeNode[0],sh=1, d=1 ) ,d=1 ,sh=1)
|
||
|
cmds.delete(hist,ch=1)
|
||
|
cmds.delete('arcCurve*')
|
||
|
if len(currentArcCurve)>0:
|
||
|
if cmds.objExists(currentArcCurve):
|
||
|
shapeNode = cmds.listRelatives(currentArcCurve, fullPath=True )
|
||
|
hist = cmds.listConnections(cmds.listConnections(shapeNode[0],sh=1, d=1 ) ,d=1 ,sh=1)
|
||
|
cmds.delete(hist,ch=1)
|
||
|
if cmds.objExists(currentArcCurve):
|
||
|
cmds.select(currentArcCurve)
|
||
|
cmds.select(storeEdge,add=1)
|
||
|
if cmds.objExists(currentArcCurve + 'BaseWire'):
|
||
|
cmds.delete(currentArcCurve + 'BaseWire')
|
||
|
|
||
|
def XI4():
|
||
|
global storeEdge
|
||
|
global currentArcCurve
|
||
|
currentDropOff = cmds.floatSliderGrp('dropOffSlider' ,q=1,v=1)
|
||
|
snapCheck = cmds.checkBox('snapCurve',q = 1 ,v = 1)
|
||
|
goEven = cmds.checkBox('evenSpace', q=1 ,v = 1)
|
||
|
conP = cmds.intSliderGrp('CPSlider',q=1 , v = True )
|
||
|
curveT = cmds.radioButtonGrp('curveType', q=1, sl=1)
|
||
|
goArc = cmds.checkBox('makeArc', q=1 ,v = 1)
|
||
|
cClean = cmds.checkBox('cleanCurve', q=1 ,v = 1)
|
||
|
selEdge = cmds.filterExpand(expand=True ,sm=32)
|
||
|
selCurve = cmds.filterExpand(expand=True ,sm=9)
|
||
|
if selCurve:
|
||
|
if len(selEdge)>0 and len(selCurve)== 1:
|
||
|
storeEdge = selEdge
|
||
|
cmds.select(selCurve,d=1)
|
||
|
selMeshForDeformer = cmds.ls(sl=1,o=1)
|
||
|
getCircleState,listVtx = Xll()
|
||
|
newCurve = cmds.duplicate(selCurve[0], rr=1)
|
||
|
cmds.rename(newCurve[0],'newsnapCurve')
|
||
|
currentArcCurve = 'newsnapCurve'
|
||
|
cmds.rebuildCurve(currentArcCurve,ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s = 100, d=1, tol=0.01)
|
||
|
#check tip order
|
||
|
curveTip = cmds.pointOnCurve(currentArcCurve , pr = 0, p=1)
|
||
|
tipA = cmds.pointPosition(listVtx[0],w=1)
|
||
|
tipB = cmds.pointPosition(listVtx[-1],w=1)
|
||
|
distA = math.sqrt( ((tipA[0] - curveTip[0])**2) + ((tipA[1] - curveTip[1])**2) + ((tipA[2] - curveTip[2])**2) )
|
||
|
distB = math.sqrt( ((tipB[0] - curveTip[0])**2) + ((tipB[1] - curveTip[1])**2) + ((tipB[2] - curveTip[2])**2) )
|
||
|
if distA > distB:
|
||
|
listVtx.reverse()
|
||
|
#snap to curve
|
||
|
if goEven == 1:
|
||
|
for q in range(len(selEdge)+1):
|
||
|
if q == 0:
|
||
|
pp = cmds.pointOnCurve(currentArcCurve , pr = 0, p=1)
|
||
|
cmds.move( pp[0], pp[1], pp[2],listVtx[q] , a =True, ws=True)
|
||
|
else:
|
||
|
pp = cmds.pointOnCurve(currentArcCurve , pr = (1.0/len(selEdge)*q), p=1)
|
||
|
cmds.move( pp[0], pp[1], pp[2],listVtx[q] , a =True, ws=True)
|
||
|
else:
|
||
|
sum = 0
|
||
|
totalEdgeLoopLength = 0
|
||
|
Llist = []
|
||
|
uList = []
|
||
|
pList = []
|
||
|
for i in range(len(listVtx)-1):
|
||
|
pA = cmds.pointPosition(listVtx[i], w =1)
|
||
|
pB = cmds.pointPosition(listVtx[i+1], w =1)
|
||
|
checkDistance = math.sqrt( ((pA[0] - pB[0])**2) + ((pA[1] - pB[1])**2) + ((pA[2] - pB[2])**2) )
|
||
|
Llist.append(checkDistance)
|
||
|
totalEdgeLoopLength = totalEdgeLoopLength + checkDistance
|
||
|
|
||
|
for j in Llist:
|
||
|
sum = sum + j
|
||
|
uList.append(sum)
|
||
|
for k in uList:
|
||
|
p = k / totalEdgeLoopLength
|
||
|
pList.append(p)
|
||
|
|
||
|
for q in range(len(selEdge)+1):
|
||
|
if q == 0:
|
||
|
pp = cmds.pointOnCurve(currentArcCurve , pr = 0, p=1)
|
||
|
cmds.move( pp[0], pp[1], pp[2],listVtx[q] , a =True, ws=True)
|
||
|
else:
|
||
|
pp = cmds.pointOnCurve(currentArcCurve , pr = pList[q-1], p=1)
|
||
|
cmds.move( pp[0], pp[1], pp[2],listVtx[q] , a =True, ws=True)
|
||
|
cmds.delete('newsnapCurve')
|
||
|
deformerNames = cmds.wire(selMeshForDeformer, gw=0, en = 1, ce = 0, li= 0, dds = [(0,1)], dt=1, w = selCurve[0])
|
||
|
cmds.connectControl("dropOffSlider", (deformerNames[0]+".dropoffDistance[0]"))
|
||
|
if snapCheck == 0:
|
||
|
cmds.setAttr((deformerNames[0] + '.dropoffDistance[0]'),1)
|
||
|
else:
|
||
|
cmds.setAttr((deformerNames[0] + '.dropoffDistance[0]'),currentDropOff)
|
||
|
currentArcCurve = selCurve[0]
|
||
|
cmds.select(selCurve[0])
|
||
|
else:
|
||
|
if selEdge:
|
||
|
storeEdge = selEdge
|
||
|
if cClean == 0:
|
||
|
if cmds.objExists('arcCurve*'):
|
||
|
X98()
|
||
|
selMeshForDeformer = cmds.ls(sl=1,o=1)
|
||
|
getCircleState,listVtx = Xll()
|
||
|
deformerNames = []
|
||
|
#make nurbs curve
|
||
|
if getCircleState == 0: #Arc
|
||
|
if goArc == 1:
|
||
|
midP = int(len(listVtx)/2)
|
||
|
cmds.move(0.01, 0, 0,selEdge[midP],r=1, cs=1 ,ls=1, wd =1)
|
||
|
p1 = cmds.pointPosition(listVtx[0], w =1)
|
||
|
p2 = cmds.pointPosition(listVtx[midP], w =1)
|
||
|
p3 = cmds.pointPosition(listVtx[-1], w =1)
|
||
|
newNode = cmds.createNode('makeThreePointCircularArc')
|
||
|
cmds.setAttr((newNode + '.pt1'), p1[0], p1[1] , p1[2])
|
||
|
cmds.setAttr((newNode + '.pt2'), p2[0], p2[1] , p2[2])
|
||
|
cmds.setAttr((newNode + '.pt3'), p3[0], p3[1] , p3[2])
|
||
|
cmds.setAttr((newNode + '.d'), 3)
|
||
|
cmds.setAttr((newNode + '.s'), len(listVtx))
|
||
|
newCurve = cmds.createNode('nurbsCurve')
|
||
|
cmds.connectAttr((newNode+'.oc'), (newCurve+'.cr'))
|
||
|
cmds.delete(ch=1)
|
||
|
transformNode = cmds.listRelatives(newCurve, fullPath=True , parent=True )
|
||
|
cmds.select(transformNode)
|
||
|
cmds.rename(transformNode,'arcCurve0')
|
||
|
getNewNode = cmds.ls(sl=1)
|
||
|
currentArcCurve = getNewNode[0]
|
||
|
numberP = 0
|
||
|
if curveT == 2:#nubs curve
|
||
|
numberP = int(conP) - 3
|
||
|
if numberP < 1:
|
||
|
numberP = 1
|
||
|
else:
|
||
|
numberP = int(conP) -1
|
||
|
cmds.rebuildCurve(currentArcCurve,ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s= numberP, d=3, tol=0.01)
|
||
|
else:
|
||
|
p1 = cmds.pointPosition(listVtx[0], w =1)
|
||
|
cmds.curve(d= 1, p=p1)
|
||
|
cmds.rename('arcCurve0')
|
||
|
getNewNode = cmds.ls(sl=1)
|
||
|
currentArcCurve = getNewNode[0]
|
||
|
for l in range(1,len(listVtx)):
|
||
|
p2 = cmds.pointPosition(listVtx[l], w =1)
|
||
|
cmds.curve(currentArcCurve, a= 1, d= 1, p=p2)
|
||
|
numberP = int(conP) -1
|
||
|
cmds.rebuildCurve(currentArcCurve,ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s= numberP, d=1, tol=0.01)
|
||
|
else: #circle
|
||
|
p1 = cmds.pointPosition(listVtx[0], w =1)
|
||
|
cmds.curve(d= 1, p=p1)
|
||
|
cmds.rename('arcCurve0')
|
||
|
getNewNode = cmds.ls(sl=1)
|
||
|
currentArcCurve = getNewNode[0]
|
||
|
for l in range(1,len(listVtx)):
|
||
|
p2 = cmds.pointPosition(listVtx[l], w =1)
|
||
|
cmds.curve(currentArcCurve, a= 1, d= 1, p=p2)
|
||
|
cmds.curve(currentArcCurve, a= 1, d= 1, p=p1)
|
||
|
cmds.closeCurve(currentArcCurve,ch=0, ps=2, rpo=1, bb= 0.5, bki=0, p=0.1)
|
||
|
conP = cmds.intSliderGrp('CPSlider',q=1 , v = True )
|
||
|
numberP = int(conP)
|
||
|
if numberP < 4:
|
||
|
numberP = 4
|
||
|
cmds.intSliderGrp('CPSlider',e=1 , v = 4 )
|
||
|
cmds.rebuildCurve(currentArcCurve,ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s = numberP, d=3, tol=0.01)
|
||
|
###########################################################################
|
||
|
cmds.delete(currentArcCurve ,ch=1)
|
||
|
totalEdgeLoopLength = 0;
|
||
|
sum = 0
|
||
|
Llist = []
|
||
|
uList = []
|
||
|
pList = []
|
||
|
#cmds.select(selEdge)
|
||
|
for i in range(len(listVtx)-1):
|
||
|
pA = cmds.pointPosition(listVtx[i], w =1)
|
||
|
pB = cmds.pointPosition(listVtx[i+1], w =1)
|
||
|
checkDistance = math.sqrt( ((pA[0] - pB[0])**2) + ((pA[1] - pB[1])**2) + ((pA[2] - pB[2])**2) )
|
||
|
Llist.append(checkDistance)
|
||
|
totalEdgeLoopLength = totalEdgeLoopLength + checkDistance
|
||
|
if goEven == 1:
|
||
|
avg = totalEdgeLoopLength / (len(selEdge))
|
||
|
for j in range(len(selEdge)):
|
||
|
sum = ((j+1)*avg)
|
||
|
uList.append(sum)
|
||
|
else:
|
||
|
for j in Llist:
|
||
|
sum = sum + j
|
||
|
uList.append(sum)
|
||
|
for k in uList:
|
||
|
p = k / totalEdgeLoopLength
|
||
|
pList.append(p)
|
||
|
#snap to curve
|
||
|
if snapCheck == 1:
|
||
|
for q in range(len(pList)):
|
||
|
if q+1 == len(listVtx):
|
||
|
pp = cmds.pointOnCurve(currentArcCurve, pr = 0, p=1)
|
||
|
cmds.move( pp[0], pp[1], pp[2],listVtx[0] , a =True, ws=True)
|
||
|
else:
|
||
|
pp = cmds.pointOnCurve(currentArcCurve , pr = pList[q], p=1)
|
||
|
cmds.move( pp[0], pp[1], pp[2],listVtx[q+1] , a =True, ws=True)
|
||
|
#convert to Bezier Curve
|
||
|
cmds.delete(currentArcCurve ,ch=1)
|
||
|
cmds.select(currentArcCurve)
|
||
|
if curveT == 1:
|
||
|
cmds.nurbsCurveToBezier()
|
||
|
if getCircleState == 1: #circle need to fix bug
|
||
|
cmds.closeCurve(currentArcCurve,ch=0, ps=2, rpo=1, bb= 0.5, bki=0, p=0.1)
|
||
|
cmds.closeCurve(currentArcCurve,ch=0, ps=2, rpo=1, bb= 0.5, bki=0, p=0.1)
|
||
|
#wireWrap
|
||
|
deformerNames = cmds.wire( selMeshForDeformer, gw=0, en = 1, ce = 0, li= 0, dds = [(0,1)], dt=1, w = currentArcCurve)
|
||
|
#select controllers
|
||
|
if getCircleState == 0:
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
degree = cmds.getAttr(currentArcCurve + '.degree')
|
||
|
spans = cmds.getAttr(currentArcCurve + '.spans')
|
||
|
numberCVs = degree + spans
|
||
|
collect = []
|
||
|
for x in range(int(numberCVs/3)-1):
|
||
|
g = currentArcCurve + '.cv[' + str((x+1)*3) + ']'
|
||
|
collect.append(g)
|
||
|
cmds.select(collect ,r=1)
|
||
|
|
||
|
else:
|
||
|
cmds.select(currentArcCurve + '.cv[*]')
|
||
|
cmd = 'doMenuNURBComponentSelection("' + currentArcCurve + '", "controlVertex");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.connectControl("dropOffSlider", (deformerNames[0]+".dropoffDistance[0]"))
|
||
|
if snapCheck == 0:
|
||
|
cmds.setAttr((deformerNames[0] + '.dropoffDistance[0]'),1)
|
||
|
else:
|
||
|
cmds.setAttr((deformerNames[0] + '.dropoffDistance[0]'),currentDropOff)
|
||
|
#add to viewport even in isolate mode
|
||
|
for x in range(1,5):
|
||
|
cmds.isolateSelect(('modelPanel' + str(x)), ado= currentArcCurve )
|
||
|
|
||
|
def X9I():# min point for Nurbs are 4 point
|
||
|
goArc = cmds.checkBox('makeArc', q=1 ,v = 1)
|
||
|
curveT = cmds.radioButtonGrp('curveType', q=1, sl=1)
|
||
|
if goArc == 0:
|
||
|
cmds.intSliderGrp('CPSlider', e=1, min= 4, v = 4 , fmx = 500)
|
||
|
else:
|
||
|
if curveT == 1:
|
||
|
cmds.intSliderGrp('CPSlider', e=1, min= 2, v = 3, fmx = 500)
|
||
|
else:
|
||
|
cmds.intSliderGrp('CPSlider', e=1, min= 4, v = 4, fmx = 500)
|
||
|
|
||
|
def X77():
|
||
|
snapCheck = cmds.checkBox('snapCurve',q = 1 ,v = 1)
|
||
|
if snapCheck == 0 :
|
||
|
cmds.checkBox('evenSpace', e=1 ,en=0)
|
||
|
else:
|
||
|
cmds.checkBox('evenSpace', e=1 ,en=1)
|
||
|
|
||
|
def X45():# min point for Nurbs are 4 point
|
||
|
curveT = cmds.radioButtonGrp('curveType', q=1, sl=1)
|
||
|
getCurrentV = cmds.intSliderGrp('CPSlider', q=1 ,v = 1 )
|
||
|
if curveT == 2:
|
||
|
cmds.intSliderGrp('CPSlider', e=1, min= 4 )
|
||
|
if getCurrentV < 4:
|
||
|
cmds.intSliderGrp('CPSlider', e=1, v= 4 )
|
||
|
else:
|
||
|
cmds.intSliderGrp('CPSlider', e=1, min= 2 )
|
||
|
|
||
|
def Xl2():
|
||
|
check = cmds.checkBox("evenRoundPivotSnap", q=1, value=1)
|
||
|
if check == 1:
|
||
|
cmds.radioButtonGrp("PivotSnapType", e=1, en=1)
|
||
|
else:
|
||
|
cmds.radioButtonGrp("PivotSnapType", e=1, en=0)
|
||
|
def X75(type):
|
||
|
edgeRingList = cmds.ls(sl=1,fl=1)
|
||
|
targetL = cmds.floatField('equalizerLength', q=1, value = 1)
|
||
|
unwantRing = cmds.ls(cmds.polySelectSp(edgeRingList, q=1,ring=1),fl=1)
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
cmds.ConvertSelectionToEdgePerimeter()
|
||
|
cmds.select(unwantRing,d=1)
|
||
|
testLoopAB = X69()
|
||
|
if len(testLoopAB) == 2:
|
||
|
ringPA = cmds.ls(cmds.polyListComponentConversion(testLoopAB[0], tv=1),fl=1)
|
||
|
ringPB = cmds.ls(cmds.polyListComponentConversion(testLoopAB[1], tv=1),fl=1)
|
||
|
for d in edgeRingList:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(d, tv=1),fl=1)
|
||
|
pACheck = listVtx[0]
|
||
|
pBCheck = listVtx[1]
|
||
|
if pACheck in ringPA:
|
||
|
pass
|
||
|
else:
|
||
|
pACheck = listVtx[1]
|
||
|
pBCheck = listVtx[0]
|
||
|
pA = cmds.pointPosition(pACheck, w=1)
|
||
|
pB = cmds.pointPosition(pBCheck, w=1)
|
||
|
checkDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
if type == "A":
|
||
|
cmds.scale((targetL/checkDistance) ,(targetL/checkDistance),(targetL/checkDistance), listVtx[0], p=[pA[0],pA[1],pA[2]],r=1)
|
||
|
elif type == "B":
|
||
|
cmds.scale((targetL/checkDistance) ,(targetL/checkDistance),(targetL/checkDistance), listVtx[1], p=[pB[0],pB[1],pB[2]],r=1)
|
||
|
else:
|
||
|
cmds.scale((targetL/checkDistance) ,(targetL/checkDistance),(targetL/checkDistance), listVtx[0], p=[((pA[0]+pB[0])/2),((pA[1]+pB[1])/2),((pA[2]+pB[2])/2)],r=1)
|
||
|
cmds.scale((targetL/checkDistance) ,(targetL/checkDistance),(targetL/checkDistance), listVtx[1], p=[((pA[0]+pB[0])/2),((pA[1]+pB[1])/2),((pA[2]+pB[2])/2)],r=1)
|
||
|
cmds.select(edgeRingList)
|
||
|
def X76(Where):
|
||
|
selEdge = cmds.ls(sl=1,fl=1)
|
||
|
length = X52(selEdge[0])
|
||
|
output = round(length, 3)
|
||
|
if Where == 'RE':
|
||
|
cmds.floatField('equalizerLength', e=True, v=output)
|
||
|
elif Where == 'IbL':
|
||
|
cmds.floatField('refInsertLength', e=True, v=output)
|
||
|
|
||
|
def X58():
|
||
|
if cmds.objExists('edgeSave'):
|
||
|
cmds.delete('edgeSav*')
|
||
|
currentV = cmds.floatSliderGrp('lockEdgeSlider', q=True, v=True)
|
||
|
type = cmds.radioButtonGrp('lockEdgeType', q=True, sl=True)
|
||
|
if type == 1:
|
||
|
X73()
|
||
|
else:
|
||
|
XOI()
|
||
|
cmds.floatSliderGrp('lockEdgeSlider', e=True, v=currentV)
|
||
|
|
||
|
def X25():
|
||
|
if cmds.objExists('edgeSave'):
|
||
|
cmds.delete('edgeSav*')
|
||
|
currentV = cmds.floatSliderGrp('lockEdgeSlider', q=True, v=True)
|
||
|
type = cmds.radioButtonGrp('lockEdgeType', q=True, sl=True)
|
||
|
if type == 1:
|
||
|
X85()
|
||
|
else:
|
||
|
X27()
|
||
|
cmds.floatSliderGrp('lockEdgeSlider', e=True, v=currentV)
|
||
|
|
||
|
def X73():
|
||
|
lockLength = cmds.floatField('lastLockEdgelength', q=True, v=True)
|
||
|
X85()
|
||
|
X65(lockLength)
|
||
|
cmds.select(d=True)
|
||
|
|
||
|
def X65(targetEdgeLength):
|
||
|
global polySRA
|
||
|
global polySRB
|
||
|
global AEdge
|
||
|
global BEdge
|
||
|
ADis = X52(AEdge[0])
|
||
|
currentW = cmds.getAttr(polySRA[0] +" .weight")
|
||
|
newW = currentW * targetEdgeLength / ADis
|
||
|
cmds.floatSliderGrp('lockEdgeSlider', e=True, v=currentW)
|
||
|
cmds.setAttr( (polySRA[0] + ".weight"), newW)
|
||
|
ADis = X52(AEdge[0])
|
||
|
BDis = X52(BEdge[0])
|
||
|
currentW = cmds.getAttr(polySRB[0]+".weight")
|
||
|
newW = 1 - (ADis * (1.0 - currentW) / BDis)
|
||
|
cmds.setAttr( (polySRB[0] + ".weight"), newW)
|
||
|
cmds.floatField('lastLockEdgelength', e=True, v = targetEdgeLength)
|
||
|
|
||
|
|
||
|
def XOI():
|
||
|
global myLockEdge
|
||
|
myLockEdge = []
|
||
|
selectedgelock = cmds.ls(sl=True)
|
||
|
selectGeo = cmds.ls(hl=True)
|
||
|
cmds.bakePartialHistory(all=True)
|
||
|
lockLength = cmds.floatField('lastLockEdgelength', q=True, v=True)
|
||
|
length = X52(selectedgelock[0])
|
||
|
halfL = length / 2.0
|
||
|
checkN = lockLength / halfL
|
||
|
lockL = 1.0 - checkN
|
||
|
if lockL > 0:
|
||
|
cmds.sets(name="edgeSave", text="edgeSave")
|
||
|
cmds.select(selectedgelock[0], r=True)
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
cmds.polySplitRing(ch=0, splitType=2, divisions=1)
|
||
|
locknodeLst = cmds.polyDuplicateEdge(of=lockL, ch=True)
|
||
|
cmds.rename(locknodeLst[0], "lockEdges")
|
||
|
cmds.polyDelEdge(cv=True)
|
||
|
cmds.select('edgeSave', r=True)
|
||
|
X82('min')
|
||
|
myLockEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.delete('edgeSave')
|
||
|
cmds.select(d=True)
|
||
|
cmds.connectControl('lockEdgeSlider', 'lockEdges.of')
|
||
|
else:
|
||
|
cmds.select(selectedgelock[0], r=True)
|
||
|
X6l()
|
||
|
print("length longer than current egde!")
|
||
|
|
||
|
def X85():
|
||
|
cmds.floatSliderGrp('lockEdgeSlider', e=True, en=1)
|
||
|
global myLockEdge
|
||
|
global polySRA
|
||
|
global polySRB
|
||
|
global AEdge
|
||
|
global BEdge
|
||
|
myLockEdge = []
|
||
|
polySRA = []
|
||
|
polySRB = []
|
||
|
AEdge = []
|
||
|
BEdge = []
|
||
|
cmds.bakePartialHistory(all=True)
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
X82('min')
|
||
|
cmds.sets(name="edgeSave", text="edgeSave")
|
||
|
edgeData = XI2()
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
polySRA = cmds.polySplitRing(ch=True, splitType=0, weight=0.01, smoothingAngle=30, fixQuads=True, insertWithEdgeFlow=False, direction=1, rootEdge=int(edgeData[1]))
|
||
|
cmds.select('edgeSave', r=True)
|
||
|
X82('max')
|
||
|
edgeData = XI2()
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
polySRB = cmds.polySplitRing(ch=True, splitType=0, weight=0.99, smoothingAngle=30, fixQuads=True, insertWithEdgeFlow=False, direction=0, rootEdge=int(edgeData[1]))
|
||
|
cmds.select('edgeSave', r=True)
|
||
|
X82('max')
|
||
|
midEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.select('edgeSave', r=True)
|
||
|
cmds.select(midEdge, d=True)
|
||
|
X82('max')
|
||
|
AEdge = cmds.ls(sl=True, fl=True)
|
||
|
myLockEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.select('edgeSave', r=True)
|
||
|
cmds.select(midEdge, d=True)
|
||
|
cmds.select(AEdge, d=True)
|
||
|
BEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.delete('edgeSave')
|
||
|
cmds.select(d=True)
|
||
|
X36()
|
||
|
|
||
|
|
||
|
def X6l():
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
current = cmds.ls(sl=True)
|
||
|
if current:
|
||
|
tokens = current[0].split(".")
|
||
|
cmds.selectType(edge=True)
|
||
|
cmds.select(tokens[0], r=True, ne=True)
|
||
|
cmds.select(current, r=True)
|
||
|
cmd = 'doMenuComponentSelectionExt("' + tokens[0] + '", "edge", 0);'
|
||
|
mel.eval(cmd)
|
||
|
|
||
|
def X27():
|
||
|
global myLockEdge
|
||
|
myLockEdge = []
|
||
|
selectedgelock = cmds.ls(sl=True)
|
||
|
selectGeo = cmds.ls(hl=True)
|
||
|
cmds.sets(name="edgeSave", text="edgeSave")
|
||
|
cmds.bakePartialHistory(all=True)
|
||
|
Lock = cmds.floatSliderGrp('lockEdgeSlider', q=True, v=True)
|
||
|
length = X52(selectedgelock[0])
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
cmds.polySplitRing(ch=0, splitType=2, divisions=1)
|
||
|
locknodeLst = cmds.polyDuplicateEdge(of=Lock, ch=True)
|
||
|
cmds.rename(locknodeLst[0], "lockEdges")
|
||
|
cmds.polyDelEdge(cv=True)
|
||
|
cmds.select(selectGeo[0], r=True)
|
||
|
X6l()
|
||
|
cmds.InvertSelection()
|
||
|
cmds.select('edgeSave', r=True)
|
||
|
X82('min')
|
||
|
myLockEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.delete('edgeSave')
|
||
|
cmds.select(d=True)
|
||
|
cmds.connectControl('lockEdgeSlider', 'lockEdges.of')
|
||
|
|
||
|
def X24():
|
||
|
global myLockEdge
|
||
|
length = X52(myLockEdge[0])
|
||
|
output = round(length, 3)
|
||
|
cmds.floatField('lastLockEdgelength', e=True, v=output)
|
||
|
|
||
|
def XI2():
|
||
|
startEdge = cmds.ls(sl=True, fl=True)
|
||
|
buffer = startEdge[0].split(".")
|
||
|
Edgebuffer = buffer[1].split("[")
|
||
|
getNumber = Edgebuffer[1].split("]")
|
||
|
return buffer[0], getNumber[0]
|
||
|
|
||
|
def X36():
|
||
|
type = cmds.radioButtonGrp('lockEdgeType', q=True, sl=True)
|
||
|
if type == 1:
|
||
|
Lock = cmds.floatSliderGrp('lockEdgeSlider', q=True, v=True)
|
||
|
global polySRA
|
||
|
global polySRB
|
||
|
global AEdge
|
||
|
global BEdge
|
||
|
errorCheck = (1 - Lock) / 2.0
|
||
|
if 0.001 < errorCheck < 0.4999:
|
||
|
cmds.setAttr((polySRA[0] +".weight"), errorCheck)
|
||
|
currentW = cmds.getAttr(polySRB[0]+".weight")
|
||
|
ADis = X52(AEdge[0])
|
||
|
BDis = X52(BEdge[0])
|
||
|
newW = 1 - (ADis * (1.0 - currentW) / BDis)
|
||
|
cmds.setAttr((polySRB[0] + ".weight"), newW)
|
||
|
X24()
|
||
|
|
||
|
def X82(minmax):
|
||
|
value = 0 if minmax == "max" else float('inf')
|
||
|
selection = cmds.ls(sl=True, fl=True)
|
||
|
edges = cmds.filterExpand(selection, ex=True, sm=32)
|
||
|
if not edges:
|
||
|
raise ValueError("No valid Edges selected!")
|
||
|
targetEdge = None
|
||
|
for edge in edges:
|
||
|
checkEdgeLength = X52(edge)
|
||
|
if minmax == "max" and checkEdgeLength > value:
|
||
|
value = checkEdgeLength
|
||
|
targetEdge = edge
|
||
|
elif minmax == "min" and checkEdgeLength < value:
|
||
|
value = checkEdgeLength
|
||
|
targetEdge = edge
|
||
|
|
||
|
if targetEdge:
|
||
|
cmds.select(targetEdge)
|
||
|
else:
|
||
|
raise ValueError("No edge found matching the criteria.")
|
||
|
|
||
|
def X52(edge):
|
||
|
vertices = cmds.polyListComponentConversion(edge, toVertex=True)
|
||
|
vertices = cmds.filterExpand(vertices, sm=31)
|
||
|
length = X89(vertices[0], vertices[1])
|
||
|
return length
|
||
|
|
||
|
def X89(vertex1, vertex2):
|
||
|
v1 = cmds.pointPosition(vertex1, w=True)
|
||
|
v2 = cmds.pointPosition(vertex2, w=True)
|
||
|
distance = math.sqrt((v1[0] - v2[0])**2 + (v1[1] - v2[1])**2 + (v1[2] - v2[2])**2)
|
||
|
return distance
|
||
|
|
||
|
def XO3():
|
||
|
keepCheckBox = cmds.checkBox('keepSpliteNumber', q=True, v=True)
|
||
|
keepInsertNumber = cmds.floatSliderGrp('multiInsertNo', q=True, v=True)
|
||
|
selectedEdges = cmds.ls(sl=True, fl=True)
|
||
|
polySplitRingNodes = cmds.ls(type='polySplitRing')
|
||
|
cmds.floatSliderGrp('multiInsertNo', e=True, v=1)
|
||
|
polySRList = []
|
||
|
obj = cmds.ls(hl=True)
|
||
|
if polySplitRingNodes:
|
||
|
cmds.select(obj)
|
||
|
cmds.delete(ch=True)
|
||
|
if len(selectedEdges) == 1:
|
||
|
cmds.select(selectedEdges)
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
nodeLst = cmds.polySplitRing(ch=True, splitType=2, divisions=1, useEqualMultiplier=True, smoothingAngle=30, fixQuads=False)
|
||
|
cmds.connectControl('multiInsertNo', nodeLst[0] + ".div")
|
||
|
if keepCheckBox:
|
||
|
cmds.setAttr(nodeLst[0] + ".div", keepInsertNumber)
|
||
|
cmds.floatSliderGrp('multiInsertNo', e=True, v=keepInsertNumber)
|
||
|
elif len(selectedEdges) > 1:
|
||
|
confirmString = cmds.confirmDialog(title="Confirm", message="Warning!! More than one edge selected?", button=["Continues", "Abort"], defaultButton="Abort", cancelButton="Abort", dismissString="Abort")
|
||
|
if confirmString == "Continues":
|
||
|
for s in selectedEdges:
|
||
|
cmds.select(s)
|
||
|
cmds.polySelectSp(ring=True)
|
||
|
nodeLst = cmds.polySplitRing(ch=True, splitType=2, divisions=1, useEqualMultiplier=True, smoothingAngle=30, fixQuads=False)
|
||
|
polySRList.append(nodeLst[0] + ".div")
|
||
|
collectList = ['"{}"'.format(p) for p in polySRList]
|
||
|
getList = ','.join(collectList)
|
||
|
cmd = "cmds.connectControl('multiInsertNo', {})".format(getList)
|
||
|
eval(cmd)
|
||
|
if keepCheckBox:
|
||
|
cmds.floatSliderGrp('multiInsertNo', e=True, v=keepInsertNumber)
|
||
|
for p in polySRList:
|
||
|
cmds.setAttr(p, keepInsertNumber)
|
||
|
cmds.select(cl=True)
|
||
|
if obj:
|
||
|
cmd = 'doMenuComponentSelection("' + obj[0] +'", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
|
||
|
def X2l(location, curveObject):
|
||
|
curve = curveObject
|
||
|
tempList = om.MSelectionList()
|
||
|
tempList.add(curve)
|
||
|
curveObj = om.MObject()
|
||
|
tempList.getDependNode(0, curveObj)
|
||
|
dagpath = om.MDagPath()
|
||
|
tempList.getDagPath(0, dagpath)
|
||
|
curveMF = om.MFnNurbsCurve(dagpath)
|
||
|
point = om.MPoint( location[0], location[1], location[2])
|
||
|
prm = om.MScriptUtil()
|
||
|
pointer = prm.asDoublePtr()
|
||
|
om.MScriptUtil.setDouble (pointer, 0.0)
|
||
|
tolerance = .001
|
||
|
space = om.MSpace.kObject
|
||
|
result = om.MPoint()
|
||
|
result = curveMF.closestPoint (point, pointer, 0.0, space)
|
||
|
parameter = om.MScriptUtil.getDouble (pointer)
|
||
|
return [parameter, (result.x), (result.y), (result.z)]
|
||
|
|
||
|
def X39(SX, SY):
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(SX), int(SY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
checkCam = X68()
|
||
|
finalX = []
|
||
|
finalY = []
|
||
|
finalZ = []
|
||
|
checkList = []
|
||
|
checkList.append('refPlane')
|
||
|
for mesh in checkList:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
intersection = fnMesh.closestIntersection(om.MFloatPoint(pos2), om.MFloatVector(dir), None, None, False, om.MSpace.kWorld, 99999, False, None, hitpoint, None, None, None, None, None)
|
||
|
if intersection:
|
||
|
finalX = hitpoint.x
|
||
|
finalY = hitpoint.y
|
||
|
finalZ = hitpoint.z
|
||
|
return (finalX, finalY, finalZ)
|
||
|
|
||
|
def X49(pointName):
|
||
|
view = omuia.M3dView.active3dView()
|
||
|
posInView = []
|
||
|
ppos = cmds.pointPosition(pointName, w=1)
|
||
|
posInView.append(view.worldToView(oma.MPoint(ppos)))
|
||
|
vpos = view.worldToView(oma.MPoint(ppos))
|
||
|
wx, wy, wz = X39(vpos[0], vpos[1])
|
||
|
return (wx, wy, wz)
|
||
|
|
||
|
def Xl3(cameraName, worldPoint):
|
||
|
resWidth, resHeight = X34()
|
||
|
selList = om.MSelectionList()
|
||
|
selList.add(cameraName)
|
||
|
dagPath = om.MDagPath()
|
||
|
selList.getDagPath(0, dagPath)
|
||
|
dagPath.extendToShape()
|
||
|
camInvMtx = dagPath.inclusiveMatrix().inverse()
|
||
|
fnCam = om.MFnCamera(dagPath)
|
||
|
mFloatMtx = fnCam.projectionMatrix()
|
||
|
projMtx = om.MMatrix(mFloatMtx.matrix)
|
||
|
mPoint = om.MPoint(worldPoint[0], worldPoint[1], worldPoint[2]) * camInvMtx * projMtx
|
||
|
x = (mPoint[0] / mPoint[3] / 2 + 0.5) * resWidth
|
||
|
y = (mPoint[1] / mPoint[3] / 2 + 0.5) * resHeight
|
||
|
return [x, y]
|
||
|
|
||
|
def X34():
|
||
|
windowUnder = cmds.getPanel(withFocus=True)
|
||
|
if 'modelPanel' not in windowUnder:
|
||
|
windowUnder = 'modelPanel4'
|
||
|
viewNow = omui.M3dView.active3dView()
|
||
|
omui.M3dView.getM3dViewFromModelEditor(windowUnder, viewNow)
|
||
|
screenW = omui.M3dView.portWidth(viewNow)
|
||
|
screenH = omui.M3dView.portHeight(viewNow)
|
||
|
return (screenW, screenH)
|
||
|
|
||
|
def X55(tX, tY, tZ):
|
||
|
checkCam = X68()
|
||
|
resWidth, resHeight = X34()
|
||
|
ratio = cmds.getAttr('defaultResolution.deviceAspectRatio')
|
||
|
cmds.polyPlane(w=ratio, h=1, sx=40, sy=20, ax=(0, 0, 1), cuv=2, ch=1)
|
||
|
cmds.rename('refPlane')
|
||
|
cmds.setAttr('refPlane.visibility', 0)
|
||
|
cmds.parentConstraint(checkCam, 'refPlane', weight=1)
|
||
|
cmds.delete(constraints=True)
|
||
|
cmds.setAttr('refPlane.translateX', tX)
|
||
|
cmds.setAttr('refPlane.translateY', tY)
|
||
|
cmds.setAttr('refPlane.translateZ', tZ)
|
||
|
head3d = cmds.pointPosition('refPlane.vtx[0]')
|
||
|
tail3d = cmds.pointPosition('refPlane.vtx[860]')
|
||
|
head2D = Xl3(checkCam, (head3d[0], head3d[1], head3d[2]))
|
||
|
tail2d = Xl3(checkCam, (tail3d[0], tail3d[1], tail3d[2]))
|
||
|
distanceX = tail2d[0] - head2D[0]
|
||
|
distanceY = tail2d[1] - head2D[1]
|
||
|
cmds.setAttr('refPlane.scaleX', resWidth / distanceX * 2)
|
||
|
cmds.setAttr('refPlane.scaleY', resHeight / distanceY * 2)
|
||
|
|
||
|
def X68():
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath, type='transform', p=True)
|
||
|
cameraPosition = cmds.xform(cameraTrans, q=1, ws=1, rp=1)
|
||
|
return cameraTrans[0]
|
||
|
|
||
|
def Xo7(edgeList):
|
||
|
listEvenVtx = X8I(edgeList)
|
||
|
if cmds.objExists('tempEvenCurve'):
|
||
|
cmds.delete('tempEvenCurve')
|
||
|
cmds.select(edgeList)
|
||
|
cmds.polyToCurve(form=2, degree=1, conformToSmoothMeshPreview=1)
|
||
|
cmds.rename('tempEvenCurve')
|
||
|
curveCVs =cmds.ls('tempEvenCurve.cv[*]',fl=1)
|
||
|
posCurve = cmds.xform(curveCVs[0], a=1,ws=1, q=1, t=1)
|
||
|
posEdge = cmds.xform(listEvenVtx[0], a=1,ws=1, q=1, t=1)
|
||
|
if posCurve == posEdge:
|
||
|
pass
|
||
|
else:
|
||
|
listEvenVtx = listEvenVtx[::-1]
|
||
|
cmds.rebuildCurve('tempEvenCurve',ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s = 0 , d=1, tol=0)
|
||
|
cmds.rebuildCurve('tempEvenCurve',ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s = 0 , d=1, tol=0)
|
||
|
if len(curveCVs)< 4:
|
||
|
cmds.delete( 'tempEvenCurve.cv[1]', 'tempEvenCurve.cv[3]')
|
||
|
curveCVs =cmds.ls('tempEvenCurve.cv[*]',fl=1)
|
||
|
for i in range(len(curveCVs)):
|
||
|
pos = cmds.xform(curveCVs[i], a=1,ws=1, q=1, t=1)
|
||
|
cmds.xform(listEvenVtx[i], a=1, ws=1, t = (pos[0],pos[1],pos[2]) )
|
||
|
cmds.delete('tempEvenCurve')
|
||
|
|
||
|
def X94():
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
X29(e)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
|
||
|
def X29(flatList):
|
||
|
X2I()
|
||
|
listVtx = X8I(flatList)
|
||
|
cmds.select(flatList)
|
||
|
cmds.polyToCurve(form=0, degree=1, conformToSmoothMeshPreview=1,)
|
||
|
cmds.rename('newguildcurve')
|
||
|
cmds.delete('newguildcurve', e=1, ch=1)
|
||
|
cmd = 'modifySelectedCurves smooth 1 0;'
|
||
|
mel.eval(cmd)
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
xA = round(xA,3)
|
||
|
yA = round(yA,3)
|
||
|
zA = round(zA,3)
|
||
|
xC, yC, zC = cmds.pointPosition('newguildcurve.cv[0]',w=1)
|
||
|
xC = round(xC,3)
|
||
|
yC = round(yC,3)
|
||
|
zC = round(zC,3)
|
||
|
if xA == xC and yA == yC and zA == zC:
|
||
|
pass
|
||
|
else:
|
||
|
listVtx.reverse()
|
||
|
for i in range(1,len(listVtx)-1):
|
||
|
xD, yD, zD = cmds.pointPosition('newguildcurve.cv['+str(i)+']',w=1)
|
||
|
cmds.move(xD, yD, zD,listVtx[i] , a =True, ws=True)
|
||
|
X2I()
|
||
|
|
||
|
def X47(mode):
|
||
|
if mode == 3:
|
||
|
cmds.iconTextButton('button2DIcon' ,e=1 ,bgc = [0.18,0.18,0.18] )
|
||
|
cmds.iconTextButton('button3DIcon' ,e=1 ,bgc = [0.5, 0.21, 0] )
|
||
|
elif mode ==2:
|
||
|
cmds.iconTextButton('button2DIcon' ,e=1 ,bgc = [0.5, 0.21, 0] )
|
||
|
cmds.iconTextButton('button3DIcon' ,e=1 ,bgc = [0.18,0.18,0.18] )
|
||
|
|
||
|
def Xoo(level):
|
||
|
checkMode = cmds.iconTextButton('button2DIcon' ,q=1 ,bgc = 1 )
|
||
|
if checkMode[2] > 0:
|
||
|
X9l(level)
|
||
|
else:
|
||
|
Xl8(level)
|
||
|
|
||
|
def Xl8(level):
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
X63(e,level)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
|
||
|
def X63(flatList,level):
|
||
|
numberPoint = level
|
||
|
X2I()
|
||
|
listVtx = X8I(flatList)
|
||
|
checkCam = X68()
|
||
|
closetP2Cam = []
|
||
|
shortDistance = 10000000000
|
||
|
cameraPosition = cmds.xform(checkCam, q=1, ws=1, rp=1)
|
||
|
for g in listVtx:
|
||
|
x, y, z = cmds.pointPosition(g, w=1)
|
||
|
distanceBetween = math.sqrt((float(cameraPosition[0]) - x) ** 2 + (float(cameraPosition[1]) - y) ** 2 + (float(cameraPosition[2]) - z) ** 2)
|
||
|
if distanceBetween < shortDistance:
|
||
|
shortDistance = distanceBetween
|
||
|
closetP2Cam = g
|
||
|
tX, tY, tZ = cmds.pointPosition(closetP2Cam, w=1)
|
||
|
X55(tX, tY, tZ)
|
||
|
pointDict = []
|
||
|
for g in listVtx:
|
||
|
pos = X49(g)
|
||
|
pointDict.append(pos)
|
||
|
cmds.curve(d=1, p=[(pointDict[0][0], pointDict[0][1], pointDict[0][2]), (pointDict[-1][0], pointDict[-1][1], pointDict[-1][2])])
|
||
|
cmds.rename('newguildcurve')
|
||
|
if numberPoint == 1:
|
||
|
cmds.rebuildCurve('newguildcurve', ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=1, d=3, tol=0)
|
||
|
gap = int(len(listVtx) * 0.5)
|
||
|
cmds.select('newguildcurve.cv[1]', 'newguildcurve.cv[2]')
|
||
|
nodeCluster = cmds.cluster(n= 'midGrp')
|
||
|
cmds.move(pointDict[gap][0], pointDict[gap][1], pointDict[gap][2], nodeCluster[1], rpr=True)
|
||
|
elif numberPoint == 2:
|
||
|
cmds.rebuildCurve('newguildcurve', ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=2, d=2, tol=0)
|
||
|
gapA = int(len(listVtx) * 0.33333)
|
||
|
gapB = int(len(listVtx) * 0.66666)
|
||
|
cmds.move(pointDict[gapA][0], pointDict[gapA][1], pointDict[gapA][2], 'newguildcurve.cv[1]', rpr=True)
|
||
|
cmds.move(pointDict[gapB][0], pointDict[gapB][1], pointDict[gapB][2], 'newguildcurve.cv[2]', rpr=True)
|
||
|
elif numberPoint == 3:
|
||
|
cmds.rebuildCurve('newguildcurve', ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=3, d=2, tol=0)
|
||
|
gapA = int(len(listVtx) * 0.25)
|
||
|
gapB = int(len(listVtx) * 0.5)
|
||
|
gapC = int(len(listVtx) * 0.75)
|
||
|
cmds.move(pointDict[gapA][0], pointDict[gapA][1], pointDict[gapA][2], 'newguildcurve.cv[1]', rpr=True)
|
||
|
cmds.move(pointDict[gapB][0], pointDict[gapB][1], pointDict[gapB][2], 'newguildcurve.cv[2]', rpr=True)
|
||
|
cmds.move(pointDict[gapC][0], pointDict[gapC][1], pointDict[gapC][2], 'newguildcurve.cv[3]', rpr=True)
|
||
|
cmds.delete('newguildcurve', ch=1)
|
||
|
cmds.move(cameraPosition[0], cameraPosition[1], cameraPosition[2], 'newguildcurve.scalePivot', 'newguildcurve.rotatePivot')
|
||
|
cmds.duplicate('newguildcurve')
|
||
|
cmds.setAttr('newguildcurve.scaleX', 0.5)
|
||
|
cmds.setAttr('newguildcurve.scaleY', 0.5)
|
||
|
cmds.setAttr('newguildcurve.scaleZ', 0.5)
|
||
|
cmds.setAttr('newguildcurve1.scaleX', 2)
|
||
|
cmds.setAttr('newguildcurve1.scaleY', 2)
|
||
|
cmds.setAttr('newguildcurve1.scaleZ', 2)
|
||
|
cmds.nurbsToPolygonsPref(polyType=1, format=3, uType=3, uNumber=1, vType=3, vNumber=1)
|
||
|
loftNode = cmds.loft('newguildcurve1', 'newguildcurve', ch=1, u=1, c=0, ar=1, d=3, ss=1, rn=0, po=1, rsn=True)
|
||
|
cmds.rename('guildMesh')
|
||
|
cmds.polySmooth('guildMesh', mth=0, sdt=2, ovb=1, ofb=3, ofc=0, ost=0, ocr=0, dv=2, bnr=1, c=1, kb=1, ksb=1, khe=0, kt=1, kmb=1, suv=1, peh=0, sl=1, dpe=1, ps=0.1, ro=1, ch=0)
|
||
|
cmds.transferAttributes('guildMesh', listVtx, transferPositions=1, searchMethod=3)
|
||
|
shapesNode = cmds.listRelatives(listVtx[0], shapes=True, ap=True)
|
||
|
cmds.delete(shapesNode, ch=1)
|
||
|
X2I()
|
||
|
def X2I():
|
||
|
cleanSceneList = {'refPlan*','newguildcurv*','newguildcurv*','guildMes*','baseLo*','newDeformcurv*'}
|
||
|
for c in cleanSceneList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def X9l(level):
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
X54(e,level)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
def X54(flatList,level):
|
||
|
checkEven = cmds.checkBox('evenCurveEdgeLength', q=1,v=1)
|
||
|
X2I()
|
||
|
listVtx = X8I(flatList)
|
||
|
numberPoint = level
|
||
|
distList = []
|
||
|
totalDist = 0
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[-1], w=1)
|
||
|
cmds.curve(d=1, p=[(xA, yA, zA),(xB, yB, zB)])
|
||
|
cmds.rename('newguildcurve')
|
||
|
for i in range(len(listVtx)-1):
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[i], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[i+1], w=1)
|
||
|
distanceBetween = math.sqrt((xA - xB) * (xA - xB) + (yA - yB) * (yA - yB) + (zA - zB) * (zA - zB))
|
||
|
distList.append(distanceBetween)
|
||
|
totalDist = totalDist + distanceBetween
|
||
|
if numberPoint == 1:
|
||
|
cmds.rebuildCurve('newguildcurve', ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=1, d=3, tol=0)
|
||
|
gapA = int(len(listVtx) * 0.5)
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[gapA], w=1)
|
||
|
cmds.select('newguildcurve.cv[1]','newguildcurve.cv[2]')
|
||
|
nodeCluster = cmds.cluster(n= 'midGrp')
|
||
|
cmds.spaceLocator(n='baseLoc')
|
||
|
cmds.select('baseLoc',nodeCluster[1])
|
||
|
cmds.matchTransform()
|
||
|
cmds.move( xA, yA, zA, nodeCluster[1], rpr =1)
|
||
|
cmds.select(nodeCluster[1],'baseLoc')
|
||
|
cmds.parent()
|
||
|
cmds.setAttr("baseLoc.scale", 1.33, 1.33, 1.33)
|
||
|
elif numberPoint == 2:
|
||
|
cmds.rebuildCurve('newguildcurve', ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=2, d=2, tol=0)
|
||
|
gapA = int(len(listVtx) * 0.33333)
|
||
|
gapB = int(len(listVtx) * 0.66666)
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[gapA], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[gapB ], w=1)
|
||
|
cmds.move( xA, yA, zA, 'newguildcurve.cv[1]', a =True, ws=True)
|
||
|
cmds.move( xB, yB, zB, 'newguildcurve.cv[2]', a =True, ws=True)
|
||
|
elif numberPoint == 3:
|
||
|
cmds.rebuildCurve('newguildcurve', ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=3, d=2, tol=0)
|
||
|
gapA = int(len(listVtx) * 0.25)
|
||
|
gapB = int(len(listVtx) * 0.5)
|
||
|
gapC = int(len(listVtx) * 0.75)
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[gapA], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[gapB ], w=1)
|
||
|
xC, yC, zC = cmds.pointPosition(listVtx[gapC ], w=1)
|
||
|
cmds.move( xA, yA, zA, 'newguildcurve.cv[1]', a =True, ws=True)
|
||
|
cmds.move( xB, yB, zB, 'newguildcurve.cv[2]', a =True, ws=True)
|
||
|
cmds.move( xC, yC, zC, 'newguildcurve.cv[3]', a =True, ws=True)
|
||
|
cmds.rebuildCurve('newguildcurve', ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=100, d=3, tol=0)
|
||
|
currentU = 0
|
||
|
prV = 0
|
||
|
gapDist = 1.0/(len(listVtx)-1)
|
||
|
scaleV = 1/totalDist
|
||
|
for j in range(len(listVtx)-2):
|
||
|
if checkEven == 1:
|
||
|
prV = currentU + gapDist
|
||
|
else:
|
||
|
prV = currentU + (scaleV * distList[j])
|
||
|
currentU = prV
|
||
|
xj, yj, zj = cmds.pointOnCurve('newguildcurve', pr= currentU, p=1)
|
||
|
cmds.move(xj, yj, zj,listVtx[j+1] , a =True, ws=True)
|
||
|
|
||
|
X2I()
|
||
|
|
||
|
def X3l(dir,startMode):
|
||
|
global edgeCurlRunMoveCV
|
||
|
global edgeCurlRunSel
|
||
|
global edgeCurlRunDistList
|
||
|
global startModeRecord
|
||
|
startModeRecord = startMode
|
||
|
modifiers = 0
|
||
|
if startMode == 0:
|
||
|
modifiers = cmds.getModifiers()
|
||
|
elif startMode == 1:
|
||
|
modifiers = 1
|
||
|
elif startMode == 4:
|
||
|
modifiers = 4
|
||
|
elif startMode == 100:
|
||
|
modifiers = 0
|
||
|
edgeCurlRunDistList = []
|
||
|
edgeCurlRunSel = []
|
||
|
edgeCurlRunMoveCV = []
|
||
|
checkEndCV = []
|
||
|
distList = []
|
||
|
edgeSel = cmds.ls(sl=1,fl=1)
|
||
|
if len(edgeSel) == 1:
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
selectsCV = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(edgeSel)
|
||
|
cmds.SelectEdgeLoopSp()
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
loopCVList = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(selectsCV)
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
surroundCV = cmds.ls(sl=1,fl=1)
|
||
|
commonList = list(set(surroundCV) & set(loopCVList))
|
||
|
cmds.select(commonList)
|
||
|
cmds.ConvertSelectionToContainedEdges()
|
||
|
checkConnerEdge = cmds.ls(sl=1,fl=1)
|
||
|
if len(checkConnerEdge) == 3:
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
checkConnerFace = cmds.ls(sl=1,fl=1)
|
||
|
if len(checkConnerFace)==2:
|
||
|
cmds.select(edgeSel)
|
||
|
cmds.GrowLoopPolygonSelectionRegion()
|
||
|
elif len(checkConnerFace) > 2:
|
||
|
cmds.select(checkConnerEdge)
|
||
|
else:
|
||
|
cmds.setToolTo( 'moveSuperContext' )
|
||
|
getCircleState,listVtx = Xll()
|
||
|
if getCircleState == 0:
|
||
|
edgeCurlRunSel = edgeSel
|
||
|
cleanList = ('tempGuid*','arcCurv*','upperLo*','aimLo*','baseLo*','makeThreePointCircularAr*','tempGuideLin*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
leftCV = ''
|
||
|
rightCV = ''
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
CurrentCam = cameraTrans[0]
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
A2D = Xl3(cameraTrans[0], (xA,yA,zA))
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[-1], w=1)
|
||
|
B2D = Xl3(cameraTrans[0], (xB,yB,zB))
|
||
|
if A2D[0] < B2D[0]:
|
||
|
leftCV = listVtx[0]
|
||
|
rightCV = listVtx[-1]
|
||
|
else:
|
||
|
rightCV = listVtx[0]
|
||
|
leftCV = listVtx[-1]
|
||
|
if leftCV == listVtx[-1]:
|
||
|
listVtx.reverse()
|
||
|
if dir == 'L':
|
||
|
listVtx.reverse()
|
||
|
if len(edgeSel) == 1:
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[-1], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[-2], w=1)
|
||
|
distanceBetween = math.sqrt((xA - xB) * (xA - xB) + (yA - yB) * (yA - yB) + (zA - zB) * (zA - zB))
|
||
|
distList.append(distanceBetween)
|
||
|
elif len(edgeSel) > 2:
|
||
|
distList = []
|
||
|
for i in range(len(listVtx)-1):
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[i], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[i+1], w=1)
|
||
|
distanceBetween = math.sqrt((xA - xB) * (xA - xB) + (yA - yB) * (yA - yB) + (zA - zB) * (zA - zB))
|
||
|
distList.append(distanceBetween)
|
||
|
edgeCurlRunDistList = distList
|
||
|
firstCV = listVtx[0]
|
||
|
secCV = listVtx[1]
|
||
|
thirdCV = ''
|
||
|
if len(edgeSel) == 1:
|
||
|
thirdCV = listVtx[2]
|
||
|
else:
|
||
|
thirdCV = listVtx[-1]
|
||
|
edgeCurlRunMoveCV = listVtx
|
||
|
if startMode != 100:
|
||
|
p1 = cmds.pointPosition(firstCV, w=1)
|
||
|
p2 = cmds.pointPosition(secCV, w=1)
|
||
|
p3 = cmds.pointPosition(thirdCV, w=1)
|
||
|
newNode = cmds.createNode('makeThreePointCircularArc')
|
||
|
cmds.setAttr(newNode + '.pt1', p1[0], p1[1], p1[2])
|
||
|
cmds.setAttr(newNode + '.pt2', p2[0], p2[1], p2[2])
|
||
|
cmds.setAttr(newNode + '.pt3', p3[0], p3[1], p3[2])
|
||
|
cmds.setAttr(newNode + '.d', 3)
|
||
|
cmds.setAttr(newNode + '.s', 4)
|
||
|
newCurve = cmds.createNode('nurbsCurve')
|
||
|
cmds.select(cl=1)
|
||
|
cmds.connectAttr(newNode + '.oc', newCurve + '.cr')
|
||
|
transformNode = cmds.listRelatives(newCurve, fullPath=True, parent=True)
|
||
|
cmds.rename(transformNode, 'arcCurve')
|
||
|
cmd = 'doMenuComponentSelection("' + edgeCurlRunMoveCV[0].split('.')[0] +'", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeSel)
|
||
|
cmds.refresh(f=True)
|
||
|
cPos = cmds.getAttr( newNode +'.center')
|
||
|
cmds.move( cPos[0][0], cPos[0][1], cPos[0][2],'arcCurve.scalePivot' ,'arcCurve.rotatePivot' , a =True, ws=True)
|
||
|
cmds.delete(ch=1)
|
||
|
circleR = math.sqrt((p1[0] - cPos[0][0]) * (p1[0] - cPos[0][0]) + (p1[1] - cPos[0][1]) * (p1[1] - cPos[0][1]) + (p1[2] - cPos[0][2]) * (p1[2] - cPos[0][2]))
|
||
|
cmds.spaceLocator(n='upperLoc')
|
||
|
cmds.spaceLocator(n='aimLoc')
|
||
|
cmds.spaceLocator(n='baseLoc')
|
||
|
cmds.select('upperLoc','aimLoc','baseLoc')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.setAttr(('upperLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.translate'),0, 1,-1)
|
||
|
cmds.setAttr(('upperLoc.translate'),0, 1,1)
|
||
|
consNode = cmds.aimConstraint('aimLoc','baseLoc',offset=[0,0,0], weight=1, aimVector=[1,0,0], upVector=[0,1,0], worldUpType='object', worldUpObject='upperLoc')
|
||
|
cmds.setAttr(('baseLoc.translate'),cPos[0][0], cPos[0][1], cPos[0][2])
|
||
|
cmds.setAttr(('aimLoc.translate'),p3[0], p3[1], p3[2])
|
||
|
cmds.setAttr(('upperLoc.translate'),p1[0], p1[1], p1[2])
|
||
|
cmds.circle( nr=(0, 0, 1), c=(0, 0, 0),r= circleR,n='tempGuide')
|
||
|
cmds.displaySmoothness(divisionsU=3, divisionsV=3, pointsWire=16, pointsShaded=4, polygonObject=3)
|
||
|
cmds.setAttr("tempGuideShape.overrideEnabled", 1)
|
||
|
cmds.setAttr("tempGuideShape.overrideColor",31)
|
||
|
cmds.select('tempGuide','baseLoc')
|
||
|
cmds.matchTransform()
|
||
|
cmds.select('baseLoc',d=1)
|
||
|
cmds.makeIdentity('tempGuide', apply=1, t=1,r=1,s=1)
|
||
|
cmds.ReverseCurve()
|
||
|
cmds.delete(ch=1)
|
||
|
cmds.move( p2[0], p2[1], p2[2],'tempGuide.scalePivot' ,'tempGuide.rotatePivot' , a =True, ws=True)
|
||
|
else:
|
||
|
if len(edgeSel) == 1:
|
||
|
cmds.select(edgeSel)
|
||
|
else:
|
||
|
cmds.select(edgeCurlRunMoveCV[0],edgeCurlRunMoveCV[1])
|
||
|
cmds.ConvertSelectionToContainedEdges()
|
||
|
cmds.polyToCurve(form=0, degree=1, conformToSmoothMeshPreview=1)
|
||
|
cmds.rename('tempGuide')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.ReverseCurve()
|
||
|
cmds.delete(ch=1)
|
||
|
cmds.setAttr("tempGuide.scale",50,50,50)
|
||
|
cmds.makeIdentity('tempGuide', apply=1, t=1,r=1,s=1)
|
||
|
checkLock = cmds.checkBox('lockCurveEdgeLength', q=1,v=1)
|
||
|
checkEven = cmds.checkBox('evenCurveEdgeLength', q=1,v=1)
|
||
|
if startMode == 100:
|
||
|
xA, yA, zA = cmds.pointPosition('tempGuide.cv[0]', w=1)
|
||
|
A2D = Xl3(cameraTrans[0], (xA,yA,zA))
|
||
|
xB, yB, zB = cmds.pointPosition('tempGuide.cv[1]', w=1)
|
||
|
B2D = Xl3(cameraTrans[0], (xB,yB,zB))
|
||
|
if A2D[0] > B2D[0]:
|
||
|
cmds.select('tempGuide')
|
||
|
cmds.ReverseCurve()
|
||
|
if dir == 'L':
|
||
|
cmds.select('tempGuide')
|
||
|
cmds.ReverseCurve()
|
||
|
if checkEven == 1 and len(edgeSel) > 1:
|
||
|
Xo7(edgeSel)
|
||
|
if checkLock == 0:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('tempGuide')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
for m in range(1,len(edgeCurlRunMoveCV)) :
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[m], w=1)
|
||
|
pointInSpace = om.MPoint(xK,yK,zK)
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move( closestPoint[0], closestPoint[1], closestPoint[2],edgeCurlRunMoveCV[m] , a =True, ws=True)
|
||
|
else:
|
||
|
circleLength = cmds.arclen( 'tempGuide' )
|
||
|
maxU = cmds.getAttr('tempGuide.maxValue')
|
||
|
UScaleV = circleLength / maxU
|
||
|
if len(edgeSel) == 1:
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[-2], w=1)
|
||
|
getU = X2l([xK, yK, zK], 'tempGuide')[0]
|
||
|
movingDist = distList[0]
|
||
|
moveV = movingDist / UScaleV
|
||
|
newU = getU + moveV
|
||
|
xj, yj, zj = cmds.pointOnCurve('tempGuide', pr= newU, p=1)
|
||
|
cmds.move(xj, yj, zj, edgeCurlRunMoveCV[-1] , a =True, ws=True)
|
||
|
else:
|
||
|
for m in range(1,len(edgeCurlRunMoveCV)) :
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[m-1], w=1)
|
||
|
getU = X2l([xK, yK, zK], 'tempGuide')[0]
|
||
|
movingDist = distList[m-1]
|
||
|
moveV = movingDist / UScaleV
|
||
|
newU = getU + moveV
|
||
|
xj, yj, zj = cmds.pointOnCurve('tempGuide', pr= newU, p=1)
|
||
|
cmds.move(xj, yj, zj, edgeCurlRunMoveCV[m] , a =True, ws=True)
|
||
|
else:
|
||
|
if checkLock == 0:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('tempGuide')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
if checkEven == 1:
|
||
|
Xo7(edgeSel)
|
||
|
for m in range(1,len(edgeCurlRunMoveCV)) :
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[m], w=1)
|
||
|
pointInSpace = om.MPoint(xK,yK,zK)
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move(closestPoint[0], closestPoint[1], closestPoint[2], edgeCurlRunMoveCV[m] , a =True, ws=True)
|
||
|
else:
|
||
|
circleLength = cmds.arclen( 'tempGuide' )
|
||
|
maxU = cmds.getAttr('tempGuide.maxValue')
|
||
|
UScaleV = circleLength / maxU
|
||
|
if len(edgeSel) == 1:
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[-2], w=1)
|
||
|
getU = X2l([xK, yK, zK], 'tempGuide')[0]
|
||
|
movingDist = distList[0]
|
||
|
moveV = movingDist / UScaleV
|
||
|
newU = getU + moveV
|
||
|
xj, yj, zj = cmds.pointOnCurve('tempGuide', pr= newU, p=1)
|
||
|
cmds.move(xj, yj, zj, edgeCurlRunMoveCV[-1] , a =True, ws=True)
|
||
|
else:
|
||
|
for m in range(1,len(edgeCurlRunMoveCV)) :
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[m-1], w=1)
|
||
|
getU = X2l([xK, yK, zK], 'tempGuide')[0]
|
||
|
movingDist = distList[m-1]
|
||
|
moveV = movingDist / UScaleV
|
||
|
newU = getU + moveV
|
||
|
xj, yj, zj = cmds.pointOnCurve('tempGuide', pr= newU, p=1)
|
||
|
cmds.move(xj, yj, zj, edgeCurlRunMoveCV[m] , a =True, ws=True)
|
||
|
cleanList = []
|
||
|
if len(edgeSel) == 1:
|
||
|
cmds.select(edgeCurlRunMoveCV[-2],edgeCurlRunMoveCV[-1])
|
||
|
cmds.ConvertSelectionToContainedEdges()
|
||
|
selNew=cmds.ls(sl=1)
|
||
|
cmd = 'doMenuComponentSelection("' + edgeSel[0].split('.')[0] +'", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(selNew)
|
||
|
cleanList = ('tempGuid*','arcCurv*','upperLo*','aimLo*','baseLo*','makeThreePointCircularAr*','tempGuideLin*')
|
||
|
else:
|
||
|
if startMode!= 100:
|
||
|
global ctx
|
||
|
ctx = 'edgeCurlRun'
|
||
|
if cmds.draggerContext(ctx, exists=True):
|
||
|
cmds.deleteUI(ctx)
|
||
|
cmds.draggerContext(ctx, pressCommand = X78, rc = Xo6, dragCommand = XOl, fnz = X3I, name=ctx, cursor='crossHair',undoMode='step')
|
||
|
cmds.setToolTo(ctx)
|
||
|
cleanList = ('arcCurv*','upperLo*','aimLo*','baseLo*','makeThreePointCircularAr*','tempGuideLin*')
|
||
|
else:
|
||
|
cleanList = ('tempGuid*','arcCurv*','upperLo*','aimLo*','baseLo*','makeThreePointCircularAr*','tempGuideLin*')
|
||
|
cmds.select(edgeSel)
|
||
|
cmd = 'doMenuComponentSelection("' + edgeSel[0].split('.')[0] +'", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeCurlRunSel)
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
|
||
|
def Xo6():
|
||
|
lineList = ('tempGuide','tempGuideLine')
|
||
|
for l in lineList:
|
||
|
if cmds.objExists(l):
|
||
|
cmds.setAttr((l + ".visibility"),0)
|
||
|
|
||
|
def XOl():
|
||
|
global edgeCurlRunMoveCV
|
||
|
global edgeCurlRunSel
|
||
|
global screenX,screenY
|
||
|
global ctx
|
||
|
global currentScaleRecord
|
||
|
global edgeCurlRunDistList
|
||
|
global startModeRecord
|
||
|
currentRotRecord = 0
|
||
|
currentEnRecord = 0
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, dragPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('tempGuide')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
if currentScaleRecord > vpX:
|
||
|
cmds.setAttr('tempGuide.scale',1.02,1.02,1.02)
|
||
|
else:
|
||
|
cmds.setAttr('tempGuide.scale',0.98,0.98,0.98)
|
||
|
currentScaleRecord = vpX
|
||
|
cmds.makeIdentity('tempGuide', apply=1, t=1,r=1,s=1)
|
||
|
checkLock = cmds.checkBox('lockCurveEdgeLength', q=1,v=1)
|
||
|
if(checkLock == 1):
|
||
|
cmds.setAttr("tempGuide.visibility",1)
|
||
|
circleLength = cmds.arclen( 'tempGuide' )
|
||
|
maxU = cmds.getAttr('tempGuide.maxValue')
|
||
|
UScaleV = circleLength / maxU
|
||
|
for m in range(1,len(edgeCurlRunMoveCV)) :
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[m-1], w=1)
|
||
|
getU = X2l([xK, yK, zK], 'tempGuide')[0]
|
||
|
movingDist = edgeCurlRunDistList[m-1]
|
||
|
moveV = movingDist / UScaleV
|
||
|
newU = getU + moveV
|
||
|
xj, yj, zj = cmds.pointOnCurve('tempGuide', pr= newU, p=1)
|
||
|
cmds.move(xj, yj, zj, edgeCurlRunMoveCV[m] , a =True, ws=True)
|
||
|
else:
|
||
|
cmds.setAttr("tempGuide.visibility",1)
|
||
|
for m in range(1,len(edgeCurlRunMoveCV)) :
|
||
|
xK, yK, zK = cmds.pointPosition(edgeCurlRunMoveCV[m], w=1)
|
||
|
pointInSpace = om.MPoint(xK,yK,zK)
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move(closestPoint[0], closestPoint[1], closestPoint[2], edgeCurlRunMoveCV[m] , a =True, ws=True)
|
||
|
cmds.refresh(f=True)
|
||
|
|
||
|
def X3I():
|
||
|
cleanList = ('tempGuid*','arcCurv*','upperLo*','aimLo*','baseLo*','makeThreePointCircularAr*','tempGuideLin*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
|
||
|
def X78():
|
||
|
global edgeCurlRunMoveCV
|
||
|
global edgeCurlRunSel
|
||
|
global screenX,screenY
|
||
|
global ctx
|
||
|
global currentScaleRecord
|
||
|
currentScaleRecord = 0
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, anchorPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
|
||
|
def Xl6():
|
||
|
cmds.checkBox('lockCurveEdgeLength', e=1,v=1)
|
||
|
cmds.checkBox('evenCurveEdgeLength', e=1,v=0)
|
||
|
cmds.setToolTo( 'moveSuperContext' )
|
||
|
|
||
|
def X83():
|
||
|
cmds.checkBox('lockCurveEdgeLength', e=1,v=0)
|
||
|
cmds.setToolTo( 'moveSuperContext' )
|
||
|
|
||
|
def X87():
|
||
|
cmds.checkBox('lockCurveEdgeLength', e=1,v=0)
|
||
|
cmds.checkBox('evenCurveEdgeLength', e=1,v=1)
|
||
|
cmds.setToolTo( 'moveSuperContext' )
|
||
|
|
||
|
def X9o():
|
||
|
cmds.checkBox('evenCurveEdgeLength', e=1,v=0)
|
||
|
cmds.setToolTo( 'moveSuperContext' )
|
||
|
|
||
|
def X48():
|
||
|
global curveGrp
|
||
|
global totalLenGrp
|
||
|
global ctx
|
||
|
global listVtxFGrp
|
||
|
global radiusBestFitGrp
|
||
|
global arcGrp
|
||
|
global radiusGrp
|
||
|
global blendNodeList
|
||
|
global ulistGrp
|
||
|
global sectionNumber
|
||
|
listVtxFGrp = []
|
||
|
totalLenGrp = []
|
||
|
ulistGrp = []
|
||
|
curveGrp = []
|
||
|
arcGrp = []
|
||
|
radiusGrp = []
|
||
|
radiusBestFitGrp = []
|
||
|
blendNodeList = []
|
||
|
selEdge = cmds.filterExpand(expand=True, sm=32)
|
||
|
if selEdge:
|
||
|
if cmds.objExists('saveSelSemi'):
|
||
|
cmds.delete('saveSelSemi')
|
||
|
cmds.sets(name='saveSelSemi', text='saveSelSemi')
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
listVtx = X8I(e)
|
||
|
firstN = listVtx[0].split('[')[1].split(']')[0]
|
||
|
secN = listVtx[1].split('[')[1].split(']')[0]
|
||
|
if int(firstN) > int(secN):
|
||
|
listVtx.reverse()
|
||
|
listVtxFGrp.append(listVtx)
|
||
|
positionListA = []
|
||
|
for n in listVtx:
|
||
|
getPo = cmds.pointPosition(n, w=1)
|
||
|
positionListA.append(getPo)
|
||
|
p1 = cmds.pointPosition(listVtx[0], w=1)
|
||
|
p2 = cmds.pointPosition(listVtx[-1], w=1)
|
||
|
radius = math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 + (p1[2] - p2[2]) ** 2) / 2
|
||
|
p3 = cmds.pointPosition(listVtx[int(len(listVtx) / 2)], w=1)
|
||
|
p4 = [(p2[0] + p1[0]) / 2, (p2[1] + p1[1]) / 2, (p2[2] + p1[2]) / 2]
|
||
|
distanceBC = math.sqrt((p4[0] - p3[0]) ** 2 + (p4[1] - p3[1]) ** 2 + (p4[2] - p3[2]) ** 2) / 2
|
||
|
if distanceBC < 0.001:
|
||
|
distanceBC = 0.001
|
||
|
distanceBD = radius / 2.0
|
||
|
OD = (distanceBC ** 2 + distanceBD ** 2) / (2 * distanceBC)
|
||
|
newR = radius + OD
|
||
|
radiusBestFitGrp.append(newR)
|
||
|
radiusGrp.append(radius)
|
||
|
newNode = cmds.createNode('makeTwoPointCircularArc')
|
||
|
arcGrp.append(newNode)
|
||
|
cmds.setAttr(newNode + '.pt1', p1[0], p1[1], p1[2])
|
||
|
cmds.setAttr(newNode + '.pt2', p2[0], p2[1], p2[2])
|
||
|
cmds.setAttr(newNode + '.tac', 0)
|
||
|
cmds.setAttr(newNode + '.r', newR)
|
||
|
cmds.setAttr(newNode + '.d', 3)
|
||
|
sectionNumber = len(e)
|
||
|
cmds.setAttr(newNode + '.s', sectionNumber)
|
||
|
newCurve = cmds.createNode('nurbsCurve')
|
||
|
cmds.connectAttr(newNode + '.oc', newCurve + '.cr')
|
||
|
transformNode = cmds.listRelatives(newCurve, fullPath=True, parent=True)
|
||
|
curveName = cmds.listRelatives(parent=True)
|
||
|
curveGrp.append(curveName[0])
|
||
|
cmds.setAttr(curveName[0] + '.visibility', 0)
|
||
|
cvList = []
|
||
|
cvList.append(listVtx[0])
|
||
|
cvList.append(listVtx[int(len(listVtx) / 2)])
|
||
|
cvList.append(listVtx[-1])
|
||
|
points = []
|
||
|
for cv in cvList:
|
||
|
x, y, z = cmds.pointPosition(cv, w=1)
|
||
|
this_point = om.MPoint(x, y, z)
|
||
|
points.append(this_point)
|
||
|
vectors = [ points[i + 1] - points[i] for i in range(len(points) - 1) ]
|
||
|
if vectors[0] == vectors[1]:
|
||
|
cmds.move(0.001, 0, 0, e[1:-1], r=1, cs=1, ls=1, wd=1)
|
||
|
points = []
|
||
|
for cv in cvList:
|
||
|
x, y, z = cmds.pointPosition(cv, w=1)
|
||
|
this_point = om.MPoint(x, y, z)
|
||
|
points.append(this_point)
|
||
|
vectors = [ points[i + 1] - points[i] for i in range(len(points) - 1) ]
|
||
|
Nx = vectors[0][1] * vectors[1][2] - vectors[0][2] * vectors[1][1]
|
||
|
Ny = vectors[0][2] * vectors[1][0] - vectors[0][0] * vectors[1][2]
|
||
|
Nz = vectors[0][0] * vectors[1][1] - vectors[0][1] * vectors[1][0]
|
||
|
cmds.setAttr(newNode + '.directionVectorX', Nx)
|
||
|
cmds.setAttr(newNode + '.directionVectorY', Ny)
|
||
|
cmds.setAttr(newNode + '.directionVectorZ', Nz)
|
||
|
cmds.group(em=True, name=curveName[0] + '_offsetSemi')
|
||
|
cmds.group(em=True, name=curveName[0] + '_aim')
|
||
|
cmds.setAttr(curveName[0] + '_offsetSemi.translateX', p1[0])
|
||
|
cmds.setAttr(curveName[0] + '_offsetSemi.translateY', p1[1])
|
||
|
cmds.setAttr(curveName[0] + '_offsetSemi.translateZ', p1[2])
|
||
|
cmds.setAttr(curveName[0] + '_aim.translateX', p2[0])
|
||
|
cmds.setAttr(curveName[0] + '_aim.translateY', p2[1])
|
||
|
cmds.setAttr(curveName[0] + '_aim.translateZ', p2[2])
|
||
|
const = cmds.aimConstraint(curveName[0] + '_aim', curveName[0] + '_offsetSemi')
|
||
|
cmds.delete(const, curveName[0] + '_aim')
|
||
|
cmds.parent(curveName[0], curveName[0] + '_offsetSemi')
|
||
|
cmds.FreezeTransformations()
|
||
|
cmds.move(p1[0], p1[1], p1[2], curveName[0] + '.scalePivot', curveName[0] + '.rotatePivot', a=1)
|
||
|
totalEdgeLoopLength = 0
|
||
|
sum = 0
|
||
|
Llist = []
|
||
|
uList = []
|
||
|
pList = []
|
||
|
for i in range(len(listVtx) - 1):
|
||
|
pA = cmds.pointPosition(listVtx[i], w=1)
|
||
|
pB = cmds.pointPosition(listVtx[i + 1], w=1)
|
||
|
checkDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
Llist.append(checkDistance)
|
||
|
totalEdgeLoopLength = totalEdgeLoopLength + checkDistance
|
||
|
totalLenGrp.append(totalEdgeLoopLength)
|
||
|
goEven = cmds.checkBox('evenCurveEdgeLength', q=1, v=1)
|
||
|
if goEven == 1:
|
||
|
avg = totalEdgeLoopLength / len(e)
|
||
|
for j in range(len(e)):
|
||
|
sum = (j + 1) * avg
|
||
|
uList.append(sum)
|
||
|
else:
|
||
|
for j in Llist:
|
||
|
sum = sum + j
|
||
|
uList.append(sum)
|
||
|
|
||
|
ulistGrp.append(uList)
|
||
|
for k in uList:
|
||
|
p = k / totalEdgeLoopLength * sectionNumber
|
||
|
pList.append(p)
|
||
|
|
||
|
for q in range(len(pList) - 1):
|
||
|
pp = cmds.pointOnCurve(curveName[0], pr=pList[q], p=1)
|
||
|
cmds.move(pp[0], pp[1], pp[2], listVtx[q + 1], a=True, ws=True)
|
||
|
backupCurve = cmds.duplicate(curveName[0])
|
||
|
p1A = cmds.pointPosition(listVtx[1], w=1)
|
||
|
p2A = cmds.pointPosition(listVtx[-2], w=1)
|
||
|
mid1x = (p1A[0] - p1[0]) / 2 + p1[0]
|
||
|
mid1y = (p1A[1] - p1[1]) / 2 + p1[1]
|
||
|
mid1z = (p1A[2] - p1[2]) / 2 + p1[2]
|
||
|
mid2x = (p2A[0] - p2[0]) / 2 + p2[0]
|
||
|
mid2y = (p2A[1] - p2[1]) / 2 + p2[1]
|
||
|
mid2z = (p2A[2] - p2[2]) / 2 + p2[2]
|
||
|
positionListA.insert(1, [mid1x, mid1y, mid1z])
|
||
|
positionListA.insert(len(positionListA) - 1, [mid2x, mid2y, mid2z])
|
||
|
for x in range(len(positionListA)):
|
||
|
cmds.move(positionListA[x][0], positionListA[x][1], positionListA[x][2], backupCurve[0] + '.cv[' + str(x) + ']', a=1)
|
||
|
blendName = cmds.blendShape(backupCurve[0], curveName[0], w=[(0, 1)], en=0)
|
||
|
blendNodeList.append(blendName[0])
|
||
|
meshName = selEdge[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(selEdge)
|
||
|
ctx = 'unBevelCtx'
|
||
|
if cmds.draggerContext(ctx, exists=True):
|
||
|
cmds.deleteUI(ctx)
|
||
|
cmds.draggerContext(ctx, pressCommand=XO2, rc=X26, dragCommand=X38, fnz=X74, name=ctx, cursor='crossHair', undoMode='step')
|
||
|
cmds.setToolTo(ctx)
|
||
|
def X74():
|
||
|
cmds.setToolTo('selectSuperContext')
|
||
|
cleanList = ('makeTwoPointCircularAr*','*Semi*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def X26():
|
||
|
cmds.setToolTo('selectSuperContext')
|
||
|
cleanList = ('makeTwoPointCircularAr*','*Semi*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def XO2():
|
||
|
global currentRotRecord
|
||
|
global currentEnRecord
|
||
|
global screenX
|
||
|
global screenY
|
||
|
currentRotRecord = 0
|
||
|
currentEnRecord = 0
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, anchorPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
t = radiusGrp[0] / radiusBestFitGrp[0]
|
||
|
screenX = (vpX + t) / 1.9
|
||
|
def X38():
|
||
|
global currentRotRecord
|
||
|
global currentEnRecord
|
||
|
modifiers = cmds.getModifiers()
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, dragPoint=True)
|
||
|
distanceA = (vpX - screenX) / 100
|
||
|
t = distanceA
|
||
|
fu = 1 / (1 + t ** 5 / 100)
|
||
|
if modifiers == 4:
|
||
|
for c in curveGrp:
|
||
|
cmds.setAttr(c + '.rotateX', 0)
|
||
|
elif modifiers == 1:
|
||
|
rotateRun = cmds.getAttr(curveGrp[0] + '.rotateX')
|
||
|
if currentRotRecord > vpX:
|
||
|
rotateRun = rotateRun + 2
|
||
|
else:
|
||
|
rotateRun = rotateRun - 2
|
||
|
for c in curveGrp:
|
||
|
cmds.setAttr(c + '.rotateX', rotateRun)
|
||
|
currentRotRecord = vpX
|
||
|
elif modifiers == 8:
|
||
|
evRun = cmds.getAttr(blendNodeList[0] + '.envelope')
|
||
|
if currentEnRecord > vpX:
|
||
|
evRun = evRun + 0.05
|
||
|
else:
|
||
|
evRun = evRun - 0.05
|
||
|
if evRun > 1:
|
||
|
evRun = 1
|
||
|
elif evRun < 0:
|
||
|
evRun = 0
|
||
|
for f in blendNodeList:
|
||
|
cmds.setAttr(f + '.envelope', evRun)
|
||
|
currentEnRecord = vpX
|
||
|
else:
|
||
|
for f in blendNodeList:
|
||
|
cmds.setAttr(f + '.envelope', 0)
|
||
|
|
||
|
for a in range(len(arcGrp)):
|
||
|
newR = radiusGrp[a] * (1 + fu * 5)
|
||
|
cmds.setAttr(arcGrp[a] + '.radius', newR)
|
||
|
for i in range(len(arcGrp)):
|
||
|
pList = []
|
||
|
uList = ulistGrp[i]
|
||
|
for k in uList:
|
||
|
p = k / totalLenGrp[i] * sectionNumber
|
||
|
pList.append(p)
|
||
|
listVtx = listVtxFGrp[i]
|
||
|
for q in range(len(pList) - 1):
|
||
|
pp = cmds.pointOnCurve(curveGrp[i], pr=pList[q], p=1)
|
||
|
cmds.move(pp[0], pp[1], pp[2], listVtx[q + 1], a=True, ws=True)
|
||
|
cmds.refresh(f=True)
|
||
|
def X7l():
|
||
|
global selEdge
|
||
|
global selMeshForDeformer
|
||
|
global ctx
|
||
|
selEdge = cmds.filterExpand(expand=True, sm=32)
|
||
|
currentDropOff = 1
|
||
|
snapCheck = 1
|
||
|
goEven = cmds.checkBox('evenCurveEdgeLength', q=1, v=1)
|
||
|
conP = 2
|
||
|
curveT = 1
|
||
|
goArc = 1
|
||
|
selMeshForDeformer = cmds.ls(sl=1, o=1)
|
||
|
getCircleState, listVtx = Xll()
|
||
|
deformerNames = []
|
||
|
midP = int(len(listVtx) / 2)
|
||
|
cmds.move(0.01, 0, 0, selEdge[midP], r=1, cs=1, ls=1, wd=1)
|
||
|
p1 = cmds.pointPosition(listVtx[0], w=1)
|
||
|
p2 = cmds.pointPosition(listVtx[midP], w=1)
|
||
|
p3 = cmds.pointPosition(listVtx[-1], w=1)
|
||
|
newNode = cmds.createNode('makeThreePointCircularArc')
|
||
|
cmds.setAttr(newNode + '.pt1', p1[0], p1[1], p1[2])
|
||
|
cmds.setAttr(newNode + '.pt2', p2[0], p2[1], p2[2])
|
||
|
cmds.setAttr(newNode + '.pt3', p3[0], p3[1], p3[2])
|
||
|
cmds.setAttr(newNode + '.d', 3)
|
||
|
cmds.setAttr(newNode + '.s', len(listVtx))
|
||
|
newCurve = cmds.createNode('nurbsCurve')
|
||
|
cmds.connectAttr(newNode + '.oc', newCurve + '.cr')
|
||
|
cmds.delete(ch=1)
|
||
|
transformNode = cmds.listRelatives(newCurve, fullPath=True, parent=True)
|
||
|
cmds.rename(transformNode, 'arcCurve')
|
||
|
numberP = 0
|
||
|
numberP = int(conP) - 1
|
||
|
cmds.rebuildCurve('arcCurve', ch=1, rpo=1, rt=0, end=1, kr=0, kcp=0, kep=1, kt=0, s=numberP, d=3, tol=0.01)
|
||
|
cmds.delete('arcCurve', ch=1)
|
||
|
totalEdgeLoopLength = 0
|
||
|
sum = 0
|
||
|
Llist = []
|
||
|
uList = []
|
||
|
pList = []
|
||
|
for i in selEdge:
|
||
|
e2v = cmds.polyListComponentConversion(i, fe=1, tv=1)
|
||
|
e2v = cmds.ls(e2v, fl=1)
|
||
|
pA = cmds.pointPosition(e2v[0], w=1)
|
||
|
pB = cmds.pointPosition(e2v[1], w=1)
|
||
|
checkDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
Llist.append(checkDistance)
|
||
|
totalEdgeLoopLength = totalEdgeLoopLength + checkDistance
|
||
|
if goEven == 1:
|
||
|
avg = totalEdgeLoopLength / len(selEdge)
|
||
|
for j in range(len(selEdge)):
|
||
|
sum = (j + 1) * avg
|
||
|
uList.append(sum)
|
||
|
else:
|
||
|
for j in Llist:
|
||
|
sum = sum + j
|
||
|
uList.append(sum)
|
||
|
for k in uList:
|
||
|
p = k / totalEdgeLoopLength
|
||
|
pList.append(p)
|
||
|
for q in range(len(pList)):
|
||
|
if q + 1 == len(listVtx):
|
||
|
pp = cmds.pointOnCurve('arcCurve', pr=0, p=1)
|
||
|
cmds.move(pp[0], pp[1], pp[2], listVtx[0], a=True, ws=True)
|
||
|
else:
|
||
|
pp = cmds.pointOnCurve('arcCurve', pr=pList[q], p=1)
|
||
|
cmds.move(pp[0], pp[1], pp[2], listVtx[q + 1], a=True, ws=True)
|
||
|
cmds.delete('arcCurve', ch=1)
|
||
|
cmds.select('arcCurve')
|
||
|
cmds.nurbsCurveToBezier()
|
||
|
try:
|
||
|
deformerNames = cmds.wire(selMeshForDeformer, gw=0, en=1, ce=0, li=0, w='arcCurve', uct=0)
|
||
|
except:
|
||
|
deformerNames = cmds.wire(selMeshForDeformer, gw=0, en=1, ce=0, li=0, w='arcCurve')
|
||
|
cmds.setAttr(deformerNames[0] + '.dropoffDistance[0]', 0.1)
|
||
|
cA = cmds.pointPosition('arcCurve.cv[0]', w=1)
|
||
|
cD = cmds.pointPosition('arcCurve.cv[3]', w=1)
|
||
|
try:
|
||
|
cmds.select('arcCurve.cv[1]')
|
||
|
cmds.cluster(useComponentTags=0)
|
||
|
checkSel = cmds.ls(sl=1)
|
||
|
cmds.rename(checkSel[0], 'ccBHandle')
|
||
|
except:
|
||
|
cmds.cluster('arcCurve.cv[1]', name='ccB')
|
||
|
|
||
|
cmds.move(cA[0], cA[1], cA[2], 'ccBHandle.scalePivot', 'ccBHandle.rotatePivot', a=True, ws=True)
|
||
|
try:
|
||
|
cmds.select('arcCurve.cv[2]')
|
||
|
cmds.cluster(useComponentTags=0)
|
||
|
checkSel = cmds.ls(sl=1)
|
||
|
cmds.rename(checkSel[0], 'ccCHandle')
|
||
|
except:
|
||
|
cmds.cluster('arcCurve.cv[2]', name='ccC')
|
||
|
cmds.move(cD[0], cD[1], cD[2], 'ccCHandle.scalePivot', 'ccCHandle.rotatePivot', a=True, ws=True)
|
||
|
cmds.setAttr('arcCurve.visibility', 0)
|
||
|
cmds.setAttr('ccBHandle.visibility', 0)
|
||
|
cmds.setAttr('ccCHandle.visibility', 0)
|
||
|
meshName = selEdge[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(selEdge)
|
||
|
hideList = ['arcCurve','arcCurveBaseWire','ccBHandle','ccCHandle']
|
||
|
for h in hideList:
|
||
|
cmds.setAttr((h + '.hiddenInOutliner'), 1)
|
||
|
ctx = 'tensionCtx'
|
||
|
if cmds.draggerContext(ctx, exists=True):
|
||
|
cmds.deleteUI(ctx)
|
||
|
cmds.draggerContext(ctx, pressCommand=X22, rc=X96, dragCommand=XO6, fnz=X33, name=ctx, cursor='crossHair', undoMode='step')
|
||
|
cmds.setToolTo(ctx)
|
||
|
def X33():
|
||
|
cmds.delete(selMeshForDeformer, ch=1)
|
||
|
cmds.setToolTo('selectSuperContext')
|
||
|
cleanList = ('arc*','cc*Handl*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def X96():
|
||
|
pass
|
||
|
def X22():
|
||
|
global screenX
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, anchorPoint=True)
|
||
|
screenX = vpX
|
||
|
def XO6():
|
||
|
modifiers = cmds.getModifiers()
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, dragPoint=True)
|
||
|
distanceA = (screenX - vpX) / 100
|
||
|
t = 1 + distanceA
|
||
|
if modifiers == 4:
|
||
|
cmds.setAttr('ccBHandle.scaleX', t)
|
||
|
cmds.setAttr('ccBHandle.scaleY', t)
|
||
|
cmds.setAttr('ccBHandle.scaleZ', t)
|
||
|
elif modifiers == 1:
|
||
|
cmds.setAttr('ccCHandle.scaleX', t)
|
||
|
cmds.setAttr('ccCHandle.scaleY', t)
|
||
|
cmds.setAttr('ccCHandle.scaleZ', t)
|
||
|
elif modifiers == 8:
|
||
|
cmds.setAttr('ccBHandle.scaleX', 1)
|
||
|
cmds.setAttr('ccBHandle.scaleY', 1)
|
||
|
cmds.setAttr('ccBHandle.scaleZ', 1)
|
||
|
cmds.setAttr('ccCHandle.scaleX', 1)
|
||
|
cmds.setAttr('ccCHandle.scaleY', 1)
|
||
|
cmds.setAttr('ccCHandle.scaleZ', 1)
|
||
|
else:
|
||
|
cmds.setAttr('ccBHandle.scaleX', t)
|
||
|
cmds.setAttr('ccBHandle.scaleY', t)
|
||
|
cmds.setAttr('ccBHandle.scaleZ', t)
|
||
|
cmds.setAttr('ccCHandle.scaleX', t)
|
||
|
cmds.setAttr('ccCHandle.scaleY', t)
|
||
|
cmds.setAttr('ccCHandle.scaleZ', t)
|
||
|
cmds.refresh(f=True)
|
||
|
def X8O():
|
||
|
global vLData
|
||
|
global cLData
|
||
|
global ctx
|
||
|
global ppData
|
||
|
checCurrentkHUD = cmds.headsUpDisplay(lh=1)
|
||
|
if checCurrentkHUD is not None:
|
||
|
for t in checCurrentkHUD:
|
||
|
cmds.headsUpDisplay(t, rem=1)
|
||
|
ppData = []
|
||
|
vLData = []
|
||
|
cLData = []
|
||
|
selEdge = cmds.filterExpand(expand=True, sm=32)
|
||
|
if selEdge:
|
||
|
if cmds.objExists('saveSel'):
|
||
|
cmds.delete('saveSel')
|
||
|
cmds.sets(name='saveSel', text='saveSel')
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
pPoint, vList, cList = X35(e)
|
||
|
ppData.append(pPoint)
|
||
|
vLData.append(vList)
|
||
|
cLData.append(cList)
|
||
|
|
||
|
cmds.select(selEdge)
|
||
|
ctx = 'unBevelCtx'
|
||
|
if cmds.draggerContext(ctx, exists=True):
|
||
|
cmds.deleteUI(ctx)
|
||
|
cmds.draggerContext(ctx, pressCommand=X28, rc=Xo8, dragCommand=Xl7, name=ctx, cursor='crossHair', undoMode='step')
|
||
|
cmds.setToolTo(ctx)
|
||
|
return
|
||
|
def Xo8():
|
||
|
cmds.headsUpDisplay('HUDunBevelStep', rem=True)
|
||
|
flattenList = []
|
||
|
for v in vLData:
|
||
|
for x in range(len(v)):
|
||
|
flattenList.append(v[x])
|
||
|
cmds.polyMergeVertex(flattenList, d=0.001, am=0, ch=0)
|
||
|
cmds.select('saveSel')
|
||
|
meshName = flattenList[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.setToolTo('selectSuperContext')
|
||
|
if cmds.objExists('saveSel'):
|
||
|
cmds.delete('saveSel')
|
||
|
def X53():
|
||
|
if viewPortCount >= 1:
|
||
|
getPercent = viewPortCount / 100.0
|
||
|
elif viewPortCount < 1 and viewPortCount > 0:
|
||
|
getPercent = 0.1
|
||
|
elif viewPortCount == 0:
|
||
|
getPercent = 0
|
||
|
getNumber = '%.2f' % getPercent
|
||
|
return getNumber
|
||
|
def X28():
|
||
|
global storeCount
|
||
|
global screenX
|
||
|
global screenY
|
||
|
global viewPortCount
|
||
|
global lockCount
|
||
|
viewPortCount = 0
|
||
|
lockCount = 50
|
||
|
storeCount = 0
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, anchorPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
lockX = vpX
|
||
|
cmds.headsUpDisplay('HUDunBevelStep', section=1, block=0, blockSize='large', label='unBevel', labelFontSize='large', command=X53, atr=1)
|
||
|
def Xl7():
|
||
|
global storeCount
|
||
|
global screenX
|
||
|
global viewPortCount
|
||
|
global lockCount
|
||
|
movePN = 0
|
||
|
modifiers = cmds.getModifiers()
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctx, query=True, dragPoint=True)
|
||
|
if modifiers == 1:
|
||
|
for i in range(len(ppData)):
|
||
|
cmds.scale(0, 0, 0, vLData[i], cs=1, r=1, p=(ppData[i][0], ppData[i][1], ppData[i][2]))
|
||
|
viewPortCount = 0
|
||
|
elif modifiers == 8:
|
||
|
if screenX > vpX:
|
||
|
lockCount = lockCount - 1
|
||
|
else:
|
||
|
lockCount = lockCount + 1
|
||
|
screenX = vpX
|
||
|
if lockCount > 0:
|
||
|
getX = int(lockCount / 10) * 10
|
||
|
if storeCount != getX:
|
||
|
storeCount = getX
|
||
|
for i in range(len(ppData)):
|
||
|
for v in range(len(vLData[i])):
|
||
|
moveX = ppData[i][0] - cLData[i][v][0] * lockCount
|
||
|
moveY = ppData[i][1] - cLData[i][v][1] * lockCount
|
||
|
moveZ = ppData[i][2] - cLData[i][v][2] * lockCount
|
||
|
cmds.move(moveX, moveY, moveZ, vLData[i][v], absolute=1, ws=1)
|
||
|
viewPortCount = storeCount
|
||
|
else:
|
||
|
viewPortCount = 0.1
|
||
|
else:
|
||
|
if screenX > vpX:
|
||
|
lockCount = lockCount - 5
|
||
|
else:
|
||
|
lockCount = lockCount + 5
|
||
|
screenX = vpX
|
||
|
if lockCount > 0:
|
||
|
for i in range(len(ppData)):
|
||
|
for v in range(len(vLData[i])):
|
||
|
moveX = ppData[i][0] - cLData[i][v][0] * lockCount
|
||
|
moveY = ppData[i][1] - cLData[i][v][1] * lockCount
|
||
|
moveZ = ppData[i][2] - cLData[i][v][2] * lockCount
|
||
|
cmds.move(moveX, moveY, moveZ, vLData[i][v], absolute=1, ws=1)
|
||
|
viewPortCount = lockCount
|
||
|
else:
|
||
|
viewPortCount = 0.1
|
||
|
cmds.refresh(f=True)
|
||
|
|
||
|
def XI5():
|
||
|
selEdge = cmds.filterExpand(expand=True, sm=32)
|
||
|
if selEdge:
|
||
|
if cmds.objExists('saveSel'):
|
||
|
cmds.delete('saveSel')
|
||
|
cmds.sets(name='saveSel', text='saveSel')
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
X35(e)
|
||
|
cmds.select(selEdge)
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
cmds.polyMergeVertex(d=0.001, am=0, ch=1)
|
||
|
cmds.select('saveSel')
|
||
|
cmds.delete('saveSel')
|
||
|
|
||
|
def X35(edgelist):
|
||
|
listVtx = X8I(edgelist)
|
||
|
checkA = X79(listVtx[1], listVtx[0], listVtx[-1])
|
||
|
angleA = math.degrees(checkA)
|
||
|
checkB = X79(listVtx[-2], listVtx[-1], listVtx[0])
|
||
|
angleB = math.degrees(checkB)
|
||
|
angleC = 180 - angleA - angleB
|
||
|
distanceC = X3o(listVtx[0], listVtx[-1])
|
||
|
distanceA = distanceC / math.sin(math.radians(angleC)) * math.sin(math.radians(angleA))
|
||
|
distanceB = distanceC / math.sin(math.radians(angleC)) * math.sin(math.radians(angleB))
|
||
|
oldDistA = X3o(listVtx[-2], listVtx[-1])
|
||
|
oldDistB = X3o(listVtx[0], listVtx[1])
|
||
|
scalarB = distanceB / oldDistB
|
||
|
pA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
pB = cmds.pointPosition(listVtx[1], w=1)
|
||
|
newP = [0, 0, 0]
|
||
|
newP[0] = (pB[0] - pA[0]) * scalarB + pA[0]
|
||
|
newP[1] = (pB[1] - pA[1]) * scalarB + pA[1]
|
||
|
newP[2] = (pB[2] - pA[2]) * scalarB + pA[2]
|
||
|
listVtx = listVtx[1:-1]
|
||
|
storeDist = []
|
||
|
for l in listVtx:
|
||
|
sotreXYZ = [0, 0, 0]
|
||
|
p = cmds.xform(l, q=True, t=True, ws=True)
|
||
|
sotreXYZ[0] = (newP[0] - p[0]) / 100
|
||
|
sotreXYZ[1] = (newP[1] - p[1]) / 100
|
||
|
sotreXYZ[2] = (newP[2] - p[2]) / 100
|
||
|
storeDist.append(sotreXYZ)
|
||
|
return (newP, listVtx, storeDist)
|
||
|
def X84():
|
||
|
goEven = cmds.checkBox('evenRoundEdgeLength', q=1, v=1)
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
check = []
|
||
|
check.append(e[0])
|
||
|
check.append(e[-1])
|
||
|
e2v = cmds.ls(cmds.polyListComponentConversion(check,tv=1),fl=1)
|
||
|
if len(e2v) != 3:
|
||
|
XI7(e)
|
||
|
if goEven == 1:
|
||
|
Xo7(e)
|
||
|
XI7(e)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
def XI7(flatList):
|
||
|
cleanList = ('newCircleGuid*','tempGuid*','arcCurv*','upperLo*','aimLo*','tempCircleGuide*','baseLo*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
edgeSel = flatList
|
||
|
listVtx = X8I(edgeSel)
|
||
|
pointA = listVtx[0]
|
||
|
pointB = listVtx[-1]
|
||
|
xA, yA, zA = cmds.pointPosition(pointA, w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(pointB , w=1)
|
||
|
avgX = 0
|
||
|
avgY = 0
|
||
|
avgZ = 0
|
||
|
for i in range(1, len(listVtx)-1):
|
||
|
xP, yP, zP = cmds.pointPosition(listVtx[i], w=1)
|
||
|
avgX = avgX + xP
|
||
|
avgY = avgY + yP
|
||
|
avgZ = avgZ + zP
|
||
|
xMid = avgX / (len(listVtx)-2)
|
||
|
yMid = avgY / (len(listVtx)-2)
|
||
|
zMid = avgZ / (len(listVtx)-2)
|
||
|
distanceBetween = math.sqrt((xA - xB) * (xA - xB) + (yA - yB) * (yA - yB) + (zA - zB) * (zA - zB))
|
||
|
circleR = distanceBetween / math.sqrt( 2 )
|
||
|
cmds.circle( nr=(0, 0 ,circleR), c=(0, 0, 0),r= circleR,n='tempCircleGuideA')
|
||
|
cmds.spaceLocator(n='upperLoc')
|
||
|
cmds.spaceLocator(n='aimLoc')
|
||
|
cmds.spaceLocator(n='baseLoc')
|
||
|
cmds.select('upperLoc','aimLoc','baseLoc')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.setAttr(('upperLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.translate'),0, 1,-1)
|
||
|
cmds.setAttr(('upperLoc.translate'),0, 1,1)
|
||
|
consNode = cmds.aimConstraint('aimLoc','baseLoc',offset=[0,0,0], weight=1, aimVector=[1,0,0], upVector=[0,1,0], worldUpType='object', worldUpObject='upperLoc')
|
||
|
cmds.setAttr(('baseLoc.translate'),xA, yA, zA)
|
||
|
cmds.setAttr(('aimLoc.translate'),xB, yB, zB )
|
||
|
cmds.setAttr(('upperLoc.translate'),xMid,yMid,zMid)
|
||
|
cmds.select('tempCircleGuideA','baseLoc')
|
||
|
cmds.matchTransform()
|
||
|
cmds.duplicate('tempCircleGuideA',smartTransform=1,n='newCircleGuide')
|
||
|
cmds.setAttr(('newCircleGuide.translate'),xB, yB, zB)
|
||
|
intersectC = cmds.curveIntersect('tempCircleGuideA','newCircleGuide')
|
||
|
sPosX, sPosY,sPosZ = cmds.pointOnCurve('tempCircleGuideA' , pr = float(intersectC[0]), p=1)
|
||
|
cPosX, cPosY,cPosZ = cmds.pointOnCurve('tempCircleGuideA' , pr = float(intersectC[2]), p=1)
|
||
|
distA = math.sqrt((xMid - sPosX) * (xMid - sPosX) + (yMid - sPosY) * (yMid - sPosY) + (zMid - sPosZ) * (zMid - sPosZ))
|
||
|
distB = math.sqrt((xMid - cPosX) * (xMid - cPosX) + (yMid - cPosY) * (yMid - cPosY) + (zMid - cPosZ) * (zMid - cPosZ))
|
||
|
newCenter = []
|
||
|
if distA > distB:
|
||
|
newCenter = [sPosX, sPosY,sPosZ ]
|
||
|
else:
|
||
|
newCenter = [cPosX, cPosY,cPosZ ]
|
||
|
cmds.setAttr(('newCircleGuide.translate'),newCenter[0], newCenter[1], newCenter[2])
|
||
|
cmds.makeIdentity('newCircleGuide', apply=1, t=1,r=1,s=1)
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('newCircleGuide')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
for m in range(1,len(listVtx)) :
|
||
|
xK, yK, zK = cmds.pointPosition(listVtx[m], w=1)
|
||
|
pointInSpace = om.MPoint(xK,yK,zK)
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move(closestPoint[0], closestPoint[1], closestPoint[2], listVtx[m] , a =True, ws=True)
|
||
|
cleanList = ('newCircleGuid*','tempGuid*','arcCurv*','upperLo*','aimLo*','tempCircleGuide*','baseLo*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def Xo9():
|
||
|
goEven = cmds.checkBox('evenRoundEdgeLength', q=1, v=1)
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
check = []
|
||
|
check.append(e[0])
|
||
|
check.append(e[-1])
|
||
|
e2v = cmds.ls(cmds.polyListComponentConversion(check,tv=1),fl=1)
|
||
|
if len(e2v) != 3:
|
||
|
X2o(e)
|
||
|
if goEven == 1:
|
||
|
Xo7(e)
|
||
|
X2o(e)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
def X2o(flatList):
|
||
|
cleanList = ('newCircleGuid*','tempGuid*','arcCurv*','upperLo*','aimLo*','tempCircleGuide*','baseLo*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
listVtx = X8I(flatList)
|
||
|
pointA = listVtx[0]
|
||
|
pointB = listVtx[-1]
|
||
|
xA, yA, zA = cmds.pointPosition(pointA, w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(pointB , w=1)
|
||
|
avgX = 0
|
||
|
avgY = 0
|
||
|
avgZ = 0
|
||
|
for i in range(1, len(listVtx)-1):
|
||
|
xP, yP, zP = cmds.pointPosition(listVtx[i], w=1)
|
||
|
avgX = avgX + xP
|
||
|
avgY = avgY + yP
|
||
|
avgZ = avgZ + zP
|
||
|
xMid = avgX / (len(listVtx)-2)
|
||
|
yMid = avgY / (len(listVtx)-2)
|
||
|
zMid = avgZ / (len(listVtx)-2)
|
||
|
distanceBetween = math.sqrt((xA - xB) * (xA - xB) + (yA - yB) * (yA - yB) + (zA - zB) * (zA - zB))
|
||
|
circleR = distanceBetween / 2
|
||
|
cmds.circle( nr=(0, 0 ,circleR), c=(0, 0, 0),r= circleR,n='newCircleGuide')
|
||
|
cmds.spaceLocator(n='upperLoc')
|
||
|
cmds.spaceLocator(n='aimLoc')
|
||
|
cmds.spaceLocator(n='baseLoc')
|
||
|
cmds.select('upperLoc','aimLoc','baseLoc')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.setAttr(('upperLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.translate'),0, 1,-1)
|
||
|
cmds.setAttr(('upperLoc.translate'),0, 1,1)
|
||
|
consNode = cmds.aimConstraint('aimLoc','baseLoc',offset=[0,0,0], weight=1, aimVector=[1,0,0], upVector=[0,1,0], worldUpType='object', worldUpObject='upperLoc')
|
||
|
cmds.setAttr(('baseLoc.translate'),xA, yA, zA)
|
||
|
cmds.setAttr(('aimLoc.translate'),xB, yB, zB )
|
||
|
cmds.setAttr(('upperLoc.translate'),xMid,yMid,zMid)
|
||
|
cmds.select('newCircleGuide','baseLoc')
|
||
|
cmds.matchTransform()
|
||
|
xC = (xA - xB)/2 + xB
|
||
|
yC = (yA - yB)/2 + yB
|
||
|
zC = (zA - zB)/2 + zB
|
||
|
cmds.setAttr(('newCircleGuide.translate'),xC, yC, zC)
|
||
|
cmds.makeIdentity('newCircleGuide', apply=1, t=1,r=1,s=1)
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('newCircleGuide')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
for m in range(1,len(listVtx)) :
|
||
|
xK, yK, zK = cmds.pointPosition(listVtx[m], w=1)
|
||
|
pointInSpace = om.MPoint(xK,yK,zK)
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move(closestPoint[0], closestPoint[1], closestPoint[2], listVtx[m] , a =True, ws=True)
|
||
|
cleanList = ('newCircleGuid*','tempGuid*','arcCurv*','upperLo*','aimLo*','tempCircleGuide*','baseLo*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def X5I():
|
||
|
checkEven = cmds.checkBox('evenRoundEdgeLength', q=1,v=1)
|
||
|
pivotSnapSwitch = cmds.checkBox('evenRoundPivotSnap', q=1,v=1)
|
||
|
getFaceList = cmds.filterExpand(ex=1, sm=34)
|
||
|
if getFaceList:
|
||
|
cmds.ConvertSelectionToEdgePerimeter()
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
cmds.polyCircularizeEdge(constructionHistory=0, alignment=0, radialOffset=0, normalOffset=0, normalOrientation=0, smoothingAngle=30, evenlyDistribute = checkEven, divisions=0, supportingEdges=0, twist=0, relaxInterior=1)
|
||
|
sortGrp = X69()
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmds.delete(meshName,ch =1)
|
||
|
if pivotSnapSwitch == 1:
|
||
|
if len(sortGrp) > 1:
|
||
|
X2O()
|
||
|
def X2O():
|
||
|
pivotSnapTypeCheck = cmds.radioButtonGrp('PivotSnapType', q=1,sl=1)
|
||
|
cleanList = ('baseCircleCurv*','tempCenterCurve*','xxxx','tempCircleCenterLin*','upperLo*','aimLo*','baseLo*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
baseLoopNumber = 0
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
curveList = []
|
||
|
targetLoop = ''
|
||
|
vCheck = 10000000
|
||
|
if pivotSnapTypeCheck == 2:
|
||
|
vCheck = 0
|
||
|
for e in sortGrp:
|
||
|
bbox =cmds.xform(e, q=1, ws=1, bb=1)
|
||
|
xSide = (bbox[3]-bbox[0])*(bbox[4]-bbox[1])
|
||
|
ySide = (bbox[5]-bbox[2])*(bbox[3]-bbox[0])
|
||
|
zSide = (bbox[4]-bbox[1])*(bbox[5]-bbox[2])
|
||
|
if xSide == 0:
|
||
|
xSide = 1
|
||
|
if ySide == 0:
|
||
|
ySide = 1
|
||
|
if zSide == 0:
|
||
|
zSide = 1
|
||
|
bboxV = math.sqrt(xSide*ySide*zSide)
|
||
|
if pivotSnapTypeCheck == 1:
|
||
|
if bboxV < vCheck:
|
||
|
vCheck = bboxV
|
||
|
targetLoop = e
|
||
|
else:
|
||
|
if bboxV > vCheck:
|
||
|
vCheck = bboxV
|
||
|
targetLoop = e
|
||
|
cmds.select(targetLoop)
|
||
|
cirvleNode = cmds.polyToCurve(ch=0,form=2, degree=1, conformToSmoothMeshPreview=1,n='baseCircleCurve')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.select(targetLoop)
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
edgeSel = cmds.ls(sl=1,fl=1)
|
||
|
baseLoopNumber = len(edgeSel)
|
||
|
pointA = edgeSel[0]
|
||
|
pointB = edgeSel[-1]
|
||
|
pointC = edgeSel[int(len(edgeSel)/2)]
|
||
|
xA, yA, zA = cmds.pointPosition(pointA, w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(pointB , w=1)
|
||
|
xC, yC, zC = cmds.pointPosition(pointC , w=1)
|
||
|
cmds.spaceLocator(n='upperLoc')
|
||
|
cmds.spaceLocator(n='aimLoc')
|
||
|
cmds.spaceLocator(n='baseLoc')
|
||
|
cmds.select('upperLoc','aimLoc','baseLoc')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.setAttr(('upperLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.scale'),0.01,0.01,0.01)
|
||
|
cmds.setAttr(('aimLoc.translate'),0, 1,-1)
|
||
|
cmds.setAttr(('upperLoc.translate'),0, 1,1)
|
||
|
consNode = cmds.aimConstraint('aimLoc','baseLoc',offset=[0,0,0], weight=1, aimVector=[1,0,0], upVector=[0,1,0], worldUpType='object', worldUpObject='upperLoc')
|
||
|
cmds.setAttr(('baseLoc.translate'),xA, yA, zA)
|
||
|
cmds.setAttr(('aimLoc.translate'),xB, yB, zB )
|
||
|
cmds.setAttr(('upperLoc.translate'),xC, yC, zC)
|
||
|
cmds.curve(d=1, p=[(0,0,0),(0,0,-10)], k=[0,1],name = 'tempCircleCenterLine')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.select('tempCircleCenterLine','baseLoc')
|
||
|
cmds.matchTransform(rot=1)
|
||
|
cmds.select('tempCircleCenterLine','baseCircleCurve')
|
||
|
cmds.matchTransform(pos=1)
|
||
|
cmds.makeIdentity('tempCircleCenterLine', apply=1, t=1,r=1,s=1)
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('tempCircleCenterLine')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
matchList = list(set(edgeLoopSel)-set(targetLoop))
|
||
|
cmds.select(matchList)
|
||
|
sortGrp = X69()
|
||
|
cmds.spaceLocator(n='xxxx')
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
for e in sortGrp:
|
||
|
cmds.select(e)
|
||
|
cirvleNode = cmds.polyToCurve(ch=0,form=2, degree=1, conformToSmoothMeshPreview=1,name='tempCenterCurve01')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.select('baseCircleCurve',cirvleNode[0])
|
||
|
cmds.matchTransform()
|
||
|
cmds.makeIdentity('baseCircleCurve', apply=1, t=1,r=1,s=1)
|
||
|
baseLength = cmds.arclen( 'baseCircleCurve' )
|
||
|
targetLength = cmds.arclen( cirvleNode[0] )
|
||
|
scaleV = targetLength / baseLength
|
||
|
cmds.setAttr(('baseCircleCurve.scale'),scaleV,scaleV,scaleV)
|
||
|
compareCVList = cmds.ls(('baseCircleCurve.cv[*]'),fl=1)
|
||
|
bboxPiv =cmds.xform('baseCircleCurve', q=1, ws=1, piv=1)
|
||
|
pointInSpace = om.MPoint(bboxPiv[0],bboxPiv[1],bboxPiv[2])
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move(closestPoint[0], closestPoint[1], closestPoint[2], 'xxxx', a =True, ws=True)
|
||
|
cmds.select('baseCircleCurve','xxxx')
|
||
|
cmds.matchTransform(pos=1)
|
||
|
cmds.select(e)
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
listVtx = cmds.ls(sl=1,fl=1)
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
centerP = cmds.manipMoveContext("Move", q=1,p=1)
|
||
|
nodeCluster = cmds.cluster(n= 'centerGrp')
|
||
|
pointInSpace = om.MPoint(centerP[0],centerP[1],centerP[2])
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move(closestPoint[0], closestPoint[1], closestPoint[2], nodeCluster[1], rpr=1)
|
||
|
cmds.delete(meshName,ch =1)
|
||
|
if baseLoopNumber == len(listVtx):
|
||
|
for m in listVtx :
|
||
|
xK, yK, zK = cmds.pointPosition(m, w=1)
|
||
|
checkDist = 100000
|
||
|
getCV = []
|
||
|
toRemove = ''
|
||
|
for c in compareCVList:
|
||
|
xN, yN, zN = cmds.pointPosition(c, w=1)
|
||
|
dist = math.sqrt((xK - xN) * (xK - xN) + (yK - yN) * (yK - yN) + (zK - zN) * (zK - zN))
|
||
|
if dist < checkDist:
|
||
|
checkDist = dist
|
||
|
getCV = [xN,yN,zN]
|
||
|
toRemove = c
|
||
|
cmds.move( getCV[0], getCV[1], getCV[2], m , a =True, ws=True)
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
cleanList = ('baseCircleCurv*','tempCenterCurve*','xxxx','tempCircleCenterLin*','upperLo*','aimLo*','baseLo*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
def Xo2():
|
||
|
goEven = cmds.checkBox('evenCurveEdgeLength', q=1, v=1)
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
X42(e)
|
||
|
if goEven == 1:
|
||
|
Xo7(e)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
def X42(flatList):
|
||
|
if cmds.objExists('tempCenterLin*'):
|
||
|
cmds.delete('tempCenterLin*')
|
||
|
edgeSel = flatList
|
||
|
listVtx = X8I(edgeSel)
|
||
|
xA, yA, zA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
xB, yB, zB = cmds.pointPosition(listVtx[-1], w=1)
|
||
|
cmds.curve(d=1, p=[(xA, yA, zA),(xB, yB, zB)], k=[0,1],name = 'tempCenterLine')
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add('tempCenterLine')
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
omCurveOut = om.MFnNurbsCurve(dagPath)
|
||
|
for m in listVtx :
|
||
|
xK, yK, zK = cmds.pointPosition(m, w=1)
|
||
|
pointInSpace = om.MPoint(xK,yK,zK)
|
||
|
closestPoint = om.MPoint()
|
||
|
closestPoint = omCurveOut.closestPoint(pointInSpace)
|
||
|
cmds.move( closestPoint[0], closestPoint[1], closestPoint[2],m, a =True, ws=True)
|
||
|
if cmds.objExists('tempCenterLin*'):
|
||
|
cmds.delete('tempCenterLin*')
|
||
|
def XO7():
|
||
|
edgeLoopSel = cmds.ls(sl=1,fl=1)
|
||
|
sortGrp = X69()
|
||
|
for e in sortGrp:
|
||
|
check = []
|
||
|
check.append(e[0])
|
||
|
check.append(e[-1])
|
||
|
e2v = cmds.ls(cmds.polyListComponentConversion(check,tv=1),fl=1)
|
||
|
if len(e2v) != 3:
|
||
|
Xo7(e)
|
||
|
meshName = edgeLoopSel[0].split('.')[0]
|
||
|
cmd = 'doMenuNURBComponentSelection("' + meshName + '", "edge");'
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(edgeLoopSel)
|
||
|
def X8I(edgelist):
|
||
|
if edgelist:
|
||
|
selEdges = edgelist
|
||
|
shapeNode = cmds.listRelatives(selEdges[0], fullPath=True , parent=True )
|
||
|
transformNode = cmds.listRelatives(shapeNode[0], fullPath=True , parent=True )
|
||
|
edgeNumberList = []
|
||
|
for a in selEdges:
|
||
|
checkNumber = ((a.split('.')[1]).split('\n')[0]).split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([n for n in c.split('|')[-1] if n.isdigit()])
|
||
|
if findNumber:
|
||
|
edgeNumberList.append(findNumber)
|
||
|
getNumber = []
|
||
|
for s in selEdges:
|
||
|
evlist = cmds.polyInfo(s,ev=True)
|
||
|
checkNumber = ((evlist[0].split(':')[1]).split('\n')[0]).split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([n for n in c.split('|')[-1] if n.isdigit()])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
dup = set([x for x in getNumber if getNumber.count(x) > 1])
|
||
|
getHeadTail = list(set(getNumber) - dup)
|
||
|
vftOrder = []
|
||
|
finalList = []
|
||
|
if len(getHeadTail)>0:
|
||
|
vftOrder.append(getHeadTail[0])
|
||
|
count = 0
|
||
|
while len(dup)> 0 and count < 100:
|
||
|
checkVtx = transformNode[0]+'.vtx['+ vftOrder[-1] + ']'
|
||
|
velist = cmds.polyInfo(checkVtx,ve=True)
|
||
|
getNumber = []
|
||
|
checkNumber = ((velist[0].split(':')[1]).split('\n')[0]).split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([n for n in c.split('|')[-1] if n.isdigit()])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
findNextEdge = []
|
||
|
for g in getNumber:
|
||
|
if g in edgeNumberList:
|
||
|
findNextEdge = g
|
||
|
edgeNumberList.remove(findNextEdge)
|
||
|
checkVtx = transformNode[0]+'.e['+ findNextEdge + ']'
|
||
|
findVtx = cmds.polyInfo(checkVtx,ev=True)
|
||
|
getNumber = []
|
||
|
checkNumber = ((findVtx[0].split(':')[1]).split('\n')[0]).split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([n for n in c.split('|')[-1] if n.isdigit()])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
gotNextVtx = []
|
||
|
for g in getNumber:
|
||
|
if g in dup:
|
||
|
gotNextVtx = g
|
||
|
if len(gotNextVtx)> 0:
|
||
|
dup.remove(gotNextVtx)
|
||
|
vftOrder.append(gotNextVtx)
|
||
|
count += 1
|
||
|
if len(getHeadTail)>1:
|
||
|
vftOrder.append(getHeadTail[1])
|
||
|
for v in vftOrder:
|
||
|
finalList.append(transformNode[0]+'.vtx['+ v + ']' )
|
||
|
return finalList
|
||
|
def XlO(selEdges):
|
||
|
if selEdges:
|
||
|
trans = selEdges[0].split(".")[0]
|
||
|
e2vInfos = cmds.polyInfo(selEdges, ev=True)
|
||
|
e2vDict = {}
|
||
|
fEdges = []
|
||
|
for info in e2vInfos:
|
||
|
evList = [ int(i) for i in re.findall('\\d+', info) ]
|
||
|
e2vDict.update(dict([(evList[0], evList[1:])]))
|
||
|
while True:
|
||
|
try:
|
||
|
startEdge, startVtxs = e2vDict.popitem()
|
||
|
except:
|
||
|
break
|
||
|
edgesGrp = [startEdge]
|
||
|
num = 0
|
||
|
for vtx in startVtxs:
|
||
|
curVtx = vtx
|
||
|
while True:
|
||
|
|
||
|
nextEdges = []
|
||
|
for k in e2vDict:
|
||
|
if curVtx in e2vDict[k]:
|
||
|
nextEdges.append(k)
|
||
|
if nextEdges:
|
||
|
if len(nextEdges) == 1:
|
||
|
if num == 0:
|
||
|
edgesGrp.append(nextEdges[0])
|
||
|
else:
|
||
|
edgesGrp.insert(0, nextEdges[0])
|
||
|
nextVtxs = e2vDict[nextEdges[0]]
|
||
|
curVtx = [ vtx for vtx in nextVtxs if vtx != curVtx ][0]
|
||
|
e2vDict.pop(nextEdges[0])
|
||
|
else:
|
||
|
break
|
||
|
else:
|
||
|
break
|
||
|
num += 1
|
||
|
fEdges.append(edgesGrp)
|
||
|
retEdges =[]
|
||
|
for f in fEdges:
|
||
|
collectList=[]
|
||
|
for x in f:
|
||
|
getCom= (trans +".e["+ str(x) +"]")
|
||
|
collectList.append(getCom)
|
||
|
retEdges.append(collectList)
|
||
|
return retEdges
|
||
|
|
||
|
def Xll():
|
||
|
selEdges = cmds.ls(sl=1, fl=1)
|
||
|
shapeNode = cmds.listRelatives(selEdges[0], fullPath=True, parent=True)
|
||
|
transformNode = cmds.listRelatives(shapeNode[0], fullPath=True, parent=True)
|
||
|
edgeNumberList = []
|
||
|
for a in selEdges:
|
||
|
checkNumber = a.split('.')[1].split('\n')[0].split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([ n for n in c.split('|')[-1] if n.isdigit() ])
|
||
|
if findNumber:
|
||
|
edgeNumberList.append(findNumber)
|
||
|
getNumber = []
|
||
|
for s in selEdges:
|
||
|
evlist = cmds.polyInfo(s, ev=True)
|
||
|
checkNumber = evlist[0].split(':')[1].split('\n')[0].split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([ n for n in c.split('|')[-1] if n.isdigit() ])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
dup = set([ x for x in getNumber if getNumber.count(x) > 1 ])
|
||
|
getHeadTail = list(set(getNumber) - dup)
|
||
|
checkCircleState = 0
|
||
|
if not getHeadTail:
|
||
|
checkCircleState = 1
|
||
|
getHeadTail.append(getNumber[0])
|
||
|
vftOrder = []
|
||
|
vftOrder.append(getHeadTail[0])
|
||
|
count = 0
|
||
|
while len(dup) > 0 and count < 1000:
|
||
|
checkVtx = transformNode[0] + '.vtx[' + vftOrder[-1] + ']'
|
||
|
velist = cmds.polyInfo(checkVtx, ve=True)
|
||
|
getNumber = []
|
||
|
checkNumber = velist[0].split(':')[1].split('\n')[0].split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([ n for n in c.split('|')[-1] if n.isdigit() ])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
findNextEdge = []
|
||
|
for g in getNumber:
|
||
|
if g in edgeNumberList:
|
||
|
findNextEdge = g
|
||
|
edgeNumberList.remove(findNextEdge)
|
||
|
checkVtx = transformNode[0] + '.e[' + findNextEdge + ']'
|
||
|
findVtx = cmds.polyInfo(checkVtx, ev=True)
|
||
|
getNumber = []
|
||
|
checkNumber = findVtx[0].split(':')[1].split('\n')[0].split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([ n for n in c.split('|')[-1] if n.isdigit() ])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
gotNextVtx = []
|
||
|
for g in getNumber:
|
||
|
if g in dup:
|
||
|
gotNextVtx = g
|
||
|
dup.remove(gotNextVtx)
|
||
|
vftOrder.append(gotNextVtx)
|
||
|
count += 1
|
||
|
if checkCircleState == 0:
|
||
|
vftOrder.append(getHeadTail[1])
|
||
|
elif vftOrder[0] == vftOrder[1]:
|
||
|
vftOrder = vftOrder[1:]
|
||
|
elif vftOrder[0] == vftOrder[-1]:
|
||
|
vftOrder = vftOrder[0:-1]
|
||
|
finalList = []
|
||
|
for v in vftOrder:
|
||
|
finalList.append(transformNode[0] + '.vtx[' + v + ']')
|
||
|
return (checkCircleState, finalList)
|
||
|
|
||
|
def X3o(p1, p2):
|
||
|
pA = cmds.pointPosition(p1, w=1)
|
||
|
pB = cmds.pointPosition(p2, w=1)
|
||
|
dist = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
return dist
|
||
|
def X79(pA, pB, pC):
|
||
|
a = cmds.pointPosition(pA, w=1)
|
||
|
b = cmds.pointPosition(pB, w=1)
|
||
|
c = cmds.pointPosition(pC, w=1)
|
||
|
ba = [ aa - bb for aa, bb in zip(a, b) ]
|
||
|
bc = [ cc - bb for cc, bb in zip(c, b) ]
|
||
|
nba = math.sqrt(sum((x ** 2.0 for x in ba)))
|
||
|
ba = [ x / nba for x in ba ]
|
||
|
nbc = math.sqrt(sum((x ** 2.0 for x in bc)))
|
||
|
bc = [ x / nbc for x in bc ]
|
||
|
scalar = sum((aa * bb for aa, bb in zip(ba, bc)))
|
||
|
angle = math.acos(scalar)
|
||
|
return angle
|
||
|
def X69():
|
||
|
selEdges = cmds.ls(sl=1, fl=1)
|
||
|
trans = selEdges[0].split('.')[0]
|
||
|
e2vInfos = cmds.polyInfo(selEdges, ev=True)
|
||
|
e2vDict = {}
|
||
|
fEdges = []
|
||
|
for info in e2vInfos:
|
||
|
evList = [ int(i) for i in re.findall('\\d+', info) ]
|
||
|
e2vDict.update(dict([(evList[0], evList[1:])]))
|
||
|
while True:
|
||
|
try:
|
||
|
startEdge, startVtxs = e2vDict.popitem()
|
||
|
except:
|
||
|
break
|
||
|
edgesGrp = [startEdge]
|
||
|
num = 0
|
||
|
for vtx in startVtxs:
|
||
|
curVtx = vtx
|
||
|
while True:
|
||
|
nextEdges = []
|
||
|
for k in e2vDict:
|
||
|
if curVtx in e2vDict[k]:
|
||
|
nextEdges.append(k)
|
||
|
|
||
|
if nextEdges:
|
||
|
if len(nextEdges) == 1:
|
||
|
if num == 0:
|
||
|
edgesGrp.append(nextEdges[0])
|
||
|
else:
|
||
|
edgesGrp.insert(0, nextEdges[0])
|
||
|
nextVtxs = e2vDict[nextEdges[0]]
|
||
|
curVtx = [ vtx for vtx in nextVtxs if vtx != curVtx ][0]
|
||
|
e2vDict.pop(nextEdges[0])
|
||
|
else:
|
||
|
break
|
||
|
else:
|
||
|
break
|
||
|
num += 1
|
||
|
fEdges.append(edgesGrp)
|
||
|
retEdges = []
|
||
|
for f in fEdges:
|
||
|
collectList = []
|
||
|
for x in f:
|
||
|
getCom = trans + '.e[' + str(x) + ']'
|
||
|
collectList.append(getCom)
|
||
|
retEdges.append(collectList)
|
||
|
return retEdges
|
||
|
|
||
|
def X62(angle):
|
||
|
currentSelp = cmds.ls(sl=True, fl=True)
|
||
|
cmds.polySelectConstraint(m=2, w=1, pp=4, m3a=angle, t=0x8000)
|
||
|
wholeLoop = cmds.ls(sl=True, fl=True)
|
||
|
cmds.polySelectConstraint(m=2, w=2, t=0x8000)
|
||
|
removeInnerEdges = cmds.ls(sl=True, fl=True)
|
||
|
if len(wholeLoop) != len(removeInnerEdges):
|
||
|
cmds.select(wholeLoop)
|
||
|
cmds.select(removeInnerEdges, d=True)
|
||
|
cmds.polySelectConstraint(m=0, w=0)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
|
||
|
def X99():
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
cmds.polySelectConstraint(m=2, t=0x8000, w=1)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
|
||
|
def X6o():
|
||
|
cmds.polySlideEdgeCtx("polySlideEdgeContext", e=True, useSnapping=False)
|
||
|
cmds.setToolTo("polySlideEdgeContext")
|
||
|
|
||
|
|
||
|
def XI9(PM):
|
||
|
selEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
if PM == "minus":
|
||
|
if len(selEdge) > 1:
|
||
|
cmds.polySelectConstraint(pp=6, t=0x8000)
|
||
|
cmds.polySelectConstraint(m=0, w=0)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
else:
|
||
|
cmds.polySelectConstraint(m=2, w=2, t=0x8000)
|
||
|
selInner = cmds.ls(sl=True, fl=True)
|
||
|
cmds.select(selEdge, r=True)
|
||
|
cmds.polySelectConstraint(m=2, w=1, t=0x8000)
|
||
|
selBorder = cmds.ls(sl=True, fl=True)
|
||
|
cmds.select(selEdge, r=True)
|
||
|
if len(selInner) > len(selBorder):
|
||
|
cmds.polySelectConstraint(pp=5, t=0x8000)
|
||
|
cmds.polySelectConstraint(m=0, w=0)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
else:
|
||
|
cmds.polySelectConstraint(pp=1, m=2, w=1, t=0x8000)
|
||
|
cmds.polySelectConstraint(m=0, w=0)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
|
||
|
|
||
|
def X32():
|
||
|
firstSel = cmds.ls(sl=True, fl=True)
|
||
|
cmd = 'polySelectEdgesEveryN "edgeRing" 1';
|
||
|
mel.eval(cmd)
|
||
|
growAll = cmds.ls(sl=True, fl=True)
|
||
|
newFace = cmds.polyListComponentConversion(firstSel, fe=True, tf=True)
|
||
|
newEdges = cmds.ls(cmds.polyListComponentConversion(newFace, ff=True, te=True),fl=1)
|
||
|
commonItems = list(set(newEdges) & set(growAll))
|
||
|
cmds.select(commonItems)
|
||
|
|
||
|
def X86():
|
||
|
firstSel = cmds.ls(sl=True, fl=True)
|
||
|
newVert = cmds.polyListComponentConversion(firstSel, fe=True, tv=True)
|
||
|
cmds.select(newVert)
|
||
|
cmds.ConvertSelectionToContainedFaces(newVert)
|
||
|
cmds.ConvertSelectionToEdgePerimeter()
|
||
|
newBorder = cmds.ls(sl=True, fl=True)
|
||
|
diffItems = list(set(firstSel) - set(newBorder))
|
||
|
cmds.select(diffItems)
|
||
|
|
||
|
|
||
|
def X95():
|
||
|
edges = cmds.ls(fl=True, sl=True)
|
||
|
cmds.polySelectConstraint(m=2, w=2, type=0x8000)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
getPoints = cmds.ls( cmds.polyListComponentConversion(edges, tv=True),fl=True)
|
||
|
edgeLoopExt = cmds.ls( cmds.polySelectSp(edges, q=1, loop=1),fl=True)
|
||
|
for p in getPoints:
|
||
|
surEedge = cmds.ls( cmds.polyListComponentConversion(p, te=True),fl=True)
|
||
|
nextTwoEdge = list(set(surEedge) - set(edgeLoopExt))
|
||
|
surPoints = cmds.ls( cmds.polyListComponentConversion(nextTwoEdge, tv=True),fl=True)
|
||
|
surPoints.remove(p)
|
||
|
if len(surPoints) == 2:
|
||
|
ptA = cmds.xform(surPoints[0], q=True, t=True, ws=True)
|
||
|
ptB = cmds.xform(surPoints[1], q=True, t=True, ws=True)
|
||
|
midP = cmds.xform(p, q=True, t=True, ws=True)
|
||
|
distA = math.sqrt( ((ptA[0] - midP[0])**2) + ((ptA[1] - midP[1])**2) + ((ptA[2] - midP[2])**2))
|
||
|
distB = math.sqrt( ((ptB[0] - midP[0])**2) + ((ptB[1] - midP[1])**2) + ((ptB[2] - midP[2])**2))
|
||
|
scaleBaseP = ''
|
||
|
scaleDistP = 0
|
||
|
if distA > distB:
|
||
|
scaleBaseP = ptA
|
||
|
scaleDistP = distA
|
||
|
else:
|
||
|
scaleBaseP = ptB
|
||
|
scaleDistP = distB
|
||
|
avgDist = ( distA + distB )/2
|
||
|
magV = avgDist /scaleDistP
|
||
|
if magV < 1:
|
||
|
vectBtwPnts= ((scaleBaseP[0] -midP[0])*-1), ((scaleBaseP[1] -midP[1])*-1), ((scaleBaseP[2] -midP[2])*-1)
|
||
|
vectorToFinish = om.MFloatVector(vectBtwPnts[0],vectBtwPnts[1],vectBtwPnts[2])
|
||
|
raySource = om.MFloatPoint(scaleBaseP[0],scaleBaseP[1],scaleBaseP[2])
|
||
|
rayDirection = vectorToFinish
|
||
|
magnitude = vectorToFinish.length()
|
||
|
new_magnitude = magnitude * magV
|
||
|
direction_normalized = vectorToFinish.normal()
|
||
|
scaled_direction = direction_normalized * new_magnitude
|
||
|
new_endpoint = raySource + scaled_direction
|
||
|
cmds.move(new_endpoint.x, new_endpoint.y, new_endpoint.z, p , absolute=True)
|
||
|
|
||
|
def X66():
|
||
|
target = cmds.intField("collapseLoopNumber", q=1,v = 1)
|
||
|
checkEdges = cmds.ls(selection=True, flatten=True)
|
||
|
checkNumberA = XlO(checkEdges)
|
||
|
if len(checkNumberA) == 1:
|
||
|
cmds.select(checkEdges, r=True)
|
||
|
if cmds.objExists("edgeGepLock"):
|
||
|
cmds.delete("edgeGepLock*")
|
||
|
cmds.sets(name="edgeGepLock", text="edgeGepLock")
|
||
|
cvListFlat = cmds.ls(cmds.polyListComponentConversion(fromEdge=True, toVertex=True),fl=1)
|
||
|
count = 0
|
||
|
if len(cvListFlat) == len(checkEdges):
|
||
|
while len(checkEdges) > target and count < 100:
|
||
|
cmds.select("edgeGepLock", r=True)
|
||
|
X82('min')
|
||
|
cmds.polyCollapseEdge()
|
||
|
cmds.select("edgeGepLock", r=True)
|
||
|
checkEdges = cmds.ls(selection=True, flatten=True)
|
||
|
count += 1
|
||
|
else:
|
||
|
cmds.select(checkEdges)
|
||
|
XI9('minus')
|
||
|
checkEdges = cmds.ls(selection=True, flatten=True)
|
||
|
if cmds.objExists("edgeGepLock"):
|
||
|
cmds.delete("edgeGepLock*")
|
||
|
cmds.sets(name="edgeGepLock", text="edgeGepLock")
|
||
|
cmds.select("edgeGepLock", r=True)
|
||
|
while len(checkEdges) > (target - 2) and count < 100:
|
||
|
cmds.select("edgeGepLock", r=True)
|
||
|
X82('min')
|
||
|
cmds.polyCollapseEdge()
|
||
|
cmds.select("edgeGepLock", r=True)
|
||
|
checkEdges = cmds.ls(selection=True, flatten=True)
|
||
|
count += 1
|
||
|
cmds.select("edgeGepLock", r=True)
|
||
|
XI9('plus')
|
||
|
XO7()
|
||
|
if cmds.objExists("edgeGepLock"):
|
||
|
cmds.delete("edgeGepLock*")
|
||
|
def Xl9():
|
||
|
cmds.delete(all=True, e=True, ch=True)
|
||
|
selEdges = cmds.filterExpand(ex=True, sm=32) or []
|
||
|
selCV = cmds.filterExpand(ex=True, sm=31) or []
|
||
|
if len(selCV) > 0 and len(selEdges) == 0:
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
#cmds.GrowPolygonSelectionRegion()
|
||
|
unwantEdge = cmds.ls(sl=True, fl=True)
|
||
|
cmds.select(selCV)
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
cmds.polySelectConstraint(mode=2, type=0x0008, size=3)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
cmds.select(unwantEdge, d=True)
|
||
|
X5o()
|
||
|
cmds.select(selCV, add=True)
|
||
|
elif len(selCV) > 0 and len(selEdges) == 1:
|
||
|
XI3()
|
||
|
elif len(selCV) == 1 and len(selEdges) == 2:
|
||
|
verticesA = cmds.ls(cmds.polyListComponentConversion(selEdges[0], toVertex=True),fl=1)
|
||
|
verticesB = cmds.ls(cmds.polyListComponentConversion(selEdges[1], toVertex=True),fl=1)
|
||
|
common_items = list(set(verticesA) & set(verticesB))
|
||
|
cmds.select(common_items,selCV)
|
||
|
cmds.polyConnectComponents(ch=0, insertWithEdgeFlow=0, adjustEdgeFlow=0)
|
||
|
|
||
|
def X5o():
|
||
|
value = 0
|
||
|
edges = cmds.filterExpand(ex=True, sm=32)
|
||
|
target_edge = ''
|
||
|
for edge in edges:
|
||
|
vertices = cmds.ls(cmds.polyListComponentConversion(edge, toVertex=True),fl=1)
|
||
|
v1 = cmds.pointPosition(vertices[0], w=True)
|
||
|
v2 = cmds.pointPosition(vertices[1], w=True)
|
||
|
check_edge_length = math.sqrt((v1[0] - v2[0])**2 + (v1[1] - v2[1])**2 + (v1[2] - v2[2])**2)
|
||
|
if check_edge_length > value:
|
||
|
value = check_edge_length
|
||
|
target_edge = edge
|
||
|
cmds.select(target_edge)
|
||
|
|
||
|
|
||
|
def XI3():
|
||
|
cleanList = ('KeepEdge','KeepCV','NewCV')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
sel = cmds.ls(sl=1, fl=1)
|
||
|
cmds.select(cl=1)
|
||
|
Verts = []
|
||
|
Edge = []
|
||
|
newVertAddList = []
|
||
|
for s in sel:
|
||
|
if '.vtx[' in s:
|
||
|
Verts.append(s)
|
||
|
elif '.e[' in s:
|
||
|
Edge.append(s)
|
||
|
if len(Edge) == 1 and len(Verts) > 0:
|
||
|
cmds.sets(name='KeepEdge', text='g')
|
||
|
cmds.sets(Edge, add='KeepEdge')
|
||
|
cmds.sets(name='KeepCV', text='g')
|
||
|
cmds.sets(Verts, add='KeepCV')
|
||
|
cmds.sets(name='NewCV', text='g')
|
||
|
for v in Verts:
|
||
|
getEdge = cmds.ls(cmds.sets('KeepEdge', query=True),fl=1)
|
||
|
for g in getEdge:
|
||
|
EdgeNumber = int(g.split('[')[-1].split(']')[0])
|
||
|
vertList = cmds.ls(cmds.polyListComponentConversion(g, tv=True), fl=True)
|
||
|
vertPA = cmds.xform(vertList[0], q=True, ws=True, translation=True)
|
||
|
vertPB = cmds.xform(vertList[1], q=True, ws=True, translation=True)
|
||
|
vertPC = cmds.xform(v, q=True, ws=True, translation=True)
|
||
|
VA = om.MVector(vertPA[0],vertPA[1],vertPA[2])
|
||
|
VB = om.MVector(vertPB[0],vertPB[1],vertPB[2])
|
||
|
VC = om.MVector(vertPC[0],vertPC[1],vertPC[2])
|
||
|
VAB = VB - VA
|
||
|
magnitude = VAB.length()
|
||
|
if magnitude != 0:
|
||
|
DA = om.MVector(VAB.x / magnitude, VAB.y / magnitude, VAB.z / magnitude)
|
||
|
else:
|
||
|
DA = om.MVector(VAB)
|
||
|
t = (VC - VA) * DA
|
||
|
closest_point = VA + DA * t
|
||
|
wPos = [closest_point.x, closest_point.y, closest_point.z]
|
||
|
if wPos != vertPA and wPos != vertPB:
|
||
|
AC = closest_point - VA
|
||
|
BC = closest_point - VB
|
||
|
if AC * BC < 0:
|
||
|
print('here')
|
||
|
cmds.polySplit(g, ip=[(EdgeNumber, 0.5)], ch=0)
|
||
|
lastVert = str(v.split('.')[0]) + '.vtx[' + str(cmds.polyEvaluate(v, v=1)) + ']'
|
||
|
cmds.xform(lastVert, ws=True, t=(closest_point.x, closest_point.y, closest_point.z))
|
||
|
cmds.polyConnectComponents([v, lastVert], ch=0)
|
||
|
cmds.sets(lastVert, add='NewCV')
|
||
|
else:
|
||
|
checkExistEdge = cmds.ls(cmds.polyListComponentConversion(v, te=True), fl=True)
|
||
|
if wPos == vertPA:
|
||
|
checkCurrentEdge = cmds.ls(cmds.polyListComponentConversion(vertList[0], te=True), fl=True)
|
||
|
common_elements = [element for element in checkExistEdge if element in checkCurrentEdge]
|
||
|
if len(common_elements) == 0:
|
||
|
cmds.polyConnectComponents([v, vertList[0]], ch=0)
|
||
|
else:
|
||
|
checkCurrentEdges = cmds.ls(cmds.polyListComponentConversion(vertList[1], te=True), fl=True)
|
||
|
common_elements = [element for element in checkExistEdge if element in checkCurrentEdge]
|
||
|
if len(common_elements) == 0:
|
||
|
cmds.polyConnectComponents([v, vertList[1]], ch=0)
|
||
|
getNewCV = cmds.ls(cmds.sets('NewCV', query=True),fl=1)
|
||
|
if 'getNewCV':
|
||
|
cmds.select('NewCV')
|
||
|
else:
|
||
|
cmds.select(Verts,Edge)
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
Xl9()
|
||
|
|
||
|
def run():
|
||
|
fColor = (0.23,0.2,0.2)
|
||
|
if cmds.window("EdgeSenseiWindow", exists=True):
|
||
|
cmds.deleteUI("EdgeSenseiWindow", window=True)
|
||
|
if cmds.dockControl("EdgeSenseiDock", exists=True):
|
||
|
cmds.deleteUI("EdgeSenseiDock", control=True)
|
||
|
edge_window = cmds.window("EdgeSenseiWindow", title="Edge Sensei", widthHeight=(320, 1100),s = 1 ,mxb = False, mnb = False)
|
||
|
cmds.columnLayout(adj=True)
|
||
|
cmds.frameLayout(label="Quick Tools", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 50), (2, 20), (3, 50), (4, 7), (5, 50), (6, 7), (7, 50), (8, 7), (9, 65)])
|
||
|
cmds.text(l=" Quick")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Split",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: cmds.SplitPolygonTool())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Insert",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: cmds.SplitEdgeRingTool())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Slide",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X6o())
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 50), (2, 20), (3, 65), (4, 7), (5, 75), (6, 7), (7, 50), (8, 7), (9, 65)])
|
||
|
cmds.text(l="")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Connet 90",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: Xl9())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Sharp Corner",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X23())
|
||
|
cmds.setParent("..")
|
||
|
cmds.separator(height=5, style="in")
|
||
|
cmds.rowColumnLayout(nc=13, cw=[(1, 50), (2, 20), (3, 50), (4, 7), (5, 70), (6, 7), (7, 50), (8, 20), (9, 50), (10, 5), (11, 20), (12, 5), (13, 20)])
|
||
|
cmds.text(l=" Select")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Border",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X99())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Contiguous",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X62(30))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Shortest",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X92())
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=13, cw=[(1, 50), (2, 20), (3, 40), (4, 5), (5, 20), (6, 5), (7, 20), (8, 20), (9, 50), (10, 5), (11, 20), (12, 5), (13, 20)])
|
||
|
cmds.text(l=" ")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Loop",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: cmds.SelectEdgeLoopSp())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="+", rpt=1, bgc=(0.08, 0.18, 0.38), c=lambda *args: XI9("plus"))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="-", rpt=1, bgc=(0.08, 0.38, 0.28), c=lambda *args: XI9("minus"))
|
||
|
cmds.text(l=" |")
|
||
|
cmds.iconTextButton(style="textOnly", label="Ring",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: cmds.SelectEdgeRingSp())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="+", rpt=1, bgc=(0.08, 0.18, 0.38), c=lambda *args: X32())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="-", rpt=1, bgc=(0.08, 0.38, 0.28), c=lambda *args: X86())
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 50), (2, 20), (3, 50), (4, 20), (5, 50), (6, 20), (7, 50)])
|
||
|
cmds.setParent("..")
|
||
|
cmds.separator(height=5, style="in")
|
||
|
cmds.rowColumnLayout(nc=11, cw=[(1, 50), (2, 20), (3, 50), (4, 7), (5, 50), (6, 7), (7, 50), (8, 7), (9, 50), (10, 7), (11, 65)])
|
||
|
cmds.text(l="Average")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Smooth", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X94())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Even", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: XO7())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Spread",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X95())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Flow",rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: cmds.PolyEditEdgeFlow())
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.setParent("..")
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.setParent("..")
|
||
|
cmds.frameLayout(label="Arc", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 50), (2, 20), (3, 50), (4, 5), (5, 50), (6, 5), (7, 50), (8, 5), (9, 50)])
|
||
|
cmds.text(l=" 3D")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="1", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X9l(1))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="2", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X9l(2))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="3", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X9l(3))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="--", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X9l(0))
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 50), (2, 20), (3, 50), (4, 5), (5, 50), (6, 5), (7, 50), (8, 5), (9, 50)])
|
||
|
cmds.text(l=" 2D")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="1", rpt=1, bgc=(0.22, 0.22, 0.18), c=lambda *args: Xl8(1))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="2", rpt=1, bgc=(0.22, 0.22, 0.18), c=lambda *args: Xl8(2))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="3", rpt=1, bgc=(0.22, 0.22, 0.18), c=lambda *args: Xl8(3))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="--", rpt=1, bgc=(0.22, 0.22, 0.18), c=lambda *args: Xl8(0))
|
||
|
cmds.text(l="", h=5)
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 50), (2, 20), (3, 50), (4, 5), (5, 50), (6, 5), (7, 50), (8, 5), (9, 50)])
|
||
|
cmds.text(l=" Edit")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Inflate", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X48())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Tension", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X7l())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="UnBevel", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X8O())
|
||
|
cmds.text(l="")
|
||
|
cmds.checkBox("evenCurveEdgeLength", label="Even", value=0)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.setParent("..")
|
||
|
cmds.setParent("..")
|
||
|
cmds.frameLayout(label="Constant", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 50), (2, 20), (3, 50), (4, 7), (5, 50), (6, 17), (7, 90)])
|
||
|
cmds.text(l=" Extend")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="L", rpt=1,bgc=(0.08, 0.18, 0.38), c=lambda *args: X3l('L',100))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="R", rpt=1,bgc=(0.08, 0.38, 0.28), c=lambda *args: X3l('R',100))
|
||
|
cmds.text(l="")
|
||
|
cmds.checkBox("lockCurveEdgeLength", label="Keep Length", value=0)
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 50), (2, 20), (3, 50), (4, 7), (5, 50), (6, 20), (7, 50)])
|
||
|
cmds.text(l=" Curl")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="L", rpt=1,bgc=(0.08, 0.18, 0.38), c=lambda *args: X3l('L',4))
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="R", rpt=1,bgc=(0.08, 0.38, 0.28), c=lambda *args: X3l('R',4))
|
||
|
cmds.setParent("..")
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.setParent("..")
|
||
|
cmds.setParent("..")
|
||
|
cmds.frameLayout(label="Round", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 50), (2, 20), (3, 50), (4, 5), (5, 50), (6, 5), (7, 50), (8, 5), (9, 50)])
|
||
|
cmds.text(l="")
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="90", bgc=(0.18, 0.18, 0.18), c=lambda *args: X84())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="180", bgc=(0.18, 0.18, 0.18), c=lambda *args: Xo9())
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="360", bgc=(0.18, 0.18, 0.18), c=lambda *args: X5I())
|
||
|
cmds.text(l="")
|
||
|
cmds.checkBox("evenRoundEdgeLength", label="Even", value=1)
|
||
|
cmds.setParent("..")
|
||
|
cmds.rowColumnLayout(nc=4, cw=[(1, 50), (2, 20), (3,110), (4,130)])
|
||
|
cmds.text(l="")
|
||
|
cmds.text(l="")
|
||
|
cmds.checkBox("evenRoundPivotSnap", label="Pivot Snap Type", value=0, cc=lambda *args: Xl2())
|
||
|
cmds.radioButtonGrp("PivotSnapType", en=0, nrb=2, sl=1, la2=("Small", "Big"), cw=[(1,50), (2, 60)] )
|
||
|
cmds.setParent("..")
|
||
|
cmds.setParent("..")
|
||
|
cmds.frameLayout(label="Insert by Number", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.floatSliderGrp("multiInsertNo", v=2, pre=0, min=2, max=50, fmn=2, fmx=100, cw3=[50, 35, 0], label="Number ", field=True)
|
||
|
cmds.rowColumnLayout(nc=5, cw=[(1, 50),(2, 20), (3, 30),(4, 9), (5, 150)])
|
||
|
cmds.text(l="Repeat")
|
||
|
cmds.text(l="")
|
||
|
cmds.checkBox("keepSpliteNumber", l="", v=0)
|
||
|
cmds.text(l="")
|
||
|
cmds.iconTextButton(style="textOnly", label="Split", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: XO3())
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.setParent("..")
|
||
|
cmds.text(l="",h=1)
|
||
|
cmds.setParent("..")
|
||
|
cmds.frameLayout(label="Insert by Length:", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 45), (2, 7), (3, 40), (4, 7),(5, 95), (6, 5),(7, 95)])
|
||
|
cmds.text(label="Length:")
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.floatField("refInsertLength", v = 10, pre=3)
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.button(bgc=[0.2, 0.2, 0.2], label="Check", h=23, c=lambda *args: X76("IbL"))
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.button(bgc=[0.2, 0.2, 0.2], label="Split", h=23, c=lambda *args: XoI())
|
||
|
cmds.setParent('..')
|
||
|
cmds.text(l="",h=1)
|
||
|
cmds.setParent('..')
|
||
|
cmds.frameLayout(label="Edge Lock", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=3, cw=[(1, 50), (2, 50), (3, 175)])
|
||
|
cmds.text(l=" Type")
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.radioButtonGrp("lockEdgeType", nrb=2, sl=1, la2=["Absolute", "Relative"], cw=[(1, 90), (2, 70)])
|
||
|
cmds.setParent("..")
|
||
|
cmds.floatSliderGrp("lockEdgeSlider", v=0.95, min=0.001, max=0.999, s=0.01, cw3=[50, 40, 0], label="Ratio ", field=True, dc=lambda *args: X36())
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 45), (2, 7), (3, 40), (4, 7),(5, 95), (6, 5),(7, 95)])
|
||
|
cmds.text(l="Length")
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.floatField("lastLockEdgelength", v = 0.02, pre=3)
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.iconTextButton(style="textOnly",label="Ratio", rpt=1, bgc=(0.18, 0.18, 0.18), c=lambda *args: X25())
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.iconTextButton(style="textOnly",label="Length", rpt=1,bgc=(0.18, 0.18, 0.18), c=lambda *args: X58())
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.setParent("..")
|
||
|
cmds.setParent("..")
|
||
|
cmds.text(l="",h=4)
|
||
|
cmds.setParent("..")
|
||
|
cmds.frameLayout(label="Ring Equalizer", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=11, cw=[(1, 45), (2, 7), (3, 40), (4, 7),(5, 40), (6, 30),(7, 35), (8, 3),(9, 35), (10, 3),(11, 35)])
|
||
|
cmds.text(l="Length")
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.floatField("equalizerLength", v=1 ,pre =3 )
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.iconTextButton(style="textOnly", label="check", bgc=(0.18, 0.18, 0.18), c=lambda *args: X76("RE"))
|
||
|
cmds.text(l=" | ",h=2)
|
||
|
cmds.iconTextButton(style="textOnly", label="A", bgc=(0.08, 0.18, 0.38), c=lambda *args: X75('A'))
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.iconTextButton(style="textOnly", label="Mid", bgc=(0.18, 0.18, 0.18), c=lambda *args: X75('M'))
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.iconTextButton(style="textOnly", label="B", bgc=(0.08, 0.38, 0.28), c=lambda *args: X75('B'))
|
||
|
cmds.setParent("..")
|
||
|
cmds.text(l="",h=1)
|
||
|
cmds.setParent('..')
|
||
|
cmds.frameLayout(label="Collapse Loop to Number:", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 45), (2, 7), (3, 40), (4, 7),(5, 95), (6, 5),(7, 95)])
|
||
|
cmds.text(label="Target:")
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.intField("collapseLoopNumber", v = 10)
|
||
|
cmds.text(l="", h=3)
|
||
|
cmds.button(bgc=[0.2, 0.2, 0.2], label="Collapse", h=23, c=lambda *args: X66())
|
||
|
cmds.setParent('..')
|
||
|
cmds.text(l="",h=1)
|
||
|
cmds.setParent('..')
|
||
|
cmds.frameLayout(label="Arc Deformer", bv=0, w=298, cll=1, cl=0 ,bgc = fColor)
|
||
|
cmds.rowColumnLayout(nc=3 ,cw=[(1,50),(2,50),(3,175)])
|
||
|
cmds.text(l ='Type')
|
||
|
cmds.text(l ='')
|
||
|
cmds.radioButtonGrp('curveType', nrb=2, sl=1, labelArray2=['Bezier', 'Nurbs'], cw = [(1,90),(2,70)],cc='X45()')
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.rowColumnLayout(nc=10 ,cw=[(1,1),(2,50),(3,10),(4,50),(5,5),(6,50),(7,5),(8,50),(9,5),(10,95)])
|
||
|
cmds.text(l ='')
|
||
|
cmds.text(l ='Options')
|
||
|
cmds.text(l ='')
|
||
|
cmds.checkBox('makeArc', label= "Arc" ,v = 1, cc=lambda *args: X9I())
|
||
|
cmds.text(l ='')
|
||
|
cmds.checkBox('snapCurve', label= "Snap" ,v = 1, cc=lambda *args: X77())
|
||
|
cmds.text(l ='')
|
||
|
cmds.checkBox('evenSpace', label= "Even" ,v = 1)
|
||
|
cmds.text(l ='')
|
||
|
cmds.checkBox('cleanCurve', label= "Keep Curve" ,v = 1)
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.intSliderGrp('CPSlider', cw3=[50, 30, 180], label = 'Point ', field= 1, min= 2, max= 10, fmx = 500, v = 3 )
|
||
|
cmds.floatSliderGrp('dropOffSlider' , label = 'DropOff', v = 0.01, cw3=[50, 30, 180], field=1 ,pre = 2, min= 0.01, max= 10)
|
||
|
cmds.rowColumnLayout(nc=4 ,cw=[(1,99),(2,95),(3,5),(4,95)])
|
||
|
cmds.text(l ='')
|
||
|
cmds.iconTextButton(style="textOnly", l= 'Create',bgc=(0.18, 0.18, 0.18), c= 'XI4()')
|
||
|
cmds.text(l ='')
|
||
|
cmds.iconTextButton(style="textOnly", l= 'Done', bgc=(0.18, 0.18, 0.18), c= 'X98()')
|
||
|
cmds.text(l ='')
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.text(l="",h=2)
|
||
|
cmds.showWindow(edge_window)
|
||
|
cmds.window("EdgeSenseiWindow", e=1, widthHeight=(320, 1100))
|
||
|
#allowedAreas = ['right', 'left']
|
||
|
#cmds.dockControl("EdgeSenseiDock", area="left", content = edge_window, width=360, allowedArea = allowedAreas,fl=1, label="EdgeSensei v1.0")
|