/[ascend]/trunk/pygtk/diagnose.py
ViewVC logotype

Diff of /trunk/pygtk/diagnose.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 283 by johnpye, Wed Feb 8 15:30:50 2006 UTC revision 284 by johnpye, Thu Feb 9 03:02:44 2006 UTC
# Line 4  import ascend Line 4  import ascend
4  from itertools import groupby  from itertools import groupby
5  from operator import itemgetter  from operator import itemgetter
6  import math  import math
7    import re
8    
9    ZOOM_RE = re.compile(r"([0-9]+)\s*%?")
10    MAX_ZOOM_SIZE = 2000
11    MAX_ZOOM_RATIO = 16
12    
13  class DiagnoseWindow:  class DiagnoseWindow:
14      def __init__(self,GLADE_FILE,browser):      def __init__(self,GLADE_FILE,browser):
# Line 12  class DiagnoseWindow: Line 17  class DiagnoseWindow:
17          _xml.signal_autoconnect(self)            _xml.signal_autoconnect(self)  
18    
19          self.window = _xml.get_widget("diagnosewin")          self.window = _xml.get_widget("diagnosewin")
20            self.imagescroll = _xml.get_widget("imagescroll")
21          self.image = _xml.get_widget("image")          self.image = _xml.get_widget("image")
22          self.blockentry = _xml.get_widget("blockentry")          self.blockentry = _xml.get_widget("blockentry")
23            self.zoomentry = _xml.get_widget("zoomentry")
24    
25          self.varview = _xml.get_widget("varview")          self.varview = _xml.get_widget("varview")
26          self.varbuf = gtk.TextBuffer()          self.varbuf = gtk.TextBuffer()
# Line 42  class DiagnoseWindow: Line 49  class DiagnoseWindow:
49          self.data = self.im.getIncidenceData()          self.data = self.im.getIncidenceData()
50          print "DATA LOADED"          print "DATA LOADED"
51    
52          self.canvas = None          self.zoom=1;
53            
54      def fill_values(self, block):      def fill_values(self, block):
55          print "FILL VALUES %d" % block          print "FILL VALUES for block %d" % block
56          try:          try:
57              rl,cl,rh,ch = self.im.getBlockLocation(block)              rl,cl,rh,ch = self.im.getBlockLocation(block)
58          except IndexError:          except IndexError:
# Line 57  class DiagnoseWindow: Line 64  class DiagnoseWindow:
64          nr = int(rh-rl+1);          nr = int(rh-rl+1);
65          nc = int(ch-cl+1);          nc = int(ch-cl+1);
66    
67          print "STARTING IMAGE CREATION"          #print "STARTING IMAGE CREATION"
68          # refer http://pygtk.org/pygtk2tutorial/sec-DrawingMethods.html          # refer http://pygtk.org/pygtk2tutorial/sec-DrawingMethods.html
69          c = chr(255)          c = chr(255)
70          b = nr*nc*3*[c]          b = nr*nc*3*[c]
# Line 77  class DiagnoseWindow: Line 84  class DiagnoseWindow:
84              pos = rowstride*r + 3*c              pos = rowstride*r + 3*c
85              dot = blackdot;              dot = blackdot;
86              var = self.im.getVariable(i.col);              var = self.im.getVariable(i.col);
87              try:              rat = var.getValue() / var.getNominal()
88                  rat = var.getValue() / var.getNominal()              if rat!=0:
89                  print "SCALE i.col =",rat                  try:
90                  val = math.log(rat);                      #print "SCALE i.col =",rat
91                  print "LOG i.col =",val                      val = math.log(abs(rat));
92                  if val > 1:                      #print "LOG i.col =",val
93                      dot = reddot;                      if val > 1:
94                  elif var < -1:                          dot = reddot;
95                      dot = bluedot;                      elif var < -1:
96                  elif var > 0:                          dot = bluedot;
97                      dot = pinkdot;                      elif var > 0:
98                  elif var < 0:                          dot = pinkdot;
99                      dot = skydot;                      elif var < 0:
100              except ValueError, e:                          dot = skydot;
101                  pass                  except ValueError, e:
102              print "DOT: ",dot                      pass
103                #print "DOT: ",dot
104              b[pos], b[pos+1], b[pos+2] = dot              b[pos], b[pos+1], b[pos+2] = dot
105    
106          d = ''.join(b)          d = ''.join(b)
107    
108          print "DONE IMAGE CREATION"          #print "DONE IMAGE CREATION"
   
         pb = gtk.gdk.pixbuf_new_from_data(d, gtk.gdk.COLORSPACE_RGB, False, 8 \  
                 , nc, nr, rowstride)  
109            
110            self.pixbuf = gtk.gdk.pixbuf_new_from_data(d, gtk.gdk.COLORSPACE_RGB, False, 8 \
111                    , nc, nr, rowstride);
112    
113          if nc > nr:          self.nr = nr
114              w = 400          self.nc = nc
115              h = 400 * nr / nc;          self.zoom = -1 # to fit, up to max 16x
116          else:          self.do_zoom()
             h = 400  
             w = 400 * nr / nc;  
117    
118          if h/nr > 16 or w/nc > 16:          #print "DONE IMAGE TRANSFER TO SERVER"
             h= nr*16  
             w= nc*16  
119    
120          if nc < 200 and nr < 200:          self.fill_var_names()
121              pb1 = pb.scale_simple(w,h,gtk.gdk.INTERP_NEAREST)          self.fill_rel_names()
         else:  
             pb1 = pb.scale_simple(w,h,gtk.gdk.INTERP_BILINEAR)  
           
         del pb;  
122    
123          print "DONE IMAGE PREPARATION"      def do_zoom(self):
124            if self.zoom == -1:
125                w, h = self.imagescroll.size_request()
126                #print "SCALE TO FIX, w=%d, h=%d" % (w,h)
127                if self.nc/self.nr > w/h:
128                    # a 'wide' image    
129                    self.zoom = w / self.nc
130                else:
131                    self.zoom = h / self.nr
132    
133            if self.zoom > MAX_ZOOM_RATIO:
134                self.zoom = MAX_ZOOM_RATIO
135    
136            if self.zoom * self.nc > MAX_ZOOM_SIZE or self.zoom * self.nr > MAX_ZOOM_SIZE:
137                self.zoom = MAX_ZOOM_SIZE / max(self.nc,self.nr)
138    
139            w = int(self.zoom * self.nc);
140            h = int(self.zoom * self.nr);
141                
142            self.zoomentry.set_text("%d %%" % (int(self.zoom*100)) )
143    
144            if self.zoom < 2:
145                pb1 = self.pixbuf.scale_simple(w,h,gtk.gdk.INTERP_BILINEAR)
146            else:
147                pb1 = self.pixbuf.scale_simple(w,h,gtk.gdk.INTERP_NEAREST)
148            
149          self.image.set_from_pixbuf(pb1)          self.image.set_from_pixbuf(pb1)
150    
         print "DONE IMAGE TRANSFER TO SERVER"  
   
         self.fill_var_names()  
         self.fill_rel_names()  
   
151      def fill_var_names(self):      def fill_var_names(self):
152          names = [str(i) for i in self.im.getBlockVars(self.block)]          names = [str(i) for i in self.im.getBlockVars(self.block)]
153          if self.varcollapsed.get_active():          if self.varcollapsed.get_active():
# Line 158  class DiagnoseWindow: Line 176  class DiagnoseWindow:
176          self.block = block;          self.block = block;
177          self.fill_values(block)          self.fill_values(block)
178    
179        def set_zoom(self,zoom):
180            self.zoom = zoom
181            self.do_zoom()
182    
183      def on_varcollapsed_toggled(self,*args):      def on_varcollapsed_toggled(self,*args):
184          print "COLLAPSED-TOGGLED"          print "COLLAPSED-TOGGLED"
185          self.fill_var_names()          self.fill_var_names()
# Line 178  class DiagnoseWindow: Line 200  class DiagnoseWindow:
200          if keyname=="Return":          if keyname=="Return":
201              self.set_block( int(self.blockentry.get_text()) )              self.set_block( int(self.blockentry.get_text()) )
202    
203        def on_zoominbutton_clicked(self,*args):
204            z = int( math.log(self.zoom)/math.log(2) )
205            z = pow(2,z + 1);
206            self.set_zoom(z)
207    
208        def on_zoomoutbutton_clicked(self,*args):
209            z = int( math.log(self.zoom)/math.log(2) + 0.999)
210            z = pow(2,z - 1);
211            self.set_zoom(z)        
212    
213        def on_zoomentry_key_press_event(self,widget,event):
214            keyname = gtk.gdk.keyval_name(event.keyval)
215            print "KEY ",keyname
216            if keyname=="Return":
217                t = self.zoomentry.get_text()
218                m = ZOOM_RE.match(t)
219                if not m:
220                    self.zoomentry.set_text("%d %%" % int(self.zoom*100))
221                for mm in m:
222                    print m
223                self.set_zoom( int(self.zoomentry.get_text()) )
224    
225  # The following is from  # The following is from
226  # http://www.experts-exchange.com/Programming/Programming_Languages/Python/Q_21719649.html  # http://www.experts-exchange.com/Programming/Programming_Languages/Python/Q_21719649.html
227    # it's still buggy.
228    
229  def fold(data):  def fold(data):
230      """ fold sorted numeric sequence data into ranged representation:      """ fold sorted numeric sequence data into ranged representation:

Legend:
Removed from v.283  
changed lines
  Added in v.284

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22