|
From: chris l. <chr...@sp...> - 2008-04-03 20:15:36
|
I've put the following together, and would appreciate some criticisms of
it as to push it on much further without a fairly major clean up seems
a problem , but it does at least allow the construction of some basic
objects using visual python.
Chris
p.s. Hopefully it's etter than another Flanders and Swann pastiche...
"""
A lousy visual python object builder, in need of a little love.
Select an object from the drop down add menu and once selected choose
the object n the object list, then adjust the parameters to 'sculpt'
your object'
Things to do.
Sort out slider bar problems
Add an ability to store the final visual object... Pickle?
"""
from visual.controls import *
import random
w = 400
d = display(x=w, y=0, width = w,height = w, range = 1.5)
c = controls(x = 0, y = 0, width = w , height = w, range= 60)
bl = button(pos=(-60,-50), height=20, width=20, text='Quit',
action=lambda: donowt())
objlist = []
objmenu = None
parametermenu = None
parameterlist = []
currentobj = None
currentparam = None
def donowt():
import sys
sys.exit()
class ParaSlider(object):
vector_variables = ['axis','color','pos','size']
s1 = None
s2 = None
s3 = None
def __init__(self, obj, menu, menuitem):
self.menuitem = menuitem[0]
if self.menuitem in ParaSlider.vector_variables:
self = ParaSliders(obj, menu, menuitem[0])
return
self.obj = obj
self.value = 50 * getattr(obj, self.menuitem)
self.menu = menu
print 'Menuitem',self.menuitem
ParaSlider.s1 = slider(pos=(-20,-30), width=7, length=70,
axis=(1,0,0), action=lambda: self.menu_command())
ParaSlider.s1.value = self.value
def menu_command(self):
print 'ParaSlider setting to value:', self.s1.value
print 'Setting: %s of %s to %s' % (self.menuitem, self.obj,
self.s1.value)
setattr(self.obj, self.menuitem, self.s1.value/ 50)
class ParaSliders(ParaSlider):
s2 = None
s3 = None
def __init__(self, obj, menu, menuitem):
self.menuitem = menuitem
self.obj = obj
self.menu = menu
self.value = 50 * getattr(obj, self.menuitem)
ParaSlider.s1 = slider(pos=(-20,-30), width=7, length=70,
axis=(1,0,0), action=lambda: self.menu_command())
ParaSliders.s2 = slider(pos=(-20,-40), width=7, length=70,
axis=(1,0,0), action=lambda: self.menu_command())
ParaSliders.s3 = slider(pos=(-20,-50), width=7, length=70,
axis=(1,0,0), action=lambda: self.menu_command())
print 'Self.value',self.value
print 'Self.value[0]',self.value[0]
print 'Self.value[1]',self.value[1]
print 'Self.value[2]',self.value[2]
ParaSlider.s1.value = self.value[0]
ParaSliders.s2.value = self.value[1]
ParaSliders.s3.value = self.value[2]
def menu_command(self):
print 'ParaSliders setting to value:', self.s1.value
print 'Self.s1.value',self.s1.value
print 'Self.s2.value',self.s2.value
print 'Self.s3.value',self.s3.value
print 'Setting: %s of %s to %s' % (self.menuitem, self.obj,
self.s1.value)
print 'Setting: %s of %s to %s' % (self.menuitem, self.obj,
self.s2.value)
print 'Setting: %s of %s to %s' % (self.menuitem, self.obj,
self.s3.value)
val = (self.s1.value/50,self.s2.value/50, self.s3.value/50)
setattr(self.obj, self.menuitem, val)
class AddMenu(object):
menulist =[
['A cylinder', cylinder],
['An Arrow',arrow],
['A Cone',cone],
['A pyramid', pyramid],
['A sphere', sphere],
['A Ring', ring],
['A Box',box],
['An Ellisoid',ellipsoid],
['An Helix', helix],
]
menu = None
def __init__(self, title = 'Add',color = color.green):
self.title = title
self.color = color
m = menu (pos=(-60,60,0), height=7, width=35, text=self.title,
color = self.color)
m.items.extend(self.menufunc())
AddMenu.menu = m
def menu_command(self):
global objmenu
if not objlist:
objmenu = ObjectMenu()
objlist.append(AddMenu.menulist[self.menu.nitem-1][1]())
ObjectMenu.menu.items.append((AddMenu.menulist[self.menu.nitem-1][0],lambda:objmenu.menu_command()))
def __repr__(self):
return self.title
def __getitem__(self, value):
return AddMenu.menulist[value]
def getmenu(self):
return AddMenu.menulist
def menufunc(self):
m = []
for item in self.getmenu():
m.append((item[0],lambda: self.menu_command()))
return m
class ObjectMenu(object):
menulist =[]
menu = None
def __init__(self, title = 'Objects', color = color.red):
self.title = title
self.color = color
m = menu (pos=(-25,60,0), height=7, width=35, text=self.title,
color = self.color)
ObjectMenu.menu = m
def menu_command(self):
global currentobj
objlist[self.menu.nitem - 1].color = color.red
if currentobj:
currentobj.color = color.blue
currentobj = objlist[self.menu.nitem - 1]
global parametermenu
parametermenu = ParameterMenu(currentobj)
def setparameter(obj,slider,parameter):
print obj,slider.value
setattr(obj,parameter, slider.value/10)
class ParameterMenu(object):
menulist = []
paralist =
['alpha','axis','color','opacity','height','length','pos','radius',
'fixedwidth','shaftwidth','headwidth','up','size','thickness','width','coils']
menu = None
def __init__(self,obj, title = 'Parameters', color = color.blue):
self.obj = obj
self.title = title
self.color = color
m = ParameterMenu.menu
if m:
del m.items[0:len(m.items)]
else:
m = menu (pos=(30,60,0), height=7, width=35,
text=self.title, color = self.color)
ParameterMenu.menu = m
self.menulist = self.menufunc()
m.items.extend(self.menulist)
def menu_command(self):
#print 'Menulist:',self.menulist
s1 = ParaSlider(self.obj, self.menu, menuitem =
self.menulist[self.menu.nitem - 1])
#s2 = slider(pos=(-20,-40), width=7, length=70,
axis=(1,0,0), action=lambda: setparameter(self.obj,s2,'y'))
#s3 = slider(pos=(-20,-50), width=7, length=70,
axis=(1,0,0), action=lambda: setparameter(self.obj,s3,'z'))
def __repr__(self):
return '%s :>%s' %(self.title, str(self.obj))
def __getitem__(self, value):
return ParameterMenu.menulist[value]
def getmenu(self):
return ParameterMenu.menulist
def menufunc(self):
m = []
for item in dir(self.obj):
if item in ParameterMenu.paralist :
m.append(('%s' %(item), lambda: self.menu_command()))
return m
if __name__ == '__main__':
am = AddMenu()
while 1:
c.interact()
|