1 # |
1 # |
2 |
2 |
3 from PyQt4 import QtGui, QtCore |
3 import os, sys |
|
4 |
|
5 from PyQt4 import QtGui, QtCore, uic |
4 from PyQt4.QtCore import SIGNAL, Qt |
6 from PyQt4.QtCore import SIGNAL, Qt |
5 |
7 |
6 from gppib_plotter import GPIBplotter |
8 from gpib_plotter import GPIBplotter |
7 from hpgl_qt import QHPGLPlotterWidget |
9 from hpgl_qt import QHPGLPlotterWidget |
8 |
10 |
9 ORGANISATION="Logilab" |
11 form_class, base_class = uic.loadUiType(os.path.join(os.path.dirname(__file__), "qhpgl_plotter.ui")) |
10 APPLICATION="qgpib_plotter" |
|
11 def variant(v): |
|
12 _cvrts = {1: lambda x:x.toInt(), |
|
13 10: lambda x:unicode(x.toString()), |
|
14 } |
|
15 t = v.userType() |
|
16 |
12 |
17 class Preferences(object): |
13 from qpreferences import PreferenceItem, AbstractPreferences, PreferencesEditor |
18 _defaults = {'device': '/dev/ttyUSB0', |
|
19 'address': 0, |
|
20 } |
|
21 def __init__(self): |
|
22 self._settings = qc.QSettings(qc.QSettings.UserScope, |
|
23 ORGANISATION, APPLICATION) |
|
24 |
14 |
25 def getPref(self, key): |
15 class Preferences(AbstractPreferences): |
26 val = self._settings.value(key, QtCore.QVariant(self._defaults[key])) |
16 ORGANISATION="Logilab" |
|
17 APPLICATION="qgpib_plotter" |
27 |
18 |
28 |
19 device = PreferenceItem('/dev/ttyUSB0', name=u'device', description=u'GPIB device') |
29 class QtHPGLPlotter(QtGui.QMainWindow): |
20 address = PreferenceItem(5, name=u'GPIB address') |
|
21 _pos = PreferenceItem(basetype=QtCore.QPoint) |
|
22 _size = PreferenceItem(basetype=QtCore.QSize) |
|
23 _appState = PreferenceItem(basetype=QtCore.QByteArray) |
|
24 |
|
25 class QtHPGLPlotter(QtGui.QMainWindow, form_class): |
30 def __init__(self, parent=None): |
26 def __init__(self, parent=None): |
31 QtGui.QMainWindow.__init__(self, parent) |
27 QtGui.QMainWindow.__init__(self, parent) |
32 self.gpib_plotter = GPIBplotter( |
28 self._plots = {} |
|
29 self._prefs = Preferences() |
|
30 self.setupUi() |
|
31 self.initializeGPIB() |
|
32 if self._prefs._pos: |
|
33 self.move(self._prefs._pos) |
|
34 if self._prefs._size: |
|
35 self.resize(self._prefs._size) |
|
36 if self._prefs._appState: |
|
37 self.restoreState(self._prefs._appState) |
33 |
38 |
|
39 def setupUi(self): |
|
40 form_class.setupUi(self, self) # call qtdesigner generated form creation |
|
41 # actions defined in designer |
|
42 self.connect(self.actionPreferences, SIGNAL('triggered(bool)'), |
|
43 self.preferencesTriggered) |
|
44 self.connect(self.actionQuit, SIGNAL('triggered(bool)'), |
|
45 self.quitTriggered) |
|
46 self.connect(self.actionOpen, SIGNAL('triggered(bool)'), |
|
47 self.openTriggered) |
|
48 self.connect(self.actionSave, SIGNAL('triggered(bool)'), |
|
49 self.saveTriggered) |
|
50 self.connect(self.actionSaveAs, SIGNAL('triggered(bool)'), |
|
51 self.saveAsTriggered) |
|
52 |
|
53 self.plotterWidget = QHPGLPlotterWidget(self) |
|
54 self.setCentralWidget(self.plotterWidget) |
|
55 |
|
56 self.connect(self.captureButton, SIGNAL("toggled(bool)"), |
|
57 self.captureToggled) |
|
58 |
|
59 self._plots_list = QtGui.QStringListModel() |
|
60 self.plotsView.setModel(self._plots_list) |
|
61 self.connect(self.plotsView, SIGNAL('activated(const QModelIndex&)'), |
|
62 self.currentPlotChanged) |
|
63 self.connect(self.plotsView.selectionModel(), |
|
64 SIGNAL('currentChanged(const QModelIndex&, const QModelIndex&)'), |
|
65 self.currentPlotChanged) |
|
66 |
|
67 def currentPlotChanged(self, index, old_index=None): |
|
68 if index.isValid(): |
|
69 value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString()) |
|
70 |
|
71 #self.plotterWidget = QHPGLPlotterWidget(self) |
|
72 #self.setCentralWidget(self.plotterWidget) |
|
73 self.plotterWidget.clear() |
|
74 self.plotterWidget.parse(self._plots[value]) |
|
75 |
|
76 def preferencesTriggered(self, checked=False): |
|
77 PreferencesEditor(self._prefs, self).exec_() |
|
78 |
|
79 def quitTriggered(self, checked=False): |
|
80 self.close() |
|
81 |
|
82 def closeEvent(self, event): |
|
83 if 1: |
|
84 #if self.promptForSave(): |
|
85 self._prefs._pos = self.pos() |
|
86 self._prefs._size = self.size() |
|
87 self._prefs._appState = self.saveState() |
|
88 event.accept() |
|
89 else: |
|
90 event.ignore() |
34 |
91 |
|
92 def openTriggered(self, checked=False): |
|
93 filenames = QtGui.QFileDialog.getOpenFileNames(self, "Open a HPGL file to display", '.', 'HPGL files (*.plt)\nAll files (*)') |
|
94 for filename in filenames: |
|
95 filename = str(filename) |
|
96 if os.path.exists(filename): |
|
97 data = open(filename).read() |
|
98 name = os.path.basename(filename) |
|
99 name = os.path.splitext(name)[0] |
|
100 lst = self.plotsView.model().stringList() |
|
101 lst.append(name) |
|
102 self._plots[name] = data |
|
103 self.plotsView.model().setStringList(lst) |
|
104 #self.plotsView.setCurrentIndex(self.plotsView.model().index(self.plotsView.model().stringList().count(), 0)) |
|
105 |
|
106 |
|
107 |
|
108 def saveTriggered(self, checked=False): |
|
109 print "save" |
|
110 def saveAsTriggered(self, checked=False): |
|
111 print "saveAs" |
|
112 |
|
113 def initializeGPIB(self): |
|
114 try: |
|
115 self.gpib_plotter = GPIBplotter(device=self._prefs.device, |
|
116 address=self._prefs.address, |
|
117 ) |
|
118 except: |
|
119 self.gpib_plotter = None |
|
120 self._online = False |
|
121 self.setCaptureLed() |
|
122 |
|
123 def captureToggled(self, state): |
|
124 if state: |
|
125 if self.gpib_plotter is None: |
|
126 self.initializeGPIB() |
|
127 if self.gpib_plotter is None: |
|
128 QtGui.QMessageBox.critical(self, self.tr("GPIB error"), |
|
129 self.tr("<b>Unable to initialize GPIB connection</b>.<br>Please check your GPIB dongle and settings.")) |
|
130 self._online = False |
|
131 else: |
|
132 # todo |
|
133 self._online = True |
|
134 else: |
|
135 self._online = False |
|
136 self.setCaptureLed() |
|
137 |
|
138 |
|
139 def setCaptureLed(self): |
|
140 if self._online: |
|
141 icn = QtGui.QIcon(':/icons/led_green.png') |
|
142 else: |
|
143 icn = QtGui.QIcon(':/icons/led_green_off.png') |
|
144 self.captureButton.setIcon(icn) |
|
145 self.captureButton.setChecked(self._online) |
|
146 |
|
147 if __name__ == '__main__': |
|
148 a = QtGui.QApplication([]) |
|
149 w = QtHPGLPlotter() |
|
150 w.show() |
|
151 a.exec_() |
|
152 |