def randomSelectionUI(*args):
if cmds.window("win", exists = True):
cmds.deleteUI("win")
widgets["win"] = cmds.window("win", w=280, h=75, t="zbw_randomSelection")
widgets["mainCLO"] = cmds.columnLayout()
widgets["text"] = cmds.text("What percent of selection do you want to keep?")
widgets["keepIFG"] = cmds.intFieldGrp(l=" % to keep:", v1=50, h=40, cw = ([1, 65], [2, 50]), cal = ([1,"left"], [2, "left"]))
widgets["text2"] = cmds.text("Random: each obj has % chance to be removed")
widgets["text3"] = cmds.text("Precise: exact num removed, but randomly chosen")
cmds.separator(h=10)
widgets["typeRBG"] = cmds.radioButtonGrp(l="Type:", l1 = "Random Remove", l2 = "Precise Remove", nrb = 2, sl = 1, cw = ([1, 30], [2,120], [3, 120], [4, 50]), cal = ([1, "left"], [2,"left"], [3, "left"], [4, "left"]))
widgets["but"] = cmds.button(l="Reselect", w=280, h=40, bgc = (.6, .8, .6), c = doSel)
cmds.window(widgets["win"], e=True, w=280, h=75)
cmds.showWindow(widgets["win"])
python类button()的实例源码
def findScriptUI(*args):
if cmds.window("findScript", exists = True):
cmds.deleteUI("findScript")
widgets["win"] = cmds.window("findScript", t="zbw_findPath", w=300, h=200)
widgets["mainCLO"] = cmds.columnLayout()
cmds.separator(h=10)
widgets["textTx"] = cmds.text(l="Will search your active python paths. \nNo need for suffix (.py or .mel)\nNo wildcards(*). Just string, 3 chars min", al="left")
cmds.separator(h=20)
widgets["nameTFG"] = cmds.textFieldGrp(l="search for:", cw = [(1, 75), (2,200)], cal = [(1, "left"),(2, "right")])
cmds.separator(h=20)
widgets["searchBut"] = cmds.button(l="Search python paths!", w=300, h=50, bgc=(0,.6, 0), c=searchPaths)
cmds.separator(h=20)
widgets["resultTxt"] = cmds.textFieldGrp(l="results:", ed=False, w=300, cw = [(1, 75), (2,200)], bgc = (0,0,0) , cal = [(1, "left"),(2, "right")])
cmds.showWindow(widgets["win"])
def getScriptsUI(*args):
if cmds.window("thisWin", exists = True):
cmds.deleteUI("thisWin")
widgets["win"] = cmds.window("thisWin", w=300, h=200)
widgets["mainFLO"] = cmds.formLayout()
widgets["list"] = cmds.textScrollList(nr=10, w=300, dcc = executeCommand)
cmds.formLayout(widgets["mainFLO"], e=1, af = [(widgets["list"], "left", 0), (widgets["list"], "top", 0), (widgets["list"], "bottom", 30), (widgets["list"], "right", 0)])
widgets["button"] = cmds.button(l="Refresh List!", w=300, h= 30, bgc = (.8, .6, .3), c= getScripts)
cmds.formLayout(widgets["mainFLO"], e=1, af = [(widgets["button"], "left", 0), (widgets["button"], "right", 0), (widgets["button"], "bottom", 0)])
cmds.showWindow(widgets["win"])
#populate the list with the contents of the path
def shadingTransferUI(*args):
if cmds.window("win", exists=True):
cmds.deleteUI("win")
widgets["win"] = cmds.window("win", t="zbw_shadingTransfer", w=200, h=100, s=False)
widgets["mainCLO"] = cmds.columnLayout()
cmds.text(l="1. Select the source object (poly/nurbs)", al="left")
cmds.text(l="2. Select the target object(s)", al="left")
cmds.text(l="Note: deleteHistory on the transferUV\nwill try to avoid deleting deformers.\nNo promises:)", al="left")
cmds.separator(h=10)
widgets["shdBut"] = cmds.button(l="Copy Shaders to targets!", w=200, h=40, bgc=(.4, .7, .4), c=partial(getSelection, "copyShader"))
cmds.separator(h=10)
widgets["uvBut"] = cmds.button(l="Transfer UV's to targets!", w=200, h=40, bgc=(.7, .7, .5), c=partial(getSelection, "transferUV"))
widgets["xferCBG"] = cmds.checkBoxGrp(l="Delete history after transfer?", v1=0, cal=[(1, "left"), (2,"left")], cw=[(1, 150), (2, 50)])
cmds.window(widgets["win"], e=True, w=200, h=100)
cmds.showWindow(widgets["win"])
def getObj(*args):
#get selection and put it in the widgets["objTFG"]
clearList()
sel = cmds.ls(sl=True, type="transform")
if (sel and (len(sel)==1)):
cmds.textFieldGrp(widgets["objTFG"], e=True, tx=sel[0])
else:
cmds.warning("you must select one object with the \"follow\" attribute")
#------------maybe add attr onto end of obj text, then you don't have to get it later if you needed to ???
#now create a button for each value in the "follow" attr
#channels = cmds.channelBox ('mainChannelBox', query=True, selectedMainAttributes=True)
enumValueStr = cmds.attributeQuery("follow", node=sel[0], listEnum=True)[0]
values = enumValueStr.split(":")
for i in range(0,len(values)):
#pick a random color?
r = random.uniform(0.5,1)
g = random.uniform(0.5,1)
b = random.uniform(0.5,1)
color = (r, g, b)
#here create the button
cmds.button(l=values[i], w=125, p=widgets["bottomRCLO"], bgc=color, h=50, c=partial(switchMatchSpace, i))
def snapUI():
"""simple snap UI for snapping"""
if cmds.window("snapWin", exists=True):
cmds.deleteUI("snapWin", window=True)
cmds.windowPref("snapWin", remove=True)
widgets["win"] = cmds.window("snapWin", t="zbw_snap", w=210, h=100, rtf=True)
widgets["mainCLO"] = cmds.columnLayout(w=210, h=100)
cmds.text("Select the target object(s),\nthen the object(s) you want to snap", al="center", w=210)
cmds.separator(h=5, style="single")
widgets["cbg"] = cmds.checkBoxGrp(l="Options: ", ncb=2, v1=1, v2=1, l1="Translate", l2="Rotate", cal=[(1,"left"),(2,"left"), (3,"left")], cw=[(1,50),(2,75),(3,75)])
widgets["avgRBG"] = cmds.radioButtonGrp(nrb=2, l1="Snap all to first", l2="Snap last to avg", cal=[(1,"left"),(2,"left"),(3,"left")], cw=[(1,100),(2,100)],sl=1)
widgets["rpCB"] = cmds.checkBox(l="Use Rotate Pivot To Query Position?", v=1)
widgets["snapPivCB"] = cmds.checkBox(l="Snap via pivot? (vs. translate value)", v=1)
cmds.separator(h=5, style="single")
widgets["snapButton"] = cmds.button(l="Snap obj(s)!", w=210, h=40, bgc=(.6,.8,.6), c=partial(snapIt, False))
widgets["snapPivButton"] = cmds.button(l="Snap pivot!", w=210, h=20, bgc=(.8,.6,.6), c=partial(snapIt, True))
cmds.window(widgets["win"], e=True, w=5, h=5)
cmds.showWindow(widgets["win"])
def jointRadiusUI(*args):
if cmds.window("jntWin", exists=True):
cmds.deleteUI("jntWin")
widgets["win"] = cmds.window("jntWin", t="zbw_jointRadius", w=200, h=90, s=False)
widgets["clo"] = cmds.columnLayout(rs=10)
widgets["slider"] = cmds.floatSliderGrp(l="radius", min=0.05, max=2, field=True, fieldMinValue=0.01,
fieldMaxValue=2, precision=2, sliderStep=0.1, value=0.5,
cw=([1, 40], [2, 45], [3, 115]),
cal=([1, "left"], [2, "left"], [3, "left"]))
# radio button group, all or selected
widgets["rbg"] = cmds.radioButtonGrp(nrb=2, l1="all", l2="selected", cw=([1, 50], [1, 50]), sl=1)
widgets["but"] = cmds.button(l="Set Radius", w=205, h=50, bgc=(.5, .8, .5), c=adjustRadius)
cmds.window(widgets["win"], e=True, w=200, h=90)
cmds.showWindow(widgets["win"])
def zbw_mmChangeConnectAttrUI(base, attr, obj, *args):
if (cmds.window('zbw_mmChangeAttrUI', exists=True)):
cmds.deleteUI('zbw_mmChangeAttrUI', window=True)
cmds.windowPref('zbw_mmChangeAttrUI', remove=True)
window=cmds.window('zbw_mmChangeAttrUI', widthHeight=(400,80), title='zbw_messageMapper_changeAttrName')
cmds.columnLayout()
#show old attr name
cmds.text("old attribute name: " + attr)
#asks for the new attr name
cmds.textFieldGrp("zbw_mmChangeAttrTFG", l="new attr name (just attr name)")
#button to do it (pass along attr, obj)
cmds.button("zbw_mmChangeAttrB", l="change attr!", c=partial(zbw_mmChangeConnectAttr, base, attr, obj))
cmds.showWindow(window)
#force window to size
cmds.window('zbw_mmChangeAttrUI', e=True, widthHeight = (400,80))
pass
def zbw_mmChangeConnectObjUI(base, attr, obj, *args):
if (cmds.window('zbw_mmChangeObjUI', exists=True)):
cmds.deleteUI('zbw_mmChangeObjUI', window=True)
cmds.windowPref('zbw_mmChangeObjUI', remove=True)
window=cmds.window('zbw_mmChangeObjUI', widthHeight=(400,85), title='zbw_messageMapper_changeObjName')
cmds.columnLayout()
#show old attr name
cmds.text("base attribute name: " + attr)
cmds.text("old connected obj name: " + obj)
#asks for the new attr name
cmds.textFieldButtonGrp("zbw_mmChangeObjTFBG", l="select new obj: ", bl="get", bc=partial(zbw_mmAddTarget, "zbw_mmChangeObjTFBG"))
#button to do it (pass along attr, obj)
cmds.button("zbw_mmChangeObjB", l="change obj!", c=partial(zbw_mmChangeConnectObj, base, attr, obj))
cmds.showWindow(window)
#force window to size
cmds.window('zbw_mmChangeObjUI', e=True, widthHeight = (420,85))
def modelSequenceUI(*args):
if (cmds.window("modSeq", exists=True)):
cmds.deleteUI("modSeq")
widgets["win"] = cmds.window("modSeq", w = 300, h = 220, t = "zbw_modelSequence")
widgets["mainCLO"] = cmds.columnLayout(w = 300,h = 220)
cmds.separator(h=10)
cmds.text("Select ONE object to be duplicated \nThis will duplicate it for frames selected and group", al="left")
cmds.separator(h=20)
#textFieldGRP - name of objs
widgets["sufTFG"] = cmds.textFieldGrp(l="Sequence Suffix:", cw = [(1, 100), (2,200)], cal = [(1, "left"),(2, "right")])
#radioButtonGrp - timeslider or frame range
widgets["frmRBG"] = cmds.radioButtonGrp(l="Get Frames From:", nrb=2, sl=2, l1="Time Slider", l2="Frame Range", cw = [(1, 120), (2,80), (3,80)], cal = [(1, "left"),(2, "left")], cc=enableFR)
#textFieldGrp - framerange (enable)
widgets["frmRngIFG"] = cmds.intFieldGrp(l="Range:", nf=2, en=True, v1=0, v2 = 9, cw = [(1, 120), (2,80), (3,80)], cal = [(1, "left"),(2, "left")])
#int = by frame step
widgets["stepIFG"] = cmds.intFieldGrp(l="Step By (frames):", v1 = 1, cw = [(1, 120), (2,80)], cal = [(1, "left"),(2, "right")])
cmds.separator(h=30)
widgets["doBut"] = cmds.button(l="Create duplicates of objects!", w= 300, h=40, bgc = (0,.8, 0), c=getValues)
cmds.showWindow(widgets["win"])
def makeSequence(obj = "", name = "", frameStart = 0, frameEnd = 1, step = 1):
"""duplicate selected geo based on settings from UI"""
dupes = []
numCopies = (frameEnd-frameStart)/step
#check here if we want to create more than 25 duplicates?
confirm = cmds.confirmDialog(t="Confirm", m= "This will create %d copies of %s. \nFrames: %d to %d\nFor dense meshes, this could get heavy\nAre you sure you want to do this?"%(numCopies, obj, frameStart, frameEnd), button = ["Yes", "No"], cancelButton = "No")
if confirm == "Yes":
for frame in range(frameStart, frameEnd + 1, step):
cmds.currentTime(frame, edit=True)
dupe = cmds.duplicate(obj, n="%s_%d"%(name, frame), ic = False, un = False)
dupes.append(dupe)
if dupes:
grp = cmds.group(em = True, n = "%s_GRP"%name)
for dupe in dupes:
cmds.parent(dupe, grp)
#cmds.currentTime(currentFrame, e=True)
def follicleUI(*args):
"""UI for the script"""
if cmds.window("folWin", exists=True):
cmds.deleteUI("folWin")
widgets["win"] = cmds.window("folWin", t="zbw_makeFollicle", w=300, h=100)
widgets["mainCLO"] = cmds.columnLayout()
# widgets["polyFrame"] = cmds.frameLayout(l="Polygon Vert(s) Follicle")
# widgets["polyCLO"] = cmds.columnLayout()
widgets["text"] = cmds.text("Select one or two vertices (2 will get avg position) and run")
widgets["nameTFG"] = cmds.textFieldGrp(l="FollicleName:", cal=([1, "left"],[2,"left"]), cw=([1,100],[2,200]), tx="follicle")
cmds.separator(h=10)
widgets["button"] = cmds.button(w=300, h=50, bgc=(0.6,.8,.6), l="Add follicle to vert(s)", c=getUV)
# cmds.setParent(widgets["mainCLO"])
# widgets["nurbsFrame"] = cmds.frameLayout(l="Nurbs select")
cmds.showWindow(widgets["win"])
cmds.window(widgets["win"], e=True, w=300, h=100)
#-------could also select edit point????
#-------multiple selection and average uv position? Orrrr option to create multiple UV's, one on each vertex
#-------grab an edge and convert to 2 verts and get average. . .
#-------have option for distributed (select 2 verts and number of follicles, spread that num between the two uv positions)
def getAttr(*args):
"""grabs the selected channel from the selected obj and puts the enum values into the list"""
#--------here could require a channel of a specific name, then you could do it automagically (check for "follow", "spaces", "space", "ss", etc)
obj = cmds.textFieldGrp(widgets["objTFG"], q=True, tx=True)
cmds.select(obj, r=True)
channels = cmds.channelBox ('mainChannelBox', query=True, selectedMainAttributes=True)
print channels
if (channels and (len(channels)==1)):
if (cmds.attributeQuery(channels[0], node=obj, enum=True)):
enumValue = cmds.attributeQuery(channels[0], node=obj, listEnum=True)
values = enumValue[0].split(":")
for value in values:
cmds.textScrollList(widgets["spacesTSL"], e=True, append=value)
#----------create a button for each one???
#----------or have them be double clicked???
else:
cmds.warning("select only the enum space switch channel")
def dupeSwapUI():
"""UI for script"""
if cmds.window("dupeWin", exists=True):
cmds.deleteUI("dupeWin")
cmds.window("dupeWin", t="zbw_dupeSwap", w=250, h=100)
cmds.columnLayout("dupeCLO")
cmds.text("Select the initial object. then select the", al="center", w=250)
cmds.text("duplicates and press button", al="center", w=250)
cmds.separator(h=5, style ="single")
cmds.radioButtonGrp("inputsRBG", l="inputs:", nrb=3, l1="none", l2="connect", l3="duplicate", cw=[(1, 50), (2,47), (3,63), (4,40)], cal=[(1,"left"), (2,"left"), (3,"left"), (4,"left")], sl=1)
cmds.separator(h=5, style ="single")
cmds.button("dupeButton", l="Swap Elements", w=250, h=50, bgc=(.6, .8,.6), c=dupeIt)
cmds.showWindow("dupeWin")
cmds.window("dupeWin", e=True, w=250, h=100)
def animNoiseUI():
if cmds.window('animNoiseWin', exists=True):
cmds.deleteUI('animNoiseWin', window=True)
cmds.windowPref('animNoiseWin', remove=True)
widgets["win"] = cmds.window('animNoiseWin', widthHeight=(300,200), title='zbw_animNoise')
widgets["CLO"] = cmds.columnLayout(cal='center')
widgets["ampFFG"] = cmds.floatFieldGrp(cal=(1, 'left'), nf=2, l="set Min/Max Amp", v1=-1.0, v2=1.0)
#add gradient?
widgets["freqIFG"] = cmds.intFieldGrp(cal=(1,'left'), l='frequency(frames)', v1=5)
#checkbox for random freq
widgets["randFreqOnCBG"] = cmds.checkBoxGrp(cal=(1,'left'), cw=(1, 175),l='random frequency on', v1=0, cc=animNoiseRandom)
widgets["randFreqFFG"] = cmds.floatFieldGrp(l='random freq (frames)', v1=1, en=0)
#checkbox for avoid keys
widgets["avoidCBG"] = cmds.checkBoxGrp(cal=(1,'left'), cw=(1, 175),l='buffer existing keys (by freq)', v1=0)
#radiobutton group for tangents
#checkbox for timeline range
widgets["rangeRBG"] = cmds.radioButtonGrp(nrb=2,l="Frame Range:", l1="Timeslider", l2="Frame Range", sl=1, cw=[(1,100),(2,75),(3,75)],cc=enableFrameRange)
#floatFieldGrp for range
widgets["frameRangeIFG"] = cmds.intFieldGrp(nf=2, l='start/end frames', v1=1, v2=10, en=0)
widgets["goBut"] = cmds.button(l='Add Noise', width=300, h=30, bgc=(.6,.8,.6), command=addNoise)
cmds.showWindow(widgets["win"])
def channelbox_command_cboxReset(box, menuItem, key, *args):
with sysCmd.Undo(0):
confirm = cmds.confirmDialog(t="Reset to Default",
m="Delete all saved data and modified settings associated with this Channel Box?",
icon="critical", button=["Reset", "Cancel"])
if confirm == "Reset":
default_states = box.menu_default_states
for k, v in default_states.iteritems():
# compare keys containing a default state with items that exist in the edit menu or others
# specified and restore them
box.saved_states[k] = v
sysCmd.channelbox_pickle_delete_state(box)
# box.re_init(box) # re-initialize to update our changes in the display
cmds.warning("Please close the ChannelBox UI and re-open it for changes to take effect")
def ui():
'''
User interface for stopwatch
'''
with utl.MlUi('ml_stopwatch', 'Stopwatch', width=400, height=175, info='''Press the start button to start recording.
Continue pressing to set marks.
When finished, press the stop button and the report will pop up.''') as win:
mc.checkBoxGrp('ml_stopwatch_round_checkBox',label='Round to nearest frame', value1=True, annotation='Only whole number frames')
mc.text('ml_stopwatch_countdown_text', label='Ready...')
mc.button('ml_stopwatch_main_button', label='Start', height=80)
_setButtonStart()
mc.button(label='Stop', command=_stopButton, annotation='Stop the recording.')
def _startButton(*args):
'''
Run when the start button is pressed, gathers args and starts the stopwatch.
'''
global STOPWATCH
_setButtonMark()
rounded = mc.checkBoxGrp('ml_stopwatch_round_checkBox', query=True, value1=True)
kwargs = dict()
kwargs['startFrame'], null = utl.frameRange()
if rounded:
kwargs['roundTo'] = 0
STOPWATCH = Stopwatch(**kwargs)
STOPWATCH.start()
def __init__(self):
super(CopySkinUI, self).__init__('ml_copySkin', 'Copy SkinClusters', width=400, height=180,
info='''Select a skinned mesh to add to the Source Mesh field below.
Select a destination mesh, or vertices to copy the skin to.
Press the button to copy the skin weights.''')
self.buildWindow()
self.srcMeshField = self.selectionField(label='Source Mesh',
annotation='Select the mesh to be used as the source skin.',
channel=False,
text='')
mc.button(label='Copy Skin', command=self.copySkin, annotation='Copy the Source Skin to selection.')
self.finish()
def ui():
'''
User interface for convert rotation order
'''
with utl.MlUi('ml_convertRotationOrder', 'Convert Rotation Order', width=400, height=140, info='''Select objects to convert and press button for desired rotation order.
Use the "Get Tips" button to see suggestions for a single object on the current frame.''') as win:
mc.button(label='Get tips for selection', command=loadTips, annotation='')
mc.scrollField('ml_convertRotationOrder_nodeInfo_scrollField', editable=False, wordWrap=True, height=60)
mc.rowColumnLayout(numberOfColumns=2, columnWidth=[(1,100), (2,400)], columnAttach=[2,'both',1])
for each in ROTATE_ORDERS:
_BUTTON[each] = win.buttonWithPopup(label=each, command=globals()[each], annotation='Convert selected object rotate order to '+each+'.', shelfLabel=each)
mc.textField('ml_convertRotationOrder_'+each+'_textField', editable=False)
resetTips()
def about(self, *args):
'''
This pops up a window which shows the revision number of the current script.
'''
text='by Morgan Loomis\n\n'
try:
__import__(self.module)
module = sys.modules[self.module]
text = text+'Revision: '+str(module.__revision__)+'\n'
except StandardError:
pass
try:
text = text+'ml_utilities Rev: '+str(__revision__)+'\n'
except StandardError:
pass
mc.confirmDialog(title=self.name, message=text, button='Close')
def __init__(self, label=None, name=None, command=None, annotation='', shelfLabel='', shelfIcon='render_useBackground', readUI_toArgs={}, **kwargs):
'''
The fancy part of this object is the readUI_toArgs argument.
'''
self.uiArgDict = readUI_toArgs
self.name = name
self.command = command
self.kwargs = kwargs
self.annotation = annotation
self.shelfLabel = shelfLabel
self.shelfIcon = shelfIcon
if annotation and not annotation.endswith('.'):
annotation+='.'
button = mc.button(label=label, command=self.runCommand, annotation=annotation+' Or right click for more options.')
mc.popupMenu()
mc.menuItem(label='Create Shelf Button', command=self.createShelfButton, image=shelfIcon)
mc.menuItem(label='Create Hotkey',
command=self.createHotkey, image='commandButton')
def colorControlLayout(self, label=''):
mc.rowLayout( numberOfColumns=4,
columnWidth4=(150, 200, 90, 80),
adjustableColumn=2,
columnAlign=(1, 'right'),
columnAttach=[(1, 'both', 0),
(2, 'both', 0),
(3, 'both', 0),
(4, 'both', 0)] )
mc.text(label=label)
colorSlider = mc.colorSliderGrp( label='', adj=2, columnWidth=((1,1),(3,1)))
mc.button(label='From Selected',
ann='Get the color of the selected object.',
command=partial(self.setFromSelected, colorSlider))
mc.button(label='Randomize',
ann='Set a random color.',
command=partial(self.randomizeColors, colorSlider))
controls = mc.layout(colorSlider, query=True, childArray=True)
mc.setParent('..')
return colorSlider
def quickBreakDownUI():
winName = 'ml_quickBreakdownWin'
if mc.window(winName, exists=True):
mc.deleteUI(winName)
mc.window(winName, title='ml :: QBD', iconName='Quick Breakdown', width=100, height=500)
mc.columnLayout(adj=True)
mc.paneLayout(configuration='vertical2', separatorThickness=1)
mc.text('<<')
mc.text('>>')
mc.setParent('..')
for v in (10,20,50,80,90,100,110,120,150):
mc.paneLayout(configuration='vertical2',separatorThickness=1)
mc.button(label=str(v)+' %', command=partial(weightPrevious,v/100.0))
mc.button(label=str(v)+' %', command=partial(weightNext,v/100.0))
mc.setParent('..')
mc.showWindow(winName)
mc.window(winName, edit=True, width=100, height=250)
def dragLeft(self):
'''This is activated by the left mouse button, and weights to the next or previous keys.'''
#clamp it
if self.x < -1:
self.x = -1
if self.x > 1:
self.x = 1
if self.x > 0:
self.drawString('>> '+str(int(self.x*100))+' %')
for curve in self.keySel.curves:
for i,v,n in zip(self.time[curve],self.value[curve],self.next[curve]):
mc.keyframe(curve, time=(i,), valueChange=v+((n-v)*self.x))
elif self.x <0:
self.drawString('<< '+str(int(self.x*-100))+' %')
for curve in self.keySel.curves:
for i,v,p in zip(self.time[curve],self.value[curve],self.prev[curve]):
mc.keyframe(curve, time=(i,), valueChange=v+((p-v)*(-1*self.x)))
def buildUI(self):
# To start with we create a layout to hold our UI objects
# A layout is a UI object that lays out its children, in this case in a column
column = cmds.columnLayout()
# Now we create a text label to tell a user how to use our UI
cmds.text(label="Use this slider to set the tween amount")
# We want to put our slider and a button side by side. This is not possible in a columnLayout, so we use a row
row = cmds.rowLayout(numberOfColumns=2)
# We create a slider, set its minimum, maximum and default value.
# The changeCommand needs to be given a function to call, so we give it our tween function
# We need to hold on to our slider's name so we can edit it later, so we hold it in a variable
self.slider = cmds.floatSlider(min=0, max=100, value=50, step=1, changeCommand=tween)
# Now we make a button to reset our UI, and it calls our reset method
cmds.button(label="Reset", command=self.reset)
# Finally we don't want to add anymore to our row layout but want to add it to our column again
# So we must change the active parent layout
cmds.setParent(column)
# We add a button to close our UI
cmds.button(label="Close", command=self.close)
# *args will be a new concept for you
# It basically means I do not know how many arguments I will get, so please put them all inside this one list (tuple) called args
def buildUI(self):
column = cmds.columnLayout()
cmds.text(label="Use this slider to set the tween amount")
cmds.rowLayout(numberOfColumns=2)
self.slider = cmds.floatSlider(min=0, max=100, value=50, step=1, changeCommand=tweener.tween)
cmds.button(label="Reset", command=self.reset)
cmds.setParent(column)
cmds.button(label="Close", command=self.close)
# And again, we just need to override the reset method
# We don't need to define the close, or show methods because it gets those from BaseWindow
def buildUI(self):
column = cmds.columnLayout()
cmds.text(label="Use the slider to modify the number of teeth the gear will have")
cmds.rowLayout(numberOfColumns=4)
# This label will show the number of teeth we've set
self.label = cmds.text(label="10")
# Unlike the tweener, we use an integer slider and we set it to run the modifyGear method as it is dragged
self.slider = cmds.intSlider(min=5, max=30, value=10, step=1, dragCommand=self.modifyGear)
cmds.button(label="Make Gear", command=self.makeGear)
cmds.button(label="Reset", command=self.reset)
cmds.setParent(column)
cmds.button(label="Close", command=self.close)
def about():
"""Displays the CMT About dialog."""
name = 'cmt_about'
if cmds.window(name, exists=True):
cmds.deleteUI(name, window=True)
if cmds.windowPref(name, exists=True):
cmds.windowPref(name, remove=True)
window = cmds.window(name, title='About CMT', widthHeight=(600, 500), sizeable=False)
form = cmds.formLayout(nd=100)
text = cmds.scrollField(editable=False, wordWrap=True, text=cmt.__doc__.strip())
button = cmds.button(label='Documentation', command='import cmt.menu; cmt.menu.documentation()')
margin = 8
cmds.formLayout(form, e=True,
attachForm=(
(text, 'top', margin),
(text, 'right', margin),
(text, 'left', margin),
(text, 'bottom', 40),
(button, 'right', margin),
(button, 'left', margin),
(button, 'bottom', margin),
),
attachControl=(
(button, 'top', 2, text)
))
cmds.showWindow(window)
def show_ui(self):
u"""Window???"""
if cmds.window(self._WINDOW_NAME, exists=True):
cmds.deleteUI(self._WINDOW_NAME)
self.window = cmds.window(self._WINDOW_NAME,
t=self._WINDOW_TITLE,
width=340,
maximizeButton=False, minimizeButton=False)
form = cmds.formLayout()
field_group = cmds.columnLayout(adj=True, cal="center", rs=self._MARGIN)
cmds.text(u"""???????????????????????????????
????????????????????????????""", al="left")
self.text_scroll = cmds.textScrollList(append=self.get_windows(), ams=False, dcc=self.check_execute)
self.text_field = cmds.textFieldGrp(l=u"????", ad2=2, cl2=["left", "left"], cw=[1, 60])
cmds.setParent("..")
button_group = cmds.columnLayout(adj=True, cal="center")
cmds.button(l="Check", c=self.check_execute)
cmds.setParent("..")
cmds.formLayout(form, e=True,
attachForm=[(field_group, "top", self._MARGIN),
(field_group, "left", self._MARGIN),
(field_group, "right", self._MARGIN),
(button_group, "bottom", self._MARGIN),
(button_group, "left", self._MARGIN),
(button_group, "right", self._MARGIN)],
attachControl=[(button_group, "top", self._MARGIN, field_group)])
cmds.setParent("..")
cmds.showWindow(self.window)