""" This file defines the ModuleManager class that is responsible for managing all the Modules and Filters for a particular data source. This code is distributed under the conditions of the BSD license. See LICENSE.txt for details. Copyright (c) 2001-2002, Prabhu Ramachandran. """ __author__ = "Prabhu Ramachandran " __version__ = "$Revision: 1.13 $" __date__ = "$Date: 2004/07/06 23:06:31 $" import Misc.LutHandler, Common, Tkinter import sys _PARENT = '' if sys.modules.has_key ('mayavi'): _PARENT = 'mayavi.' debug = Common.debug class ModuleManager: """ This class manages a bunch of various Filters and Modules.""" def __init__ (self, dvm): """ Argument 'dvm' is a DataVizManager instance.""" debug ("In ModuleManager::__init__ ()") self.dvm = dvm self.data_src = dvm.get_data_source () self.renwin= dvm.get_render_window () self.filter = {} self.fil_name = [] self.module = {} self.mod_name = [] self.n_mod = 0 self.n_fil = 0 self.cur_mod_name = "" self.cur_fil_name = None # The GUI list boxes self.fil_lst = None self.mod_lst = None # LUTs self.scalar_lut_h = Misc.LutHandler.LutHandler () self.scalar_lut_h.initialize (self) _cfg = Common.config.scalar_lut_cfg if _cfg: self.scalar_lut_h.load_config(_cfg) self.vector_lut_h = Misc.LutHandler.LutHandler () self.vector_lut_h.initialize (self) _cfg = Common.config.vector_lut_cfg if _cfg: self.vector_lut_h.load_config(_cfg) self.scalar_data_range = [0.0, 1.0] self.vector_data_range = [0.0, 1.0] self.data_src.add_reference (self) self.Update () def __del__ (self): debug ("In ModuleManager::__del__ ()") def clear (self): """This is needed to prevent self-referential loops and is usually called before a ModuleManager is destroyed.""" debug ("In ModuleManager::clear ()") self.data_src.del_reference (self) for key in self.mod_name[:]: self.del_module (key) for key in self.fil_name[:]: self.del_filter (key) del self.scalar_lut_h del self.vector_lut_h self.renwin.Render () def config_changed (self): """The configuration file has changed - take notice and update all modules and filters.""" debug ("In ModuleManager::config_changed ()") self.scalar_lut_h.config_changed () self.vector_lut_h.config_changed () for fil in self.filter.values (): fil.config_changed () for mod in self.module.values (): mod.config_changed () def get_data_source (self): """ Get the data source object for this object.""" debug ("In ModuleManager::get_data_source ()") return self.data_src def get_render_window (self): debug ("In ModuleManager::get_render_window ()") return self.renwin def get_scalar_lut_handler (self): debug ("In ModuleManager::get_scalar_lut_handler ()") return self.scalar_lut_h def get_scalar_lut (self): debug ("In ModuleManager::get_scalar_lut ()") return self.scalar_lut_h.get_lut () def get_vector_lut_handler (self): debug ("In ModuleManager::get_vector_lut_handler ()") return self.vector_lut_h def get_vector_lut (self): debug ("In ModuleManager::get_vector_lut ()") return self.vector_lut_h.get_lut () def get_scalar_data_range (self): debug ("In ModuleManager::get_scalar_data_range ()") return self.scalar_lut_h.get_data_range () def get_vector_data_range (self): debug ("In ModuleManager::get_vector_data_range ()") return self.vector_lut_h.get_data_range () def get_scalar_data_name (self): debug ("In ModuleManager::get_scalar_data_name ()") return self.get_last_source ().get_scalar_data_name () def get_vector_data_name (self): debug ("In ModuleManager::get_vector_data_name ()") return self.get_last_source ().get_vector_data_name () def get_last_source (self): """Get the last source object. If there are filters this returns the last of the filters if not it returns the data source.""" debug ("In ModuleManager::get_last_source ()") if not self.filter: return self.data_src else: return self.filter[self.fil_name[-1]] def GetOutput (self): """Returns the output of the filtered data.""" debug ("In ModuleManager::GetOutput ()") if not self.filter: f = self.data_src else: f = self.filter[self.fil_name[-1]] return f.GetOutput () def get_module_names(self): """Returns the list of module names that are being managed.""" return self.mod_name def get_module(self, val): """Returns the module given an integer index into the list of module names or the module name itself.""" if type(val) == type("string"): return self.module.get(val) elif type(val) == type(1): if val < len(self.mod_name): return self.module[self.mod_name[val]] return None def _get_scalar_range (self, data_out): debug ("In ModuleManager::_get_scalar_range ()") sc_name = self.data_src.get_scalar_data_name () pd = data_out.GetPointData ().GetScalars () cd = data_out.GetCellData ().GetScalars () dr = [] if pd and cd: if hasattr (pd, 'GetName'): # VTK 4.0 and above if (sc_name == pd.GetName ()): dr = pd.GetRange () elif sc_name == cd.GetName (): dr = cd.GetRange () else: # old VTK release (this should not usually happen). pr = pd.GetRange () cr = cd.GetRange () dr = [min (cr[0], pr[0]), max (cr[1], pr[1])] elif pd: dr = pd.GetRange () elif cd: dr = cd.GetRange () if dr: self.scalar_data_range = dr val = self.get_scalar_data_name () self.scalar_lut_h.set_data_name (val) self.scalar_lut_h.set_data_range (self.scalar_data_range) def _get_max_norm (self, data_out): debug ("In ModuleManager::_get_max_norm ()") vec_name = self.data_src.get_vector_data_name () pd = data_out.GetPointData ().GetVectors () cd = data_out.GetCellData ().GetVectors () max_v = 0.0 if pd and cd: if hasattr (pd, 'GetName'): # VTK 4.0 and above if (vec_name == pd.GetName ()): max_v = pd.GetMaxNorm() elif vec_name == cd.GetName (): max_v = cd.GetMaxNorm () else: # old version of VTK. :( max_v = max (pd.GetMaxNorm (), cd.GetMaxNorm ()) elif pd: max_v = pd.GetMaxNorm () elif cd: max_v = cd.GetMaxNorm () if max_v: self.vector_data_range = [0.0, max_v] val = self.get_vector_data_name () self.vector_lut_h.set_data_name (val) self.vector_lut_h.set_data_range (self.vector_data_range) def update_filters (self): debug ("In ModuleManager::update_filters ()") if not len (self.fil_name): return self._get_max_norm (self.data_src.GetOutput ()) self._get_scalar_range (self.data_src.GetOutput ()) self.filter[self.fil_name[0]].set_input_source (self.data_src) for i in range (1, len (self.fil_name)): prev = self.filter[self.fil_name[i-1]] self._get_max_norm (prev.GetOutput ()) self._get_scalar_range (prev.GetOutput ()) self.filter[self.fil_name[i]].set_input_source (prev) def update_modules (self): debug ("In ModuleManagers::update_modules ()") self.vector_data_range = [0.0, 0.0] self.scalar_data_range = [0.0, 0.0] out = self.GetOutput () self._get_max_norm (out) self._get_scalar_range (out) self._set_module_input () self.renwin.Render () def Update (self): """Update all the filters and modules. Usually called when anything changes in the filters or Data sources.""" debug ("In ModuleManager::Update ()") self.update_filters () self.update_modules () def _set_module_input (self): """ Sets the input for all the modules.""" debug ("In ModuleManager::_set_module_input ()") out = self.GetOutput () for mod in self.module.values (): mod.SetInput (out) def add_module (self, module): debug ("In ModuleManager::add_module ()") self.n_mod = self.n_mod + 1 k = '%d. %s'%(self.n_mod, module.__class__.__name__) self.module[k] = module self.cur_mod_name = k self.mod_name.append (k) def add_filter (self, filter): debug ("In ModuleManager::add_filter ()") self.n_fil = self.n_fil + 1 k = '%d. %s'%(self.n_fil, filter.__class__.__name__) self.filter[k] = filter self.fil_name.append (k) self.cur_fil_name = k self.update_modules () def del_module (self, key): debug ("In ModuleManager::del_module ()") try: del self.module[key] except KeyError: msg = "Error: cannot delete module with key: %s"%key raise KeyError, msg indx = self.mod_name.index (key) if len (self.mod_name) > 1: if indx == 0: self.cur_mod_name = self.mod_name[indx + 1] else: self.cur_mod_name = self.mod_name[indx - 1] else: self.cur_mod_name = "" del self.mod_name[indx] def del_filter (self, key): debug ("In ModuleManager::del_filter ()") try: del self.filter[key] except KeyError: msg = "Error: cannot delete filter with key: %s"%key raise KeyError, msg indx = self.fil_name.index (key) prev = None next = None self.cur_fil_name = "" if indx == 0: prev = self.data_src else: self.cur_fil_name = self.fil_name[indx-1] prev = self.filter[self.fil_name[indx-1]] if indx < (len (self.fil_name) - 1): next = self.filter[self.fil_name[indx+1]] self.cur_fil_name = self.fil_name[indx+1] if next: next.set_input_source (prev) del self.fil_name[indx] self.update_modules () def get_current_module (self): """ Get currently selected module.""" debug ("In ModuleManager::get_current_module ()") return self.module[self.cur_mod_name] def _write_msg (self, file, msg): file.write (msg) debug (msg) def save_config (self, file): """Save the object configurations to file.""" debug ("In ModuleManager::save_config ()") self._write_msg (file, "### Scalar Lookup Table ###\n") self.scalar_lut_h.save_config (file) self._write_msg (file, "### End of Scalar Lookup Table ###\n") self._write_msg (file, "### Vector Lookup Table ###\n") self.vector_lut_h.save_config (file) self._write_msg (file, "### End Vector Lookup Table ###\n") self._write_msg (file, "### Filters ###\n") file.write ("%d\n"%len (self.fil_name)) for f_name in self.fil_name: self._write_msg (file, "### %s ###\n"%f_name) fil = self.filter[f_name] if fil.__module__.find('Filters.') > -1: # standard filter. file.write ("%s\n"%fil.__class__.__name__) else: file.write ("User.%s\n"%fil.__class__.__name__) fil.save_config (file) self._write_msg (file, "### End of %s ###\n"%f_name) self._write_msg (file, "### End of Filters ###\n") self._write_msg (file, "### Modules ###\n") file.write ("%d\n"%len (self.mod_name)) for m_name in self.mod_name: self._write_msg (file, "### %s ###\n"%m_name) mod = self.module[m_name] if mod.__module__.find('Modules.') > -1: file.write ("%s\n"%mod.__class__.__name__) else: file.write ("User.%s\n"%mod.__class__.__name__) mod.save_config (file) self._write_msg (file, "### End of %s ###\n"%m_name) self._write_msg (file, "### End of Modules ###\n") def _read_msg (self, file): debug (file.readline ()) def load_config (self, file): """Load the saved object configuration from a file.""" debug ("In ModuleManager::load_config ()") self._read_msg (file) self.scalar_lut_h.load_config (file) self._read_msg (file) self._read_msg (file) self.vector_lut_h.load_config (file) self._read_msg (file) self._read_msg (file) n = int (file.readline ()) for i in range (n): self._read_msg (file) name = file.readline ()[:-1] arg = None if name == "UserDefined": arg = file.readline()[:-1] if name[:5] == 'User.': name = name[5:] fil_scr = Common.mod_fil_import('Filters', name, globals(), locals(), 1) else: fil_scr = __import__ ("%sFilters.%s"%(_PARENT, name), globals(), locals(), [name]) if arg: fil = eval ("fil_scr.%s (self, arg)"%name) else: fil = eval ("fil_scr.%s (self)"%name) self.add_filter_gui (fil) fil.load_config (file) self._read_msg (file) self._read_msg (file) self._read_msg (file) n = int (file.readline ()) for i in range (n): self._read_msg (file) name = file.readline ()[:-1] arg = None if name == "Labels": arg = -1 if name[:5] == 'User.': name = name[5:] mod_scr = Common.mod_fil_import('Modules', name, globals(), locals(), 1) else: mod_scr = __import__ ("%sModules.%s"%(_PARENT, name), globals(), locals(), [name]) if arg: mod = eval ("mod_scr.%s (self, arg)"%name) else: mod = eval ("mod_scr.%s (self)"%name) self.add_module_gui (mod) mod.load_config (file) self._read_msg (file) self._read_msg (file) self.Update () def create_filter_gui (self, master): """ Create the GUI for the filters.""" debug ("In ModuleManager::create_filter_gui ()") frame = Tkinter.Frame (master) frame.pack (side='top', fill='both', expand=1) label = Tkinter.Label (frame, text="Filters") label.grid (row=0, column=0, sticky='ew', columnspan=2) scr = Tkinter.Scrollbar (frame, orient='vertical') self.fil_lst = Tkinter.Listbox (frame, yscrollcommand=scr.set, selectmode='single', height=3, exportselection=0) scr.config (command=self.fil_lst.yview) self.fil_lst.grid (row=1, column=0, sticky='ewns') scr.grid (row=1, column=1, sticky='ns') self.fil_lst.bind ("", self.config_filter) but_f = Tkinter.Frame (master) but_f.pack (side='top', fill='both', expand=1) but1 = Tkinter.Button (but_f, text="Configure Filter", command=self.config_filter) but1.grid (row=0, column=0, sticky="ew") but2 = Tkinter.Button (but_f, text="Delete Filter", command=self.del_filter_gui) but2.grid (row=0, column=1, sticky="ew") for fil in self.fil_name: self.fil_lst.insert ('end', fil) if self.cur_fil_name: self.fil_lst.select_clear (0, 'end') indx = self.fil_name.index (self.cur_fil_name) self.fil_lst.activate (indx) self.fil_lst.select_set (indx) def create_module_gui (self, master): """ Create the GUI for the modules.""" debug ("In ModuleManager::create_module_gui ()") frame = Tkinter.Frame (master) frame.pack (side='top', fill='both', expand=1) label = Tkinter.Label (frame, text="Modules") label.grid (row=0, column=0, sticky='ew', columnspan=2) scr = Tkinter.Scrollbar (frame, orient='vertical') self.mod_lst = Tkinter.Listbox (frame, yscrollcommand=scr.set, selectmode='single', height=4, exportselection=0) scr.config (command=self.mod_lst.yview) self.mod_lst.grid (row=1, column=0, sticky='ewns') scr.grid (row=1, column=1, sticky='ns') self.mod_lst.bind ("", self.config_module) but_f = Tkinter.Frame (master) but_f.pack (side='top', fill='both', expand=1) but1 = Tkinter.Button (but_f, text="Configure", command=self.config_module) but1.grid (row=0, column=0, sticky="ew") but2 = Tkinter.Button (but_f, text="Delete", command=self.del_module_gui) but2.grid (row=0, column=1, sticky="ew") for mod in self.mod_name: self.mod_lst.insert ('end', mod) if self.cur_mod_name: self.mod_lst.select_clear (0, 'end') indx = self.mod_name.index (self.cur_mod_name) self.mod_lst.activate (indx) self.mod_lst.select_set (indx) def create_gui (self, master): """ Create control GUI ModuleManager.""" debug ("In ModuleManager::create_gui ()") if not master: debug ("In ModuleManager::create_gui: Error: No master widget.") return None self.frame = Tkinter.Frame (master, relief='ridge', bd=2) self.frame.pack (side='top', fill='both', expand=1) but_f = Tkinter.Frame (self.frame) but_f.pack (side='top') Tkinter.Button (but_f, text="Config Scalar Legend", command=self.config_scalar_lut).pack (side='top') Tkinter.Button (but_f, text="Config Vector Legend", command=self.config_vector_lut).pack (side='top') self.create_filter_gui (self.frame) self.create_module_gui (self.frame) def close_gui (self, event=None): debug ("In ModuleManager::close_gui ()") self.frame.destroy () def config_module (self, event=None): debug ("In ModuleManager::config_module ()") key = self.mod_lst.get ('active') if key: self.module[key].configure (self.frame) def config_filter (self, event=None): debug ("In ModuleManager::config_filter ()") key = self.fil_lst.get ('active') if key: self.filter[key].configure (self.frame) def del_filter_gui (self, event=None): debug ("In ModuleManager::del_filter_gui ()") key = self.fil_lst.get ('active') self.fil_lst.delete ('active') if key: self.del_filter (key) def del_module_gui (self, event=None): debug ("In ModuleManager::del_module_gui ()") key = self.mod_lst.get ('active') self.mod_lst.delete ('active') if key: self.del_module (key) def add_filter_gui (self, fil): debug ("In ModuleManager::add_filter_gui ()") self.add_filter (fil) self.fil_lst.insert ('end', self.cur_fil_name) self.fil_lst.select_clear (0, 'end') self.fil_lst.activate ('end') self.fil_lst.select_set ('end') def add_module_gui (self, mod): debug ("In ModuleManager::add_module_gui ()") self.add_module (mod) self.mod_lst.insert ('end', self.cur_mod_name) self.mod_lst.select_clear (0, 'end') self.mod_lst.activate ('end') self.mod_lst.select_set ('end') def config_scalar_lut (self): debug ("In ModuleManager::config_scalar_lut ()") self.scalar_lut_h.configure (self.frame) def config_vector_lut (self): debug ("In ModuleManager::config_vector_lut ()") self.vector_lut_h.configure (self.frame)