""" Displays a surface map with special contouring using the vtkBandedPolyDataContourFilter. This contour filter produces filled contours of the same color between two contour lines rather than either a continuous color distribution or just individual contour lines. It should work for any input dataset. It is best used for 2d surfaces. Note that one can either specify a total number of contours between the minimum and maximum values by entering a single integer or specify the individual contours by specifying a Python list/tuple in the GUI. This code is distributed under the conditions of the BSD license. See LICENSE.txt for details. Copyright (c) 2001-2003, Prabhu Ramachandran. """ __author__ = "Prabhu Ramachandran " __version__ = "$Revision: 1.5 $" __date__ = "$Date: 2005/09/08 18:01:42 $" import Base.Objects import Common import Tkinter import tkColorChooser import vtk import vtkPipeline.vtkMethodParser import vtkPipeline.ConfigVtkObj debug = Common.debug class BandedSurfaceMap (Base.Objects.Module): """ Displays a surface map with special contouring using the vtkBandedPolyDataContourFilter. This contour filter produces filled contours of the same color between two contour lines rather than either a continuous color distribution or just individual contour lines. It should work for any input dataset. It is best used for 2d surfaces. Note that one can either specify a total number of contours between the minimum and maximum values by entering a single integer or specify the individual contours by specifying a Python list/tuple in the GUI.""" def __init__ (self, mod_m): debug ("In BandedSurfaceMap::__init__ ()") Common.state.busy () Base.Objects.Module.__init__ (self, mod_m) self.cont_fil = vtk.vtkBandedPolyDataContourFilter () self.cont_fil.SetScalarModeToValue () self.mapper = self.map = vtk.vtkDataSetMapper () self.map.SetInput (mod_m.GetOutput ()) self.actor = self.act = vtk.vtkActor () self.act.SetMapper (self.map) self.data_range = self.mod_m.get_scalar_data_range () self.map.SetLookupTable (self.mod_m.get_scalar_lut ()) self.map.SetScalarRange (self.data_range) self.map.ScalarVisibilityOn () self.act.GetProperty ().SetColor (Common.config.fg_color) self.act.GetProperty ().SetLineWidth (2) # surface mode. self.act.GetProperty ().SetRepresentation (2) # used for the pipeline browser self.pipe_objs = self.act self.renwin.add_actors (self.act) self._gui_init () self.renwin.Render () Common.state.idle () def __del__ (self): debug ("In BandedSurfaceMap::__del__ ()") if self.act: self.renwin.remove_actors (self.act) self.renwin.Render () def _gui_init (self): self._contour_init () def _contour_init (self): debug ("In BandedSurfaceMap::_contour_init ()") Base.Objects.Module._contour_init (self) self.contour_on.set (0) self.n_cnt.set ("10") dr = self.mod_m.get_scalar_data_range () self.min_cnt.set (dr[0]) self.max_cnt.set (dr[1]) def SetInput (self, source): debug ("In BandedSurfaceMap::SetInput ()") Common.state.busy () dr = self.mod_m.get_scalar_data_range () self.map.SetInput (source) if (dr[0] != self.data_range[0]) or (dr[1] != self.data_range[1]): self.map.SetScalarRange (dr) self.data_range = dr self.min_cnt.set (dr[0]) self.max_cnt.set (dr[1]) self.do_contour () Common.state.idle () def save_config (self, file): debug ("In BandedSurfaceMap::save_config ()") file.write ("%d, %s, %f, %f\n"%(self.contour_on.get (), self.n_cnt.get (), self.min_cnt.get (), self.max_cnt.get ())) p = vtkPipeline.vtkMethodParser.VtkPickler () for obj in (self.cont_fil, self.map, self.act, self.act.GetProperty ()): p.dump (obj, file) def load_config (self, file): debug ("In BandedSurfaceMap::load_config ()") cnt_on, n_cnt, min_cnt, max_cnt = eval (file.readline ()) self.contour_on.set (cnt_on) self.n_cnt.set (str(n_cnt)) self.min_cnt.set (min_cnt) self.max_cnt.set (max_cnt) p = vtkPipeline.vtkMethodParser.VtkPickler () for obj in (self.cont_fil, self.map, self.act, self.act.GetProperty ()): p.load (obj, file) self.do_contour () def config_changed (self): debug ("In BandedSurfaceMap::config_changed ()") self.act.GetProperty ().SetColor (Common.config.fg_color) def make_main_gui (self, master=None): debug ("In BandedSurfaceMap::make_main_gui ()") "Create the GUI configuration controls for this object." self.make_actor_gui () CVOF = vtkPipeline.ConfigVtkObj.ConfigVtkObjFrame gui = CVOF(self.root, self.renwin) t_m = ['ClippingOn'] gui.configure(self.cont_fil, get=[], toggle=t_m, get_set=[], state=[], auto_update=1, one_frame=1) gui.pack(side='top', fill='both', expand=1) self.make_contour_gui () def do_contour (self, event=None): debug ("In BandedSurfaceMap::do_contour ()") Common.state.busy () if self.contour_on.get (): if not self.mod_m.get_scalar_data_name (): self.contour_on.set (0) msg = "Warning: No scalar data present to contour!" Common.print_err (msg) Common.state.idle () return out = self.mod_m.GetOutput () if out.IsA('vtkPolyData'): f = None elif out.IsA ('vtkStructuredGrid'): f = vtk.vtkStructuredGridGeometryFilter () elif out.IsA ('vtkRectilinearGrid'): f = vtk.vtkRectilinearGridGeometryFilter () elif out.IsA ('vtkStructuredPoints') or \ out.IsA('vtkImageData'): if hasattr (vtk, 'vtkImageDataGeometryFilter'): f = vtk.vtkImageDataGeometryFilter () else: f = vtk.vtkStructuredPointsGeometryFilter () elif out.IsA('vtkUnstructuredGrid'): f = vtk.vtkGeometryFilter() else: msg = "This module does not support the given "\ "output - %s "%(out.GetClassName ()) raise Base.Objects.ModuleException, msg if f: f.SetInput (out) self.cont_fil.SetInput (f.GetOutput()) else: self.cont_fil.SetInput (out) self.map.SetInput (self.cont_fil.GetOutput ()) self.map.SetScalarModeToUseCellData() else: self.map.SetInput (self.mod_m.GetOutput ()) self.map.SetScalarModeToDefault() self.change_contour () Common.state.idle () def change_contour (self, event=None): debug ("In BandedSurfaceMap::change_contour ()") Common.state.busy () min_cnt = self.min_cnt.get () max_cnt = self.max_cnt.get () if max_cnt < min_cnt: msg = "Error: Max. contour less than min. contour. "\ "Setting to defaults." debug (msg) dr = self.data_range min_cnt, max_cnt = dr[0], dr[1] self.min_cnt.set (min_cnt) self.max_cnt.set (max_cnt) n_cnt = eval (self.n_cnt.get ()) auto = 1 if hasattr(n_cnt, "__getitem__"): auto = 0 if self.contour_on.get (): if auto: self.cont_fil.GenerateValues (n_cnt, min_cnt, max_cnt) else: self.cont_fil.SetNumberOfContours(len(n_cnt)) for i in range(len(n_cnt)): self.cont_fil.SetValue(i, n_cnt[i]) self.cont_fil.Update () self.renwin.Render () Common.state.idle ()