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

Contents of /trunk/pygtk/gtkbrowser.py

Parent Directory Parent Directory | Revision Log Revision Log


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

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