482 lines
25 KiB
Python
482 lines
25 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import maya.cmds as cmds
|
||
|
import math
|
||
|
import re
|
||
|
import maya.mel as mel
|
||
|
from collections import defaultdict
|
||
|
|
||
|
def sBFillHole():
|
||
|
checkHole = cmds.filterExpand(ex=1, sm=(34))
|
||
|
checkHoleEdge = cmds.ls(cmds.polyListComponentConversion(checkHole, te=1),fl=1)
|
||
|
cmds.polySelectConstraint(mode=3, type=0x8000, where=1)
|
||
|
selected_edge = cmds.ls(sl=1,fl=1)
|
||
|
cmds.polySelectConstraint(disable=True)
|
||
|
foundHole = list(set(selected_edge)&set(checkHoleEdge))
|
||
|
if foundHole:
|
||
|
cmds.select(foundHole)
|
||
|
cmds.FillHole()
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
cmds.select(checkHole,add=1)
|
||
|
else:
|
||
|
cmds.select(checkHole)
|
||
|
|
||
|
def isFlat(sel):
|
||
|
normals = defaultdict(list)
|
||
|
for face in sel:
|
||
|
normal = cmds.polyInfo(face, faceNormals=True)[0].split()[2:]
|
||
|
normal = [float(x) for x in normal]
|
||
|
normals[tuple(normal)].append(face)
|
||
|
most_common_normal = max(normals, key=lambda x: len(normals[x]))
|
||
|
facesFlat = 1
|
||
|
for normal, faces in normals.items():
|
||
|
if normal == most_common_normal:
|
||
|
continue
|
||
|
dot = sum([a*b for a,b in zip(normal, most_common_normal)])
|
||
|
mag1 = math.sqrt(sum([a*a for a in normal]))
|
||
|
mag2 = math.sqrt(sum([a*a for a in most_common_normal]))
|
||
|
cos_angle = dot / (mag1 * mag2)
|
||
|
angle = math.acos(cos_angle)
|
||
|
if math.degrees(angle) > 1:
|
||
|
facesFlat = 0
|
||
|
return facesFlat
|
||
|
|
||
|
def speedBendExtrudeGO():
|
||
|
global passSelection
|
||
|
passSelection = []
|
||
|
toBlendFace = cmds.filterExpand(ex=1, sm=(34))
|
||
|
if toBlendFace:
|
||
|
beforeBendClean()
|
||
|
toBlendFace = cmds.filterExpand(ex=1, sm=(34))
|
||
|
checkFlat = isFlat(toBlendFace)
|
||
|
if checkFlat == 1:
|
||
|
singleFaceRecord = cmds.filterExpand(ex=1, sm=(34))
|
||
|
toBlendEdge = cmds.ls(cmds.polyListComponentConversion(singleFaceRecord, te=1),fl=1)
|
||
|
totalDistance = 0
|
||
|
for b in toBlendEdge:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(b, tv=1),fl=1)
|
||
|
pA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
pB = cmds.pointPosition(listVtx[1], w=1)
|
||
|
checkDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
totalDistance = totalDistance + checkDistance
|
||
|
diameterA = totalDistance / 3.14159
|
||
|
bendLength = totalDistance / 2
|
||
|
cmds.polyExtrudeFacet(constructionHistory=0, keepFacesTogether=1, divisions=1, twist=0, taper=0, off=0 , thickness = bendLength , smoothingAngle=30)
|
||
|
finishBendClean()
|
||
|
|
||
|
def speedBendLinkUI():
|
||
|
checkSetting = cmds.checkBox('speedBendSetting',q=1, v= 1)
|
||
|
checkDivSetting = cmds.checkBox('speedBendNoDiv',q=1, v= 1)
|
||
|
bendV = cmds.floatSliderGrp("speedBendBend",q=1,v=1)
|
||
|
rollV = cmds.floatSliderGrp("speedBendRoll",q=1,v=1)
|
||
|
offsetV = cmds.floatSliderGrp('speedBendOffset',q=1,v=1)
|
||
|
cmds.iconTextButton("speedBendGOGO", e=1, en=0 ,bgc=[0.28,0.28,0.28],l='')
|
||
|
cmds.iconTextButton("speedBendExtrude", e=1, en=0 ,bgc=[0.28,0.28,0.28],l='')
|
||
|
if checkDivSetting == 0:
|
||
|
divV = cmds.intSliderGrp("speedBendDiv",q=1,v=1)
|
||
|
cmds.connectControl( 'speedBendBend', 'speedBend.curvature' )
|
||
|
cmds.connectControl( 'speedBendRoll', 'bendOffsetRot.rotateY' )
|
||
|
cmds.connectControl( 'speedBendOffset', 'speedBendHandle.translateX' )
|
||
|
if checkDivSetting == 0:
|
||
|
cmds.connectControl( 'speedBendDiv', 'speedBendBridge.divisions' )
|
||
|
if checkSetting == 1:
|
||
|
cmds.setAttr('speedBend.curvature',bendV)
|
||
|
cmds.setAttr('bendOffsetRot.rotateY',rollV)
|
||
|
cmds.setAttr('speedBendHandle.translateX',offsetV)
|
||
|
if checkDivSetting == 1:
|
||
|
cmds.setAttr('speedBendBridge.divisions',divV)
|
||
|
cmds.iconTextButton("speedBendExtrude", e=1, en=0 ,bgc=[0.28,0.28,0.28],l='')
|
||
|
cmds.scriptJob (ro=1, event = ["SelectionChanged", finishBendClean])
|
||
|
cmds.scriptJob(uiDeleted=["speedBendUI", finishBendClean])
|
||
|
|
||
|
def speedBendOffsetReset():
|
||
|
currentV = cmds.floatSliderGrp("speedBendOffset",e=1,v=0)
|
||
|
if cmds.objExists('speedBendHandle'):
|
||
|
cmds.setAttr('speedBendHandle.translateX' ,0)
|
||
|
|
||
|
def speedBendOffsetMore(more):
|
||
|
currentV = cmds.floatSliderGrp("speedBendOffset",q=1,max=1)
|
||
|
if currentV == 100:
|
||
|
if (more == -1):
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 0, min = -1, max = 10, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.34, 0.34, 0.34])
|
||
|
cmds.button('sBOffsetPlus',e=1,en=1,l='+')
|
||
|
if currentV == 10:
|
||
|
if (more == 1):
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 0, min = -10, max = 100, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.44, 0.44, 0.44])
|
||
|
cmds.button('sBOffsetPlus',e=1,en=0,l='')
|
||
|
else:
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 1, min = -1.0, max = 1, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.24, 0.24, 0.24])
|
||
|
elif currentV == 1:
|
||
|
if (more == 1):
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 0, min = -1, max = 10, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.34, 0.34, 0.34])
|
||
|
else:
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 3, min = -1.0, max = 0.1, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.14, 0.14, 0.14])
|
||
|
elif currentV == 0.1:
|
||
|
if (more == 1):
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 2, min = -1.0, max = 1, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.24, 0.24, 0.24])
|
||
|
else:
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 4, min = -1.0, max = 0.01, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.04, 0.04, 0.04])
|
||
|
cmds.button('sBOffsetMinus',e=1,en=0,l='')
|
||
|
elif currentV == 0.01:
|
||
|
if (more == 1):
|
||
|
cmds.floatSliderGrp('speedBendOffset',e=1, pre = 2, min = -1.0, max = 1, v=0)
|
||
|
cmds.button("speedBendOffsetV", e=1 , bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.button('sBOffsetMinus',e=1,en=1,l='-')
|
||
|
|
||
|
def speedBendDivReset():
|
||
|
currentV = cmds.intSliderGrp("speedBendDiv",e=1,v=8)
|
||
|
if cmds.objExists('speedBendBridge'):
|
||
|
cmds.setAttr('speedBendBridge.divisions',8)
|
||
|
|
||
|
def speedBendBendMore(more):
|
||
|
currentV = cmds.floatSliderGrp("speedBendBend", q=1 , v=1)
|
||
|
currentGap = cmds.intField('speedBendBendV', q=1,v =1)
|
||
|
maxV = cmds.floatSliderGrp("speedBendBend", q=1, max=1)
|
||
|
minV = cmds.floatSliderGrp("speedBendBend", q=1, min=1)
|
||
|
nextCloseV = (int(currentV / currentGap) + int(more)) * currentGap
|
||
|
if nextCloseV > maxV:
|
||
|
nextCloseV = maxV
|
||
|
elif nextCloseV < minV:
|
||
|
nextCloseV = minV
|
||
|
cmds.floatSliderGrp("speedBendBend", e=1 , v=nextCloseV)
|
||
|
if cmds.objExists('speedBend'):
|
||
|
cmds.setAttr('speedBend.curvature',nextCloseV)
|
||
|
|
||
|
def speedBendBendReset():
|
||
|
cmds.floatSliderGrp("speedBendBend", e=1 , v=90)
|
||
|
if cmds.objExists('speedBend'):
|
||
|
cmds.setAttr('speedBend.curvature',90)
|
||
|
|
||
|
def speedBendBendUpdate():
|
||
|
currentV = cmds.floatSliderGrp("speedBendBend", q=1 , v=1)
|
||
|
if cmds.objExists('speedBendBend'):
|
||
|
cmds.setAttr('speedBend.curvature',currentV)
|
||
|
|
||
|
|
||
|
def speedBendRollMore(more):
|
||
|
currentV = cmds.floatSliderGrp("speedBendRoll", q=1 , v=1)
|
||
|
currentGap = cmds.intField('speedBendRollV', q=1,v =1)
|
||
|
maxV = cmds.floatSliderGrp("speedBendRoll", q=1, max=1)
|
||
|
minV = cmds.floatSliderGrp("speedBendRoll", q=1, min=1)
|
||
|
nextCloseV = (int(currentV / currentGap) + int(more)) * currentGap
|
||
|
if nextCloseV > maxV:
|
||
|
nextCloseV = maxV
|
||
|
elif nextCloseV < minV:
|
||
|
nextCloseV = minV
|
||
|
cmds.floatSliderGrp("speedBendRoll", e=1 , v=nextCloseV)
|
||
|
if cmds.objExists('bendOffsetRot'):
|
||
|
cmds.setAttr('bendOffsetRot.rotateY',nextCloseV)
|
||
|
|
||
|
def speedBendRollUpdate():
|
||
|
currentV = cmds.floatSliderGrp("speedBendRoll", q=1 , v=1)
|
||
|
if cmds.objExists('bendOffsetRot'):
|
||
|
cmds.setAttr('bendOffsetRot.rotateY',currentV)
|
||
|
|
||
|
def speedBendRollReset():
|
||
|
cmds.floatSliderGrp("speedBendRoll", e=1 , v=0)
|
||
|
if cmds.objExists('bendOffsetRot'):
|
||
|
cmds.setAttr('bendOffsetRot.rotateY',0)
|
||
|
|
||
|
def speedBendGo():
|
||
|
global passSelection
|
||
|
passSelection = []
|
||
|
checkButton = cmds.iconTextButton("speedBendGOGO", q=1, en=1)
|
||
|
checkDivSetting = cmds.checkBox('speedBendNoDiv',q=1, v= 1)
|
||
|
if checkButton == 1:
|
||
|
sBFillHole()
|
||
|
global toBlendMesh
|
||
|
lockFaceList = []
|
||
|
beforeBendClean()
|
||
|
toBlendFace = cmds.filterExpand(ex=1, sm=(34))
|
||
|
if toBlendFace:
|
||
|
toBlendMesh = toBlendFace[0].split('.')[0]
|
||
|
toBlendShape = cmds.listRelatives(toBlendMesh,f=1, s=1)
|
||
|
singleFace = 0
|
||
|
cmds.sets(name="toBlendCut", text="toBlendCut")
|
||
|
if len(toBlendFace) > 0:
|
||
|
checkFlat = isFlat(toBlendFace)
|
||
|
if checkFlat == 1:
|
||
|
singleFaceRecord = cmds.filterExpand(ex=1, sm=(34))
|
||
|
toBlendEdgeAll = cmds.ls(cmds.polyListComponentConversion(singleFaceRecord, te=1),fl=1)
|
||
|
toBlendEdgeInside = cmds.ls(cmds.polyListComponentConversion(singleFaceRecord, te=1,internal=1),fl=1)
|
||
|
toBlendEdge = list(set(toBlendEdgeAll)-set(toBlendEdgeInside))
|
||
|
totalDistance = 0
|
||
|
for b in toBlendEdge:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(b, tv=1),fl=1)
|
||
|
pA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
pB = cmds.pointPosition(listVtx[1], w=1)
|
||
|
checkDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
totalDistance = totalDistance + checkDistance
|
||
|
diameterA = totalDistance / 3.14159
|
||
|
bendLength = totalDistance / 2
|
||
|
cmds.polyExtrudeFacet(constructionHistory=0, keepFacesTogether=1, divisions=1, twist=0, taper=0, off=0 , thickness = bendLength , smoothingAngle=30)
|
||
|
addCapFace = cmds.ls(sl=1,fl=1)
|
||
|
addCapEdge = cmds.ls(cmds.polyListComponentConversion(addCapFace, te=1),fl=1)
|
||
|
cmds.sets(toBlendEdge,name="toBlendCut", text="toBlendCut")
|
||
|
cmds.sets(addCapEdge, add= 'toBlendCut')
|
||
|
toBlendFace = cmds.ls(cmds.polyListComponentConversion(addCapEdge, tf=1),fl=1)
|
||
|
singleFace = 1
|
||
|
if len(toBlendFace) > 1 :
|
||
|
convert2EdgeInternal = cmds.ls(cmds.polyListComponentConversion(toBlendFace, te=1, internal=1),fl=1)
|
||
|
convert2Edge = cmds.ls(cmds.polyListComponentConversion(toBlendFace, te=1),fl=1)
|
||
|
toBlendEdge = list(set(convert2Edge)-set(convert2EdgeInternal))
|
||
|
cmds.sets(toBlendEdge, add= 'toBlendCut')
|
||
|
fullFace = cmds.ls( (toBlendMesh+'.f[*]'),fl=1)
|
||
|
lockFaceList = list(set(fullFace)-set(toBlendFace))
|
||
|
cmds.sets(lockFaceList,name="lockFaces", text="lockFaces")
|
||
|
ringVtx = cmds.polyListComponentConversion(toBlendEdge, tv=1)
|
||
|
ringVtx = cmds.ls(ringVtx,fl=1)
|
||
|
cv_positions = [cmds.pointPosition(x,w=1) for x in ringVtx]
|
||
|
center_position = [sum(axis) / len(ringVtx) for axis in zip(*cv_positions)]
|
||
|
grp = cmds.group(empty=True, name='bendPointA')
|
||
|
cmds.move(center_position[0], center_position[1], center_position[2], grp, absolute=True)
|
||
|
findFace = cmds.polyListComponentConversion(toBlendEdge, tf=1)
|
||
|
findFace = cmds.ls(findFace,fl=1)
|
||
|
getFaceList = list(set(findFace) & set(toBlendFace))
|
||
|
ringEdgeList = cmds.ls(cmds.polyListComponentConversion(getFaceList,te=1,internal=1),fl=1)
|
||
|
capEdgeLoop = cmds.ls(cmds.polyListComponentConversion(getFaceList,te=1),fl=1)
|
||
|
ringB = list(set(capEdgeLoop) - set(ringEdgeList) - set(toBlendEdge))
|
||
|
ringVtxB = cmds.ls(cmds.polyListComponentConversion(ringB, tv=1),fl=1)
|
||
|
cv_positionsB = [cmds.pointPosition(x,w=1) for x in ringVtxB]
|
||
|
center_positionB = [sum(axis) / len(ringVtxB) for axis in zip(*cv_positionsB)]
|
||
|
grpB = cmds.group(empty=True, name='bendPointB')
|
||
|
cmds.move(center_positionB[0], center_positionB[1], center_positionB[2], grpB, absolute=True)
|
||
|
consNodeA = cmds.aimConstraint('bendPointB','bendPointA',offset=[0,0,0], weight=1, aimVector=[0,1,0], upVector=[1,0,0], worldUpType='vector')
|
||
|
rotationRecord = cmds.getAttr('bendPointA.rotate')
|
||
|
if singleFace == 0:
|
||
|
totalDistance = 0
|
||
|
for b in toBlendEdge:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(b, tv=1),fl=1)
|
||
|
pA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
pB = cmds.pointPosition(listVtx[1], w=1)
|
||
|
checkDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
totalDistance = totalDistance + checkDistance
|
||
|
diameterA = totalDistance / 3.14159
|
||
|
bendLength = totalDistance / 2
|
||
|
cmds.polySplitRing(ringEdgeList)
|
||
|
newSplitRing = cmds.ls(sl=1,fl=1)
|
||
|
findNewVerticleFaceA = cmds.ls(cmds.polyListComponentConversion(newSplitRing , tf=1),fl=1)
|
||
|
findNewVerticleFaceB = cmds.ls(cmds.polyListComponentConversion(toBlendEdge , tf=1),fl=1)
|
||
|
findNewVerticleFace = list(set(findNewVerticleFaceA) & set(findNewVerticleFaceB))
|
||
|
findNewVerticleVerticleEdge = cmds.ls(cmds.polyListComponentConversion(findNewVerticleFace,te=1,internal=1),fl=1)
|
||
|
cmds.sets(newSplitRing, add = 'toBlendCut' )
|
||
|
if checkDivSetting == 0:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(findNewVerticleVerticleEdge[0], tv=1),fl=1)
|
||
|
pA = cmds.pointPosition(listVtx[0], w=1)
|
||
|
pB = cmds.pointPosition(listVtx[1], w=1)
|
||
|
oldEdgeDistance = math.sqrt((pA[0] - pB[0]) ** 2 + (pA[1] - pB[1]) ** 2 + (pA[2] - pB[2]) ** 2)
|
||
|
distanceScaleV = bendLength /oldEdgeDistance
|
||
|
for v in findNewVerticleVerticleEdge:
|
||
|
listVtx = cmds.ls(cmds.polyListComponentConversion(v, tv=1),fl=1)
|
||
|
getBaseCV = list(set(listVtx) & set(ringVtx))
|
||
|
pA = cmds.pointPosition(getBaseCV, w=1)
|
||
|
cmds.scale(distanceScaleV,distanceScaleV,distanceScaleV, v, cs=1, r=1, p= (pA[0],pA[1],pA[2]))
|
||
|
cmds.delete(findNewVerticleFace)
|
||
|
cmds.delete(toBlendMesh,ch=1)
|
||
|
cmds.select('toBlendCut',add=1)
|
||
|
else:
|
||
|
if checkDivSetting == 0:
|
||
|
toDeleteFace = list(set(toBlendFace)-set(singleFaceRecord))
|
||
|
cmds.delete(toDeleteFace)
|
||
|
cmds.delete(toBlendMesh,ch=1)
|
||
|
if checkDivSetting == 0:
|
||
|
membersLockFaces = cmds.ls(cmds.sets('lockFaces', query=True),fl=1)
|
||
|
cmds.polyBridgeEdge('toBlendCut',ch=1, divisions=20, twist=0, taper=1, curveType=0, smoothingAngle=30, direction=0, sourceDirection=0, targetDirection=0)
|
||
|
history_nodes = cmds.listHistory(toBlendMesh)
|
||
|
polyBridgeNode= cmds.ls(history_nodes,type='polyBridgeEdge')
|
||
|
cmds.rename(polyBridgeNode[0],'speedBendBridge')
|
||
|
cmds.createNode('mesh')
|
||
|
cmds.rename('toBlendOutShape')
|
||
|
unWantTransNode = cmds.listRelatives('toBlendOutShape', parent=True)[0]
|
||
|
cmds.connectAttr((toBlendShape[0] + '.outMesh'), ('toBlendOutShape.inMesh'),f=1)
|
||
|
cmds.parent('toBlendOutShape',toBlendMesh, relative=True, shape=True)
|
||
|
cmds.delete(unWantTransNode)
|
||
|
shading_group = cmds.listConnections(toBlendShape[0], type='shadingEngine')[0]
|
||
|
cmds.sets('toBlendOutShape', e=1, forceElement=shading_group)
|
||
|
cmds.HideSelectedObjects(toBlendShape[0])
|
||
|
cmds.polySoftEdge(toBlendMesh, a=30, ch=1)
|
||
|
cmds.select(toBlendMesh)
|
||
|
cmds.Bend()
|
||
|
bendHandleNode = cmds.ls(sl=1,fl=1,transforms=1)
|
||
|
cmds.rename(bendHandleNode[0],'speedBendHandle')
|
||
|
history_nodes = cmds.listHistory(toBlendMesh)
|
||
|
bendNode = cmds.ls(history_nodes,type='nonLinear')
|
||
|
cmds.rename(bendNode[0],'speedBend')
|
||
|
cmds.setAttr(('speedBendHandle.rotate'),rotationRecord[0][0],rotationRecord[0][1],rotationRecord[0][2])
|
||
|
cmds.setAttr(('speedBendHandle.translate'),center_position[0],center_position[1],center_position[2])
|
||
|
cmds.setAttr(('speedBendHandle.scale'),bendLength,bendLength,bendLength)
|
||
|
cmds.setAttr('speedBend.lowBound',0)
|
||
|
cmds.setAttr('speedBend.curvature',90)
|
||
|
cmds.parent('speedBendHandle',toBlendMesh)
|
||
|
offSetGrp = cmds.group(empty=True, name="bendOffset")
|
||
|
offSetRotGrp = cmds.group(empty=True, name="bendOffsetRot")
|
||
|
cmds.parent(offSetRotGrp,offSetGrp)
|
||
|
cmds.parent(offSetGrp,'speedBendHandle')
|
||
|
cmds.setAttr('bendOffset.translate',0,0,0)
|
||
|
cmds.setAttr('bendOffset.rotate',0,0,0)
|
||
|
cmds.setAttr('bendOffset.scale',1,1,1)
|
||
|
cmds.parent('bendOffset',toBlendMesh)
|
||
|
cmds.parent('speedBendHandle','bendOffsetRot')
|
||
|
weightZeroList = cmds.ls(cmds.polyListComponentConversion(membersLockFaces, tv=1),fl=1)
|
||
|
for f in weightZeroList:
|
||
|
cmds.percent('speedBend',f , v=0)
|
||
|
if checkDivSetting == 0:
|
||
|
toBlendFaceList = cmds.ls(cmds.polyListComponentConversion('toBlendOutShape',tf=1),fl=1)
|
||
|
convertList = []
|
||
|
for e in lockFaceList:
|
||
|
newN = 'toBlendOutShape.' + e.split('.')[-1]
|
||
|
convertList.append(newN)
|
||
|
selBendArea = list(set(toBlendFaceList) - set(convertList))
|
||
|
if singleFace == 1:
|
||
|
passSelection = addCapFace
|
||
|
else:
|
||
|
passSelection = selBendArea
|
||
|
cmds.hide(toBlendShape)
|
||
|
cmds.select(cl=1)
|
||
|
cmds.showHidden('toBlendOutShape')
|
||
|
cmds.select(toBlendMesh)
|
||
|
cleanList = ('bendPoint*','lockFaces','toBlendCut')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
cmds.setAttr(('speedBendHandle.hiddenInOutliner'),0)
|
||
|
cmds.setAttr(('speedBendHandle.visibility'),0)
|
||
|
if checkDivSetting == 0:
|
||
|
cmds.setAttr("speedBendBridge.divisions",8)
|
||
|
speedBendLinkUI()
|
||
|
|
||
|
|
||
|
def beforeBendClean():
|
||
|
speedBendScriptJobClean()
|
||
|
selection = cmds.ls(sl=1,fl=1)
|
||
|
if selection:
|
||
|
top_node = selection[0]
|
||
|
while cmds.listRelatives(top_node, parent=True):
|
||
|
top_node = cmds.listRelatives(top_node, parent=True)[0]
|
||
|
cmds.delete(top_node ,ch=1)
|
||
|
toBlendShape = cmds.listRelatives(top_node, s=1)
|
||
|
if toBlendShape:
|
||
|
if len(toBlendShape)>1:
|
||
|
if 'toBlendOutShape' in toBlendShape:
|
||
|
for s in toBlendShape:
|
||
|
if s != 'toBlendOutShape':
|
||
|
cmds.delete(s)
|
||
|
else:
|
||
|
faceCount = cmds.polyEvaluate(top_node, f=True )
|
||
|
for t in toBlendShape:
|
||
|
checkFaceCount = cmds.polyEvaluate(t, f=True )
|
||
|
if checkFaceCount != faceCount:
|
||
|
cmds.delete(t)
|
||
|
toBlendShape = cmds.listRelatives(top_node,f=1,s=1)[0]
|
||
|
parentNode = cmds.listRelatives(toBlendShape,f=1, p=1)[0]
|
||
|
cmds.rename(toBlendShape,(parentNode[1:]+'Shape'))
|
||
|
cleanList = ('speedBendBridg*','bendPoint*','lockFace*','toBlendCu*','toBlendOutShap*','speedBen*','bendOffse*')
|
||
|
for c in cleanList:
|
||
|
if cmds.objExists(c):
|
||
|
cmds.delete(c)
|
||
|
cmds.showHidden(top_node)
|
||
|
|
||
|
def finishBendClean():
|
||
|
storeSel = cmds.ls(sl=1)
|
||
|
speedBendScriptJobClean()
|
||
|
global toBlendMesh
|
||
|
global passSelection
|
||
|
if cmds.objExists(toBlendMesh):
|
||
|
cmds.delete(toBlendMesh ,ch=1)
|
||
|
toBlendShape = cmds.listRelatives(toBlendMesh,s=1)
|
||
|
if toBlendShape:
|
||
|
if len(toBlendShape)>1:
|
||
|
if 'toBlendOutShape' in toBlendShape:
|
||
|
for s in toBlendShape:
|
||
|
if s != 'toBlendOutShape':
|
||
|
cmds.delete(s)
|
||
|
else:
|
||
|
faceCount = cmds.polyEvaluate(toBlendMesh, f=True )
|
||
|
for t in toBlendShape:
|
||
|
checkFaceCount = cmds.polyEvaluate(t, f=True )
|
||
|
if checkFaceCount != faceCount:
|
||
|
cmds.delete(t)
|
||
|
toBlendShape = cmds.listRelatives(toBlendMesh,f=1,s=1)[0]
|
||
|
parentNode = cmds.listRelatives(toBlendShape,f=1, p=1)[0]
|
||
|
cmds.rename(toBlendShape,(parentNode[1:]+'Shape'))
|
||
|
cmds.showHidden(toBlendMesh)
|
||
|
if passSelection:
|
||
|
convertList = []
|
||
|
for p in passSelection:
|
||
|
newN = toBlendMesh +'.' + p.split('.')[-1]
|
||
|
convertList.append(newN)
|
||
|
cmds.select(convertList)
|
||
|
checkState = cmds.iconTextButton("speedBendGOGO", q=1, ex=1 )
|
||
|
if checkState == 1:
|
||
|
cmds.iconTextButton("speedBendGOGO", e=1, en=1, l ="Bend", bgc=[0.2, 0.2, 0.2] )
|
||
|
cmds.iconTextButton("speedBendExtrude", e=1, en=1 ,bgc=[0.2,0.2,0.2],l='Extrude')
|
||
|
|
||
|
def speedBendScriptJobClean():
|
||
|
count = 0
|
||
|
foundError = 1
|
||
|
while foundError > 0 and count < 10:
|
||
|
jobs = cmds.scriptJob( listJobs=True )
|
||
|
foundError = 0
|
||
|
for j in jobs:
|
||
|
if "finishBendClean" in j:
|
||
|
jID = j.split(':')[0]
|
||
|
print(jID)
|
||
|
try:
|
||
|
cmds.scriptJob (kill = int(jID),f =1 )
|
||
|
except:
|
||
|
foundError = 1
|
||
|
|
||
|
count += 1
|
||
|
|
||
|
def run():
|
||
|
if cmds.window("speedBendUI", exists=True):
|
||
|
cmds.deleteUI("speedBendUI")
|
||
|
speedBendUI = cmds.window("speedBendUI",title = "Speed Bend",w = 350,h = 150)
|
||
|
cmds.frameLayout(label="Bend Extrude:",lv=0, bv=0, w=295, mw=3, mh=5)
|
||
|
cmds.columnLayout(adj=1)
|
||
|
cmds.rowColumnLayout(nc=5, cw=[(1, 220), (2, 30), (3, 30),(4, 30),(5, 30)])
|
||
|
cmds.floatSliderGrp("speedBendBend", cw3=[50, 50, 0], label=" Bend", f=1, v=90, min=-180, max=180, pre=0, cc=speedBendBendUpdate)
|
||
|
cmds.button(label="X", c=speedBendBendReset, bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.intField('speedBendBendV', v =45, bgc =[0.24,0.24,0.24])
|
||
|
cmds.button(label="-", c=lambda x: speedBendBendMore(-1), bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.button(label="+", c=lambda x: speedBendBendMore(1), bgc=[0.24, 0.24, 0.24])
|
||
|
|
||
|
cmds.floatSliderGrp("speedBendRoll", cw3=[50, 50, 0], label=" Roll", f=1, v=45, min=-180, max=180, fmx=360, pre=0, cc=speedBendRollUpdate)
|
||
|
cmds.button(label="X", c=speedBendRollReset, bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.intField('speedBendRollV', v =45, bgc =[0.24,0.24,0.24] )
|
||
|
cmds.button(label="-", c=lambda x: speedBendRollMore(-1), bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.button(label="+", c=lambda x: speedBendRollMore(1), bgc=[0.24, 0.24, 0.24])
|
||
|
|
||
|
cmds.floatSliderGrp("speedBendOffset", cw3=[50, 50, 0], label=" Offset", f=1, v=0, min=-0.1, max=1, pre=1)
|
||
|
cmds.button(label="X", c=speedBendOffsetReset, bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.button("speedBendOffsetV", en= 0,label="", bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.button('sBOffsetMinus',label="-", c=lambda x: speedBendOffsetMore(-1), bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.button('sBOffsetPlus',label="+", c=lambda x: speedBendOffsetMore(1), bgc=[0.24, 0.24, 0.24])
|
||
|
|
||
|
cmds.intSliderGrp("speedBendDiv", cw3=[50, 50, 0], label="Divisions", v=4, f=1, min=1, max=16, fmx=36)
|
||
|
cmds.button(label="X", c=speedBendDivReset, bgc=[0.24, 0.24, 0.24])
|
||
|
cmds.setParent("..")
|
||
|
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 18),(2, 100), (3, 100), (4, 2), (5, 58), (6, 2), (7, 58)])
|
||
|
cmds.text(l ='')
|
||
|
cmds.columnLayout(adj=1)
|
||
|
cmds.checkBox('speedBendSetting',label="Remember", value= 0)
|
||
|
cmds.checkBox('speedBendNoDiv',label="No Divisions", value= 0)
|
||
|
cmds.setParent("..")
|
||
|
cmds.iconTextButton("speedBendGOGO", style='textOnly', l ="Bend", c=speedBendGo, rpt=1, bgc=[0.2, 0.2, 0.2])
|
||
|
cmds.text(l ='')
|
||
|
cmds.iconTextButton("speedBendExtrude", style='textOnly', l ="Extrude", c=speedBendExtrudeGO, rpt=1, bgc=[0.2, 0.2, 0.2])
|
||
|
cmds.text(l ='')
|
||
|
cmds.iconTextButton(style='textOnly', l ="Done", c=finishBendClean, bgc=[0.3, 0.2, 0.2])
|
||
|
cmds.showWindow(speedBendUI)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
run()
|