Scripts:
- Jean-Baptiste Perin updated his bvh to armatures script to use the new armature module. - Johnny Matthews (guitargeek) contributed "Shape Widget Wizard". (Moved it to the Animation menu in Scripts win) - Benoit Foucque (dienben) contributed "Blender Lip Synchro". Thanks to the three authors!
This commit is contained in:
913
release/scripts/widgetwizard.py
Normal file
913
release/scripts/widgetwizard.py
Normal file
@@ -0,0 +1,913 @@
|
||||
#!BPY
|
||||
|
||||
"""
|
||||
Name: 'Shape Widget Wizard'
|
||||
Blender: 238
|
||||
Group: 'Animation'
|
||||
Tip: 'Adds Widgets for Driven Shapes'
|
||||
"""
|
||||
|
||||
__author__ = ["Johnny Matthews (guitargeek)"]
|
||||
__url__ = ("blender", "elysiun")
|
||||
__version__ = "0.0.9 12/15/05"
|
||||
|
||||
__bpydoc__ = """\
|
||||
"Shape Widget Wizard" creates objects that drive shape channels.
|
||||
|
||||
Explanation:
|
||||
|
||||
Shapes define morph targets and sometimes it is helpful to animate with a GUI
|
||||
control panel of widgets. This script lets you define several different types
|
||||
of controls that (depending on the type) control 1 to 4 shapes with a single
|
||||
controller.
|
||||
|
||||
Usage:
|
||||
|
||||
1. Click where you want the widget to go<br>
|
||||
2. Highlight the object that has shapes<br>
|
||||
3. Run the script<br>
|
||||
4. Choose the type of widget (there are next and back buttons if you pick the wrong kind)<br>
|
||||
5. Click next and choose what shapes go where on the widget<br>
|
||||
6. Choose a display name for the widget<br>
|
||||
7. Click finish
|
||||
|
||||
The widget is added and you are returned to the first screen for adding another widget.
|
||||
|
||||
"""
|
||||
|
||||
###################################################################
|
||||
# #
|
||||
# Shape Widget Wizard #
|
||||
# #
|
||||
# all versions (C) December 2005 Johnny Matthews (guitargeek) #
|
||||
# #
|
||||
# Released under the GPL #
|
||||
# #
|
||||
# Works in Blender 2.4 and higher #
|
||||
# #
|
||||
# This script can be found online at: #
|
||||
# http://guitargeek.superihost.com/widgetmaker #
|
||||
# #
|
||||
# email: johnny.matthews@gmail.com #
|
||||
###################################################################
|
||||
# History #
|
||||
# 0.9 #
|
||||
# Added Name Objects #
|
||||
# 0.81 #
|
||||
# Added Single Shape Toggle #
|
||||
# #
|
||||
# 0.8 #
|
||||
# Controller is Transform Locked and can only move #
|
||||
# in appropriate directions #
|
||||
# #
|
||||
# 0.7 #
|
||||
# Controller is named the same as the range + ".ctrl" #
|
||||
# #
|
||||
###################################################################
|
||||
|
||||
import Blender
|
||||
from Blender import Mesh,Object,Material,Window,IpoCurve,Ipo,Text3d
|
||||
from Blender.BGL import *
|
||||
from Blender.Draw import *
|
||||
print "----------------------"
|
||||
|
||||
SHAPE1_ONE_MONE = 1
|
||||
SHAPE1_ONE_ZERO = 2
|
||||
SHAPE1_ZERO_MONE = 3
|
||||
SHAPE1_TOGGLE = 12
|
||||
SHAPE2_EXCLUSIVE = 4
|
||||
SHAPE2_V = 5
|
||||
SHAPE2_T = 6
|
||||
SHAPE2_INVT = 7
|
||||
SHAPE2_PLUS = 8
|
||||
SHAPE3_T = 9
|
||||
SHAPE3_INVT = 10
|
||||
SHAPE4_X = 11
|
||||
|
||||
|
||||
stage = 1
|
||||
numshapes = Create(1)
|
||||
widmenu = Create(1)
|
||||
rangename = Create("Range")
|
||||
shapes = [Create(0),Create(0),Create(0),Create(0)]
|
||||
drawtype = 0
|
||||
|
||||
|
||||
#get rid of an ipo curve by deleting all its points
|
||||
def delCurve(ipo):
|
||||
while len(ipo.getPoints()) > 0:
|
||||
ipo.delBezier(0)
|
||||
ipo.recalc()
|
||||
|
||||
#if a given ipocurve is not there create it, otherwise get it
|
||||
def verifyIpocurve(ky,index):
|
||||
ipo = ky.ipo
|
||||
if ipo == None:
|
||||
nip = Ipo.New("Key","keyipo")
|
||||
ky.ipo = nip
|
||||
ipo = ky.ipo
|
||||
idx = "Key " + str(index)
|
||||
crv = ipo.getCurve(index)
|
||||
if crv == None:
|
||||
crv = ipo.addCurve(idx)
|
||||
crv.setInterpolation("Linear")
|
||||
return crv
|
||||
|
||||
# Add the Drivers and Curves
|
||||
def setupDrivers(ob,ctrl,type):
|
||||
global shapes
|
||||
me = ob.getData()
|
||||
ky = me.getKey()
|
||||
|
||||
if type in [SHAPE1_ONE_MONE,SHAPE1_ONE_ZERO,SHAPE1_ZERO_MONE]:
|
||||
ctrl.protectFlags = int("111111011",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
|
||||
delCurve(ipo)
|
||||
if type == 1:
|
||||
ipo.addBezier((-1,-1))
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
if type == 2:
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
if type == 3:
|
||||
ipo.addBezier((-1,-1))
|
||||
ipo.addBezier((0,0))
|
||||
ipo.recalc()
|
||||
|
||||
if type == SHAPE1_TOGGLE:
|
||||
ctrl.protectFlags = int("111111011",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((0.5,0))
|
||||
ipo.addBezier((0.500001,1))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
if type == SHAPE2_EXCLUSIVE:
|
||||
ctrl.protectFlags = int("111111011",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_Z
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((-1,1))
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.recalc()
|
||||
|
||||
if type == SHAPE2_T:
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((-1,-1))
|
||||
ipo.addBezier((0,0))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((-1,-1))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
if type == SHAPE2_INVT:
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((-1,-1))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
if type == SHAPE2_PLUS:
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((-1,-1))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((-1,-1))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
if type == SHAPE2_V: # 2 Shape Mix
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
|
||||
if type == SHAPE3_INVT:
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((-1,1))
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[2].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
if type == SHAPE3_T:
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
ipo.recalc()
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((-1,-1))
|
||||
ipo.addBezier((0,0))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((-1,1))
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[2].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
ipo2.recalc()
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
if type == SHAPE4_X:
|
||||
ctrl.protectFlags = int("111111010",2)
|
||||
ipo = verifyIpocurve(ky,shapes[0].val)
|
||||
ipo.driver = 1
|
||||
ipo.driverObject = ctrl
|
||||
ipo.driverChannel = IpoCurve.LOC_Z
|
||||
delCurve(ipo)
|
||||
ipo.addBezier((0,0))
|
||||
ipo.addBezier((1,1))
|
||||
ipo.recalc()
|
||||
|
||||
ipo2 = verifyIpocurve(ky,shapes[1].val)
|
||||
ipo2.driver = 1
|
||||
ipo2.driverObject = ctrl
|
||||
ipo2.driverChannel = IpoCurve.LOC_X
|
||||
delCurve(ipo2)
|
||||
ipo2.addBezier((0,0))
|
||||
ipo2.addBezier((1,1))
|
||||
ipo2.recalc()
|
||||
|
||||
ipo3 = verifyIpocurve(ky,shapes[2].val)
|
||||
ipo3.driver = 1
|
||||
ipo3.driverObject = ctrl
|
||||
ipo3.driverChannel = IpoCurve.LOC_X
|
||||
delCurve(ipo3)
|
||||
ipo3.addBezier((-1,1))
|
||||
ipo3.addBezier((0,0))
|
||||
ipo3.recalc()
|
||||
|
||||
ipo4 = verifyIpocurve(ky,shapes[3].val)
|
||||
ipo4.driver = 1
|
||||
ipo4.driverObject = ctrl
|
||||
ipo4.driverChannel = IpoCurve.LOC_Z
|
||||
delCurve(ipo4)
|
||||
ipo4.addBezier((-1,1))
|
||||
ipo4.addBezier((0,0))
|
||||
ipo4.recalc()
|
||||
|
||||
#The Main Call to Build the Widget
|
||||
|
||||
def build(type):
|
||||
global shapes,widmenu,rangename
|
||||
sce = Blender.Scene.getCurrent()
|
||||
loc = Window.GetCursorPos()
|
||||
range = makeRange(type,rangename.val)
|
||||
controller = makeController(rangename.val)
|
||||
text = makeText(rangename.val)
|
||||
|
||||
sce.link(range)
|
||||
sce.link(controller)
|
||||
sce.link(text)
|
||||
|
||||
range.setLocation(loc)
|
||||
controller.setLocation(loc)
|
||||
text.setLocation(loc)
|
||||
|
||||
range.makeParent([controller],1)
|
||||
range.makeParent([text],0)
|
||||
|
||||
sce.update()
|
||||
|
||||
ob = Object.GetSelected()[0]
|
||||
setupDrivers(ob,controller,widmenu.val)
|
||||
|
||||
#Create the text
|
||||
|
||||
def makeText(name):
|
||||
ob = Object.New("Text",name+".name")
|
||||
txt = Text3d.New(name+".name")
|
||||
txt.setDrawMode(Text3d.DRAW3D)
|
||||
txt.setAlignment(Text3d.MIDDLE)
|
||||
txt.setText(name)
|
||||
ob.link(txt)
|
||||
ob.setEuler(3.14159/2,0,0)
|
||||
return ob
|
||||
|
||||
|
||||
#Create the mesh controller
|
||||
|
||||
def makeController(name):
|
||||
ob = Object.New("Mesh",name+".ctrl")
|
||||
me = Mesh.New(name+".ctrl")
|
||||
|
||||
me.verts.extend(-0.15,0, 0)
|
||||
me.verts.extend( 0,0, 0.15)
|
||||
me.verts.extend( 0.15,0, 0)
|
||||
me.verts.extend( 0,0,-0.15)
|
||||
v = me.verts
|
||||
c = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(c)
|
||||
ob.link(me)
|
||||
return ob
|
||||
|
||||
#Create the mesh range
|
||||
|
||||
def makeRange(type,name):
|
||||
ob = Object.New("Mesh",name)
|
||||
#ob.setDrawMode(8) # Draw Name
|
||||
me = Mesh.New(name)
|
||||
|
||||
l=[]
|
||||
|
||||
if type == SHAPE1_ONE_ZERO:
|
||||
me.verts.extend(-0.15,0,0)
|
||||
me.verts.extend( 0.15,0,0)
|
||||
me.verts.extend(-0.15,0,1)
|
||||
me.verts.extend( 0.15,0,1)
|
||||
me.verts.extend(-0.25,0,.1)
|
||||
me.verts.extend(-0.25,0,-.10)
|
||||
me.verts.extend(0.25,0,.1)
|
||||
me.verts.extend(0.25,0,-0.10)
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[3],v[2]),(v[4],v[5],v[0]),(v[6],v[7],v[1])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE1_TOGGLE:
|
||||
me.verts.extend(-0.15,0,-0.5)
|
||||
me.verts.extend( 0.15,0,-0.5)
|
||||
me.verts.extend( 0.15,0, 0.5)
|
||||
me.verts.extend(-0.15,0, 0.5)
|
||||
me.verts.extend(-0.15,0, 1.5)
|
||||
me.verts.extend( 0.15,0, 1.5)
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3]),(v[3],v[4],v[5],v[2])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE1_ZERO_MONE:
|
||||
me.verts.extend(-0.15,0,0)
|
||||
me.verts.extend( 0.15,0,0)
|
||||
me.verts.extend(-0.15,0,-1)
|
||||
me.verts.extend( 0.15,0,-1)
|
||||
me.verts.extend(-0.25,0,.1)
|
||||
me.verts.extend(-0.25,0,-.10)
|
||||
me.verts.extend(0.25,0,.1)
|
||||
me.verts.extend(0.25,0,-0.10)
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[3],v[2]),(v[4],v[5],v[0]),(v[6],v[7],v[1])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type in [SHAPE1_ONE_MONE,SHAPE2_EXCLUSIVE]:
|
||||
me.verts.extend(-0.15,0,-1)
|
||||
me.verts.extend( 0.15,0,-1)
|
||||
me.verts.extend(-0.15,0,1)
|
||||
me.verts.extend( 0.15,0,1)
|
||||
me.verts.extend(-0.25,0,.1)
|
||||
me.verts.extend(-0.25,0,-.10)
|
||||
me.verts.extend(0.25,0,.1)
|
||||
me.verts.extend(0.25,0,-0.10)
|
||||
me.verts.extend(-0.15,0,0)
|
||||
me.verts.extend( 0.15,0,0)
|
||||
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[3],v[2]),(v[4],v[5],v[8]),(v[6],v[7],v[9])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE2_T:
|
||||
me.verts.extend(-1,0,0)
|
||||
me.verts.extend( 1,0,0)
|
||||
me.verts.extend( 1,0,-1)
|
||||
me.verts.extend(-1,0,-1)
|
||||
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE2_INVT:
|
||||
me.verts.extend(-1,0,0)
|
||||
me.verts.extend( 1,0,0)
|
||||
me.verts.extend( 1,0,1)
|
||||
me.verts.extend(-1,0,1)
|
||||
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE2_PLUS:
|
||||
me.verts.extend(-1,0,-1)
|
||||
me.verts.extend( 1,0,-1)
|
||||
me.verts.extend( 1,0,1)
|
||||
me.verts.extend(-1,0,1)
|
||||
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE2_V:
|
||||
me.verts.extend(0,0,0)
|
||||
me.verts.extend(1,0,0)
|
||||
me.verts.extend(1,0,1)
|
||||
me.verts.extend(0,0,1)
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
ob.setEuler(0,-0.78539,0)
|
||||
|
||||
elif type == SHAPE3_INVT:
|
||||
me.verts.extend(-1,0,0)
|
||||
me.verts.extend( 1,0,0)
|
||||
me.verts.extend( 1,0,1)
|
||||
me.verts.extend(-1,0,1)
|
||||
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
elif type == SHAPE3_T:
|
||||
me.verts.extend(-1,0,0)
|
||||
me.verts.extend( 1,0,0)
|
||||
me.verts.extend( 1,0,-1)
|
||||
me.verts.extend(-1,0,-1)
|
||||
|
||||
v = me.verts
|
||||
l = [(v[0],v[1],v[2],v[3])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
|
||||
|
||||
elif type == SHAPE4_X:
|
||||
me.verts.extend(0,0,-1)
|
||||
me.verts.extend(1,0,-1)
|
||||
me.verts.extend(1,0,0)
|
||||
me.verts.extend(1,0,1)
|
||||
me.verts.extend(0,0,1)
|
||||
me.verts.extend(-1,0,1)
|
||||
me.verts.extend(-1,0,0)
|
||||
me.verts.extend(-1,0,-1)
|
||||
v = me.verts
|
||||
l = [(v[0],v[1]),(v[1],v[2]),(v[2],v[3]),(v[3],v[4]),(v[4],v[5]),(v[5],v[6]),(v[6],v[7]),(v[7],v[0])]
|
||||
me.edges.extend(l)
|
||||
ob.link(me)
|
||||
ob.setEuler(0,-0.78539,0)
|
||||
|
||||
return ob
|
||||
|
||||
|
||||
def create():
|
||||
main()
|
||||
|
||||
####################### gui ######################
|
||||
|
||||
|
||||
EVENT_NONE = 1
|
||||
EVENT_EXIT = 100
|
||||
EVENT_WIDGET_MENU = 101
|
||||
EVENT_NEXT = 102
|
||||
EVENT_BACK = 103
|
||||
|
||||
#get the list of shapes from the selected object
|
||||
|
||||
def shapeMenuText():
|
||||
if len(Object.GetSelected()) == 0:
|
||||
return ""
|
||||
ob = Object.GetSelected()[0]
|
||||
me = ob.getData()
|
||||
key= me.getKey()
|
||||
if key == None:
|
||||
return ""
|
||||
blocks = key.getBlocks()
|
||||
menu = "Choose Shape %t|"
|
||||
for n in range(len(blocks)):
|
||||
menu = menu + blocks[n].name + " %x" + str(n) + "|"
|
||||
return menu
|
||||
|
||||
|
||||
#draw the widget for the gui
|
||||
|
||||
def drawWidget(type):
|
||||
global shapes
|
||||
if type == SHAPE1_ONE_MONE:# 1 to -1 Single Shape
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,50)
|
||||
glVertex2i(170,50)
|
||||
glVertex2i(170,150)
|
||||
glVertex2i(150,150)
|
||||
glVertex2i(150,50)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,100)
|
||||
glVertex2i(190,100)
|
||||
glEnd()
|
||||
glRasterPos2d(180,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(180,60)
|
||||
Text("-1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 190, 100, 100, 18, shapes[0].val, "Choose Shape.")
|
||||
elif type == SHAPE1_TOGGLE:# Toggle Single Shape
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,50)
|
||||
glVertex2i(170,50)
|
||||
glVertex2i(170,100)
|
||||
glVertex2i(150,100)
|
||||
glVertex2i(150,50)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(170,100)
|
||||
glVertex2i(170,150)
|
||||
glVertex2i(150,150)
|
||||
glVertex2i(150,100)
|
||||
glEnd()
|
||||
glRasterPos2d(180,140)
|
||||
Text("On","normal")
|
||||
glRasterPos2d(180,60)
|
||||
Text("Off","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 190, 100, 100, 18, shapes[0].val, "Choose Shape.")
|
||||
elif type == SHAPE1_ONE_ZERO: # 1 to 0 Single Shape
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,50)
|
||||
glVertex2i(170,50)
|
||||
glVertex2i(170,150)
|
||||
glVertex2i(150,150)
|
||||
glVertex2i(150,50)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,50)
|
||||
glVertex2i(190,50)
|
||||
glEnd()
|
||||
glRasterPos2d(180,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(180,60)
|
||||
Text("0","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 190, 100, 100, 18, shapes[0].val, "Choose Shape.")
|
||||
elif type == SHAPE1_ZERO_MONE:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,50)
|
||||
glVertex2i(170,50)
|
||||
glVertex2i(170,150)
|
||||
glVertex2i(150,150)
|
||||
glVertex2i(150,50)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,150)
|
||||
glVertex2i(190,150)
|
||||
glEnd()
|
||||
glRasterPos2d(180,140)
|
||||
Text("0","normal")
|
||||
glRasterPos2d(180,60)
|
||||
Text("-1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 190, 100, 100, 18, shapes[0].val, "Choose Shape.")
|
||||
elif type == SHAPE2_EXCLUSIVE:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,50)
|
||||
glVertex2i(170,50)
|
||||
glVertex2i(170,150)
|
||||
glVertex2i(150,150)
|
||||
glVertex2i(150,50)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,100)
|
||||
glVertex2i(190,100)
|
||||
glEnd()
|
||||
glRasterPos2d(180,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(180,60)
|
||||
Text("1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 195, 135, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 195, 52, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
elif type == SHAPE2_T:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,75)
|
||||
glVertex2i(250,75)
|
||||
glVertex2i(250,125)
|
||||
glVertex2i(150,125)
|
||||
glVertex2i(150,75)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,125)
|
||||
glVertex2i(260,125)
|
||||
glEnd()
|
||||
glRasterPos2d(200,140)
|
||||
Text("0","normal")
|
||||
glRasterPos2d(200,60)
|
||||
Text("-1","normal")
|
||||
glRasterPos2d(250,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(150,140)
|
||||
Text("-1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 220, 52, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 260, 135, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
elif type == SHAPE2_INVT:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,75)
|
||||
glVertex2i(250,75)
|
||||
glVertex2i(250,125)
|
||||
glVertex2i(150,125)
|
||||
glVertex2i(150,75)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,75)
|
||||
glVertex2i(260,75)
|
||||
glEnd()
|
||||
glRasterPos2d(200,60)
|
||||
Text("0","normal")
|
||||
glRasterPos2d(200,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(250,60)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(150,60)
|
||||
Text("-1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 220, 135, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 260, 52, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
elif type == SHAPE2_PLUS:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,50)
|
||||
glVertex2i(250,50)
|
||||
glVertex2i(250,150)
|
||||
glVertex2i(150,150)
|
||||
glVertex2i(150,50)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,100)
|
||||
glVertex2i(260,100)
|
||||
glEnd()
|
||||
glRasterPos2d(200,105)
|
||||
Text("0","normal")
|
||||
glRasterPos2d(200,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(200,55)
|
||||
Text("-1","normal")
|
||||
glRasterPos2d(250,105)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(150,105)
|
||||
Text("-1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 220, 155, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 260, 100, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
elif type == SHAPE2_V:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,70)
|
||||
glVertex2i(185,105)
|
||||
glVertex2i(150,141)
|
||||
glVertex2i(115,105)
|
||||
glVertex2i(150,70)
|
||||
glEnd()
|
||||
glRasterPos2d(110,105)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(190,105)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(150,80)
|
||||
Text("0","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 20, 125, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 195, 125, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
|
||||
|
||||
|
||||
elif type == SHAPE3_T:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,75)
|
||||
glVertex2i(250,75)
|
||||
glVertex2i(250,125)
|
||||
glVertex2i(150,125)
|
||||
glVertex2i(150,75)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,125)
|
||||
glVertex2i(260,125)
|
||||
glEnd()
|
||||
glRasterPos2d(200,140)
|
||||
Text("0","normal")
|
||||
glRasterPos2d(200,60)
|
||||
Text("-1","normal")
|
||||
glRasterPos2d(250,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(150,140)
|
||||
Text("1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 220, 52, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 45, 135, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
shapes[2] = Menu(shapeMenuText(), EVENT_NONE, 260, 135, 100, 18, shapes[2].val, "Choose Shape 3.")
|
||||
elif type == SHAPE3_INVT:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,75)
|
||||
glVertex2i(250,75)
|
||||
glVertex2i(250,125)
|
||||
glVertex2i(150,125)
|
||||
glVertex2i(150,75)
|
||||
glEnd()
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(140,75)
|
||||
glVertex2i(260,75)
|
||||
glEnd()
|
||||
glRasterPos2d(200,60)
|
||||
Text("0","normal")
|
||||
glRasterPos2d(200,140)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(250,60)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(150,60)
|
||||
Text("1","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 220, 135, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 45, 52, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
shapes[2] = Menu(shapeMenuText(), EVENT_NONE, 260, 52, 100, 18, shapes[2].val, "Choose Shape 3.")
|
||||
|
||||
|
||||
elif type == SHAPE4_X:
|
||||
glBegin(GL_LINE_STRIP)
|
||||
glVertex2i(150,70)
|
||||
glVertex2i(185,105)
|
||||
glVertex2i(150,141)
|
||||
glVertex2i(115,105)
|
||||
glVertex2i(150,70)
|
||||
glEnd()
|
||||
glRasterPos2d(120,125)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(180,125)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(120,80)
|
||||
Text("1","normal")
|
||||
glRasterPos2d(180,80)
|
||||
Text("1","normal")
|
||||
|
||||
glRasterPos2d(145,105)
|
||||
Text("0","normal")
|
||||
shapes[0] = Menu(shapeMenuText(), EVENT_NONE, 10, 125, 100, 18, shapes[0].val, "Choose Shape 1.")
|
||||
shapes[1] = Menu(shapeMenuText(), EVENT_NONE, 195, 125, 100, 18, shapes[1].val, "Choose Shape 2.")
|
||||
shapes[2] = Menu(shapeMenuText(), EVENT_NONE, 10, 60, 100, 18, shapes[2].val, "Choose Shape 3.")
|
||||
shapes[3] = Menu(shapeMenuText(), EVENT_NONE, 195, 60, 100, 18, shapes[3].val, "Choose Shape 4.")
|
||||
|
||||
#the gui callback
|
||||
|
||||
def draw():
|
||||
global widmenu,numshapes,stage,type, shapes,rangename
|
||||
glRasterPos2d(5,200)
|
||||
Text("Shape Widget Wizard","large")
|
||||
PushButton("Quit", EVENT_EXIT, 5, 5, 50, 18)
|
||||
|
||||
if stage == 1:
|
||||
name = "Choose Widget Type %t|\
|
||||
1 Shape: 1 / -1 %x" +str(SHAPE1_ONE_MONE) +"|\
|
||||
1 Shape: 1,0 %x" +str(SHAPE1_ONE_ZERO) +"|\
|
||||
1 Shape: 0,-1 %x" +str(SHAPE1_ZERO_MONE)+"|\
|
||||
1 Shape: Toggle %x" +str(SHAPE1_TOGGLE) +"|\
|
||||
2 Shape Exclusive %x"+str(SHAPE2_EXCLUSIVE)+"|\
|
||||
2 Shape - V %x" +str(SHAPE2_V) +"|\
|
||||
2 Shape - T %x" +str(SHAPE2_T) +"|\
|
||||
2 Shape - Inv T %x" +str(SHAPE2_INVT) +"|\
|
||||
2 Shape - + %x" +str(SHAPE2_PLUS) +"|\
|
||||
3 Shape - T %x" +str(SHAPE3_T) +"|\
|
||||
3 Shape - Inv T%x" +str(SHAPE3_INVT) +"|\
|
||||
4 Shape - Mix %x" +str(SHAPE4_X)
|
||||
widmenu = Menu(name, EVENT_NONE, 5, 120, 200, 40, widmenu.val, "Choose Widget Type.")
|
||||
PushButton("Next", EVENT_NEXT, 5, 25, 50, 18)
|
||||
|
||||
elif stage == 2:
|
||||
glRasterPos2d(60,140)
|
||||
rangename = String("Name: ", EVENT_NONE, 5, 170, 200, 18, rangename.val, 50, "Name for Range Object")
|
||||
drawWidget(widmenu.val)
|
||||
PushButton("Back", EVENT_BACK, 5, 25, 50, 18)
|
||||
PushButton("Finish", EVENT_NEXT, 55, 25, 50, 18)
|
||||
return
|
||||
|
||||
|
||||
|
||||
def event(evt, val):
|
||||
if (evt == QKEY and not val):
|
||||
Exit()
|
||||
|
||||
|
||||
def bevent(evt):
|
||||
global widmenu,stage,drawtype
|
||||
######### Manages GUI events
|
||||
if evt==EVENT_EXIT:
|
||||
Exit()
|
||||
elif evt==EVENT_BACK:
|
||||
if stage == 2:
|
||||
stage = 1
|
||||
Redraw()
|
||||
elif evt==EVENT_NEXT:
|
||||
if stage == 1:
|
||||
stage = 2
|
||||
Redraw()
|
||||
elif stage == 2:
|
||||
build(widmenu.val)
|
||||
stage = 1
|
||||
Window.RedrawAll()
|
||||
|
||||
|
||||
Register(draw, event, bevent)
|
||||
Reference in New Issue
Block a user