""" This module shows the given vector data as a 'hedge hog' plot. The lines can be colored based on the input scalar data. This class should work with any dataset. 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.6 $" __date__ = "$Date: 2005/08/02 18:30:13 $" import Base.Objects, Common import Tkinter, tkColorChooser import vtk, math import vtkPipeline.vtkMethodParser debug = Common.debug class HedgeHog (Base.Objects.Module): """ This module shows the given vector data as a 'hedge hog' plot. The lines can be colored based on the input scalar data. This class should work with any dataset. """ def __init__ (self, mod_m): debug ("In HedgeHog::__init__ ()") Common.state.busy () Base.Objects.Module.__init__ (self, mod_m) self.root = None self.hhog = vtk.vtkHedgeHog () self.mapper = self.map = vtk.vtkPolyDataMapper () self.actor = self.act = vtk.vtkActor () self._initialize () self.renwin.Render () Common.state.idle () def __del__ (self): debug ("In HedgeHog::__del__ ()") if self.act: self.renwin.remove_actors (self.act) self.renwin.Render () def _initialize (self): debug ("In HedgeHog::_initialize ()") self.step_size = 1.0 self.scale = 1.0 self.color_mode = 1 self.find_def_step_size () self.hhog.SetInput (self.mod_m.GetOutput ()) self.hhog.SetScaleFactor (self.scale) self.map.SetInput (self.hhog.GetOutput ()) self.do_color_mode () self.act.SetMapper (self.map) self.act.GetProperty ().SetColor (*Common.config.fg_color) # used for the pipeline browser self.pipe_objs = self.act self.renwin.add_actors (self.act) def find_def_step_size (self): debug ("In HedgeHog::find_def_step_size ()") out = self.mod_m.GetOutput () bnd = out.GetBounds () n = out.GetNumberOfCells () if not n: n = out.GetNumberOfPoints () data_2d = 0 vol = 1.0 for i in range (0,3): l = abs (bnd[2*i+1] - bnd[2*i]) if l == 0.0: data_2d=1 else: vol = vol*l l = vol/n if data_2d == 1: self.step_size = math.sqrt (l) else: self.step_size = math.pow (l, 1.0/3.0) self.scale = 2.0*self.step_size def SetInput (self, source): debug ("In HedgeHog::SetInput ()") Common.state.busy () self.hhog.SetInput (source) self.do_color_mode () Common.state.idle () def save_config (self, file): debug ("In HedgeHog::save_config ()") p = vtkPipeline.vtkMethodParser.VtkPickler () for obj in (self.hhog, self.map, self.act, self.act.GetProperty ()): p.dump (obj, file) def load_config (self, file): debug ("In HedgeHog::load_config ()") p = vtkPipeline.vtkMethodParser.VtkPickler () for obj in (self.hhog, self.map, self.act, self.act.GetProperty ()): p.load (obj, file) self.color_mode = self.map.GetScalarVisibility () self.do_color_mode () def config_changed (self): debug ("In HedgeHog::config_changed ()") self.act.GetProperty ().SetColor (*Common.config.fg_color) def make_main_gui (self, master=None): debug ("In HedgeHog::make_main_gui ()") "Create the GUI configuration controls for this object." frame = Tkinter.Frame (self.root, relief='ridge', bd=2) frame.pack (side='top', pady=2, fill='both', expand=1) labl = Tkinter.Label (frame, text="Line scale factor:") labl.grid (row=0, column=0, sticky='w') self.scale_var = Tkinter.DoubleVar () self.scale_var.set (self.hhog.GetScaleFactor ()) scale_entr = Tkinter.Entry (frame, width=5, relief='sunken', textvariable=self.scale_var) scale_entr.grid (row=0, column=1, sticky='we') scale_entr.bind ("", self.change_scale) self.make_color_mode_gui () self.make_actor_gui (color=0, scalar=0, representation=0) def make_color_mode_gui (self): debug ("In HedgeHog::make_color_mode_gui ()") frame = Tkinter.Frame (self.root, relief="ridge", bd=2) frame.pack (side='top') lab = Tkinter.Label (frame, text="Coloring mode:") lab.grid (row=0, column=0, sticky='ew', pady=5) self.color_var = Tkinter.IntVar () self.color_var.set (self.color_mode) rb = Tkinter.Radiobutton (frame, text="No Coloring", variable=self.color_var, value=0, command=self.set_color_mode_gui) rb.grid (row=1, column=0, sticky='w') rb = Tkinter.Radiobutton (frame, text="Scalar Coloring", variable=self.color_var, value=1, command=self.set_color_mode_gui) rb.grid (row=2, column=0, sticky='w') but = Tkinter.Button (frame, text="Line Color", command=self.set_line_color) but.grid (row=3, column=0, sticky='ew') def change_scale (self, event=None): debug ("In HedgeHog::change_scale ()") Common.state.busy () self.hhog.SetScaleFactor (self.scale_var.get ()) self.renwin.Render () Common.state.idle () def set_color_mode_gui (self, event=None): "This sets up the data to setup the actual coloring mode." debug ("In HedgeHog::set_color_mode_gui ()") Common.state.busy () self.color_mode = self.color_var.get () self.do_color_mode () self.renwin.Render () Common.state.idle () def do_color_mode (self): debug ("In HedgeHog::do_color_mode ()") if self.color_mode == 1: # Scalar Coloring self.map.ScalarVisibilityOn () dr = self.mod_m.get_scalar_data_range () self.map.SetScalarRange (dr) self.map.SetLookupTable (self.mod_m.get_scalar_lut ()) elif self.color_mode == 0: # No colouring self.map.ScalarVisibilityOff () def set_line_color (self, event=None): debug ("In HedgeHog::set_line_color ()") clr = self.act.GetProperty ().GetColor () init_clr = "#%02x%02x%02x"%(clr[0]*255, clr[1]*255, clr[2]*255) color = tkColorChooser.askcolor (title="Change axes color", initialcolor=init_clr) if color[1] is not None: Common.state.busy () clr = Common.tk_2_vtk_color (color[0]) self.act.GetProperty ().SetColor (*clr) self.renwin.Render () Common.state.idle () if self.color_mode != 0: msg = "Warning: This setting will have effect only if "\ "the coloring mode is set to 'No Coloring'." Common.print_err (msg)