home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / p / python / !Graph / py / Graph < prev   
Encoding:
Text File  |  1996-10-23  |  6.7 KB  |  225 lines

  1. # Iconbar handler for Graph
  2. # Created by Py_New on Mon,19 Aug
  3.  
  4. import tbevent
  5. import window
  6. import saveas
  7. import drawf
  8. import sys
  9. import swi
  10. import string
  11. from math import *
  12.  
  13. BadFile= 'Bad File'
  14.  
  15. WINDOW_WIDTH=1280
  16. WINDOW_HEIGHT=1024
  17. OS_TO_DRAW=256
  18. PATH_MOVE=2
  19. PATH_DRAW=8
  20. BLACK=0x0
  21. WHITE=0xffffff00
  22. TRANSPARENT=-1
  23. EPSILON=0.00001
  24.  
  25. trans=swi.block(6,[0x10000,0,0,0x10000,0,0])
  26.  
  27. colours={'black':0,
  28.          'red':0xff00,
  29.          'blue':0xff000000,
  30.          'green':0xff0000,
  31.          'yellow':0xffff00,
  32.          'cyan':0xffff0000,
  33.          'white':0xffffff00}
  34.  
  35. minorgrid=(TRANSPARENT,0xffeedd00,512,1)
  36. middlegrid=(TRANSPARENT,0xffddaa00,512,1)
  37. majorgrid=(TRANSPARENT,0xffcc8800,512,1)
  38.  
  39.  
  40. class Orphans:
  41.       actions={}
  42.       def __init__(self):
  43.           tbevent.tbclasses[0]=self
  44.       def E_Q_Quit(self):
  45.           sys.exit()
  46.  
  47. class Messenger:
  48.       def M_DataLoad(self):
  49.           try:
  50.              a=Parse(tbevent.wblock.nullstring(44))
  51.           except BadFile:
  52.              return
  53.           Display(a)
  54.       def Wimp_MQuit(self):
  55.           sys.exit()
  56.  
  57. class Parse:
  58.       def __init__(self,fname):
  59.           act={'xrange':(2,self.xrange),
  60.                'yrange':(2,self.yrange),
  61.                'plot':(-1,self.plot),
  62.                'steps':(1,self.steps),
  63.                'title':(-1,self.title),
  64.                'axes':(2,self.axes),
  65.                'grid':(2,self.grid),
  66.                'colour':(1,self.colour)}
  67.           self.fname=fname
  68.           self.n=30
  69.           self.x0=-1.0
  70.           self.x1= 1.0
  71.           self.setx()
  72.           self.y0=-1.0
  73.           self.y1= 1.0
  74.           self.sety()
  75.           self.setstyle(BLACK)
  76.           self.title=''
  77.           f=open(fname,'r')
  78.           s=f.readlines()
  79.           f.close()
  80.           self.df=drawf.new()
  81.           self.df.fonttable({1:"Trinity.Medium"})
  82.           for line in s:
  83.              words=string.split(line)
  84.              if words:
  85.                 command=words[0]
  86.                 if command[0]!=';':
  87.                    if act.has_key(command):
  88.                       a=act[command]
  89.                       if a[0]<0 or len(words)==a[0]+1:
  90.                          a[1](words[1:])
  91.                       else:
  92.                          tbevent.errorbox(
  93.                           "Command "+command+" needs "+`a[0]`+" arguments")
  94.                    else:
  95.                       tbevent.errorbox("Unknown command "+command)
  96.       def xrange(self,w):
  97.           self.x0=string.atof(w[0])
  98.           self.x1=string.atof(w[1])
  99.           self.setx()
  100.       def setx(self):
  101.           if self.x1<self.x0+EPSILON:
  102.              tbevent.errorbox("Bad x range")
  103.              raise BadFile
  104.           self.xs=1280*256/(self.x1-self.x0)
  105.           step=(self.x1-self.x0)/self.n
  106.           self.xl=[]
  107.           for m in range(self.n+1):
  108.               self.xl.append(self.x0+m*step)
  109.       def yrange(self,w):
  110.           self.y0=string.atof(w[0])
  111.           self.y1=string.atof(w[1])
  112.           self.sety()
  113.       def sety(self):
  114.           if self.y1<self.y0+EPSILON:
  115.              tbevent.errorbox("Bad y range")
  116.              raise BadFile
  117.           self.ys=WINDOW_HEIGHT*OS_TO_DRAW/(self.y1-self.y0)
  118.       def plot(self,w):
  119.           fn=string.joinfields(w,' ')
  120.           yl=[]
  121.           for m in range(self.n+1):
  122.              try:
  123.                 x=self.xl[m]
  124.                 yl.append(eval(fn))
  125.              except:
  126.                 tbevent.errorbox("Can't find "+fn+"at x="+`x`)
  127.                 raise BadFile
  128.           pt=[(int((self.xl[0]-self.x0)*self.xs),int((yl[0]-self.y0)*self.ys))]
  129.           for m in range(1,self.n+1):
  130.               pt.append(PATH_DRAW)
  131.               pt.append((int((self.xl[m]-self.x0)*self.xs),
  132.                          int((yl[m]-self.y0)*self.ys)))
  133.           self.df.path(pt,self.style)
  134.       def steps(self,w):
  135.           self.n=string.atoi(w[0])
  136.           if self.n<10:
  137.              tbevent.errorbox("Using 10 steps")
  138.              self.n=10
  139.           if self.n>1000:
  140.              tbevent.errorbox("Using 1000 steps")
  141.              self.n=1000
  142.           self.setx()
  143.       def title(self,w):
  144.           self.title=string.joinfields(w,' ')
  145.           self.df.text((OS_TO_DRAW*80,OS_TO_DRAW*960),self.title,self.textstyle)
  146.       def axes(self,w):
  147.           xaxis=string.atof(w[0])
  148.           yaxis=string.atof(w[1])
  149.           xa=int((xaxis-self.x0)*self.xs)
  150.           ya=int((yaxis-self.y0)*self.ys)
  151.           self.df.path([(xa,0),PATH_DRAW,(xa,WINDOW_HEIGHT*OS_TO_DRAW),
  152.                        PATH_MOVE,(0,ya),PATH_DRAW,(WINDOW_WIDTH*OS_TO_DRAW,ya)],
  153.                        self.style)
  154.       def colour(self,w):
  155.           if colours.has_key(w[0]):
  156.              self.setstyle(colours[w[0]])
  157.           else:
  158.              self.setstyle(string.atoi(w[0],0))
  159.       def setstyle(self,c):
  160.           self.style=(TRANSPARENT,c,512,1)
  161.           self.textstyle=(c,WHITE,1,640*20,640*20)
  162.       def grid(self,w):
  163.           xint=string.atof(w[0])/10
  164.           yint=string.atof(w[1])/10
  165.           g=[]
  166.           gm=[]
  167.           gmm=[]
  168.           n0=ceil(self.x0/xint)
  169.           n1=floor(self.x1/xint)
  170.           for n in range(n0,n1+1):
  171.             x=int((n*xint-self.x0)*self.xs)
  172.             z=[(x,0),PATH_DRAW,(x,WINDOW_HEIGHT*OS_TO_DRAW),PATH_MOVE]
  173.             if n % 10 == 0:
  174.                g=g+z
  175.             elif n % 5 ==0:
  176.                gm=gm+z
  177.             else:
  178.                gmm=gmm+z
  179.           n0=ceil(self.y0/yint)
  180.           n1=floor(self.y1/yint)
  181.           for n in range(n0,n1+1):
  182.             y=int((n*yint-self.y0)*self.ys)
  183.             z=[(0,y),PATH_DRAW,(WINDOW_WIDTH*OS_TO_DRAW,y),PATH_MOVE]
  184.             if n % 10 == 0:
  185.                g=g+z
  186.             elif n % 5 ==0:
  187.                gm=gm+z
  188.             else:
  189.                gmm=gmm+z
  190.           if gmm:
  191.                self.df.path(gmm[:-1],minorgrid)
  192.           if gm:
  193.                self.df.path(gm[:-1],middlegrid)
  194.           if g:
  195.                self.df.path(g[:-1],majorgrid)
  196.  
  197. class Display(window.Window):
  198.       actions={}
  199.       def __init__(self,parsed):
  200.           window.Window.__init__(self,"Display")
  201.           tbevent.tbclasses[self.id]=self
  202.           self.handle=self.getwimphandle()
  203.           tbevent.winclasses[self.handle]=self
  204.           self.p=parsed
  205.           self.settitle("Graph: "+self.p.fname)
  206.           self.show()
  207.       def W_Redraw(self):
  208.           global trans
  209.           more=swi.swi(0x400c8,".b;i",tbevent.wblock)
  210.           trans[4]=256*(tbevent.wblock[1]-tbevent.wblock[5])
  211.           trans[5]=256*(tbevent.wblock[4]-tbevent.wblock[6])
  212.           while more:
  213.                 self.p.df.render(0,trans.start,tbevent.wblock.start+28,0)
  214.                 more=swi.swi(0x400ca,".b;i",tbevent.wblock)
  215.       def E_S_AboutToBeShown(self):
  216.           savewind=saveas.SaveAs(tbevent.idblock[4])
  217.           savewind.setdataaddress(self.p.df.start,self.p.df.size)
  218.  
  219. tbevent.initialise("<Graph$Dir>")
  220.  
  221. oi=Orphans()
  222. tbevent.msghandler=Messenger()
  223.  
  224. while 1:
  225.       tbevent.poll()