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() |