Subversion Repositories Projects

Rev

Rev 599 | Rev 601 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
584 FredericG 1
#!/usr/bin/env python
2
# -*- coding: iso-8859-15 -*-
3
# generated by wxGlade 0.6.3 on Thu Sep 24 15:46:36 2009
4
 
586 FredericG 5
import sys
584 FredericG 6
import wx
585 FredericG 7
import wx.lib
8
import wx.lib.plot
584 FredericG 9
 
585 FredericG 10
# Needs Numeric or numarray or NumPy
11
try:
12
    import numpy.oldnumeric as _Numeric
13
except:
14
    try:
15
        import numarray as _Numeric  #if numarray is used it is renamed Numeric
16
    except:
17
        try:
18
            import Numeric as _Numeric
19
        except:
20
            msg= """
21
            This module requires the Numeric/numarray or NumPy module,
22
            which could not be imported.  It probably is not installed
23
            (it's not part of the standard Python distribution). See the
24
            Numeric Python site (http://numpy.scipy.org) for information on
25
            downloading source or binaries."""
26
            raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg
27
 
584 FredericG 28
# begin wxGlade: extracode
29
# end wxGlade
30
 
31
 
32
 
587 FredericG 33
class MenuBar(wx.MenuBar):
34
    def __init__(self, *args, **kwds):
35
        # content of this block not found: did you rename this class?
36
        pass
37
 
38
    def __set_properties(self):
39
        # content of this block not found: did you rename this class?
40
        pass
41
 
42
    def __do_layout(self):
43
        # content of this block not found: did you rename this class?
44
        pass
45
 
46
# end of class MenuBar
47
 
48
 
585 FredericG 49
class wxFrame(wx.Panel):
50
    def __init__(self, *args, **kwds):
586 FredericG 51
        # content of this block not found: did you rename this class?
52
        pass
585 FredericG 53
 
54
    def __set_properties(self):
586 FredericG 55
        # content of this block not found: did you rename this class?
585 FredericG 56
        pass
57
 
58
    def __do_layout(self):
586 FredericG 59
        # content of this block not found: did you rename this class?
585 FredericG 60
        pass
61
 
62
# end of class wxFrame
63
 
64
 
65
class MyFrame(wx.Frame):
66
    def __init__(self, *args, **kwds):
67
        # content of this block not found: did you rename this class?
68
        pass
69
 
70
    def __set_properties(self):
71
        # content of this block not found: did you rename this class?
72
        pass
73
 
74
    def __do_layout(self):
75
        # content of this block not found: did you rename this class?
76
        pass
77
 
78
# end of class MyFrame
79
 
80
 
584 FredericG 81
class MainFrame(wx.Frame):
82
    def __init__(self, *args, **kwds):
83
        # begin wxGlade: MainFrame.__init__
84
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
85
        wx.Frame.__init__(self, *args, **kwds)
587 FredericG 86
 
87
        # Menu Bar
88
        self.frame_1_menubar = wx.MenuBar()
89
        wxglade_tmp_menu = wx.Menu()
90
        wxglade_tmp_menu.Append(wx.NewId(), "Exit", "", wx.ITEM_NORMAL)
91
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
92
        wxglade_tmp_menu = wx.Menu()
93
        wxglade_tmp_menu.Append(wx.NewId(), "Clear", "", wx.ITEM_NORMAL)
94
        wxglade_tmp_menu.Append(wx.NewId(), "Import", "", wx.ITEM_NORMAL)
95
        self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet")
96
        wxglade_tmp_menu = wx.Menu()
97
        self.frame_1_menubar.Append(wxglade_tmp_menu, "MK")
98
        wxglade_tmp_menu = wx.Menu()
99
        self.frame_1_menubar.Append(wxglade_tmp_menu, "Help")
100
        self.SetMenuBar(self.frame_1_menubar)
101
        # Menu Bar end
600 FredericG 102
        self.Description = wx.StaticText(self, -1, "Description")
103
        self.text_ctrl_6 = wx.TextCtrl(self, -1, "Test")
104
        self.label_37 = wx.StaticText(self, -1, "Speed(s)")
105
        self.text_ctrl_9 = wx.TextCtrl(self, -1, "100-200:10")
106
        self.label_35 = wx.StaticText(self, -1, "Motor(s)")
107
        self.text_ctrl_7 = wx.TextCtrl(self, -1, "1")
108
        self.label_38 = wx.StaticText(self, -1, "")
109
        self.text_ctrl_10 = wx.TextCtrl(self, -1, "")
110
        self.label_36 = wx.StaticText(self, -1, "Channel")
111
        self.text_ctrl_8 = wx.TextCtrl(self, -1, "6")
112
        self.label_39 = wx.StaticText(self, -1, "")
113
        self.text_ctrl_11 = wx.TextCtrl(self, -1, "")
114
        self.button_4 = wx.Button(self, -1, "Start")
115
        self.GraphPanel = wx.Panel(self, -1)
116
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
117
        self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"])
118
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
119
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"])
586 FredericG 120
        self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
584 FredericG 121
 
122
        self.__set_properties()
123
        self.__do_layout()
587 FredericG 124
 
125
        self.Bind(wx.EVT_MENU, self.OnImport, id=-1)
600 FredericG 126
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
127
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
584 FredericG 128
        # end wxGlade
129
 
587 FredericG 130
    def setApp(self, app):
131
        self.app = app
585 FredericG 132
 
584 FredericG 133
    def __set_properties(self):
134
        # begin wxGlade: MainFrame.__set_properties
587 FredericG 135
        self.SetTitle("VibrationTest")
600 FredericG 136
        self.SetSize((850, 700))
137
        self.Description.SetMinSize((53, 13))
138
        self.GraphPanel.SetMinSize((800,300))
139
        self.graphTypeChoice.SetSelection(0)
140
        self.yAxisChoice.SetSelection(1)
141
        self.TestListCtrl.SetMinSize((800,300))
584 FredericG 142
        # end wxGlade
143
 
144
    def __do_layout(self):
145
        # begin wxGlade: MainFrame.__do_layout
600 FredericG 146
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
147
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
148
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
149
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
150
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
151
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
152
        grid_sizer_1 = wx.GridSizer(3, 4, 4, 5)
153
        sizer_3.Add((20, 20), 0, 0, 0)
154
        sizer_8.Add((20, 20), 0, 0, 0)
155
        grid_sizer_1.Add(self.Description, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
584 FredericG 156
        grid_sizer_1.Add(self.text_ctrl_6, 0, 0, 0)
600 FredericG 157
        grid_sizer_1.Add(self.label_37, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
158
        grid_sizer_1.Add(self.text_ctrl_9, 0, 0, 0)
159
        grid_sizer_1.Add(self.label_35, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
584 FredericG 160
        grid_sizer_1.Add(self.text_ctrl_7, 0, 0, 0)
600 FredericG 161
        grid_sizer_1.Add(self.label_38, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
162
        grid_sizer_1.Add(self.text_ctrl_10, 0, 0, 0)
163
        grid_sizer_1.Add(self.label_36, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
584 FredericG 164
        grid_sizer_1.Add(self.text_ctrl_8, 0, 0, 0)
600 FredericG 165
        grid_sizer_1.Add(self.label_39, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
166
        grid_sizer_1.Add(self.text_ctrl_11, 0, 0, 0)
167
        sizer_9.Add(grid_sizer_1, 0, 0, 0)
168
        sizer_10.Add((50, 20), 0, 0, 0)
169
        sizer_10.Add(self.button_4, 0, wx.ALIGN_CENTER_VERTICAL, 0)
170
        sizer_9.Add(sizer_10, 1, wx.EXPAND, 0)
171
        sizer_8.Add(sizer_9, 0, 0, 0)
172
        sizer_8.Add((20, 30), 0, 0, 0)
173
        sizer_11.Add(self.GraphPanel, 1, wx.EXPAND, 0)
174
        sizer_11.Add((20, 5), 0, 0, 0)
175
        sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0)
176
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
177
        sizer_12.Add((40, 20), 0, 0, 0)
178
        sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0)
179
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
180
        sizer_11.Add(sizer_12, 0, 0, 0)
181
        sizer_8.Add(sizer_11, 0, 0, 0)
182
        sizer_8.Add((20, 30), 0, 0, 0)
183
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
184
        sizer_8.Add((20, 20), 0, 0, 0)
185
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
186
        self.SetSizer(sizer_3)
584 FredericG 187
        self.Layout()
600 FredericG 188
        self.SetSize((850, 700))
584 FredericG 189
        # end wxGlade
190
 
590 FredericG 191
        # List events
192
        self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl)
193
 
586 FredericG 194
        # Configure Graph
593 FredericG 195
        self.client = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
196
 
585 FredericG 197
        self.client.SetPointLabelFunc(self.DrawPointLabel)
198
 
199
        self.client.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL))
200
        self.client.SetFontSizeAxis(10)
201
        self.client.SetFontSizeLegend(7)
202
        self.client.setLogScale((False,False))
203
 
586 FredericG 204
 
205
        # Configure TestListCtrl
594 FredericG 206
        self.TestListCtrl.InsertColumn(0, "Description")
207
        self.TestListCtrl.InsertColumn(1, "Speed")
208
        self.TestListCtrl.InsertColumn(2, "Channel")
209
        self.TestListCtrl.InsertColumn(3, "Result")
586 FredericG 210
 
585 FredericG 211
    def DrawPointLabel(self, dc, mDataDict):
212
        """This is the fuction that defines how the pointLabels are plotted
213
            dc - DC that will be passed
214
            mDataDict - Dictionary of data that you want to use for the pointLabel
215
 
216
            As an example I have decided I want a box at the curve point
217
            with some text information about the curve plotted below.
218
            Any wxDC method can be used.
219
        """
220
        # ----------
221
        dc.SetPen(wx.Pen(wx.BLACK))
222
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
223
 
224
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
225
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
226
        px,py = mDataDict["pointXY"]
227
        cNum = mDataDict["curveNum"]
228
        pntIn = mDataDict["pIndex"]
229
        legend = mDataDict["legend"]
230
        #make a string to display
231
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
232
        dc.DrawText(s, sx , sy+1)
233
        # -----------
234
 
596 FredericG 235
 
236
    def onNewTest(self, test):
237
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
238
        self.TestListCtrl.SetStringItem(index, 1, str(test.speed))
239
        self.TestListCtrl.SetStringItem(index, 2, test.channel)
240
        self.TestListCtrl.SetStringItem(index, 3, "OK")
241
 
242
 
590 FredericG 243
    def OnTestSelected(self, event):
244
         testId = event.m_itemIndex
245
         print "Test Selected id=%d" % (testId)
592 FredericG 246
         self.activeTestId = testId
247
         self.drawGraph()
590 FredericG 248
 
592 FredericG 249
    def drawGraph(self):
250
         vibTest = self.app.getTest(self.activeTestId)
590 FredericG 251
         nb = vibTest.getDataLen()
600 FredericG 252
         y = int(self.yAxisChoice.GetStringSelection())
590 FredericG 253
 
600 FredericG 254
         if self.graphTypeChoice.GetSelection() == 0:
599 FredericG 255
             xydata = _Numeric.linspace(0,0.09*nb,2*nb)
256
             xydata.shape = (nb, 2)
257
             xydata[:,1] = vibTest.getRawData()
600 FredericG 258
             line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
599 FredericG 259
 
260
             title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
261
             self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
262
             self.client.SetEnableGrid('Horizontal')
596 FredericG 263
 
600 FredericG 264
         if self.graphTypeChoice.GetSelection() == 1:
265
             xydata = _Numeric.linspace(0,0.09*nb,2*nb)
266
             xydata.shape = (nb, 2)
267
             xydata[:,1] = vibTest.getFilteredData()
268
             line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
269
 
270
             title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
271
             self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
272
             self.client.SetEnableGrid('Horizontal')
273
 
274
         elif self.graphTypeChoice.GetSelection() == 2:
599 FredericG 275
             xydata = _Numeric.linspace(0,5555,nb)
276
             xydata.shape = (nb/2, 2)
277
 
278
             xydata[:,1] = vibTest.getSpectrum()
590 FredericG 279
 
599 FredericG 280
             line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
600 FredericG 281
             markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
599 FredericG 282
 
283
             title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
600 FredericG 284
             self.client.Draw(wx.lib.plot.PlotGraphics([line,markers], title, "Freq (Hz)", "Acc"), xAxis=(0,300), yAxis= (-0,y))
285
             self.client.SetEnableGrid(True)
590 FredericG 286
 
599 FredericG 287
 
587 FredericG 288
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
289
        self.app.Import()
290
 
599 FredericG 291
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
592 FredericG 292
        self.drawGraph()
293
 
600 FredericG 294
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
599 FredericG 295
        self.drawGraph()
296
 
584 FredericG 297
# end of class MainFrame
298
 
299
 
586 FredericG 300
class VibTest:
596 FredericG 301
    def __init__(self, descr, motor, speed, channel, rawData):
594 FredericG 302
        self.descr = descr
303
        self.motor = motor
304
        self.speed = speed
596 FredericG 305
        self.channel = channel
599 FredericG 306
 
307
        self.dataLen = len(rawData)
308
 
590 FredericG 309
        self.rawData = _Numeric.array(rawData)
310
        self.dc = self.rawData.mean()
311
        self.rawData -= self.dc
586 FredericG 312
 
600 FredericG 313
        self.fft = _Numeric.fft.rfft(self.rawData)
314
 
315
        self.spectrum = None
316
        self.filteredData = None
599 FredericG 317
 
594 FredericG 318
    def getDescr(self):
319
        return self.Descr
587 FredericG 320
 
590 FredericG 321
    def getRawData(self):
322
        return self.rawData
323
 
324
    def getDataLen(self):
325
        return self.dataLen
326
 
599 FredericG 327
    def getSpectrum(self):
600 FredericG 328
        if self.spectrum == None:
329
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
330
        return self.spectrum
590 FredericG 331
 
600 FredericG 332
    def getFilteredData(self):
333
        if self.filteredData == None:
334
            tmpfft = self.fft.copy()
335
            for i in range(0,7):
336
                tmpfft[i] = 0
337
            for i in range(30, len(tmpfft)):
338
                tmpfft[i] = 0
339
            self.filteredData = _Numeric.fft.irfft(tmpfft)
340
        return self.filteredData
599 FredericG 341
 
584 FredericG 342
class App(wx.App):
586 FredericG 343
    def __init__(self, par):
344
        self.VibTests = []
345
 
346
        wx.App.__init__(self, par)
347
 
348
 
596 FredericG 349
    def AddTest(self, descr, motor, speed, channel, rawData):
350
        test = VibTest(descr, motor, speed, channel, rawData)
586 FredericG 351
        self.VibTests.append(test)
596 FredericG 352
        self.frame_1.onNewTest(test)
586 FredericG 353
 
590 FredericG 354
    def getTest(self, testId):
355
        return self.VibTests[testId]
356
 
584 FredericG 357
    def OnInit(self):
358
        wx.InitAllImageHandlers()
586 FredericG 359
        self.frame_1 = MainFrame(None, -1, "")
587 FredericG 360
        self.frame_1.setApp(self);
586 FredericG 361
        self.SetTopWindow(self.frame_1)
362
 
587 FredericG 363
        self.frame_1.Show()
364
        return 1
365
 
366
    def Import(self):
600 FredericG 367
 
368
        filePath = "./unbal150.txt"
599 FredericG 369
        #filePath = "./nikivan.txt"
596 FredericG 370
 
371
        print "Import %s" % filePath
372
 
373
        logfile = open(filePath, "r")
590 FredericG 374
        data = None
596 FredericG 375
 
376
        headers = (logfile.readline()).split(',')
377
        nbCols = len(headers)
378
        print "NbCols =", nbCols
379
 
380
        data = []
381
        descr = []
382
        speed = []
383
        channel = []
384
        for c in range(nbCols):
385
            data.append([])
386
            h = headers[c].split(' ')
387
            descr.append(h[0]);
388
            speed.append(h[1]);
389
            channel.append(h[2]);
390
 
590 FredericG 391
        for line in logfile:
392
            values = line.split(',')
596 FredericG 393
            for i in range(nbCols):
394
                data[i].append(int(values[i]))
590 FredericG 395
        logfile.close()
596 FredericG 396
 
397
        for c in range(nbCols):
599 FredericG 398
            if (len(data[c]) % 2) != 0:
399
                data[c].append(data[c][-1])
596 FredericG 400
            self.AddTest(descr[c], 0, int(speed[c]), channel[c], data[c])
590 FredericG 401
 
402
 
403
 
586 FredericG 404
 
590 FredericG 405
 
584 FredericG 406
# end of class App
407
 
408
if __name__ == "__main__":
409
    VibrationTestGui = App(0)
410
    VibrationTestGui.MainLoop()