#!BPY ########################################################################## # # # BUTTON_DEMO.PY # # Demonstrates the buttons available for Python scripting in Blender. # # # # by Jonathan Berg, email: joncberg (at) yahoo (dot) com # # # # I'm new to this, so if someone knows a better way to do something, # # let me know. # # # # Open the script in Blender's text editor and # # Press Alt-P to start the script. # # # ########################################################################## from Blender import Draw, BGL # Assign event numbers to buttons evtNoEvt = 0 evtPush = 1 evtMenu = 2 evtNum = 3 evtSlider = 4 evtString = 5 evtToggle = 6 # Set initial values of buttons menu = Draw.Create(1) number = Draw.Create(3) slider = Draw.Create(0.5) string = Draw.Create("Hello world!") toggle = Draw.Create(1) # other variables count = 0 result = 0 def gui(): global evtNoEvt, evtPush, evtMenu, evtNum, evtSlider, evtString, evtToggle global menu, number, scroll, slider, string, toggle global count, result BGL.glRasterPos2i(10,350) # position the cursor to write text Draw.Text("Press Q or ESC to quit.") BGL.glRasterPos2i(10,335) Draw.Text("Whenever the Push button is clicked, the expression selected in the menu") BGL.glRasterPos2i(10,320) Draw.Text("is evaluated and added to Result.") BGL.glRasterPos2i(10,300) Draw.Text("Result = %.3f" % result) # Draw.Button("Push", evtPush, 10, 260, 160, 18, "A push button") BGL.glRasterPos2i(200,265) Draw.Text("The count of Push button clicks is %d." % count) BGL.glRasterPos2i(200,250) Draw.Text("Clicks of the Push button are counted when Toggle is down.") # menuName = "Menu Title %t|Number x Slider %x1|Number / Slider %x2|Length of '" + string.val + "'%x3" menu = Draw.Menu(menuName, evtMenu, 10, 210, 160, 18, menu.val, "A menu") BGL.glRasterPos2i(200,215) Draw.Text("The selected menu choice is %d." % menu.val) BGL.glRasterPos2i(200,200) if menu.val == 3: Draw.Text("Choice 3 uses the input from the string button below.") # number = Draw.Number("Number", evtNum, 10, 160, 160, 18, number.val, 1, 10, "A number button") BGL.glRasterPos2i(200,165) Draw.Text("The number button has value %d." % number.val) # slider = Draw.Slider("Slider: ", evtSlider, 10, 110, 160, 18, slider.val, 0.0, 1.0, 0, "A slider button") BGL.glRasterPos2i(200,115) Draw.Text("The slider has value %f." % slider.val) # string = Draw.String("String: ", evtString, 10, 60, 160, 18, string.val, 20, "A string button") BGL.glRasterPos2i(200,65) if string.val: # if string is not empty Draw.Text('The contents of the string button is "%s",' % string.val) BGL.glRasterPos2i(200,50) Draw.Text("which is %d characters long." % len(string.val) ) else: Draw.Text("The string button is empty.") # toggle = Draw.Toggle("Toggle", evtToggle, 10, 10, 160, 18, toggle.val, "A toggle button") if toggle.val: toggleState = "down" else: toggleState = "up" BGL.glRasterPos2i(200,15) Draw.Text("The toggle button is %s." % toggleState) def event(evt, val): # function that handles keyboard and mouse events if evt == Draw.ESCKEY or evt == Draw.QKEY: stop = Draw.PupMenu("OK?%t|Stop script %x1") if stop == 1: Draw.Exit() return def buttonEvt(evt): # function that handles button events global evtNoEvt, evtPush, evtMenu, evtNum, evtSlider, evtString, evtToggle global menu, number, scroll, slider, string, toggle global count, result if evt == evtPush: if toggle.val: count = count + 1 if menu.val == 1: result = result + number.val*slider.val elif menu.val == 2: if slider.val: result = result + number.val/slider.val else: Draw.PupMenu("Error! %t|Division by zero") elif menu.val == 3: result = result + len(string.val) print "The push button was pushed." elif evt == evtMenu: print "Menu choice changed to", menu.val elif evt == evtNum: print "Number button changed to", number.val elif evt == evtSlider: print "Slider value changed to", slider.val elif evt == evtString: print "The contents of string button is now:", string.val elif evt == evtToggle: print "Toggle is now", toggle.val elif evt == evtNoEvt: print "No event." #if there was an event, redraw the window if evt: Draw.Redraw() Draw.Register(gui, event, buttonEvt)