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

Annotation of /trunk/pygtk/gtkbrowser.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 917 - (hide annotations) (download) (as text)
Thu Nov 2 21:34:59 2006 UTC (16 years, 4 months ago) by johnpye
File MIME type: text/x-python
File size: 34477 byte(s)
Added some debug stuff to work on the on_load problem.
1 johnpye 132 #!/usr/bin/env python
2    
3 johnpye 361 import sys
4 johnpye 478 def print_loading_status(status,msg=None):
5     sys.stderr.write("\r \r")
6     if msg!=None:
7     sys.stderr.write(msg+"\n")
8 johnpye 803 sys.stderr.write(status+"...\r")
9 johnpye 478 sys.stderr.flush()
10 johnpye 361
11 johnpye 627 try:
12 johnpye 856 #print_loading_status("Loading PSYCO")
13 johnpye 627 #try:
14     # import psyco
15     # psyco.full()
16     # print "Running with PSYCO optimisation..."
17     #except ImportError:
18     # pass
19 johnpye 279
20 johnpye 463
21 johnpye 627 print_loading_status("Loading python standard libraries")
22 johnpye 478
23 johnpye 627 import re
24     import urlparse
25     import optparse
26     import platform
27     import sys
28     import os.path
29 johnpye 132
30 johnpye 627 if platform.system() != "Windows":
31     import dl
32     # This sets the flags for dlopen used by python so that the symbols in the
33     # ascend library are made available to libraries dlopened within ASCEND:
34     sys.setdlopenflags(dl.RTLD_GLOBAL|dl.RTLD_NOW)
35 johnpye 499
36 johnpye 627 print_loading_status("Loading LIBASCEND/ascpy")
37     import ascpy
38 johnpye 478
39 johnpye 627 print_loading_status("Loading PyGTK, glade, pango")
40 johnpye 478
41 johnpye 627 import pygtk
42     pygtk.require('2.0')
43     import gtk
44     import gtk.glade
45     import pango
46 johnpye 478
47 johnpye 627 print_loading_status("Loading python matplotlib")
48 johnpye 507 try:
49 johnpye 627 import matplotlib
50 johnpye 632 matplotlib.use('GTKAgg')
51 johnpye 627
52 johnpye 507 try:
53 johnpye 746 print_loading_status("Trying python numarray")
54     import numarray
55     matplotlib.rcParams['numerix'] = 'numarray'
56     print_loading_status("","Using python module numarray")
57 johnpye 507 except ImportError:
58     try:
59 johnpye 746 print_loading_status("Trying python numpy")
60     import numpy
61     matplotlib.rcParams['numerix'] = 'numpy'
62     print_loading_status("","Using python module numpy")
63 johnpye 507 except ImportError:
64 johnpye 627 try:
65     print_loading_status("Trying python Numeric")
66     import Numeric
67     matplotlib.rcParams['numerix'] = 'Numeric'
68     print_loading_status("","Using python module Numeric")
69     except ImportError:
70     print_loading_status("","FAILED TO LOAD A NUMERIC MODULE FOR PYTHON")
71 johnpye 507
72 johnpye 627 except ImportError,e:
73     print_loading_status("","FAILED TO LOAD MATPLOTLIB")
74     raise RuntimeError("Failed to load MATPLOTLIB (is it installed?). Details:"+str(e))
75 johnpye 507
76 johnpye 669 print_loading_status("Loading IPython")
77     import console;
78     if not console.have_ipython:
79     print_loading_status("","IPython couldn't be loaded")
80    
81 johnpye 627 print_loading_status("Loading ASCEND python modules")
82     from preferences import * # loading/saving of .ini options
83     from solverparameters import * # 'solver parameters' window
84     from help import * # viewing help files
85     from incidencematrix import * # incidence/sparsity matrix matplotlib window
86     from observer import * # observer tab support
87     from properties import * # solver_var properties dialog
88     from varentry import * # for inputting of variables with units
89     from diagnose import * # for diagnosing block non-convergence
90     from solverreporter import * # solver status reporting
91     from modelview import * # model browser
92 johnpye 732 from integrator import * # integrator dialog
93     from infodialog import * # general-purpose textual information dialog
94 johnpye 904 from versioncheck import * # version check (contacts ascend.cruncher2.dyndns.org)
95 johnpye 627 import config
96 johnpye 669
97 johnpye 627 except RuntimeError, e:
98     print "ASCEND had problems starting up. Please report the following"
99     print "error message at http://mantis.cruncher2.dyndns.org/."
100     print "\n\nFull error message:",str(e)
101     print "\n\nPress ENTER to close this window."
102     sys.stdout.flush()
103     sys.stdin.readline();
104     sys.exit();
105 johnpye 311
106 johnpye 627 except ImportError, e:
107     print "\n\n------------------ ERROR ---------------------"
108     print "ASCEND had problems importing required models."
109     print "\nPlease ensure you have all the runtime prerequisites installed."
110     print "Please then report a bug if you continue to have problems."
111     print "\nFull error message:",str(e)
112     if platform.system()=="Windows":
113     print "\nYou will also need to report the contents of any popup error"
114     print "messages from Windows if any were shown."
115     print "\n\nPress ENTER to close this window."
116     sys.stdout.flush()
117     sys.stdin.readline();
118     sys.exit();
119    
120 johnpye 478 print_loading_status("Starting GUI")
121    
122 johnpye 132 # This is my first ever GUI code so please be nice :)
123 johnpye 361 # But I *have* at least read
124     # http://www.joelonsoftware.com/uibook/chapters/fog0000000057.html
125     # and leafed through
126     # http://developer.gnome.org/projects/gup/hig/
127 johnpye 132
128     # The fancy tree-view gizmo is the GtkTreeView object. See the article
129     # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/300304
130     # for the original source code on which my implementation was based.
131    
132 johnpye 227 ESCAPE_KEY = 65307
133    
134 johnpye 230 HELP_ROOT = None
135    
136 johnpye 223 #======================================
137     # Browser is the main ASCEND library/model browser window
138    
139 johnpye 132 class Browser:
140    
141     # ---------------------------------
142     # SETUP
143    
144 johnpye 858 def __init__(self,librarypath=None,assetspath=None):
145    
146     if assetspath==None:
147     assetspath=config.PYGTK_ASSETS
148    
149 johnpye 132 #--------
150     # load the file referenced in the command line, if any
151    
152 johnpye 858 print_loading_status("Parsing options","CONFIG = %s"%config.VERSION)
153 johnpye 478
154 johnpye 132 parser = optparse.OptionParser(usage="%prog [[-m typename] file]", version="gtkbrowser $rev$" )
155     # add options here if we want
156    
157 johnpye 160 parser.add_option("-m", "--model"
158 johnpye 341 ,action="store", type="string", dest="model"
159 johnpye 160 ,help="specify the model to instantiate upon loading modules")
160 johnpye 436
161     parser.add_option("--pygtk-assets"
162 johnpye 455 ,action="store", type="string", dest="assets_dir"
163 johnpye 436 ,help="override the configuration value for the location of assets"\
164     +" required by PyGTK for the ASCEND GUI, optional"
165 johnpye 858 ,default=assetspath
166 johnpye 436 )
167    
168 johnpye 459 parser.add_option("--library"
169     ,action="store", type="string", dest="library_path"
170 johnpye 723 ,help="override the configuration value for the library path"
171 johnpye 858 ,default=librarypath
172 johnpye 459 )
173    
174 johnpye 723 parser.add_option("--no-auto-sim"
175     ,action="store_false", dest="auto_sim"
176     ,help="disable auto-instantiation of MODEL named as the file stem"
177     ,default=True
178     )
179    
180 johnpye 533 (self.options, args) = parser.parse_args()
181 johnpye 132
182 johnpye 533 #print "OPTIONS_______________:",self.options
183 johnpye 482
184 johnpye 533 self.assets_dir = self.options.assets_dir
185 johnpye 132
186 johnpye 246 self.observers = []
187 johnpye 251 self.clip = None
188 johnpye 246
189 johnpye 132 #--------
190     # load up the preferences ini file
191    
192 johnpye 478 print_loading_status("Loading preferences")
193    
194 johnpye 479 self.prefs = Preferences()
195 johnpye 132
196 johnpye 482 _prefpath = self.prefs.getStringPref("Directories","librarypath",None)
197 johnpye 500 _preffileopenpath = self.prefs.getStringPref("Directories","fileopenpath",None)
198 johnpye 482
199 johnpye 132 #--------
200 johnpye 482 # set up library path and the path to use for File->Open dialogs
201 johnpye 455
202 johnpye 533 if self.options.library_path != None:
203     _path = os.path.abspath(self.options.library_path)
204 johnpye 860 _pathsrc = "command line options"
205 johnpye 482 # when a special path is specified, use that as the file-open location
206 johnpye 507 self.fileopenpath = _path
207 johnpye 356 else:
208 johnpye 482 if _prefpath:
209     _path = _prefpath
210     _pathsrc = "user preferences"
211     else:
212     _path = config.LIBRARY_PATH
213 johnpye 479 _pathsrc = "default (config.py)"
214 johnpye 482
215     if _preffileopenpath:
216     self.fileopenpath = _preffileopenpath
217 johnpye 479 else:
218 johnpye 482 self.fileopenpath = _path
219    
220     #--------
221     # Create the ASCXX 'Library' object
222    
223 johnpye 507 print_loading_status("Creating ASCEND 'Library' object","PATH = "+_path+" FROM "+_pathsrc)
224 johnpye 482 self.library = ascpy.Library(_path)
225 johnpye 479
226 johnpye 132 self.sim = None
227 johnpye 351
228 johnpye 132 #-------------------
229     # Set up the window and main widget actions
230    
231 johnpye 858 self.glade_file = os.path.join(self.assets_dir,config.GLADE_FILE)
232 johnpye 709
233 johnpye 895 print_loading_status("Setting up windows") #,"GLADE_FILE = %s" % self.glade_file)
234 johnpye 806
235 johnpye 436 glade = gtk.glade.XML(self.glade_file,"browserwin")
236 johnpye 132
237     self.window = glade.get_widget("browserwin")
238 johnpye 208
239 johnpye 709
240 johnpye 132 if not self.window:
241     raise RuntimeError("Couldn't load window from glade file")
242 johnpye 172
243 johnpye 294 _display = self.window.get_screen().get_display().get_name()
244 johnpye 173 _geom=self.prefs.getGeometrySizePosition(_display,"browserwin")
245 johnpye 172 if _geom:
246 johnpye 294 self.window.resize(_geom[0],_geom[1])
247     self.window.move(_geom[2],_geom[3])
248 johnpye 173
249 johnpye 132 self.window.connect("delete_event", self.delete_event)
250    
251 johnpye 294 self.browserpaned=glade.get_widget("browserpaned")
252     _geom2=self.prefs.getGeometryValue(_display,"browserpaned")
253 johnpye 173 if _geom2:
254 johnpye 294 self.browserpaned.set_position(_geom2)
255 johnpye 173
256 johnpye 132 self.openbutton=glade.get_widget("openbutton")
257     self.openbutton.connect("clicked",self.open_click)
258    
259     self.reloadbutton=glade.get_widget("reloadbutton")
260     self.reloadbutton.connect("clicked",self.reload_click)
261    
262     self.solvebutton=glade.get_widget("solvebutton")
263     self.solvebutton.connect("clicked",self.solve_click)
264    
265 johnpye 669 self.integratebutton=glade.get_widget("integratebutton")
266     self.integratebutton.connect("clicked",self.integrate_click)
267    
268 johnpye 132 self.checkbutton=glade.get_widget("checkbutton")
269     self.checkbutton.connect("clicked",self.check_click)
270    
271     self.autotoggle=glade.get_widget("autotoggle")
272 johnpye 688 self.automenu = glade.get_widget("automenu")
273 johnpye 132 self.autotoggle.connect("toggled",self.auto_toggle)
274    
275     self.methodrunbutton=glade.get_widget("methodrunbutton")
276     self.methodrunbutton.connect("clicked",self.methodrun_click)
277    
278     self.methodsel=glade.get_widget("methodsel")
279    
280     self.maintabs = glade.get_widget("maintabs")
281    
282 johnpye 164 self.statusbar = glade.get_widget("statusbar")
283    
284 johnpye 208 self.menu = glade.get_widget("browsermenu")
285    
286 johnpye 321 self.show_solving_popup=glade.get_widget("show_solving_popup")
287     self.show_solving_popup.set_active(self.prefs.getBoolPref("SolverReporter","show_popup",True))
288     self.close_on_converged=glade.get_widget("close_on_converged")
289     self.close_on_converged.set_active(self.prefs.getBoolPref("SolverReporter","close_on_converged",True))
290     self.close_on_nonconverged=glade.get_widget("close_on_nonconverged")
291     self.close_on_nonconverged.set_active(self.prefs.getBoolPref("SolverReporter","close_on_nonconverged",True))
292 johnpye 785 self.solver_engine=glade.get_widget("solver_engine")
293 johnpye 164
294 johnpye 770 self.use_relation_sharing=glade.get_widget("use_relation_sharing")
295     self.use_relation_sharing.set_active(self.prefs.getBoolPref("Compiler","use_relation_sharing",True))
296    
297 johnpye 688 glade.signal_autoconnect(self)
298    
299 johnpye 533 #-------
300     # Status icons
301 johnpye 164
302 johnpye 268 self.fixedimg = gtk.Image()
303 johnpye 858 self.fixedimg.set_from_file(os.path.join(self.options.assets_dir,'locked.png'))
304 johnpye 268
305 johnpye 258 self.iconstatusunknown = None
306 johnpye 268 self.iconfixed = self.fixedimg.get_pixbuf()
307 johnpye 255 self.iconsolved = self.window.render_icon(gtk.STOCK_YES,gtk.ICON_SIZE_MENU)
308 johnpye 258 self.iconactive = self.window.render_icon(gtk.STOCK_NO,gtk.ICON_SIZE_MENU)
309 johnpye 255 self.iconunsolved = None
310    
311     self.statusicons={
312 johnpye 463 ascpy.ASCXX_VAR_STATUS_UNKNOWN: self.iconstatusunknown
313     ,ascpy.ASCXX_VAR_FIXED: self.iconfixed
314     ,ascpy.ASCXX_VAR_SOLVED: self.iconsolved
315     ,ascpy.ASCXX_VAR_ACTIVE: self.iconactive
316     ,ascpy.ASCXX_VAR_UNSOLVED: self.iconunsolved
317 johnpye 255 }
318 johnpye 533
319    
320 johnpye 273 self.statusmessages={
321 johnpye 463 ascpy.ASCXX_VAR_STATUS_UNKNOWN: "Status unknown"
322     ,ascpy.ASCXX_VAR_FIXED: "Fixed"
323     ,ascpy.ASCXX_VAR_SOLVED: "Converged"
324     ,ascpy.ASCXX_VAR_ACTIVE: "Active (unconverged)"
325     ,ascpy.ASCXX_VAR_UNSOLVED: "Not yet visited"
326 johnpye 533 }
327 johnpye 255
328 johnpye 533 #-------------------
329     # waitwin
330 johnpye 132
331 johnpye 533 self.waitwin = gtk.gdk.Window(self.window.window,
332     gtk.gdk.screen_width(),
333     gtk.gdk.screen_height(),
334     gtk.gdk.WINDOW_CHILD,
335     0,
336     gtk.gdk.INPUT_ONLY)
337 johnpye 226
338 johnpye 533 _cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
339     self.waitwin.set_cursor(_cursor)
340 johnpye 181
341 johnpye 533 #-------------------
342     # pixbufs to be used in the error listing
343 johnpye 181
344 johnpye 533 self.iconok = self.window.render_icon(gtk.STOCK_YES,gtk.ICON_SIZE_MENU)
345     self.iconinfo = self.window.render_icon(gtk.STOCK_DIALOG_INFO,gtk.ICON_SIZE_MENU)
346     self.iconwarning = self.window.render_icon(gtk.STOCK_DIALOG_WARNING,gtk.ICON_SIZE_MENU)
347     self.iconerror = self.window.render_icon(gtk.STOCK_DIALOG_ERROR,gtk.ICON_SIZE_MENU)
348 johnpye 181
349 johnpye 533 #--------------------
350     # pixbufs for solver_var status
351 johnpye 181
352 johnpye 132 #--------------------
353     # set up the error view
354    
355 johnpye 168 self.errorview = glade.get_widget("errorview")
356 johnpye 132 errstorecolstypes = [gtk.gdk.Pixbuf,str,str,str,int]
357     self.errorstore = gtk.TreeStore(*errstorecolstypes)
358     errtitles = ["","Location","Message"];
359     self.errorview.set_model(self.errorstore)
360     self.errcols = [ gtk.TreeViewColumn() for _type in errstorecolstypes]
361    
362     i = 0
363     for tvcolumn in self.errcols[:len(errtitles)]:
364     tvcolumn.set_title(errtitles[i])
365     self.errorview.append_column(tvcolumn)
366    
367     if i>0:
368     _renderer = gtk.CellRendererText()
369     tvcolumn.pack_start(_renderer, True)
370     tvcolumn.add_attribute(_renderer, 'text', i)
371     if(i==2):
372     tvcolumn.add_attribute(_renderer, 'foreground', 3)
373     tvcolumn.add_attribute(_renderer, 'weight', 4)
374     else:
375     _renderer1 = gtk.CellRendererPixbuf()
376     tvcolumn.pack_start(_renderer1, False)
377     tvcolumn.add_attribute(_renderer1, 'pixbuf', int(0))
378    
379     i = i + 1
380    
381    
382     #--------------------
383     # set up the error reporter callback
384 johnpye 463 self.reporter = ascpy.getReporter()
385 johnpye 132 self.reporter.setPythonErrorCallback(self.error_callback)
386    
387 johnpye 785
388     #-------
389     # Solver engine list
390    
391     _slvlist = ascpy.getSolvers()
392     self.solver_engine_menu = gtk.Menu()
393     self.solver_engine_menu.show()
394     self.solver_engine.set_submenu(self.solver_engine_menu)
395     self.solver_engine_menu_dict = {}
396     _fmi = None
397     for _s in _slvlist:
398     _mi = gtk.RadioMenuItem(_fmi,_s.getName(),False)
399     if _fmi==None:
400     _fmi = _mi
401     _mi.show()
402     _mi.connect('toggled',self.on_select_solver_toggled,_s.getName())
403     self.solver_engine_menu.append(_mi)
404     self.solver_engine_menu_dict[_s.getName()]=_mi
405    
406 johnpye 803 _pref_solver = self.prefs.getStringPref("Solver","engine","QRSlv")
407     _mi = self.solver_engine_menu_dict.get(_pref_solver)
408     if _mi:
409     _mi.set_active(1)
410 johnpye 785
411 johnpye 709 #--------
412     # Assign an icon to the main window
413    
414     self.icon = None
415     if config.ICON_EXTENSION:
416     _iconpath = ""
417     try:
418     _icon = gtk.Image()
419 johnpye 858 _iconpath = os.path.join(self.assets_dir,'ascend'+config.ICON_EXTENSION)
420 johnpye 709 _icon.set_from_file(_iconpath)
421     _iconpbuf = _icon.get_pixbuf()
422     self.window.set_icon(_iconpbuf)
423     self.icon = _iconpbuf
424     except Exception, e:
425 johnpye 860 print "FAILED TO SET APPLICATION ICON PATH '%s': %s" % (_iconpath,str(e))
426 johnpye 709 self.reporter.reportError("FAILED to set application icon '%s': %s"
427     % (_iconpath,str(e))
428     )
429    
430 johnpye 132 #-------------------
431     # set up the module view
432    
433     self.modtank = {}
434     self.moduleview = glade.get_widget("moduleview")
435 johnpye 355 modulestorecoltypes = [str, str, int] # bool=can-be-instantiated
436 johnpye 132 self.modulestore = gtk.TreeStore(*modulestorecoltypes)
437     moduleviewtitles = ["Module name", "Filename"]
438     self.moduleview.set_model(self.modulestore)
439     self.modcols = [ gtk.TreeViewColumn() for _type in modulestorecoltypes]
440     i = 0
441     for modcol in self.modcols[:len(moduleviewtitles)]:
442     modcol.set_title(moduleviewtitles[i])
443     self.moduleview.append_column(modcol)
444     _renderer = gtk.CellRendererText()
445     modcol.pack_start(_renderer, True)
446     modcol.add_attribute(_renderer, 'text', i)
447 johnpye 355 modcol.add_attribute(_renderer,'weight',2)
448 johnpye 132 i = i + 1
449     self.moduleview.connect("row-activated", self.module_activated )
450    
451     #--------------------
452     # set up the methods combobox
453    
454     self.methodstore = gtk.ListStore(str)
455     self.methodsel.set_model(self.methodstore)
456     _methodrenderer = gtk.CellRendererText()
457     self.methodsel.pack_start(_methodrenderer, True)
458     self.methodsel.add_attribute(_methodrenderer, 'text',0)
459    
460     #--------
461     # set up the instance browser view
462    
463 johnpye 533 self.modelview = ModelView(self, glade)
464 johnpye 255
465 johnpye 533 #--------
466 johnpye 856 # set up the tabs
467     self.tabs = {}
468     self.activetab = None # most recent observer tab
469    
470     #--------
471 johnpye 688 # set the state of the 'auto' toggle
472    
473     self.is_auto = self.prefs.getBoolPref("Browser","auto_solve",True)
474     self.autotoggle.set_active(self.is_auto)
475     self.automenu.set_active(self.is_auto)
476    
477     #--------
478 johnpye 869 # tell libascend about this 'browser' object
479    
480     print dir(ascpy.Registry())
481     ascpy.Registry().set("browser",self)
482    
483     #--------
484 johnpye 533 # options
485 johnpye 132
486     if(len(args)==1):
487     self.do_open(args[0])
488    
489 johnpye 723 print "Options: ",self.options
490 johnpye 132
491 johnpye 723 _model = None
492 johnpye 533 if self.options.model:
493 johnpye 723 _model = self.options.model
494     print "MODEL: '%s'" % _model
495     elif self.options.auto_sim:
496 johnpye 728 _head, _tail = os.path.split(args[0])
497     if(_tail):
498     _model, _ext = os.path.splitext(_tail)
499 johnpye 723
500     if _model:
501 johnpye 132 try:
502 johnpye 723 _t=self.library.findType(_model)
503     try:
504     self.do_sim(_t)
505 johnpye 725 if not self.options.model:
506 johnpye 901 self.reporter.reportNote("Instantiated self-titled model '%s'" %_model)
507 johnpye 723 except RuntimeError, e:
508     self.reporter.reportError("Failed to create instance of '%s': %s"
509     %(_model, str(e))
510     );
511 johnpye 132 except RuntimeError, e:
512 johnpye 723 if self.options.model:
513     self.reporter.reportError("Unknown model type '%s': %s"
514     %(_model, str(e))
515     );
516 johnpye 223
517 johnpye 132 def run(self):
518     self.window.show()
519 johnpye 500 print_loading_status("ASCEND is now running")
520 johnpye 132 gtk.main()
521    
522 johnpye 785 # ------------------
523     # SOLVER LIST
524    
525     def set_solver(self,solvername):
526 johnpye 900 """ this sets the active solver in the GUI, which is the default applied to newly instantiated models """
527 johnpye 785 self.solver = ascpy.Solver(solvername)
528 johnpye 803 self.prefs.setStringPref("Solver","engine",solvername)
529 johnpye 785 self.reporter.reportNote("Set solver engine to '%s'" % solvername)
530    
531 johnpye 132 # --------------------------------------------
532     # MAJOR GUI COMMANDS
533    
534 johnpye 533 def on_fix_variable_activate(self,*args):
535     self.modelview.on_fix_variable_activate(*args)
536 johnpye 132
537 johnpye 533 def on_free_variable_activate(self,*args):
538     self.modelview.on_free_variable_activate(*args)
539    
540 johnpye 785 def on_select_solver_toggled(self,widget,solvername):
541     if widget.get_active():
542     self.set_solver(solvername)
543    
544 johnpye 132 def do_open(self,filename):
545     # TODO does the user want to lose their work?
546     # TODO do we need to chdir?
547    
548 johnpye 164 _context = self.statusbar.get_context_id("do_open")
549    
550 johnpye 132 self.errorstore.clear()
551 johnpye 533 self.modelview.clear()
552 johnpye 132
553 johnpye 175 # self.library.clear()
554 johnpye 164
555 johnpye 875 print "Filename =",filename
556 johnpye 164 self.statusbar.push(_context,"Loading '"+filename+"'")
557 johnpye 132 self.library.load(filename)
558 johnpye 875 print "Statusbar =",self.statusbar
559     try:
560     self.statusbar.pop(_context)
561     except TypeError,e:
562     print "For some reason, a type error (context=%s,filename=%s): %s" % (_context,filename,e)
563 johnpye 132
564     self.filename = filename
565    
566     # Load the current list of modules into self.modules
567     self.modtank = {}
568     self.modulestore.clear()
569     modules = self.library.getModules()
570 johnpye 895 #self.library.listModules()
571 johnpye 338 try:
572     _lll=len(modules)
573     except:
574     _msg = "UNABLE TO ACCESS MODULES LIST. This is bad.\n"+\
575 johnpye 669 "Check your SWIG configuration (check for warnings during build)."
576 johnpye 338
577     self.reporter.reportError(_msg)
578     raise RuntimeError(_msg)
579    
580 johnpye 132 for m in reversed(modules):
581     _n = str( m.getName() )
582     _f = str( m.getFilename() )
583     #print "ADDING ROW name %s, file = %s" % (_n, _f)
584 johnpye 355 _r = self.modulestore.append(None, [ _n, _f, pango.WEIGHT_NORMAL ])
585 johnpye 132 for t in self.library.getModuleTypes(m):
586     _n = t.getName()
587 johnpye 355 _hasparams = t.hasParameters()
588     if _hasparams:
589     _w = pango.WEIGHT_NORMAL
590     else:
591     _w = pango.WEIGHT_BOLD
592    
593 johnpye 132 #print "ADDING TYPE %s" % _n
594 johnpye 355 _piter = self.modulestore.append(_r , [ _n, "", _w ])
595 johnpye 132 _path = self.modulestore.get_path(_piter)
596     self.modtank[_path]=t
597    
598     #print "DONE ADDING MODULES"
599    
600     self.sim = None;
601     self.maintabs.set_current_page(0);
602 johnpye 164
603 johnpye 168 # See http://www.daa.com.au/pipermail/pygtk/2005-October/011303.html
604     # for details on how the 'wait cursor' is done.
605 johnpye 164 def start_waiting(self, message):
606     self.waitcontext = self.statusbar.get_context_id("waiting")
607     self.statusbar.push(self.waitcontext,message)
608    
609     if self.waitwin:
610     self.waitwin.show()
611    
612     while gtk.events_pending():
613     gtk.main_iteration()
614 johnpye 132
615 johnpye 164 def stop_waiting(self):
616     if self.waitwin:
617     self.statusbar.pop(self.waitcontext)
618     self.waitwin.hide()
619    
620 johnpye 132 def do_sim(self, type_object):
621     self.sim = None;
622     # TODO: clear out old simulation first!
623    
624     print "DO_SIM(%s)" % str(type_object.getName())
625 johnpye 164 self.start_waiting("Compiling...")
626    
627 johnpye 277 try:
628 johnpye 770 _v = self.prefs.getBoolPref("Compiler","use_relation_sharing",True)
629     ascpy.getCompiler().setUseRelationSharing(_v)
630    
631 johnpye 277 self.sim = type_object.getSimulation(str(type_object.getName())+"_sim")
632 johnpye 900
633     self.reporter.reportNote("SIMULATION ASSIGNED")
634 johnpye 277 except RuntimeError, e:
635     self.stop_waiting()
636     self.reporter.reportError(str(e))
637     return
638    
639 johnpye 132 print "...DONE 'getSimulation'"
640 johnpye 164 self.stop_waiting()
641 johnpye 132
642 johnpye 164 self.start_waiting("Building simulation...")
643 johnpye 132 print "BUILDING SIMULATION"
644 johnpye 277
645     try:
646     self.sim.build()
647     except RuntimeError, e:
648     self.stop_waiting()
649     self.reporter.reportError(str(e))
650 johnpye 900 return
651 johnpye 277
652 johnpye 132 print "DONE BUILDING"
653 johnpye 164 self.stop_waiting()
654 johnpye 132
655 johnpye 902 # get method names and load them into the GUI
656     self.methodstore.clear()
657     _methods = self.sim.getType().getMethods()
658     _activemethod = None;
659     for _m in _methods:
660     _i = self.methodstore.append([_m.getName()])
661     if _m.getName()=="on_load":
662     self.methodsel.set_active_iter(_i)
663    
664     self.modelview.setSimulation(self.sim)
665    
666     # set the active solver on the simulation
667 johnpye 785 self.sim.setSolver(self.solver)
668 johnpye 223
669 johnpye 902 # run the 'on_load' method
670 johnpye 900 self.start_waiting("Running default method...")
671     try:
672 johnpye 915 self.reporter.reportNote("SIMULATION CREATED, RUNNING DEFAULT METHOD NOW...")
673 johnpye 900 self.sim.runDefaultMethod()
674     except RuntimeError, e:
675     self.stop_waiting()
676     self.reporter.reportError(str(e))
677     return
678     self.stop_waiting()
679 johnpye 903
680     self.modelview.refreshtree()
681 johnpye 249
682     def do_solve_if_auto(self):
683     if self.is_auto:
684 johnpye 775 self.sim.checkInstance()
685 johnpye 249 self.do_solve()
686     else:
687 johnpye 255 self.sim.processVarStatus()
688 johnpye 533 self.modelview.refreshtree()
689 johnpye 249
690     self.sync_observers()
691 johnpye 132
692     def do_solve(self):
693     if not self.sim:
694     self.reporter.reportError("No model selected yet")
695 johnpye 669 return
696 johnpye 132
697 johnpye 786 self.start_waiting("Solving with %s..." % self.solver.getName())
698 johnpye 164
699 johnpye 321 if self.prefs.getBoolPref("SolverReporter","show_popup",True):
700 johnpye 351 reporter = PopupSolverReporter(self,self.sim.getNumVars())
701 johnpye 321 else:
702     reporter = SimpleSolverReporter(self)
703    
704 johnpye 785 self.sim.solve(self.solver,reporter)
705 johnpye 164
706 johnpye 168 self.stop_waiting()
707 johnpye 255
708 johnpye 533 self.modelview.refreshtree()
709 johnpye 132
710 johnpye 669 def do_integrate(self):
711     if not self.sim:
712     self.reporter.reportError("No model selected yet")
713     return
714     integwin = IntegratorWindow(self,self.sim)
715     _integratorreporter = integwin.run()
716     if _integratorreporter!=None:
717     _integratorreporter.run()
718     self.sim.processVarStatus()
719     self.modelview.refreshtree()
720    
721    
722 johnpye 132 def do_check(self):
723     if not self.sim:
724 johnpye 775 self.reporter.reportError("No simulation yet")
725 johnpye 669 return
726 johnpye 132
727 johnpye 171 self.start_waiting("Checking system...")
728    
729 johnpye 278 try:
730 johnpye 775 self.sim.checkInstance()
731     self.reporter.reportWarning("System instance check run, check above for error (if any).")
732     # the above gives output but doesn't throw errors or return a status.
733     # ... this is a problem (at the C level)
734 johnpye 772
735 johnpye 775 status = self.sim.checkDoF()
736     if status==ascpy.ASCXX_DOF_UNDERSPECIFIED:
737 johnpye 776 self.on_show_fixable_variables_activate(None)
738 johnpye 775 elif status==ascpy.ASCXX_DOF_OVERSPECIFIED:
739 johnpye 776 self.on_show_freeable_variables_activate(None)
740 johnpye 775 elif status==ascpy.ASCXX_DOF_STRUCT_SINGULAR:
741     if not self.sim.checkStructuralSingularity():
742     sing = self.sim.getSingularityInfo()
743     title = "Structural singularity"
744     text = title
745     text += "\n\nThe singularity can be reduced by freeing the following variables:"
746     msgs = {
747     "The singularity can be reduced by freeing the following variables" : sing.freeablevars
748     ,"Relations involved in the structural singularity" : sing.rels
749     ,"Variables involved in the structural singularity" : sing.vars
750     }
751     for k,v in msgs.iteritems():
752     text+="\n\n%s:" % k
753     if len(v):
754     _l = [j.getName() for j in v]
755     _l.sort()
756     text+= "\n\t" + "\n\t".join(_l)
757     else:
758     text += "\nnone"
759 johnpye 772
760 johnpye 775 _dialog = InfoDialog(self,self.window,text,title)
761     _dialog.run()
762    
763     self.reporter.reportNote("System DoF check OK")
764    
765 johnpye 278 except RuntimeError, e:
766     self.stop_waiting()
767     self.reporter.reportError(str(e))
768     return
769 johnpye 171
770     self.stop_waiting()
771    
772 johnpye 533 self.modelview.refreshtree()
773 johnpye 132
774     def do_method(self,method):
775     if not self.sim:
776     self.reporter.reportError("No model selected yet")
777    
778     self.sim.run(method)
779 johnpye 917 self.sim.processVarStatus()
780 johnpye 533 self.modelview.refreshtree()
781 johnpye 132
782 johnpye 230 def do_quit(self):
783 johnpye 482 print_loading_status("Saving window location")
784 johnpye 230 self.reporter.clearPythonErrorCallback()
785 johnpye 482
786 johnpye 230 _w,_h = self.window.get_size()
787     _t,_l = self.window.get_position()
788     _display = self.window.get_screen().get_display().get_name()
789     self.prefs.setGeometrySizePosition(_display,"browserwin",_w,_h,_t,_l );
790    
791     _p = self.browserpaned.get_position()
792     self.prefs.setGeometryValue(_display,"browserpaned",_p);
793    
794 johnpye 482 print_loading_status("Saving current directory")
795     self.prefs.setStringPref("Directories","fileopenpath",self.fileopenpath)
796    
797 johnpye 682 self.prefs.setBoolPref("Browser","auto_solve",self.is_auto)
798    
799 johnpye 482 print_loading_status("Saving preferences")
800 johnpye 230 # causes prefs to be saved unless they are still being used elsewher
801     del(self.prefs)
802    
803 johnpye 482 print_loading_status("Closing down GTK")
804 johnpye 230 gtk.main_quit()
805 johnpye 482
806     print_loading_status("Clearing error callback")
807     self.reporter.clearPythonErrorCallback()
808    
809     print_loading_status("Quitting")
810 johnpye 230 return False
811    
812 johnpye 231 def on_tools_sparsity_click(self,*args):
813 johnpye 237
814     self.reporter.reportNote("Preparing incidence matrix...")
815 johnpye 233 _im = self.sim.getIncidenceMatrix();
816 johnpye 231
817 johnpye 237 self.reporter.reportNote("Plotting incidence matrix...")
818 johnpye 234
819 johnpye 237 _sp = IncidenceMatrixWindow(_im);
820     _sp.run();
821    
822 johnpye 912 def on_tools_repaint_tree_activate(self,*args):
823     self.reporter.reportNote("Repainting model view...")
824     self.modelview.refreshtree()
825    
826 johnpye 280 def on_diagnose_blocks_click(self,*args):
827 johnpye 285 try:
828     _bl = self.sim.getActiveBlock()
829     except RuntimeError, e:
830     self.reporter.reportError(str(e))
831     return
832 johnpye 351 _db = DiagnoseWindow(self,_bl)
833 johnpye 280 _db.run();
834    
835 johnpye 245 def on_add_observer_click(self,*args):
836 johnpye 361 self.create_observer()
837 johnpye 245
838 johnpye 250 def on_keep_observed_click(self,*args):
839 johnpye 856 print "KEEPING..."
840 johnpye 250 if len(self.observers) <= 0:
841     self.reporter.reportError("No observer defined!")
842     return
843 johnpye 856 self.tabs[self.currentobservertab].do_add_row()
844 johnpye 250
845     def on_copy_observer_matrix_click(self,*args):
846 johnpye 251 if self.clip == None:
847     self.clip = gtk.Clipboard()
848    
849 johnpye 250 if len(self.observers) <= 0:
850     self.reporter.reportError("No observer defined!")
851     return
852 johnpye 856 self.tabs[self.currentobservertab].copy_to_clipboard(self.clip)
853 johnpye 270
854 johnpye 770 def on_use_relation_sharing_toggle(self,checkmenuitem,*args):
855     _v = checkmenuitem.get_active()
856     self.prefs.setBoolPref("Compiler","use_relation_sharing",_v)
857     self.reporter.reportNote("Relation sharing set to "+str(_v))
858    
859 johnpye 321 def on_show_solving_popup_toggle(self,checkmenuitem,*args):
860     _v = checkmenuitem.get_active()
861     self.prefs.setBoolPref("SolverReporter","show_popup",_v)
862     print "SET TO",_v
863    
864     def on_close_on_converged_toggle(self,checkmenuitem,*args):
865     _v = checkmenuitem.get_active()
866     self.prefs.setBoolPref("SolverReporter","close_on_converged",_v)
867    
868     def on_close_on_nonconverged_toggle(self,checkmenuitem,*args):
869     _v = checkmenuitem.get_active()
870     self.prefs.setBoolPref("SolverReporter","close_on_nonconverged",_v)
871    
872 johnpye 328 def on_show_variables_near_bounds_activate(self,*args):
873     _epsilon = 1e-4;
874 johnpye 895 text = "Variables Near Bounds"
875 johnpye 732 title=text;
876     text += "\n"
877 johnpye 328 _vars = self.sim.getVariablesNearBounds(_epsilon)
878 johnpye 732 if len(_vars):
879     for _v in _vars:
880     text += "\n%s"%_v.getName()
881     else:
882     text +="\nnone"
883     _dialog = InfoDialog(self,self.window,text,title)
884     _dialog.run()
885 johnpye 328
886 johnpye 132 # --------------------------------------------
887     # MODULE LIST
888    
889     def module_activated(self, treeview, path, column, *args):
890     modules = self.library.getModules()
891     print "PATH",path
892     if len(path)==1:
893     self.reporter.reportNote("Launching of external editor not yet implemented")
894     elif len(path)==2:
895     if(self.modtank.has_key(path)):
896     _type = self.modtank[path];
897     self.reporter.reportNote("Creating simulation for type %s" % str(_type.getName()) )
898     self.do_sim(_type)
899     else:
900     self.reporter.reportError("Didn't find type corresponding to row")
901    
902     # ----------------------------------
903     # ERROR PANEL
904    
905 johnpye 255 def get_error_row_data(self,sev,filename,line,msg):
906     _sevicon = {
907     0: self.iconok
908     ,1: self.iconinfo
909     ,2: self.iconwarning
910     ,3: self.iconerror
911     ,4: self.iconinfo
912     ,5: self.iconwarning
913     ,6: self.iconerror
914     }[sev]
915    
916     _fontweight = pango.WEIGHT_NORMAL
917     if sev==6:
918     _fontweight = pango.WEIGHT_BOLD
919    
920     _fgcolor = "black"
921     if sev==4:
922     _fgcolor = "#888800"
923     elif sev==5:
924     _fgcolor = "#884400"
925     elif sev==6:
926     _fgcolor = "#880000"
927     elif sev==0:
928     _fgcolor = BROWSER_FIXED_COLOR
929    
930     if not filename and not line:
931     _fileline = ""
932     else:
933     if(len(filename) > 25):
934     filename = "..."+filename[-22:]
935     _fileline = filename + ":" + str(line)
936    
937     _res = [_sevicon,_fileline,msg.rstrip(),_fgcolor,_fontweight]
938     #print _res
939     return _res
940    
941 johnpye 132 def error_callback(self,sev,filename,line,msg):
942 johnpye 875 try:
943     pos = self.errorstore.append(None, self.get_error_row_data(sev, filename,line,msg))
944     path = self.errorstore.get_path(pos)
945     col = self.errorview.get_column(3)
946     self.errorview.scroll_to_cell(path,col)
947     except Exception,e:
948     print "UNABLE TO DISPLAY ERROR MESSAGE '%s'"%msg
949 johnpye 132
950     return 0;
951    
952     # --------------------------------
953     # BUTTON METHODS
954    
955     def open_click(self,*args):
956 johnpye 669 #print_loading_status("CURRENT FILEOPENPATH is",self.fileopenpath)
957 johnpye 482 dialog = gtk.FileChooserDialog("Open ASCEND model...",
958     self.window,
959     gtk.FILE_CHOOSER_ACTION_OPEN,
960     (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)
961     )
962     dialog.set_current_folder(self.fileopenpath)
963 johnpye 132 dialog.set_default_response(gtk.RESPONSE_OK)
964 johnpye 329 dialog.set_transient_for(self.window)
965     dialog.set_modal(True)
966 johnpye 132
967     filter = gtk.FileFilter()
968     filter.set_name("*.a4c, *.a4l")
969     filter.add_pattern("*.[Aa]4[Cc]")
970     filter.add_pattern("*.[Aa]4[Ll]")
971     dialog.add_filter(filter)
972    
973     filter = gtk.FileFilter()
974     filter.set_name("All files")
975     filter.add_pattern("*")
976     dialog.add_filter(filter)
977    
978     response = dialog.run()
979     _filename = dialog.get_filename()
980 johnpye 669 print "\nFILENAME SELECTED:",_filename
981 johnpye 482
982     _path = dialog.get_current_folder()
983     if _path:
984     self.fileopenpath = _path
985    
986 johnpye 329 dialog.hide()
987 johnpye 132
988     if response == gtk.RESPONSE_OK:
989     self.reporter.reportNote("File %s selected." % dialog.get_filename() )
990 johnpye 185 self.library.clear()
991 johnpye 329 self.do_open( _filename)
992 johnpye 132
993     def reload_click(self,*args):
994     _type = None
995     if(self.sim):
996     _type = self.sim.getType().getName().toString();
997    
998 johnpye 185 self.library.clear()
999 johnpye 132 self.do_open(self.filename)
1000    
1001     if _type:
1002     _t = self.library.findType(_type)
1003     self.do_sim(_t)
1004    
1005 johnpye 533 def props_activate(self,widget,*args):
1006     return self.modelview.props_activate(self,widget,*args)
1007    
1008     def observe_activate(self,widget,*args):
1009     return self.modelview.observe_activate(self,widget,*args)
1010    
1011 johnpye 132 def solve_click(self,*args):
1012     #self.reporter.reportError("Solving simulation '" + self.sim.getName().toString() +"'...")
1013     self.do_solve()
1014 johnpye 669
1015     def console_click(self,*args):
1016     try:
1017     console.start(self)
1018     except RuntimeError,e:
1019     self.reporter.reportError("Unable to start console: "+str(e));
1020    
1021     def integrate_click(self,*args):
1022     self.do_integrate()
1023 johnpye 132
1024     def check_click(self,*args):
1025     self.do_check()
1026     #self.reporter.reportError("CHECK clicked")
1027    
1028 johnpye 208 def preferences_click(self,*args):
1029     if not self.sim:
1030     self.reporter.reportError("No simulation created yet!");
1031    
1032 johnpye 351 _paramswin = SolverParametersWindow(self)
1033 johnpye 223 _paramswin.show()
1034 johnpye 221
1035 johnpye 132 def methodrun_click(self,*args):
1036     _sel = self.methodsel.get_active_text()
1037     if _sel:
1038     _method = None
1039     _methods = self.sim.getType().getMethods()
1040     for _m in _methods:
1041     if _m.getName()==_sel:
1042     _method = _m
1043     if not _method:
1044     self.reporter.reportError("Method is not valid")
1045     return
1046     self.do_method(_method)
1047     else:
1048     self.reporter.reportError("No method selected")
1049    
1050     def auto_toggle(self,button,*args):
1051 johnpye 230 self.is_auto = button.get_active()
1052 johnpye 688 if hasattr(self,'automenu'):
1053     self.automenu.set_active(self.is_auto)
1054 johnpye 132 else:
1055 johnpye 688 raise RuntimeError("no automenu")
1056 johnpye 132
1057 johnpye 688 #if self.is_auto:
1058     # self.reporter.reportSuccess("Auto mode is now ON")
1059     #else:
1060     # self.reporter.reportSuccess("Auto mode is now OFF")
1061    
1062 johnpye 230 def on_file_quit_click(self,*args):
1063     self.do_quit()
1064    
1065     def on_tools_auto_toggle(self,checkmenuitem,*args):
1066     self.is_auto = checkmenuitem.get_active()
1067     self.autotoggle.set_active(self.is_auto)
1068    
1069     def on_help_about_click(self,*args):
1070 johnpye 436 _xml = gtk.glade.XML(self.glade_file,"aboutdialog")
1071 johnpye 307 _about = _xml.get_widget("aboutdialog")
1072 johnpye 328 _about.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
1073     _about.set_transient_for(self.window);
1074 johnpye 478 _about.set_version(config.VERSION)
1075 johnpye 307 _about.run()
1076     _about.destroy()
1077 johnpye 230
1078     def on_help_contents_click(self,*args):
1079     _help = Help(HELP_ROOT)
1080     _help.run()
1081    
1082 johnpye 904 def on_help_check_for_updates_click(self,*args):
1083     v = VersionCheck()
1084     title = "Check for updates"
1085     text = "Your version is %s\n" % config.VERSION
1086 johnpye 905 try:
1087     v.check()
1088     text += "Latest version is %s\n" % v.latest
1089     if v.info:
1090     text += "Get more info at %s\n" % v.info
1091     if v.download:
1092     text += "Download from %s\n" % v.download
1093     except Exception, e:
1094     text += "\nUnable to check version\n"
1095     text += str(e)
1096 johnpye 904
1097     _dialog = InfoDialog(self,self.window,text,title)
1098     _dialog.run()
1099    
1100 johnpye 775 def on_show_fixable_variables_activate(self,*args):
1101 johnpye 290 v = self.sim.getFixableVariables()
1102 johnpye 732 text = "Fixable Variables"
1103 johnpye 750 title = text
1104 johnpye 732 text += "\n"
1105     if len(v):
1106     for var in v:
1107     text += "\n%s"%var
1108     else:
1109     text += "\nnone"
1110     _dialog = InfoDialog(self,self.window,text,title)
1111     _dialog.run()
1112 johnpye 290
1113 johnpye 775 def on_show_freeable_variables_activate(self,*args):
1114     v = self.sim.getFreeableVariables()
1115    
1116     text = "Freeable Variables"
1117     title = text
1118     text += "\n"
1119     if len(v):
1120     for var in v:
1121     text += "\n%s" % var
1122     else:
1123     text += "\nnone"
1124     _dialog = InfoDialog(self,self.window,text,title)
1125     _dialog.run()
1126    
1127 johnpye 750 def on_show_external_functions_activate(self,*args):
1128     v = self.library.getExtMethods()
1129     text = "External Functions"
1130     title = text
1131     text +="\nHere is the list of external functions currently present in"
1132     text +=" the Library:"
1133    
1134     if len(v):
1135     for ext in v:
1136     text += "\n\n%s (%d inputs, %d outputs):" % \
1137     (ext.getName(), ext.getNumInputs(), ext.getNumOutputs())
1138     text += "\n%s" % ext.getHelp()
1139     else:
1140     text +="\n\nNone"
1141     _dialog = InfoDialog(self,self.window,text,title)
1142     _dialog.run()
1143    
1144 johnpye 856 def on_maintabs_switch_page(self,notebook,page,pagenum):
1145     print("Page switched to %d" % pagenum)
1146     if pagenum in self.tabs.keys():
1147     self.currentobservertab = pagenum
1148    
1149 johnpye 245 def create_observer(self,name=None):
1150 johnpye 436 _xml = gtk.glade.XML(self.glade_file,"observervbox");
1151 johnpye 245 _label = gtk.Label();
1152 johnpye 252 _tab = self.maintabs.append_page(_xml.get_widget("observervbox"),_label);
1153 johnpye 849 _obs = ObserverTab(xml=_xml, name=name, browser=self, tab=_tab)
1154     _label.set_text(_obs.name)
1155     self.observers.append(_obs)
1156 johnpye 856 self.tabs[_tab] = _obs
1157     self.currentobservertab = _tab
1158 johnpye 849 return _obs
1159 johnpye 249
1160     def sync_observers(self):
1161     for _o in self.observers:
1162     _o.sync()
1163 johnpye 533
1164     def delete_event(self, widget, event):
1165     self.do_quit()
1166     return False
1167 johnpye 249
1168 johnpye 533 def observe(self,instance):
1169 johnpye 246 if len(self.observers) ==0:
1170     self.create_observer()
1171 johnpye 856 _observer = self.tabs[self.currentobservertab]
1172 johnpye 533 _observer.add_instance(instance)
1173 johnpye 132
1174 johnpye 478 if __name__ == "__main__":
1175 johnpye 132 b = Browser();
1176     b.run()

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