MetaBox/Scripts/Modeling/Edit/SpeedBend.py

482 lines
25 KiB
Python
Raw Normal View History

2025-01-14 02:17:16 +08:00
#!/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()