class PanelSpec(wx.Panel): def __init__(self, parent, parentMainFrame): wx.Panel.__init__(self, parent) self.CreatePanel() self.setSpLabel() self.parent = parentMainFrame self.FFT_Max_X = 5995 self.FFT_Min_X = 70 self.FFT_Max_Y = 60 self.FFT_Min_Y = -120 ######## upload ########### self.start_upload = 0 ###### download ######### self.download = 0 self.dir = "" ############################ self.thread = 0 def getstartUploadOnce(self): return self.start_upload def getisDownLoad(self): return self.download def getDownloadDir(self): return self.dir def restore2unstart(self): self.start_upload = 0 def restoreisDownLoad(self): self.download = 0 ###################################################### def CreatePanel(self): self.Figure = matplotlib.figure.Figure() self.axes = self.Figure.add_axes([0.05, 0.05, 0.93, 0.93]) self.FigureCanvas = FigureCanvas(self, -1, self.Figure) self.ButtonAutoY = wx.Button(self, -1, label=u"纵轴恢复") self.ButtonAutoX = wx.Button(self, -1, label=u"横轴恢复") self.Max_Y = wx.TextCtrl(self, -1, '60', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Min_Y = wx.TextCtrl(self, -1, '-120', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Min_X = wx.TextCtrl(self, -1, '70', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Max_X = wx.TextCtrl(self, -1, '5995', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Upload = wx.Button(self, -1, label=u"数据上传") self.Download = wx.Button(self, -1, label=u"本地存储") ###################################test sizer############################## self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) bSizer4 = wx.BoxSizer(wx.VERTICAL) gSizer6 = wx.GridSizer(1, 7, 0, 0) gSizer6.Add(self.ButtonAutoX, 0, wx.ALL | wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT, 5) gSizer6.Add(self.ButtonAutoY, 0, wx.ALL, 5) gSizer6.AddSpacer((0, 0), 1, wx.EXPAND, 5) gSizer6.AddSpacer((0, 0), 1, wx.EXPAND, 5) gSizer6.AddSpacer((0, 0), 1, wx.EXPAND, 5) gSizer6.Add(self.Upload, 0, wx.ALL | wx.ALIGN_RIGHT, 5) gSizer6.Add(self.Download, 0, wx.ALL | wx.ALIGN_LEFT, 5) bSizer4.Add(gSizer6, 0, wx.EXPAND, 5) bSizer5 = wx.BoxSizer(wx.HORIZONTAL) gSizer8 = wx.GridSizer(2, 1, 0, 0) gSizer8.Add(self.Max_Y, 0, wx.ALL, 5) gSizer8.Add(self.Min_Y, 0, wx.ALIGN_BOTTOM | wx.ALL, 5) bSizer5.Add(gSizer8, 0, wx.EXPAND, 5) gSizer10 = wx.GridSizer(1, 1, 0, 0) gSizer10.Add(self.FigureCanvas, 1, wx.ALL | wx.EXPAND, 5) bSizer5.Add(gSizer10, 5, wx.EXPAND, 5) bSizer4.Add(bSizer5, 4, wx.EXPAND, 5) gSizer9 = wx.GridSizer(1, 2, 0, 0) # gSizer9.AddSpacer( ( 0, 0), 1, wx.EXPAND, 5 ) # self.m_textCtrl16 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 80,-1 ), 0 ) gSizer9.Add(self.Min_X, 0, wx.ALL, 5) # self.m_textCtrl17 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 80,-1 ), 0 ) gSizer9.Add(self.Max_X, 0, wx.ALIGN_RIGHT | wx.ALL, 5) bSizer4.Add(gSizer9, 0, wx.EXPAND, 5) self.SetSizer(bSizer4) self.Layout() self.Centre(wx.BOTH) ##################################################################################### self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMin_X, self.Min_X) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMax_X, self.Max_X) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMax_Y, self.Max_Y) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMin_Y, self.Min_Y) self.Bind(wx.EVT_BUTTON, self.OnAutoX, self.ButtonAutoX) self.Bind(wx.EVT_BUTTON, self.OnAutoY, self.ButtonAutoY) self.Bind(wx.EVT_BUTTON, self.OnUpload, self.Upload) self.Bind(wx.EVT_BUTTON, self.OnDownload, self.Download) self.popupmenu = wx.Menu() StringList = ["Add Marker", "Remove Marker", "All Marker Off"] for text in StringList: item = self.popupmenu.Append(-1, text) self.FigureCanvas.Bind(wx.EVT_CONTEXT_MENU, self.OnShowPopup) self.FigureCanvas.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) ''' Array=linspace(70, 5995,238) self.xDataList=[] self.LineSpec=[] self.LineSpecBack=[] for i in xrange(237): xData=linspace(Array[i],Array[i+1],1024) self.xDataList.append(xData) ydata=[0]*1024 for xData in self.xDataList: lineSpec,=self.axes.plot(xData,ydata,'y') lineSpecBack,=self.axes.plot(xData,ydata,'r') self.LineSpec.append(lineSpec) self.LineSpecBack.append(lineSpecBack) ''' self.xData = linspace(70, 6470, 1024) self.yData = [0] * 1024 self.lineSpec, = self.axes.plot(self.xData, self.yData, 'y') self.lineSpecBack, = self.axes.plot(self.xData, self.yData, 'r') ####Marker############ self.drs = [] def OnUpload(self, event): self.start_upload = 1 def OnDownload(self, event): if (self.Download.GetLabel() == "LocalSave"): ''' dlg=dialog_download(self) dlg.ShowModal() if(dlg.isValid): self.dir=dlg.m_dirPick.GetPath() print self.dir ''' self.download = 1 self.Download.SetLabel(u"停止存储") '''start the thread localsave''' if (self.thread == 0): self.thread = thread_localsave.LocalSaveThread( self.parent, self.parent.queueFFTLocalSave, self.parent.queueAbLocalSave) self.thread.start() else: self.thread.event.set() else: '''stop the thread localsave''' self.thread.stop() self.Download.SetLabel(u"本地存储") self.download = 0 def OnAutoX(self, event): self.setSpLabel(begin_X=self.parent.FreqMin,end_X=self.parent.FreqMax , \ begin_Y=self.FFT_Min_Y,end_Y=self.FFT_Max_Y) self.FigureCanvas.draw() self.FFT_Min_X = self.parent.FreqMin self.FFT_Max_X = self.parent.FreqMax self.Min_X.SetValue(str(self.FFT_Min_X)) self.Max_X.SetValue(str(self.FFT_Max_X)) def OnAutoY(self, event): self.setSpLabel(begin_X=self.FFT_Min_X, end_X=self.FFT_Max_X) self.FigureCanvas.draw() self.FFT_Min_Y = -120 self.FFT_Max_Y = 60 self.Min_Y.SetValue("-120") self.Max_Y.SetValue("60") def OnEnterMin_X(self, event): self.FFT_Min_X = int(self.Min_X.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnEnterMax_X(self, event): self.FFT_Max_X = int(self.Max_X.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnEnterMin_Y(self, event): self.FFT_Min_Y = int(self.Min_Y.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnEnterMax_Y(self, event): self.FFT_Max_Y = int(self.Max_Y.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnShowPopup(self, event): pos = event.GetPosition() pos = self.FigureCanvas.ScreenToClient(pos) self.FigureCanvas.PopupMenu(self.popupmenu, pos) def OnPopupItemSelected(self, event): item = self.popupmenu.FindItemById(event.GetId()) text = item.GetText() if (text == "Add Marker"): self.OnAddMarker() elif (text == "Remove Marker"): self.OnRemove() elif (text == "All Marker Off"): self.OnAllRemove() def DrawMarker(self, Max_X, Max_Y): distance = ((self.FFT_Max_X - self.FFT_Min_X) / 10)**2 index = len(self.drs) + 1 rect, = self.axes.plot(Max_X, Max_Y, 'rd', markersize=10) text = self.axes.text(Max_X + 5, Max_Y + 2, 'M' + str(index), color='r') textM=self.axes.text(self.FFT_Min_X+5,self.FFT_Max_Y-5*(index),'M'+str(index)+':' \ +'%.2f'%(Max_X)+'MHz '+'%.2f'%(Max_Y)+'dBm') # DragRect=DraggableRectangle(rect,text,textM,self.LineSpec,self.FigureCanvas) # DragRect.setM_id('M'+str(index)+':') # # DragRect.setRadius(distance) # DragRect.connect() # self.drs.append(DragRect) #self.FigureCanvas.draw() def OnAddMarker(self): if (len(self.drs) < 4): startSection = (self.FFT_Min_X - 70) / 25 endSection = (self.FFT_Max_X - 70) / 25 lenStart = len(self.LineSpec[startSection].get_ydata()) lenEnd = len(self.LineSpec[endSection].get_ydata()) indexStart = int( (self.FFT_Min_X - (startSection * 25 + 70)) * lenStart / 25.0) indexEnd = int( (self.FFT_Max_X - (endSection * 25 + 70)) * lenEnd / 25.0) MaxList = [] MaxList.append( max( list(self.LineSpec[startSection].get_ydata()) [indexStart:lenStart])) for i in range(startSection + 1, endSection, 1): MaxList.append(max(list(self.LineSpec[i].get_ydata()))) if (indexEnd != 0): MaxList.append( max( list(self.LineSpec[endSection].get_ydata()) [0:indexEnd])) Max_Y = max(MaxList) Max_Y_Index = MaxList.index(Max_Y) + startSection y = self.LineSpec[Max_Y_Index].get_ydata() Max_X_Index = list(y).index(Max_Y) Max_X = 70 + Max_Y_Index * 25 + Max_X_Index * 25.0 / len(y) self.DrawMarker(Max_X, Max_Y) def OnRemove(self): if (len(self.axes.texts)): self.axes.lines.pop() self.axes.texts.pop() self.axes.texts.pop() self.drs.pop() #self.FigureCanvas.draw() def OnAllRemove(self): while (len(self.axes.texts)): self.axes.lines.pop() self.axes.texts.pop() self.axes.texts.pop() self.drs.pop() #self.FigureCanvas.draw() def setSpLabel(self, begin_X=70, end_X=5995, begin_Y=-120, end_Y=60): self.ylabel('dBm') self.xlabel('MHz') self.ylim(begin_Y, end_Y) self.xlim(begin_X, end_X) yticks = linspace(begin_Y, end_Y, 11) ##11个数总共### yticklabels = [str(int(i)) for i in yticks] xticks = linspace(begin_X, end_X, 11) xticklabels = [str('%0.1f' % (i)) for i in xticks] self.axes.set_xticks(xticks) self.axes.set_xticklabels(xticklabels, rotation=0) self.axes.set_yticks(yticks) self.axes.set_yticklabels(yticklabels, rotation=0) self.axes.grid(True) #self.FigureCanvas.draw() def PowerSpectrum(self, funcPara, y): if (funcPara == 0x51 or funcPara == 0x56): self.lineSpec.set_ydata(array(y)) ''' for i in range(len(self.drs)): self.drs[i].yData=self.LineSpec self.DrawAfterRelease() ''' elif (funcPara == 0x52 or funcPara == 0x57): self.lineSpecBack.set_ydata(array(y)) self.FigureCanvas.draw() def DrawAfterRelease(self): for i in range(len(self.drs)): xData = self.drs[i].rect.get_xdata() index = (int(xData) - 70) / 25 Section = index * 25 + 70 y = self.LineSpec[index].get_ydata() index_Y = (xData - Section) * len(y) / 25.0 Marker_Y = list(y)[int(index_Y)] self.drs[i].rect.set_ydata(Marker_Y) self.drs[i].textMarker.set_position((xData, Marker_Y + 2)) self.drs[i].textM.set_text(self.drs[i].M_index+'%.2f'%(xData)+ \ 'MHz '+'%.2f'%(Marker_Y)+'dBm') def xlim(self, x_min, x_max): self.axes.set_xlim(x_min, x_max) def ylim(self, y_min, y_max): self.axes.set_ylim(y_min, y_max) def xlabel(self, XabelString="X"): self.axes.set_xlabel(XabelString) def ylabel(self, YabelString="Y"): self.axes.set_ylabel(YabelString)
class PanelSpec(wx.Panel): def __init__(self, parent, parentMainFrame): wx.Panel.__init__(self, parent) self.CreatePanel() self.setSpLabel() self.parent = parentMainFrame self.FFT_Max_X = 5995 self.FFT_Min_X = 70 self.FFT_Max_Y = 60 self.FFT_Min_Y = -120 def CreatePanel(self): self.Figure = matplotlib.figure.Figure() self.axes = self.Figure.add_axes([0.05, 0.05, 0.93, 0.93]) self.FigureCanvas = FigureCanvas(self, -1, self.Figure) self.ButtonAutoY = wx.Button(self, -1, label="AutoScaleY") self.ButtonAutoX = wx.Button(self, -1, label="AutoScaleX") self.Max_Y = wx.TextCtrl(self, -1, '60', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Min_Y = wx.TextCtrl(self, -1, '-120', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Min_X = wx.TextCtrl(self, -1, '70', size=(60, 20), style=wx.TE_PROCESS_ENTER) self.Max_X = wx.TextCtrl(self, -1, '5995', size=(60, 20), style=wx.TE_PROCESS_ENTER) sizer = wx.GridBagSizer(5, 5) sizer.Add(self.ButtonAutoX, pos=(0, 1), flag=wx.TOP, border=5) sizer.Add(self.ButtonAutoY, pos=(0, 2), flag=wx.TOP, border=5) sizer.Add(self.Max_Y, pos=(1, 0), flag=wx.ALL, border=5) sizer.Add(self.Min_Y, pos=(17, 0), flag=wx.ALL, border=5) sizer.Add(self.FigureCanvas, pos=(1, 1), span=(18, 14), flag=wx.EXPAND) sizer.Add(self.Min_X, pos=(19, 1), flag=wx.RIGHT | wx.BOTTOM, border=5) sizer.Add(self.Max_X, pos=(19, 14), flag=wx.BOTTOM, border=5) sizer.AddGrowableCol(10) sizer.AddGrowableRow(10) self.SetSizer(sizer) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMin_X, self.Min_X) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMax_X, self.Max_X) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMax_Y, self.Max_Y) self.Bind(wx.EVT_TEXT_ENTER, self.OnEnterMin_Y, self.Min_Y) self.Bind(wx.EVT_BUTTON, self.OnAutoX, self.ButtonAutoX) self.Bind(wx.EVT_BUTTON, self.OnAutoY, self.ButtonAutoY) self.popupmenu = wx.Menu() StringList = ["Add Marker", "Remove Marker", "All Marker Off"] for text in StringList: item = self.popupmenu.Append(-1, text) self.FigureCanvas.Bind(wx.EVT_CONTEXT_MENU, self.OnShowPopup) self.FigureCanvas.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item) ''' Array=linspace(70, 5995,238) self.xDataList=[] self.LineSpec=[] self.LineSpecBack=[] for i in xrange(237): xData=linspace(Array[i],Array[i+1],1024) self.xDataList.append(xData) ydata=[0]*1024 for xData in self.xDataList: lineSpec,=self.axes.plot(xData,ydata,'y') lineSpecBack,=self.axes.plot(xData,ydata,'r') self.LineSpec.append(lineSpec) self.LineSpecBack.append(lineSpecBack) ''' self.xData = linspace(70, 6470, 1024) self.yData = [0] * 1024 self.lineSpec, = self.axes.plot(self.xData, self.yData, 'y') self.lineSpecBack, = self.axes.plot(self.xData, self.yData, 'r') ####Marker############ self.drs = [] def OnAutoX(self, event): self.setSpLabel(begin_X=self.parent.FreqMin,end_X=self.parent.FreqMax , \ begin_Y=self.FFT_Min_Y,end_Y=self.FFT_Max_Y) self.FigureCanvas.draw() self.FFT_Min_X = self.parent.FreqMin self.FFT_Max_X = self.parent.FreqMax self.Min_X.SetValue(str(self.FFT_Min_X)) self.Max_X.SetValue(str(self.FFT_Max_X)) def OnAutoY(self, event): self.setSpLabel(begin_X=self.FFT_Min_X, end_X=self.FFT_Max_X) self.FigureCanvas.draw() self.FFT_Min_Y = -120 self.FFT_Max_Y = 60 self.Min_Y.SetValue("-120") self.Max_Y.SetValue("60") def OnEnterMin_X(self, event): self.FFT_Min_X = int(self.Min_X.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnEnterMax_X(self, event): self.FFT_Max_X = int(self.Max_X.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnEnterMin_Y(self, event): self.FFT_Min_Y = int(self.Min_Y.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnEnterMax_Y(self, event): self.FFT_Max_Y = int(self.Max_Y.GetValue()) self.setSpLabel(self.FFT_Min_X, self.FFT_Max_X, self.FFT_Min_Y, self.FFT_Max_Y) self.FigureCanvas.draw() def OnShowPopup(self, event): pos = event.GetPosition() pos = self.FigureCanvas.ScreenToClient(pos) self.FigureCanvas.PopupMenu(self.popupmenu, pos) def OnPopupItemSelected(self, event): item = self.popupmenu.FindItemById(event.GetId()) text = item.GetText() if (text == "Add Marker"): self.OnAddMarker() elif (text == "Remove Marker"): self.OnRemove() elif (text == "All Marker Off"): self.OnAllRemove() def DrawMarker(self, Max_X, Max_Y): distance = ((self.FFT_Max_X - self.FFT_Min_X) / 10)**2 index = len(self.drs) + 1 rect, = self.axes.plot(Max_X, Max_Y, 'rd', markersize=10) text = self.axes.text(Max_X + 5, Max_Y + 2, 'M' + str(index), color='r') textM=self.axes.text(self.FFT_Min_X+5,self.FFT_Max_Y-5*(index),'M'+str(index)+':' \ +'%.2f'%(Max_X)+'MHz '+'%.2f'%(Max_Y)+'dBm') # DragRect=DraggableRectangle(rect,text,textM,self.LineSpec,self.FigureCanvas) # DragRect.setM_id('M'+str(index)+':') # # DragRect.setRadius(distance) # DragRect.connect() # self.drs.append(DragRect) #self.FigureCanvas.draw() def OnAddMarker(self): if (len(self.drs) < 4): startSection = (self.FFT_Min_X - 70) / 25 endSection = (self.FFT_Max_X - 70) / 25 lenStart = len(self.LineSpec[startSection].get_ydata()) lenEnd = len(self.LineSpec[endSection].get_ydata()) indexStart = int( (self.FFT_Min_X - (startSection * 25 + 70)) * lenStart / 25.0) indexEnd = int( (self.FFT_Max_X - (endSection * 25 + 70)) * lenEnd / 25.0) MaxList = [] MaxList.append( max( list(self.LineSpec[startSection].get_ydata()) [indexStart:lenStart])) for i in range(startSection + 1, endSection, 1): MaxList.append(max(list(self.LineSpec[i].get_ydata()))) if (indexEnd != 0): MaxList.append( max( list(self.LineSpec[endSection].get_ydata()) [0:indexEnd])) Max_Y = max(MaxList) Max_Y_Index = MaxList.index(Max_Y) + startSection y = self.LineSpec[Max_Y_Index].get_ydata() Max_X_Index = list(y).index(Max_Y) Max_X = 70 + Max_Y_Index * 25 + Max_X_Index * 25.0 / len(y) self.DrawMarker(Max_X, Max_Y) def OnRemove(self): if (len(self.axes.texts)): self.axes.lines.pop() self.axes.texts.pop() self.axes.texts.pop() self.drs.pop() #self.FigureCanvas.draw() def OnAllRemove(self): while (len(self.axes.texts)): self.axes.lines.pop() self.axes.texts.pop() self.axes.texts.pop() self.drs.pop() #self.FigureCanvas.draw() def setSpLabel(self, begin_X=70, end_X=5995, begin_Y=-120, end_Y=60): self.ylabel('dBm') self.xlabel('MHz') self.ylim(begin_Y, end_Y) self.xlim(begin_X, end_X) yticks = linspace(begin_Y, end_Y, 11) ##11个数总共### yticklabels = [str(int(i)) for i in yticks] xticks = linspace(begin_X, end_X, 11) xticklabels = [str(int(i)) for i in xticks] self.axes.set_xticks(xticks) self.axes.set_xticklabels(xticklabels, rotation=0) self.axes.set_yticks(yticks) self.axes.set_yticklabels(yticklabels, rotation=0) self.axes.grid(True) #self.FigureCanvas.draw() def PowerSpectrum(self, funcPara, y): if (funcPara == 0x51 or funcPara == 0x56): self.lineSpec.set_ydata(array(y)) ''' for i in range(len(self.drs)): self.drs[i].yData=self.LineSpec self.DrawAfterRelease() ''' elif (funcPara == 0x52 or funcPara == 0x57): self.lineSpecBack.set_ydata(array(y)) self.FigureCanvas.draw() def DrawAfterRelease(self): for i in range(len(self.drs)): xData = self.drs[i].rect.get_xdata() index = (int(xData) - 70) / 25 Section = index * 25 + 70 y = self.LineSpec[index].get_ydata() index_Y = (xData - Section) * len(y) / 25.0 Marker_Y = list(y)[int(index_Y)] self.drs[i].rect.set_ydata(Marker_Y) self.drs[i].textMarker.set_position((xData, Marker_Y + 2)) self.drs[i].textM.set_text(self.drs[i].M_index+'%.2f'%(xData)+ \ 'MHz '+'%.2f'%(Marker_Y)+'dBm') def xlim(self, x_min, x_max): self.axes.set_xlim(x_min, x_max) def ylim(self, y_min, y_max): self.axes.set_ylim(y_min, y_max) def xlabel(self, XabelString="X"): self.axes.set_xlabel(XabelString) def ylabel(self, YabelString="Y"): self.axes.set_ylabel(YabelString)