""" This module creates a 'Locator' axis, that can be used to mark a three dimensional point in your data. 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 import vtkPipeline.vtkMethodParser debug = Common.debug class Locator (Base.Objects.Module): """ This module creates a 'Locator' axis, that can be used to mark a three dimensional point in your data. """ def __init__ (self, mod_m): debug ("In Locator::__init__ ()") Common.state.busy () Base.Objects.Module.__init__ (self, mod_m) self.axes = vtk.vtkAxes () self.axes.SymmetricOn () self.mapper = self.ax_map = vtk.vtkPolyDataMapper () self.ax_map.SetInput (self.axes.GetOutput ()) self.actor = self.locator = vtk.vtkActor () self.locator.SetMapper (self.ax_map) self.locator.GetProperty ().SetLineWidth (3.0) self.locator.GetProperty ().SetColor (*Common.config.fg_color) self.root = None self.resoln_var = [] self.slider = [] for i in range (3): self.resoln_var.append (Tkinter.DoubleVar ()) self.coord_var = Tkinter.StringVar () self.locator_var = Tkinter.IntVar () self.scale_var = Tkinter.DoubleVar () self.data_out = self.mod_m.GetOutput () self._initialize () self.axes.SetOrigin (self.def_dim[0], self.def_dim[1], self.def_dim[2]) self.axes.SetScaleFactor (self.max_len*0.3) self.actor.GetProperty().SetAmbient(1.0) self.actor.GetProperty().SetDiffuse(0.0) self.renwin.add_actors (self.locator) self.pipe_objs = self.locator self.renwin.Render () Common.state.idle () def _initialize (self): debug ("In Locator::_initialize ()") self.def_dim = [] self.dim = [] self.coord = [0, 0, 0] dim1 = self.data_out.GetBounds () self.max_len = -1.0 for i in range (3): self.dim.append ((dim1[2*i], dim1[2*i+1])) val = dim1[2*i] + dim1[2*i+1] self.def_dim.append (val*0.5) mag = abs (dim1[2*i]) + abs (dim1[2*i+1]) if mag > self.max_len: self.max_len = mag self.resoln_var[i].set (mag*0.01) if dim1[2*i] != dim1[2*i+1]: self.coord[i] = 1 self.set_resolution () def __del__ (self): debug ("In Locator::__del__ ()") if self.locator: self.renwin.remove_actors (self.locator) self.renwin.Render () def SetInput (self, source): debug ("In Locator::SetInput ()") Common.state.busy () self.data_out = source self._initialize () Common.state.idle () def save_config (self, file): debug ("In Locator::save_config ()") p = vtkPipeline.vtkMethodParser.VtkPickler () for obj in (self.axes, self.ax_map, self.locator, self.locator.GetProperty ()): p.dump (obj, file) def load_config (self, file): debug ("In Locator::load_config ()") p = vtkPipeline.vtkMethodParser.VtkPickler () for obj in (self.axes, self.ax_map, self.locator, self.locator.GetProperty ()): p.load (obj, file) self._initialize () self.renwin.Render () def config_changed (self): debug ("In Locator::config_changed ()") self.locator.GetProperty ().SetColor (*Common.config.fg_color) def make_main_gui (self): debug ("In Locator::make_main_gui ()") frame = Tkinter.Frame (self.root, relief='ridge', bd=2) frame.pack (side='top', pady=2, fill='both', expand=1) self.locator_var.set (self.locator.GetVisibility()) locator_but = Tkinter.Checkbutton (frame, text="Toggle Locator Axis", variable=self.locator_var, onvalue=1, offvalue=0, command=self.set_locator) locator_but.grid (row=0, column=0, columnspan=3, pady=4, sticky='w') rw = 1 self.scale_var.set (self.axes.GetScaleFactor ()) lab = Tkinter.Label (frame, text="Scale Factor: ") lab.grid (row=rw, column=0, columnspan=1, sticky='w', pady=4) entr = Tkinter.Entry (frame, width=10, relief='sunken', textvariable=self.scale_var) entr.grid (row=rw, column=1, columnspan=2, sticky='w', pady=4) entr.bind ("", self.set_scale_factor) rw = rw + 1 self.coord_var.set (self.axes.GetOrigin ()) lab = Tkinter.Label (frame, text="Locator position:") lab.grid (row=rw, column=0, columnspan=1, sticky='w') entr = Tkinter.Entry (frame, width=20, relief='sunken', textvariable=self.coord_var) entr.grid (row=rw, column=1, columnspan=2, sticky='w') rw = rw + 1 def_name = ["Move along X-axis", "Move along Y-axis ", "Move along Z-axis"] res_name = ["X resolution:", "Y resolution:", "Z resolution:"] pos = self.axes.GetOrigin () for i in range (0,3): if self.coord[i] == 1: sl = Tkinter.Scale (frame, label=def_name[i], from_=self.dim[i][0], to=self.dim[i][1], length="8c", orient='horizontal', resolution=self.resoln_var[i].get ()) sl.set (pos[i]) sl.grid (row=rw, column=0, columnspan=3, sticky='ew') rw = rw + 1 sl.bind ("", self.change_locator) lab = Tkinter.Label (frame, text=res_name[i]) lab.grid (row=rw, column=0, sticky='w') entr = Tkinter.Entry (frame, width=5, relief='sunken', textvariable=self.resoln_var[i]) entr.grid (row=rw, column=1, sticky='w') entr.bind ("", self.set_resolution) rw = rw+1 self.slider.append (sl) self.make_actor_gui (representation=0) def set_locator (self, event=None): debug ("In Locator::set_locator ()") self.locator.SetVisibility (self.locator_var.get ()) self.renwin.Render () def change_locator (self, event=None): debug ("In Locator::change_locator ()") val = [] for i in range (0, 3): if self.coord[i] == 1: val.append (self.slider[i].get ()) else: val.append (self.def_dim[i]) self.axes.SetOrigin (*val) self.coord_var.set (val) self.renwin.Render () def set_resolution (self, event=None): debug ("In Locator::set_resolution ()") if self.slider: for i in range (3): if self.coord[i] == 1: val = self.resoln_var[i].get () self.slider[i].config (resolution=val) def set_scale_factor (self, event=None): debug ("In Locator::set_scale_factor ()") self.axes.SetScaleFactor (self.scale_var.get ()) self.renwin.Render () def close_gui (self, event=None): debug ("In Locator::close_gui ()") Base.Objects.VizObject.close_gui (self, event) self.slider = []