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

Annotation of /trunk/pygtk/gtkbrowser.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 935 - (hide annotations) (download) (as text)
Fri Nov 24 00:37:11 2006 UTC (12 years, 7 months ago) by johnpye
File MIME type: text/x-python
File size: 34489 byte(s)
Adopted suggestions wrt Py_None on Windows platform (extpy)
Fixed up default values of CUNIT_PREFIX (needs testing for case where missing)
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 932 self.sim = type_object.getSimulation(str(type_object.getName())+"_sim",False)
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 902 # get method names and load them into the GUI
643     self.methodstore.clear()
644     _methods = self.sim.getType().getMethods()
645     _activemethod = None;
646     for _m in _methods:
647     _i = self.methodstore.append([_m.getName()])
648     if _m.getName()=="on_load":
649     self.methodsel.set_active_iter(_i)
650    
651     self.modelview.setSimulation(self.sim)
652    
653     # run the 'on_load' method
654 johnpye 900 self.start_waiting("Running default method...")
655     try:
656 johnpye 915 self.reporter.reportNote("SIMULATION CREATED, RUNNING DEFAULT METHOD NOW...")
657 johnpye 900 self.sim.runDefaultMethod()
658     except RuntimeError, e:
659     self.stop_waiting()
660     self.reporter.reportError(str(e))
661     return
662     self.stop_waiting()
663 johnpye 903
664     self.modelview.refreshtree()
665 johnpye 249
666     def do_solve_if_auto(self):
667     if self.is_auto:
668 johnpye 775 self.sim.checkInstance()
669 johnpye 249 self.do_solve()
670     else:
671 johnpye 255 self.sim.processVarStatus()
672 johnpye 533 self.modelview.refreshtree()
673 johnpye 249
674     self.sync_observers()
675 johnpye 132
676     def do_solve(self):
677     if not self.sim:
678     self.reporter.reportError("No model selected yet")
679 johnpye 669 return
680 johnpye 132
681 johnpye 919 try:
682     self.sim.build()
683     except RuntimeError,e:
684     self.reporter.reportError("Couldn't build system: %s",str(e));
685     return
686    
687 johnpye 786 self.start_waiting("Solving with %s..." % self.solver.getName())
688 johnpye 164
689 johnpye 321 if self.prefs.getBoolPref("SolverReporter","show_popup",True):
690 johnpye 351 reporter = PopupSolverReporter(self,self.sim.getNumVars())
691 johnpye 321 else:
692     reporter = SimpleSolverReporter(self)
693    
694 johnpye 785 self.sim.solve(self.solver,reporter)
695 johnpye 164
696 johnpye 168 self.stop_waiting()
697 johnpye 255
698 johnpye 533 self.modelview.refreshtree()
699 johnpye 132
700 johnpye 669 def do_integrate(self):
701     if not self.sim:
702     self.reporter.reportError("No model selected yet")
703     return
704     integwin = IntegratorWindow(self,self.sim)
705     _integratorreporter = integwin.run()
706     if _integratorreporter!=None:
707     _integratorreporter.run()
708     self.sim.processVarStatus()
709     self.modelview.refreshtree()
710    
711    
712 johnpye 132 def do_check(self):
713     if not self.sim:
714 johnpye 775 self.reporter.reportError("No simulation yet")
715 johnpye 669 return
716 johnpye 132
717 johnpye 171 self.start_waiting("Checking system...")
718    
719 johnpye 278 try:
720 johnpye 775 self.sim.checkInstance()
721     self.reporter.reportWarning("System instance check run, check above for error (if any).")
722     # the above gives output but doesn't throw errors or return a status.
723     # ... this is a problem (at the C level)
724 johnpye 772
725 johnpye 775 status = self.sim.checkDoF()
726     if status==ascpy.ASCXX_DOF_UNDERSPECIFIED:
727 johnpye 776 self.on_show_fixable_variables_activate(None)
728 johnpye 918 return
729 johnpye 775 elif status==ascpy.ASCXX_DOF_OVERSPECIFIED:
730 johnpye 776 self.on_show_freeable_variables_activate(None)
731 johnpye 918 return
732 johnpye 775 elif status==ascpy.ASCXX_DOF_STRUCT_SINGULAR:
733     if not self.sim.checkStructuralSingularity():
734     sing = self.sim.getSingularityInfo()
735     title = "Structural singularity"
736     text = title
737     text += "\n\nThe singularity can be reduced by freeing the following variables:"
738     msgs = {
739     "The singularity can be reduced by freeing the following variables" : sing.freeablevars
740     ,"Relations involved in the structural singularity" : sing.rels
741     ,"Variables involved in the structural singularity" : sing.vars
742     }
743     for k,v in msgs.iteritems():
744     text+="\n\n%s:" % k
745     if len(v):
746     _l = [j.getName() for j in v]
747     _l.sort()
748     text+= "\n\t" + "\n\t".join(_l)
749     else:
750     text += "\nnone"
751 johnpye 772
752 johnpye 775 _dialog = InfoDialog(self,self.window,text,title)
753     _dialog.run()
754 johnpye 918 return
755 johnpye 775
756     self.reporter.reportNote("System DoF check OK")
757    
758 johnpye 278 except RuntimeError, e:
759     self.stop_waiting()
760     self.reporter.reportError(str(e))
761     return
762 johnpye 171
763     self.stop_waiting()
764    
765 johnpye 533 self.modelview.refreshtree()
766 johnpye 132
767     def do_method(self,method):
768     if not self.sim:
769     self.reporter.reportError("No model selected yet")
770    
771     self.sim.run(method)
772 johnpye 917 self.sim.processVarStatus()
773 johnpye 533 self.modelview.refreshtree()
774 johnpye 132
775 johnpye 230 def do_quit(self):
776 johnpye 482 print_loading_status("Saving window location")
777 johnpye 230 self.reporter.clearPythonErrorCallback()
778 johnpye 482
779 johnpye 230 _w,_h = self.window.get_size()
780     _t,_l = self.window.get_position()
781     _display = self.window.get_screen().get_display().get_name()
782     self.prefs.setGeometrySizePosition(_display,"browserwin",_w,_h,_t,_l );
783    
784     _p = self.browserpaned.get_position()
785     self.prefs.setGeometryValue(_display,"browserpaned",_p);
786    
787 johnpye 482 print_loading_status("Saving current directory")
788     self.prefs.setStringPref("Directories","fileopenpath",self.fileopenpath)
789    
790 johnpye 682 self.prefs.setBoolPref("Browser","auto_solve",self.is_auto)
791    
792 johnpye 482 print_loading_status("Saving preferences")
793 johnpye 230 # causes prefs to be saved unless they are still being used elsewher
794     del(self.prefs)
795    
796 johnpye 482 print_loading_status("Closing down GTK")
797 johnpye 230 gtk.main_quit()
798 johnpye 482
799     print_loading_status("Clearing error callback")
800     self.reporter.clearPythonErrorCallback()
801    
802     print_loading_status("Quitting")
803 johnpye 230 return False
804    
805 johnpye 231 def on_tools_sparsity_click(self,*args):
806 johnpye 237
807     self.reporter.reportNote("Preparing incidence matrix...")
808 johnpye 233 _im = self.sim.getIncidenceMatrix();
809 johnpye 231
810 johnpye 237 self.reporter.reportNote("Plotting incidence matrix...")
811 johnpye 234
812 johnpye 237 _sp = IncidenceMatrixWindow(_im);
813     _sp.run();
814    
815 johnpye 912 def on_tools_repaint_tree_activate(self,*args):
816     self.reporter.reportNote("Repainting model view...")
817     self.modelview.refreshtree()
818    
819 johnpye 280 def on_diagnose_blocks_click(self,*args):
820 johnpye 285 try:
821     _bl = self.sim.getActiveBlock()
822     except RuntimeError, e:
823     self.reporter.reportError(str(e))
824     return
825 johnpye 351 _db = DiagnoseWindow(self,_bl)
826 johnpye 280 _db.run();
827    
828 johnpye 245 def on_add_observer_click(self,*args):
829 johnpye 361 self.create_observer()
830 johnpye 245
831 johnpye 250 def on_keep_observed_click(self,*args):
832 johnpye 856 print "KEEPING..."
833 johnpye 250 if len(self.observers) <= 0:
834     self.reporter.reportError("No observer defined!")
835     return
836 johnpye 856 self.tabs[self.currentobservertab].do_add_row()
837 johnpye 250
838     def on_copy_observer_matrix_click(self,*args):
839 johnpye 251 if self.clip == None:
840     self.clip = gtk.Clipboard()
841    
842 johnpye 250 if len(self.observers) <= 0:
843     self.reporter.reportError("No observer defined!")
844     return
845 johnpye 856 self.tabs[self.currentobservertab].copy_to_clipboard(self.clip)
846 johnpye 270
847 johnpye 770 def on_use_relation_sharing_toggle(self,checkmenuitem,*args):
848     _v = checkmenuitem.get_active()
849     self.prefs.setBoolPref("Compiler","use_relation_sharing",_v)
850     self.reporter.reportNote("Relation sharing set to "+str(_v))
851    
852 johnpye 321 def on_show_solving_popup_toggle(self,checkmenuitem,*args):
853     _v = checkmenuitem.get_active()
854     self.prefs.setBoolPref("SolverReporter","show_popup",_v)
855     print "SET TO",_v
856    
857     def on_close_on_converged_toggle(self,checkmenuitem,*args):
858     _v = checkmenuitem.get_active()
859     self.prefs.setBoolPref("SolverReporter","close_on_converged",_v)
860    
861     def on_close_on_nonconverged_toggle(self,checkmenuitem,*args):
862     _v = checkmenuitem.get_active()
863     self.prefs.setBoolPref("SolverReporter","close_on_nonconverged",_v)
864    
865 johnpye 328 def on_show_variables_near_bounds_activate(self,*args):
866     _epsilon = 1e-4;
867 johnpye 895 text = "Variables Near Bounds"
868 johnpye 732 title=text;
869     text += "\n"
870 johnpye 328 _vars = self.sim.getVariablesNearBounds(_epsilon)
871 johnpye 732 if len(_vars):
872     for _v in _vars:
873     text += "\n%s"%_v.getName()
874     else:
875     text +="\nnone"
876     _dialog = InfoDialog(self,self.window,text,title)
877     _dialog.run()
878 johnpye 328
879 johnpye 132 # --------------------------------------------
880     # MODULE LIST
881    
882     def module_activated(self, treeview, path, column, *args):
883     modules = self.library.getModules()
884     print "PATH",path
885     if len(path)==1:
886     self.reporter.reportNote("Launching of external editor not yet implemented")
887     elif len(path)==2:
888     if(self.modtank.has_key(path)):
889     _type = self.modtank[path];
890     self.reporter.reportNote("Creating simulation for type %s" % str(_type.getName()) )
891     self.do_sim(_type)
892     else:
893     self.reporter.reportError("Didn't find type corresponding to row")
894    
895     # ----------------------------------
896     # ERROR PANEL
897    
898 johnpye 255 def get_error_row_data(self,sev,filename,line,msg):
899 johnpye 933 try:
900     _sevicon = {
901     0 : self.iconok
902     ,1 : self.iconinfo
903     ,2 : self.iconwarning
904     ,4 : self.iconerror
905     ,8 : self.iconinfo
906     ,16 : self.iconwarning
907     ,32 : self.iconerror
908     ,64 : self.iconerror
909     }[sev]
910     except KeyError:
911     _sevicon = self.iconerror
912 johnpye 255
913     _fontweight = pango.WEIGHT_NORMAL
914 johnpye 933 if sev==32 or sev==64:
915 johnpye 255 _fontweight = pango.WEIGHT_BOLD
916    
917     _fgcolor = "black"
918 johnpye 933 if sev==8:
919 johnpye 255 _fgcolor = "#888800"
920 johnpye 933 elif sev==16:
921 johnpye 255 _fgcolor = "#884400"
922 johnpye 933 elif sev==32 or sev==64:
923 johnpye 255 _fgcolor = "#880000"
924     elif sev==0:
925     _fgcolor = BROWSER_FIXED_COLOR
926    
927     if not filename and not line:
928     _fileline = ""
929     else:
930     if(len(filename) > 25):
931     filename = "..."+filename[-22:]
932     _fileline = filename + ":" + str(line)
933    
934 johnpye 933 _res = (_sevicon,_fileline,msg.rstrip(),_fgcolor,_fontweight)
935 johnpye 255 #print _res
936     return _res
937    
938 johnpye 132 def error_callback(self,sev,filename,line,msg):
939 johnpye 933 #print "SEV =",sev
940     #print "FILENAME =",filename
941     #print "LINE =",line
942     #print "MSG =",msg
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 johnpye 132 return 0;
948    
949     # --------------------------------
950     # BUTTON METHODS
951    
952     def open_click(self,*args):
953 johnpye 669 #print_loading_status("CURRENT FILEOPENPATH is",self.fileopenpath)
954 johnpye 482 dialog = gtk.FileChooserDialog("Open ASCEND model...",
955     self.window,
956     gtk.FILE_CHOOSER_ACTION_OPEN,
957     (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)
958     )
959     dialog.set_current_folder(self.fileopenpath)
960 johnpye 132 dialog.set_default_response(gtk.RESPONSE_OK)
961 johnpye 329 dialog.set_transient_for(self.window)
962     dialog.set_modal(True)
963 johnpye 132
964     filter = gtk.FileFilter()
965     filter.set_name("*.a4c, *.a4l")
966     filter.add_pattern("*.[Aa]4[Cc]")
967     filter.add_pattern("*.[Aa]4[Ll]")
968     dialog.add_filter(filter)
969    
970     filter = gtk.FileFilter()
971     filter.set_name("All files")
972     filter.add_pattern("*")
973     dialog.add_filter(filter)
974    
975     response = dialog.run()
976     _filename = dialog.get_filename()
977 johnpye 669 print "\nFILENAME SELECTED:",_filename
978 johnpye 482
979     _path = dialog.get_current_folder()
980     if _path:
981     self.fileopenpath = _path
982    
983 johnpye 329 dialog.hide()
984 johnpye 132
985     if response == gtk.RESPONSE_OK:
986     self.reporter.reportNote("File %s selected." % dialog.get_filename() )
987 johnpye 185 self.library.clear()
988 johnpye 329 self.do_open( _filename)
989 johnpye 132
990     def reload_click(self,*args):
991     _type = None
992     if(self.sim):
993     _type = self.sim.getType().getName().toString();
994    
995 johnpye 185 self.library.clear()
996 johnpye 132 self.do_open(self.filename)
997    
998     if _type:
999     _t = self.library.findType(_type)
1000     self.do_sim(_t)
1001    
1002 johnpye 533 def props_activate(self,widget,*args):
1003     return self.modelview.props_activate(self,widget,*args)
1004    
1005     def observe_activate(self,widget,*args):
1006     return self.modelview.observe_activate(self,widget,*args)
1007    
1008 johnpye 132 def solve_click(self,*args):
1009     #self.reporter.reportError("Solving simulation '" + self.sim.getName().toString() +"'...")
1010     self.do_solve()
1011 johnpye 669
1012     def console_click(self,*args):
1013     try:
1014     console.start(self)
1015     except RuntimeError,e:
1016     self.reporter.reportError("Unable to start console: "+str(e));
1017    
1018     def integrate_click(self,*args):
1019     self.do_integrate()
1020 johnpye 132
1021     def check_click(self,*args):
1022     self.do_check()
1023     #self.reporter.reportError("CHECK clicked")
1024    
1025 johnpye 208 def preferences_click(self,*args):
1026     if not self.sim:
1027 johnpye 919 self.reporter.reportError("No simulation created yet!");
1028     self.sim.setSolver(self.solver)
1029 johnpye 351 _paramswin = SolverParametersWindow(self)
1030 johnpye 223 _paramswin.show()
1031 johnpye 221
1032 johnpye 132 def methodrun_click(self,*args):
1033     _sel = self.methodsel.get_active_text()
1034     if _sel:
1035     _method = None
1036     _methods = self.sim.getType().getMethods()
1037     for _m in _methods:
1038     if _m.getName()==_sel:
1039     _method = _m
1040     if not _method:
1041     self.reporter.reportError("Method is not valid")
1042     return
1043     self.do_method(_method)
1044     else:
1045     self.reporter.reportError("No method selected")
1046    
1047     def auto_toggle(self,button,*args):
1048 johnpye 230 self.is_auto = button.get_active()
1049 johnpye 688 if hasattr(self,'automenu'):
1050     self.automenu.set_active(self.is_auto)
1051 johnpye 132 else:
1052 johnpye 688 raise RuntimeError("no automenu")
1053 johnpye 132
1054 johnpye 688 #if self.is_auto:
1055     # self.reporter.reportSuccess("Auto mode is now ON")
1056     #else:
1057     # self.reporter.reportSuccess("Auto mode is now OFF")
1058    
1059 johnpye 230 def on_file_quit_click(self,*args):
1060     self.do_quit()
1061    
1062     def on_tools_auto_toggle(self,checkmenuitem,*args):
1063     self.is_auto = checkmenuitem.get_active()
1064     self.autotoggle.set_active(self.is_auto)
1065    
1066     def on_help_about_click(self,*args):
1067 johnpye 436 _xml = gtk.glade.XML(self.glade_file,"aboutdialog")
1068 johnpye 307 _about = _xml.get_widget("aboutdialog")
1069 johnpye 328 _about.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
1070     _about.set_transient_for(self.window);
1071 johnpye 478 _about.set_version(config.VERSION)
1072 johnpye 307 _about.run()
1073     _about.destroy()
1074 johnpye 230
1075     def on_help_contents_click(self,*args):
1076     _help = Help(HELP_ROOT)
1077     _help.run()
1078    
1079 johnpye 904 def on_help_check_for_updates_click(self,*args):
1080     v = VersionCheck()
1081     title = "Check for updates"
1082     text = "Your version is %s\n" % config.VERSION
1083 johnpye 905 try:
1084     v.check()
1085     text += "Latest version is %s\n" % v.latest
1086     if v.info:
1087     text += "Get more info at %s\n" % v.info
1088     if v.download:
1089     text += "Download from %s\n" % v.download
1090     except Exception, e:
1091     text += "\nUnable to check version\n"
1092     text += str(e)
1093 johnpye 904
1094     _dialog = InfoDialog(self,self.window,text,title)
1095     _dialog.run()
1096    
1097 johnpye 775 def on_show_fixable_variables_activate(self,*args):
1098 johnpye 290 v = self.sim.getFixableVariables()
1099 johnpye 732 text = "Fixable Variables"
1100 johnpye 750 title = text
1101 johnpye 732 text += "\n"
1102     if len(v):
1103     for var in v:
1104     text += "\n%s"%var
1105     else:
1106     text += "\nnone"
1107     _dialog = InfoDialog(self,self.window,text,title)
1108     _dialog.run()
1109 johnpye 290
1110 johnpye 775 def on_show_freeable_variables_activate(self,*args):
1111     v = self.sim.getFreeableVariables()
1112    
1113     text = "Freeable Variables"
1114     title = text
1115     text += "\n"
1116     if len(v):
1117     for var in v:
1118     text += "\n%s" % var
1119     else:
1120     text += "\nnone"
1121     _dialog = InfoDialog(self,self.window,text,title)
1122     _dialog.run()
1123    
1124 johnpye 750 def on_show_external_functions_activate(self,*args):
1125     v = self.library.getExtMethods()
1126     text = "External Functions"
1127     title = text
1128     text +="\nHere is the list of external functions currently present in"
1129     text +=" the Library:"
1130    
1131     if len(v):
1132     for ext in v:
1133     text += "\n\n%s (%d inputs, %d outputs):" % \
1134     (ext.getName(), ext.getNumInputs(), ext.getNumOutputs())
1135     text += "\n%s" % ext.getHelp()
1136     else:
1137     text +="\n\nNone"
1138     _dialog = InfoDialog(self,self.window,text,title)
1139     _dialog.run()
1140    
1141 johnpye 856 def on_maintabs_switch_page(self,notebook,page,pagenum):
1142     print("Page switched to %d" % pagenum)
1143     if pagenum in self.tabs.keys():
1144     self.currentobservertab = pagenum
1145    
1146 johnpye 245 def create_observer(self,name=None):
1147 johnpye 436 _xml = gtk.glade.XML(self.glade_file,"observervbox");
1148 johnpye 245 _label = gtk.Label();
1149 johnpye 252 _tab = self.maintabs.append_page(_xml.get_widget("observervbox"),_label);
1150 johnpye 849 _obs = ObserverTab(xml=_xml, name=name, browser=self, tab=_tab)
1151     _label.set_text(_obs.name)
1152     self.observers.append(_obs)
1153 johnpye 856 self.tabs[_tab] = _obs
1154     self.currentobservertab = _tab
1155 johnpye 849 return _obs
1156 johnpye 249
1157     def sync_observers(self):
1158     for _o in self.observers:
1159     _o.sync()
1160 johnpye 533
1161     def delete_event(self, widget, event):
1162     self.do_quit()
1163     return False
1164 johnpye 249
1165 johnpye 533 def observe(self,instance):
1166 johnpye 246 if len(self.observers) ==0:
1167     self.create_observer()
1168 johnpye 856 _observer = self.tabs[self.currentobservertab]
1169 johnpye 533 _observer.add_instance(instance)
1170 johnpye 132
1171 johnpye 478 if __name__ == "__main__":
1172 johnpye 132 b = Browser();
1173     b.run()

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