Changeset 2194
- Timestamp:
- Jan 10, 2006, 3:53:39 PM (19 years ago)
- Location:
- inundation/pyvolution
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
inundation/pyvolution/shallow_water.py
r2143 r2194 111 111 #Realtime visualisation 112 112 if self.visualiser is None: 113 from realtime_visualisation_new import Visualiser114 #from vtk_realtime_visualiser import Visualiser113 #from realtime_visualisation_new import Visualiser 114 from vtk_realtime_visualiser import Visualiser 115 115 self.visualiser = Visualiser(self,scale_z,rect) 116 116 self.visualiser.setup['elevation']=True … … 120 120 self.visualiser.coloring['stage'] = True 121 121 self.visualiser.qcolor['stage'] = (0.0, 0.0, 0.8) 122 self.visualiser.start() 122 123 123 124 def check_integrity(self): … … 204 205 #Initial update of vertex and edge values before any storage 205 206 #and or visualisation 206 self.distribute_to_vertices_and_edges() 207 207 #self.distribute_to_vertices_and_edges() 208 s = '''for x in range(5): 209 self.distribute_to_vertices_and_edges()''' 210 global profiler 211 profiler = profiler.runctx(s, globals(), locals()) 208 212 209 213 #Initialise real time viz if requested … … 212 216 #import realtime_visualisation_new as visualise 213 217 #visualise.create_surface(self) 214 self.initialise_visualiser()218 #self.initialise_visualiser() 215 219 self.visualiser.setup_all() 216 220 self.visualiser.update_timer() … … 233 237 if self.visualise is True: 234 238 #pass 235 self.visualiser.update_all() 236 self.visualiser.update_timer() 239 #Obseleted by the VTK-Visualiser 240 #self.visualiser.update_all() 241 #self.visualiser.update_timer() 242 self.visualiser.request_redraw() 237 243 238 244 #Store model data, e.g. for subsequent visualisation … … 245 251 #Pass control on to outer loop for more specific actions 246 252 yield(t) 247 248 253 import pypar 254 profiler.dump_stats("distrib_profile." + str(pypar.size()) + "." + str(pypar.rank()) + ".dat") 249 255 def initialise_storage(self): 250 256 """Create and initialise self.writer object for storing data. … … 1803 1809 if __name__ == "__main__": 1804 1810 pass 1811 1812 # Profiling stuff 1813 import profile 1814 profiler = profile.Profile() -
inundation/pyvolution/vtk_realtime_visualiser.py
r2152 r2194 3 3 4 4 import threading 5 from Queue import Queue, Empty 5 6 import Tkinter 6 7 import vtk … … 11 12 """A VTK-powered visualiser, designed to replace the VPython one. 12 13 Intended to be run in its own thread 13 14 Functions:15 16 run: Overrides threading.Thread.run(). Do not call. Called by17 inherited start().18 19 initialise_gui: Create the TK window and makes the vtk renderer20 available.21 22 add_axes: Draw axes onto the renderer.23 24 14 """ 25 15 26 def __init__(self, domain, scale_z=1.0, rect=None, title='Test'):16 def __init__(self, domain, default_scale_z=1.0, rect=None, title='Test'): 27 17 threading.Thread.__init__(self) 28 18 # Initialise data structures. coloring, setup and updating are maps 29 19 # quantity name -> boolean, setup means to render it, 30 20 # update means to update with time. 31 # qcolor maps quantity name -> (float, float, float): the colour 21 # qcolor maps quantity name -> (float, float, float): the colour (r, g, b) 32 22 # to render a quantity. 33 23 self.setup = {} … … 36 26 self.qcolor = {} 37 27 self.scale_z = {} 38 self.default_scale_z = scale_z28 self.default_scale_z = default_scale_z 39 29 self.domain = domain 40 30 self.vertices = domain.vertex_coordinates 31 32 self.messages = Queue() 33 34 # Internal use - storage of vtk objects 35 self.grids = {} 36 self.actors = {} 37 self.polydata = {} 38 self.mappers = {} 41 39 42 40 # Default options … … 62 60 self.range_y = self.max_y - self.min_y 63 61 self.range_xy = max(self.range_x, self.range_y) 64 # Start this off in its own thread.65 self.start()66 62 67 63 def run(self): … … 79 75 # should a gui need adding. 80 76 self.root = Tkinter.Tk() 77 78 # Message handling with after 79 self.root.after(100, self.handle_messages) 80 81 81 self.renderWidget = vtkTkRenderWidget(self.root, width=400, height=400) 82 82 self.renderWidget.pack(expand='true', fill='both') … … 95 95 96 96 self.N_tri = len(self.domain.triangles) 97 self.grids = {}98 97 self.cells = vtk.vtkCellArray() 99 98 self.vertices = self.domain.get_vertex_coordinates() … … 115 114 for q in self.domain.quantities: 116 115 if self.setup[q] | self.updating[q]: 117 self.qty_index = {}118 116 self.draw_quantity(q) 119 117 120 118 def draw_quantity(self, q): 119 qty_index = {} 121 120 for n in range(self.N_tri): 122 121 for v in range(3): 123 self.qty_index[self.domain.triangles[n][v]] = self.domain.quantities[q].vertex_values[n][v] 122 qty_index[self.domain.triangles[n][v]] = self.domain.quantities[q].vertex_values[n][v] 123 124 self.grids[q] = vtk.vtkPoints() 125 grid = self.grids[q] 126 127 if self.scale_z.has_key(q): 128 scale = self.scale_z[q] 129 else: 130 scale = self.default_scale_z 124 131 125 self.points = vtk.vtkPoints()126 132 for v in range(self.N_vert): 127 self.points.InsertNextPoint(self.vert_index[v][0], 128 self.vert_index[v][1], 129 self.qty_index[v]) 130 131 self.grid = vtk.vtkPolyData() 132 self.grid.SetPoints(self.points) 133 self.grid.SetPolys(self.cells) 134 self.grids[q] = self.grid 135 136 self.mapper = vtk.vtkPolyDataMapper() 137 self.mapper.SetInput(self.grid) 138 139 self.actor = vtk.vtkActor() 140 self.actor.SetMapper(self.mapper) 141 if self.coloring[q] is True: 142 self.actor.GetProperty().SetColor(self.qcolor[q]) 133 grid.InsertNextPoint(self.vert_index[v][0], 134 self.vert_index[v][1], 135 qty_index[v] * scale) 136 137 # Can't recycle vtkPolyData objects: Apparently they behave 138 # unusually if the points (i.e. vertex data) is set after 139 # the polys (i.e. triangle data) 140 self.polydata[q] = vtk.vtkPolyData() 141 polydata = self.polydata[q] 142 143 polydata.SetPoints(grid) 144 polydata.SetPolys(self.cells) 145 146 if self.mappers.has_key(q): 147 mapper = self.mappers[q] 148 mapper.SetInput(polydata) 149 mapper.Update() 143 150 else: 144 self.actor.GetProperty().SetColor(0.5, 0.5, 0.5) 145 146 print "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 147 self.renderer.AddActor(self.actor) 148 print "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 151 self.mappers[q] = vtk.vtkPolyDataMapper() 152 mapper = self.mappers[q] 153 mapper.SetInput(polydata) 154 155 if not self.actors.has_key(q): 156 self.actors[q] = vtk.vtkActor() 157 actor = self.actors[q] 158 actor.SetMapper(mapper) 159 160 if self.coloring[q] is True: 161 actor.GetProperty().SetColor(self.qcolor[q]) 162 else: 163 actor.GetProperty().SetColor(0.5, 0.5, 0.5) 164 165 self.renderer.AddActor(actor) 149 166 150 167 def update_all(self): … … 153 170 def update_timer(self): 154 171 pass 155 156 if __name__ == '__main__': 157 v = Visualiser() 158 v.start() 159 172 173 def handle_messages(self): 174 # Expandable to include more kinds of messages if need be 175 # This lookup table is copied because it is modified later 176 handlers = {'redraw': self.message_redraw}.copy() 177 try: 178 while True: 179 message = self.messages.get_nowait() 180 try: 181 handlers[message]() 182 # Guard against redrawing more than once per 183 # call to handle_messages. 184 if message == 'redraw': 185 del handlers[message] 186 except KeyError: 187 pass 188 except Empty: 189 pass 190 self.root.after(100, self.handle_messages) 191 192 def message_redraw(self): 193 """Re-render and repaint the rendered image. 194 This function should only be called from the message handler. 195 Use request_redraw to ask for a redraw""" 196 197 for q in self.domain.quantities: 198 if self.updating[q]: 199 self.draw_quantity(q) 200 201 self.renderWindow.Render() 202 self.root.update_idletasks() 203 204 def request_redraw(self): 205 self.messages.put('redraw') 206
Note: See TracChangeset
for help on using the changeset viewer.