source: inundation/visualiser/offline.py @ 3493

Last change on this file since 3493 was 3493, checked in by jack, 18 years ago

Offline visualiser is working fairly well.

File size: 4.2 KB
Line 
1from Numeric import zeros, Float
2from Scientific.IO.NetCDF import NetCDFFile
3from Tkinter import Button, E, W
4from visualiser import Visualiser
5from vtk import vtkCellArray, vtkPoints, vtkPolyData
6
7class OfflineVisualiser(Visualiser):
8    """A VTK-powered offline visualiser which runs in its own thread.
9    """
10    def __init__(self, source):
11        """The source parameter is assumed to be a NetCDF sww file.
12        """
13        Visualiser.__init__(self, source)
14
15        self.frame_number = 0
16        fin = NetCDFFile(self.source, 'r')
17        self.max_frame_number = fin.variables['time'].shape[0] - 1
18        fin.close()
19
20    def setup_grid(self):
21        fin = NetCDFFile(self.source, 'r')
22        self.vtk_cells = vtkCellArray()
23        N_tri = fin.variables['volumes'].shape[0]
24        for v in range(N_tri):
25            self.vtk_cells.InsertNextCell(3)
26            for i in range(3):
27                self.vtk_cells.InsertCellPoint(fin.variables['volumes'][v][i])
28        fin.close()
29
30    def update_height_quantity(self, quantityName, dynamic=True):
31        fin = NetCDFFile(self.source, 'r')
32        if(fin.variables.has_key(quantityName)):
33            points = vtkPoints()
34            if dynamic:
35                N_vert = fin.variables[quantityName].shape[1]
36            else:
37                N_vert = len(fin.variables[quantityName])
38            x = fin.variables['x']
39            y = fin.variables['y']
40            q = fin.variables[quantityName]
41            for v in range(N_vert):
42                if dynamic is True:
43                    points.InsertNextPoint(x[v],
44                                           y[v],
45                                           q[self.frame_number][v] \
46                                           * self.height_zScales[quantityName] \
47                                           + self.height_offset[quantityName])
48                else:
49                    points.InsertNextPoint(x[v],
50                                           y[v],
51                                           q[v] \
52                                           * self.height_zScales[quantityName] \
53                                           + self.height_offset[quantityName])
54            polydata = self.vtk_polyData[quantityName] = vtkPolyData()
55            polydata.SetPoints(points)
56            polydata.SetPolys(self.vtk_cells)
57        else:
58            self.height_quantities.remove(quantityName)
59        fin.close()
60
61    def setup_gui(self):
62        Visualiser.setup_gui(self)
63        self.tk_renderWidget.grid(row=0, column=0, columnspan=6)
64        self.tk_quit.grid(row=2, column=0, columnspan=6, sticky=W+E)
65        self.tk_restart = Button(self.tk_root, text="<<<", command=self.restart)
66        self.tk_restart.grid(row=1, column=0, sticky=W+E)
67        self.tk_back10 = Button(self.tk_root, text="<<", command=self.back10)
68        self.tk_back10.grid(row=1, column=1, sticky=W+E)
69        self.tk_back = Button(self.tk_root, text="<", command=self.back)
70        self.tk_back.grid(row=1, column=2, sticky=W+E)
71        self.tk_pauseResume = Button(self.tk_root, text="Pause", command=self.pauseResume)
72        self.tk_pauseResume.grid(row=1, column=3, sticky=W+E)
73        self.tk_forward = Button(self.tk_root, text=">", command=self.forward)
74        self.tk_forward.grid(row=1, column=4, sticky=W+E)
75        self.tk_forward10 = Button(self.tk_root, text=">>", command=self.forward10)
76        self.tk_forward10.grid(row=1, column=5, sticky=W+E)
77
78    def restart(self):
79        self.frame_number = 0
80        self.redraw_quantities(True)
81
82    def back10(self):
83        if self.frame_number - 10 >= 0:
84            self.frame_number -= 10
85        else:
86            self.frame_number = 0
87        self.redraw_quantities(True)
88
89    def back(self):
90        if self.frame_number > 0:
91            self.frame_number -= 1
92            self.redraw_quantities(True)
93
94    def pauseResume(self):
95        print "Pause/Resume"
96
97    def forward(self):
98        if self.frame_number < self.max_frame_number:
99            self.frame_number += 1
100            self.redraw_quantities(True)
101
102    def forward10(self):
103        if self.frame_number + 10 <= self.max_frame_number:
104            self.frame_number += 10
105        else:
106            self.frame_number = self.max_frame_number
107        self.redraw_quantities(True)
Note: See TracBrowser for help on using the repository browser.