source: anuga_core/source/anuga/visualiser/offline.py @ 3537

Last change on this file since 3537 was 3537, checked in by steve, 17 years ago

Fixed the offline.py visualiser under Windows.

File size: 4.6 KB
Line 
1from Numeric import array, Float, ravel, zeros
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.frameNumber = 0
16        fin = NetCDFFile(self.source, 'r')
17        self.maxFrameNumber = fin.variables['time'].shape[0] - 1
18        fin.close()
19
20        self.vtk_heightQuantityCache = []
21        for i in range(self.maxFrameNumber + 1): # maxFrameNumber is zero indexed.
22            self.vtk_heightQuantityCache.append({})
23
24    def setup_grid(self):
25        fin = NetCDFFile(self.source, 'r')
26        self.vtk_cells = vtkCellArray()
27        N_tri = fin.variables['volumes'].shape[0]
28        for v in range(N_tri):
29            self.vtk_cells.InsertNextCell(3)
30            for i in range(3):
31                self.vtk_cells.InsertCellPoint(fin.variables['volumes'][v][i])
32        fin.close()
33
34    def update_height_quantity(self, quantityName, dynamic=True):
35        polydata = self.vtk_polyData[quantityName] = vtkPolyData()
36        if dynamic is True:
37            if not self.vtk_heightQuantityCache[self.frameNumber].has_key(quantityName):
38                self.vtk_heightQuantityCache[self.frameNumber][quantityName]\
39                    = self.read_height_quantity(quantityName, True, self.frameNumber);
40            polydata.SetPoints(self.vtk_heightQuantityCache[self.frameNumber][quantityName])
41        else:
42            polydata.SetPoints(self.read_height_quantity(quantityName, False))
43        polydata.SetPolys(self.vtk_cells)
44           
45    def read_height_quantity(self, quantityName, dynamic=True, frameNumber=0):
46        """Read in a height based quantity from the NetCDF source file
47        and return a vtkPoints object. frameNumber is ignored if
48        dynamic is false."""
49        fin = NetCDFFile(self.source, 'r')
50        points = vtkPoints()
51        if dynamic is True:
52            N_vert = fin.variables[quantityName].shape[1]
53        else:
54            N_vert = len(fin.variables[quantityName])
55        x = ravel(array(fin.variables['x'], Float))
56        y = ravel(array(fin.variables['y'], Float))
57        if dynamic is True:
58            q = array(fin.variables[quantityName][self.frameNumber], Float)
59        else:
60            q = ravel(array(fin.variables[quantityName], Float))
61
62        q *= self.height_zScales[quantityName]
63        q += self.height_offset[quantityName]
64
65        for v in range(N_vert):
66            points.InsertNextPoint(x[v], y[v], q[v])
67        fin.close()
68        return points
69
70    def setup_gui(self):
71        Visualiser.setup_gui(self)
72        self.tk_renderWidget.grid(row=0, column=0, columnspan=6)
73        self.tk_quit.grid(row=2, column=0, columnspan=6, sticky=W+E)
74        self.tk_restart = Button(self.tk_root, text="<<<", command=self.restart)
75        self.tk_restart.grid(row=1, column=0, sticky=W+E)
76        self.tk_back10 = Button(self.tk_root, text="<<", command=self.back10)
77        self.tk_back10.grid(row=1, column=1, sticky=W+E)
78        self.tk_back = Button(self.tk_root, text="<", command=self.back)
79        self.tk_back.grid(row=1, column=2, sticky=W+E)
80        self.tk_pauseResume = Button(self.tk_root, text="Pause", command=self.pauseResume)
81        self.tk_pauseResume.grid(row=1, column=3, sticky=W+E)
82        self.tk_forward = Button(self.tk_root, text=">", command=self.forward)
83        self.tk_forward.grid(row=1, column=4, sticky=W+E)
84        self.tk_forward10 = Button(self.tk_root, text=">>", command=self.forward10)
85        self.tk_forward10.grid(row=1, column=5, sticky=W+E)
86
87    def restart(self):
88        self.frameNumber = 0
89        self.redraw_quantities(True)
90
91    def back10(self):
92        if self.frameNumber - 10 >= 0:
93            self.frameNumber -= 10
94        else:
95            self.frameNumber = 0
96        self.redraw_quantities(True)
97
98    def back(self):
99        if self.frameNumber > 0:
100            self.frameNumber -= 1
101            self.redraw_quantities(True)
102
103    def pauseResume(self):
104        print "Pause/Resume"
105
106    def forward(self):
107        if self.frameNumber < self.maxFrameNumber:
108            self.frameNumber += 1
109            self.redraw_quantities(True)
110
111    def forward10(self):
112        if self.frameNumber + 10 <= self.maxFrameNumber:
113            self.frameNumber += 10
114        else:
115            self.frameNumber = self.maxFrameNumber
116        self.redraw_quantities(True)
Note: See TracBrowser for help on using the repository browser.