From: Kevin A. <ka...@us...> - 2004-05-18 17:20:41
|
Update of /cvsroot/pythoncard/PythonCard/samples/lsystem In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21941 Modified Files: readme.txt Added Files: lsystemInteractive.py lsystemInteractive.rsrc.py Log Message: added lsystemInteractive which draws pattern anti-aliased --- NEW FILE: lsystemInteractive.py --- #!/usr/bin/python """ __version__ = "$Revision: 1.1 $" __date__ = "$Date: 2004/05/18 17:20:31 $" """ from PythonCard import clipboard, dialog, graphic, model from PythonCard.turtle import AbstractTurtle, BitmapTurtle import wx import os import time import lsystem class LSystem(lsystem.LSystem): def on_initialize(self, event): self.filename = None #self.on_iterations_select(None) #self.on_angle_select(None) self.components.iterationDisplay.text = \ str(self.components.iterations.value) self.components.angleDisplay.text = \ str(self.components.angle.value) self.on_Render_command(None) # depending on the complexity of the pattern string # my system becomes pretty unresponsive above 6 or 7 iterations def on_iterations_select(self, event): self.components.iterationDisplay.text = \ str(self.components.iterations.value) self.components.iterationDisplay.redraw() self.on_Render_command(None) def on_angle_select(self, event): self.components.angleDisplay.text = \ str(self.components.angle.value) self.components.angleDisplay.redraw() self.on_Render_command(None) def on_angleDisplay_textUpdate(self, event): # how do we want to validate here # just use a try/except block? try: self.components.angle.value = \ int(self.components.angleDisplay.text) self.on_Render_command(None) except: pass ## # this seemed like a good idea, but you tend to press Render so it isn't needed ## def on_scriptField_closeField(self, event): ## self.on_Render_command(None) def on_Render_command(self, event): self.statusBar.text = "Drawing, please wait..." starttime = time.time() fractalString = self.expand( self.components.scriptField.text, self.components.iterations.value) borderWidth = 5.0 * 4 angle = self.components.angle.value bounds = self.drawAbstractFractal( fractalString, 'blue', 1, angle, (0,0)) width, height = self.components.bufOff.size scale = min( (width - 2 * borderWidth) / (bounds[2]-bounds[0]), (height - 2 * borderWidth) / (bounds[3]-bounds[1])) startPos = (bounds[0] * -scale + borderWidth, bounds[1] * -scale + borderWidth) ## self.components.bufOff.autoRefresh = True self.components.bufOff.autoRefresh = False self.drawFractal( fractalString, 'blue', scale, angle, startPos) # the bufOff BitmapCanvas should always be 4x the size # of the onscreen BitmapCanvas so we have a simple # method to anti-alias the drawing # also need to add some padding around side, so I # multiplied borderWidth * 4 above bmp = self.components.bufOff.getBitmap() self.components.onscreen.drawBitmapScaled(bmp, (0, 0), self.components.onscreen.size) # not sure if this is needed to prevent a memory leak bmp = None stoptime = time.time() self.statusBar.text = "Draw time: %.2f seconds" % (stoptime - starttime) def drawFractal(self, aFractalString, color, legLength, angle, startPos): self.components.bufOff.clear() t = BitmapTurtle(self.components.bufOff) t.color(color) t.width(3) #t.setBackColor('black') t.cls() t.lt(90) t.moveTo(startPos[0], startPos[1]) ## bounds = list(startPos + startPos) for char in aFractalString: if char=='F': t.fd(legLength) curPos = t.getXY() ## bounds[0] = min(bounds[0], curPos[0]) ## bounds[1] = min(bounds[1], curPos[1]) ## bounds[2] = max(bounds[2], curPos[0]) ## bounds[3] = max(bounds[3], curPos[1]) elif char=='+': t.rt(angle) elif char=='-': t.lt(angle) elif char=='B': t.bk(legLength) elif char=='[': t.push() elif char==']': t.pop() ## return bounds if __name__ == '__main__': app = model.Application(LSystem) app.MainLoop() --- NEW FILE: lsystemInteractive.rsrc.py --- {'application':{'type':'Application', 'name':'Doodle', 'backgrounds': [ {'type':'Background', 'name':'bgLSystem', 'title':'L-System PythonCard Application', 'position':(59, 74), 'size':(579, 550), 'statusBar':1, 'style':['resizeable'], 'menubar': {'type':'MenuBar', 'menus': [ {'type':'Menu', 'name':'menuFile', 'label':'&File', 'items': [ {'type':'MenuItem', 'name':'menuFileOpen', 'label':'&Open...\tCtrl+O', }, {'type':'MenuItem', 'name':'menuFileSaveAs', 'label':'Save &As...', }, {'type':'MenuItem', 'name':'fileSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuFileExit', 'label':'E&xit\tAlt+X', 'command':'exit', }, ] }, {'type':'Menu', 'name':'menuEdit', 'label':'&Edit', 'items': [ {'type':'MenuItem', 'name':'menuEditCopy', 'label':'&Copy\tCtrl+C', }, {'type':'MenuItem', 'name':'menuEditPaste', 'label':'&Paste\tCtrl+V', }, {'type':'MenuItem', 'name':'editSep1', 'label':'-', }, {'type':'MenuItem', 'name':'menuEditClear', 'label':'&Clear', 'command':'editClear', }, ] }, {'type':'Menu', 'name':'menuRender', 'label':'&Render', 'items': [ {'type':'MenuItem', 'name':'menuRenderRenderNow', 'label':'&Render Now\tCtrl+R', 'command':'Render', }, ] }, ] }, 'components': [ {'type':'TextField', 'name':'angleDisplay', 'position':(414, 25), 'size':(36, -1), }, {'type':'StaticText', 'name':'StaticText2', 'position':(371, 29), 'text':'Angle:', }, {'type':'Slider', 'name':'angle', 'position':(367, 54), 'size':(200, 20), 'labels':False, 'layout':'horizontal', 'max':360, 'min':0, 'tickFrequency':0, 'ticks':False, 'value':45, }, {'type':'StaticText', 'name':'iterationDisplay', 'position':(427, 76), }, {'type':'StaticText', 'name':'StaticText1', 'position':(368, 76), 'text':'Iterations:', }, {'type':'Slider', 'name':'iterations', 'position':(364, 98), 'size':(200, 20), 'labels':False, 'layout':'horizontal', 'max':10, 'min':1, 'tickFrequency':0, 'ticks':False, 'value':3, }, {'type':'Button', 'name':'btnRender', 'position':(1, 35), 'command':'Render', 'label':'Render', }, {'type':'TextArea', 'name':'scriptField', 'position':(96, 0), 'size':(201, 118), 'text':'axiom=l\nl=+rf-lfl-fr+\nr=-lf+rfr+fl-', }, {'type':'Button', 'name':'btnColor', 'position':(1, 67), 'label':'Color', }, {'type':'BitmapCanvas', 'name':'onscreen', 'position':(0, 121), 'size':(568, 348), #'backgroundColor':(0, 0, 0), }, {'type':'BitmapCanvas', 'name':'bufOff', 'position':(0, 121), 'size':(568 * 4, 348 * 4), #'backgroundColor':(0, 0, 0), 'visible':False, }, ] # end components } # end background ] # end backgrounds } } Index: readme.txt =================================================================== RCS file: /cvsroot/pythoncard/PythonCard/samples/lsystem/readme.txt,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** readme.txt 14 May 2004 16:32:35 -0000 1.3 --- readme.txt 18 May 2004 17:20:31 -0000 1.4 *************** *** 5,7 **** http://www.biologie.uni-hamburg.de/b-online/e28_3/lsys.html ! Contributed by Arlo Belshee, Kim Wallmark, Ward Cunningham, and Kevin Altis. \ No newline at end of file --- 5,46 ---- http://www.biologie.uni-hamburg.de/b-online/e28_3/lsys.html ! Contributed by Arlo Belshee, Kim Wallmark, Ward Cunningham, and Kevin Altis. ! ! some examples until we have a file load/save implemented... ! ! axiom=l ! l=+rf-lfl-fr+ ! r=-lf+rfr+fl- ! ! koch ! angle=10 ! iterations=3 ! axiom=f+f+f+f ! f=f+f-f-ff+f+f-f ! ! seaweed ! angle=21 ! iterations=3 ! axiom=[f-f+af][+fa] ! a=ff+a-f ! f=f[-aff+fa+f-bbb][-ff] ! ! wheat ! angle=10 ! iterations=4 ! axiom=f ! f=ff-[-f+f+f]+[+f-f-f] ! ! stars ! angle=156 ! iterations=4 ! axiom=a ! a=ff+aaaaf+f+f--fffff ! ! the world's most difficult crossword puzzle ! angle=89 ! iterations=4 ! axiom=a ! b=af+[-b]ff+f+fff ! a=affbb+b+b+af+b ! |