class ActualFakeActuator(object): def __init__(self, callback=None): self.callback = callback self.app = QApplication(sys.argv) self.vlayout = QVBoxLayout() self.button = QPushButton('light') self.button.pressed.connect(self._button_callback) self.button.setCheckable(True) self.button.setChecked(True) self.button.setStyleSheet('background-color: white') self.vlayout.addWidget(self.button) self.slider = QSlider() self.slider.setOrientation(Qt.Horizontal) self.vlayout.addWidget(self.slider) self.dial = QDial() self.dial.setNotchesVisible(True) self.dial.setWrapping(True) self.vlayout.addWidget(self.dial) self.quit = QPushButton('Quit') self.quit.clicked.connect(self.app.quit) self.vlayout.addWidget(self.quit) self.group = QGroupBox('Fake Actuator') self.group.setLayout(self.vlayout) def _button_callback(self): if self.button.isChecked(): self.button.setStyleSheet('background-color: red') else: self.button.setStyleSheet('background-color: white') def light_on(self): return self.button.isChecked() def toggle_light(self, on): self.button.setChecked(on) def volume(self): return self.slider.value() def set_volume(self, value): self.slider.setValue(value) def position(self): return self.dial.value() def set_position(self, value): self.dial.setValue(value) def run(self): self.group.show() self.app.exec_()
def testBasic(self): '''QTest.mouseClick with QCheckBox''' button = QPushButton() button.setCheckable(True) button.setChecked(False) QTest.mouseClick(button, Qt.LeftButton) self.assert_(button.isChecked()) QTest.mouseClick(button, Qt.LeftButton) self.assertFalse(button.isChecked())
def testWithCppSlot(self): '''QMenuBar.addAction(id, object, slot)''' menubar = QMenuBar() widget = QPushButton() widget.setCheckable(True) widget.setChecked(False) action = menubar.addAction("Accounts", widget, SLOT("toggle()")) action.activate(QAction.Trigger) self.assert_(widget.isChecked())
class AVRProgrammerDialog(QtFixes.QDialog): def __init__(self): super(AVRProgrammerDialog, self).__init__(CWMainGUI.getInstance()) # self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.avr = AVRProgrammer() self.setWindowTitle("ChipWhisperer-Lite AVR Programmer") layout = QVBoxLayout() layoutFW = QHBoxLayout() self.flashLocation = QtFixes.QLineEdit() flashFileButton = QPushButton("Find") flashFileButton.clicked.connect(self.findFlash) layoutFW.addWidget(QLabel("FLASH File")) layoutFW.addWidget(self.flashLocation) layoutFW.addWidget(flashFileButton) layout.addLayout(layoutFW) self.flashLocation.setText(QSettings().value("avr-flash-location")) # Add buttons readSigBut = QPushButton("Check Signature") readSigBut.clicked.connect(self.readSignature) verifyFlashBut = QPushButton("Verify FLASH") verifyFlashBut.clicked.connect(self.verifyFlash) verifyFlashBut.setEnabled(False) progFlashBut = QPushButton("Erase/Program/Verify FLASH") progFlashBut.clicked.connect(self.writeFlash) layoutBut = QHBoxLayout() layoutBut.addWidget(readSigBut) layoutBut.addWidget(verifyFlashBut) layoutBut.addWidget(progFlashBut) layout.addLayout(layoutBut) layoutFuse = QHBoxLayout() readFuseBut = QPushButton("Read Fuses") readFuseBut.clicked.connect(self.readFuses) writeFuseBut = QPushButton("Write Fuses") writeFuseBut.clicked.connect(self.writeFuses) self.lowfuseLine = QtFixes.QLineEdit("?") self.lowfuseLine.setMaxLength(2) self.lowfuseLine.setFixedWidth(25) self.highfuseLine = QtFixes.QLineEdit("?") self.highfuseLine.setMaxLength(2) self.highfuseLine.setFixedWidth(25) self.extfuseLine = QtFixes.QLineEdit("?") self.extfuseLine.setMaxLength(2) self.extfuseLine.setFixedWidth(25) # Don't allow use to change these fuses self.highfuseLine.setReadOnly(True) self.extfuseLine.setReadOnly(True) layoutFuse.addWidget(readFuseBut) layoutFuse.addWidget(QLabel("LOW:")) layoutFuse.addWidget(self.lowfuseLine) layoutFuse.addWidget(QLabel("HIGH:")) layoutFuse.addWidget(self.highfuseLine) layoutFuse.addWidget(QLabel("EXT:")) layoutFuse.addWidget(self.extfuseLine) layoutFuse.addWidget(writeFuseBut) layout.addLayout(layoutFuse) layoutExtra = QHBoxLayout() self.clockMode = QPushButton("Enable Slow Clock Mode") self.clockMode.setCheckable(True) self.clockMode.clicked.connect(self.toggleSlowClock) layoutExtra.addWidget(self.clockMode) layoutExtra.addStretch() layout.addLayout(layoutExtra) # Add status stuff self.statusLine = QPlainTextEdit() self.statusLine.setReadOnly(True) # self.statusLine.setFixedHeight(QFontMetrics(self.statusLine.font()).lineSpacing() * 5 + 10) layout.addWidget(self.statusLine) self.avr.newTextLog.connect(self.append) # Set dialog layout self.setLayout(layout) def append(self, text): self.statusLine.appendPlainText(text) def toggleSlowClock(self): if self.clockMode.isChecked(): self.avr.enableSlowClock(True) self.clockMode.setText("Disable Slow Clock Mode") else: self.avr.enableSlowClock(False) self.clockMode.setText("Enable Slow Clock Mode") def reject(self): #Ensure we disable slow-clock mode if self.clockMode.isChecked(): self.clockMode.setChecked(False) self.toggleSlowClock() #Release AVR self.avr.close() QDialog.reject(self) def findFlash(self): fname, _ = QFileDialog.getOpenFileName( self, 'Find FLASH File', QSettings().value("avr-flash-location"), '*.hex') if fname: self.flashLocation.setText(fname) QSettings().setValue("avr-flash-location", fname) def readSignature(self, close=True): self.avr.find() if close: self.avr.close() def readFuses(self): try: self.readSignature(close=False) self.statusLine.appendPlainText("Reading fuses") lfuse = self.avr.readFuse("low") hfuse = self.avr.readFuse("high") efuse = self.avr.readFuse("extended") self.statusLine.appendPlainText("OK: %02x %02x %02x" % (lfuse, hfuse, efuse)) self.lowfuseLine.setText("%02x" % lfuse) self.highfuseLine.setText("%02x" % hfuse) self.extfuseLine.setText("%02x" % efuse) except IOError: self.statusLine.appendPlainText("Reading fuses failed") self.lowfuseLine.setText("?") self.highfuseLine.setText("?") self.extfuseLine.setText("?") self.avr.close() def writeFuses(self): lfuse = int(self.lowfuseLine.text(), 16) # hfuse = int(self.highfuseLine.text(), 16) # efuse = int(self.extfuseLine.text(), 16) self.statusLine.appendPlainText( "Writing fuse: not only 'low' fuse is written, as hfuse/efuse can disable device\n" ) try: self.readSignature(close=False) self.avr.writeFuse("low", lfuse) # self.avr.writeFuse("high", hfuse) # self.avr.writeFuse("extended", efuse) # print("%x %x %x" % (lfuse, hfuse, efuse)) self.avr.close() except: self.avr.close() raise def verifyFlash(self): self.statusLine.appendPlainText("Verify not implemented") def writeFlash(self, erase=True, verify=True): self.avr.autoProgram(self.flashLocation.text(), erase, verify, self.statusLine.appendPlainText, QCoreApplication.processEvents) def setUSBInterface(self, iface): self.avr.setUSBInterface(iface)
class ImageViewer(QWidget): def __init__(self, filename=None, name=None, parent=None): super(ImageViewer, self).__init__(parent) self.imageRaw = np.zeros((200, 200, 200)) self.imageRGB = np.zeros((200, 200, 200, 3)) self.viewRange = [[100, 100], [100, 100], [100, 100]] self.zoomFactors = [3.0, 3.0, 3.0] self.iMin = 0 self.iMax = 1000 self.ijk = [0, 0, 0] self.name = 'untitled' self.initHbRL() self.mouseCursorCross = False ## Upper buttons self.upperRow = QHBoxLayout() self.drawRightHb = QPushButton('RightHb', self) self.drawLeftHb = QPushButton('LeftHb', self) self.drawRightHb.setCheckable(True) self.drawLeftHb.setCheckable(True) self.upperRow.addWidget(self.drawRightHb) self.upperRow.addWidget(self.drawLeftHb) QtCore.QObject.connect(self.drawRightHb, QtCore.SIGNAL('clicked()'), self.clickRightHb) QtCore.QObject.connect(self.drawLeftHb, QtCore.SIGNAL('clicked()'), self.clickLeftHb) ## View Layout self.scenes = [ MyGraphicsScene(self, 0), MyGraphicsScene(self, 1), MyGraphicsScene(self, 2) ] self.views = [ QGraphicsView(self.scenes[0]), QGraphicsView(self.scenes[1]), QGraphicsView(self.scenes[2]) ] self.sceneItems = [None, None, None] #Scene 4 view4 = QGridLayout() labelX = QLabel('X: ') labelY = QLabel('Y: ') labelZ = QLabel('Z: ') self.spin = [QSpinBox(), QSpinBox(), QSpinBox()] labelMinIntensity = QLabel('Min: ') labelMaxIntensity = QLabel('Max: ') labelZoom = QLabel('Zoom: ') self.spinMin = QSpinBox() self.spinMax = QSpinBox() self.spinZoom = QSpinBox() self.spinMin.setMaximum(10000) self.spinMax.setMaximum(10000) self.spinMin.setValue(self.iMin) self.spinMax.setValue(self.iMax) self.spinZoom.setValue(self.zoomFactors[0]) self.spinMin.setKeyboardTracking(False) self.spinMin.valueChanged.connect(self.setIntensity) self.spinMax.setKeyboardTracking(False) self.spinMax.valueChanged.connect(self.setIntensityMax) self.spinZoom.valueChanged.connect(self.setZoomFactor) self.spinZoom.setKeyboardTracking(False) labelAreaR = QLabel('Right: ') labelAreaL = QLabel('Left: ') self.labelAreaValueR = QLabel() self.labelAreaValueL = QLabel() view4.addWidget(labelX, 0, 0, 2, 1) view4.addWidget(labelY, 1, 0, 2, 1) view4.addWidget(labelZ, 2, 0, 2, 1) view4.addWidget(labelMinIntensity, 4, 0, 2, 1) view4.addWidget(labelMaxIntensity, 5, 0, 2, 1) view4.addWidget(labelZoom, 6, 0, 2, 1) view4.addWidget(labelAreaR, 7, 0) view4.addWidget(labelAreaL, 7, 2) view4.addWidget(self.spin[0], 0, 2, 2, 1) view4.addWidget(self.spin[1], 1, 2, 2, 1) view4.addWidget(self.spin[2], 2, 2, 2, 1) view4.addWidget(self.spinMin, 4, 2, 2, 1) view4.addWidget(self.spinMax, 5, 2, 2, 1) view4.addWidget(self.spinZoom, 6, 2, 2, 1) view4.addWidget(self.labelAreaValueR, 7, 1) view4.addWidget(self.labelAreaValueL, 7, 3) self.viewLayout = QGridLayout() self.viewLayout.addWidget(self.views[0], 0, 0) self.viewLayout.addWidget(self.views[1], 0, 1) self.viewLayout.addWidget(self.views[2], 1, 0) self.viewLayout.addLayout(view4, 1, 1) ## Lower self.lowerRow = QHBoxLayout() calculateButtonDown = QPushButton('calculateVolume', self) saveButtonDown = QPushButton('SaveHb', self) loadButtonDown = QPushButton('loadHb', self) savepngButtonDown = QPushButton('Save PNG', self) self.lowerRow.addWidget(calculateButtonDown) self.lowerRow.addWidget(saveButtonDown) self.lowerRow.addWidget(loadButtonDown) self.lowerRow.addWidget(savepngButtonDown) QtCore.QObject.connect(calculateButtonDown, QtCore.SIGNAL('clicked()'), self.getHbAreas) QtCore.QObject.connect(saveButtonDown, QtCore.SIGNAL('clicked()'), self.saveHb) QtCore.QObject.connect(loadButtonDown, QtCore.SIGNAL('clicked()'), self.loadHb) QtCore.QObject.connect(savepngButtonDown, QtCore.SIGNAL('clicked()'), self.saveCoronalSlice) ## Layout self.mainLayout = QVBoxLayout() self.mainLayout.addLayout(self.upperRow) self.mainLayout.addLayout(self.viewLayout) self.mainLayout.addLayout(self.lowerRow) self.setLayout(self.mainLayout) self.setWindowTitle("Image Viewer") self.resize(600, 700) self.show() if filename: self.loadNifti1(filename, name=name) def loadNifti1(self, filename, name=None): self.loadImage = LoadImage() self.loadImage.readNifti1(filename) if name is None: name = filename[:] if name[-7:] == '.nii.gz': name = name[:-7] elif name[-4:] == '.nii': name = name[:-4] for ch in ['/', '.', '~']: pos = name.find(ch) while pos > -1: name = '%s_%s' % (name[:pos], name[pos + 1:]) pos = name.find(ch) self.name = name self.imageRaw = self.loadImage.data self.spinMin.setMaximum(int(self.imageRaw.max() * 1.2)) self.spinMax.setMaximum(int(self.imageRaw.max() * 1.2)) #self.iMin = int(max(0, self.imageRaw.min()*1.2)) self.iMin = 0 self.iMax = int(self.imageRaw.max() * 0.8) self.spinMin.setValue(self.iMin) self.spinMax.setValue(self.iMax) self.imageRGB = convertImageRGB( resetIntensity(self.imageRaw, iMin=self.iMin, iMax=self.iMax)) self.setIJK() self.drawBaseImage() self.setSceneIJK() self.showSpinValue() self.setMouseCursor(True) def showSpinValue(self): self.spin[0].setMaximum(self.imageRaw.shape[0]) self.spin[1].setMaximum(self.imageRaw.shape[1]) self.spin[2].setMaximum(self.imageRaw.shape[2]) self.spin[0].setKeyboardTracking(False) self.spin[1].setKeyboardTracking(False) self.spin[2].setKeyboardTracking(False) self.spin[0].setValue(self.ijk[0]) self.spin[1].setValue(self.ijk[1]) self.spin[2].setValue(self.ijk[2]) self.spin[0].valueChanged.connect(self.resetI) self.spin[1].valueChanged.connect(self.resetJ) self.spin[2].valueChanged.connect(self.resetK) def resetI(self, i): self.ijk[0] = i self.drawBaseImage([0]) def resetJ(self, j): self.ijk[1] = j self.drawBaseImage([1]) self.labelAreaValueR.clear() self.labelAreaValueL.clear() def resetK(self, k): self.ijk[2] = k self.drawBaseImage([2]) def initHbRL(self): self.hbRight = { 'name': 'HbRight', 'color': 'red', 'images': [], 'points': [] } self.hbLeft = { 'name': 'HbLeft', 'color': 'blue', 'images': [], 'points': [] } def clickRightHb(self): if self.drawLeftHb.isChecked(): self.drawLeftHb.setChecked(False) def clickLeftHb(self): if self.drawRightHb.isChecked(): self.drawRightHb.setChecked(False) def saveHb(self, filename=None): if filename is None: filename = '%s_lawson_hb.csv' % self.name writeHb(filename, self.hbRight, self.hbLeft) with open(filename, 'a') as fout: volumes = self.getHbAreas() fout.write('%s,%s\n' % (volumes[0], volumes[1])) png_filename = filename[:-4] def saveCoronalSlice(self, filename=None): viewIndex = 1 if filename is None: filename = '%s_lawson_hb' % self.name filename += str('%03d.png' % self.ijk[viewIndex]) self.scenes[viewIndex].savePng(filename, 'PNG') def loadHb(self, filename=None): if filename is None: filename = '%s_lawson_hb.csv' % self.name self.initHbRL() readHb(filename, self.hbRight, self.hbLeft) def setMouseCursor(self, cross=False): if cross != self.mouseCursorCross: self.mouseCursorCross = cross if cross: #self.setCursor(QCursor(QtCore.Qt.CrossCursor)) self.setCursor(QtCore.Qt.CrossCursor) else: #self.setCursor(QCursor(QtCore.Qt.ArrowCursor)) self.setCursor(QtCore.Qt.ArrowCursor) def getZoomFactors(self): return self.zoomFactors def magZoomFactors(self, ratio): self.setZoomFactors([value + ratio for value in self.zoomFactors]) self.spinZoom.setValue(self.zoomFactors[0]) def setZoomFactors(self, zoomFactors): sceneRects = self.saveScene() self.zoomFactors = zoomFactors self.drawBaseImage() self.restoreScene(sceneRects) def setZoomFactor(self, zoomFactor): self.setZoomFactors([zoomFactor, zoomFactor, zoomFactor]) def getIntensity(self): return self.iMin, self.iMax def setIntensityMax(self, iMax): self.setIntensity(iMax=iMax) def setIntensity(self, iMin=None, iMax=None): if iMin: self.iMin = iMin if iMax: self.iMax = iMax self.imageRGB = convertImageRGB( resetIntensity(self.imageRaw, iMin=self.iMin, iMax=self.iMax)) self.drawBaseImage() def mousePressEventLeft(self, viewIndex, x, y): if viewIndex == 1: if self.drawRightHb.isChecked(): hbDict = self.hbRight labelAreaValue = self.labelAreaValueR elif self.drawLeftHb.isChecked(): hbDict = self.hbLeft labelAreaValue = self.labelAreaValueL else: self.resetIJK(viewIndex, x, y) return if not hbDict.has_key(self.ijk[viewIndex]): hbDict[self.ijk[viewIndex]] = HbRegionDraw() if hbDict[self.ijk[viewIndex]].insert == 4: for item in hbDict['images']: # lines self.scenes[viewIndex].removeItem(item) hbDict['images'] = [] item = hbDict['points'].pop(0) # last point self.scenes[viewIndex].removeItem(item) i, j = self.point2fijk(viewIndex, x, y) if not hbDict[self.ijk[viewIndex]].push((i, j)): item = hbDict['points'].pop(0) # last point self.scenes[viewIndex].removeItem(item) #self.scenes[viewIndex].removeItem(self.scenes[viewIndex].items()[0]) x_round, y_round = self.ij2point(viewIndex, i, j) hbDict['points'].insert( 0, self.scenes[viewIndex].addEllipse( x_round - 1, y_round - 1, 2, 2, pen=QPen(QColor(hbDict['color'])))) if hbDict[self.ijk[viewIndex]].insert >= 4: area = hbDict[self.ijk[viewIndex]].calculate_area( hbDict['name']) print ' %s %s: %s' % (self.ijk[viewIndex], hbDict['name'], area) self.drawHb(hbDict) #labelAreaValue.setText('%s: %3.2f' % (self.ijk[viewIndex], area)) labelAreaValue.setText('%3.2f' % (area)) else: self.resetIJK(viewIndex, x, y) def mousePressEventRight(self, viewIndex, x, y): if viewIndex == 1: if self.drawRightHb.isChecked(): hbDict = self.hbRight elif self.drawLeftHb.isChecked(): hbDict = self.hbLeft else: return if not hbDict.has_key(self.ijk[viewIndex]): return if hbDict[self.ijk[viewIndex]].insert == 4: for item in hbDict['images']: # lines self.scenes[viewIndex].removeItem(item) hbDict['images'] = [] #for item in self.scenes[viewIndex].items()[:3]: # lines # self.scenes[viewIndex].removeItem(item) if hbDict[self.ijk[viewIndex]].pop(): item = hbDict['points'].pop(0) # last point self.scenes[viewIndex].removeItem(item) #self.scenes[viewIndex].removeItem(self.scenes[viewIndex].items()[0]) def moveIJK(self, viewIndex, dx): self.ijk[viewIndex] += dx self.spin[viewIndex].setValue(self.ijk[viewIndex]) self.drawBaseImage([viewIndex]) self.labelAreaValueR.clear() self.labelAreaValueL.clear() def point2fijk(self, viewIndex, x, y): indexTable = [[1, 2], [0, 2], [0, 1]] xIndex = indexTable[viewIndex][0] yIndex = indexTable[viewIndex][1] ijkX = float(x) / self.zoomFactors[viewIndex] ijkY = self.imageRGB.shape[yIndex] - 1 - float( y) / self.zoomFactors[viewIndex] ijkX = np.round(ijkX * 2) / 2 ijkY = np.round(ijkY * 2) / 2 return (ijkX, ijkY) def point2fijk_flt(self, viewIndex, x, y): indexTable = [[1, 2], [0, 2], [0, 1]] xIndex = indexTable[viewIndex][0] yIndex = indexTable[viewIndex][1] ijkX = float(x) / self.zoomFactors[viewIndex] ijkY = self.imageRGB.shape[yIndex] - 1 - float( y) / self.zoomFactors[viewIndex] return (ijkX, ijkY) def point2ijk(self, viewIndex, x, y): indexTable = [[1, 2], [0, 2], [0, 1]] xIndex = indexTable[viewIndex][0] yIndex = indexTable[viewIndex][1] ijkX = int(x / self.zoomFactors[viewIndex]) ijkY = self.imageRGB.shape[yIndex] - 1 - int( y / self.zoomFactors[viewIndex]) return (ijkX, ijkY) def ij2point(self, viewIndex, i, j): indexTable = [[1, 2], [0, 2], [0, 1]] xIndex = indexTable[viewIndex][0] yIndex = indexTable[viewIndex][1] pointX = i * self.zoomFactors[viewIndex] pointY = (self.imageRGB.shape[yIndex] - 1 - j) * self.zoomFactors[viewIndex] return (pointX, pointY) def resetIJK(self, viewIndex, x, y): indexTable = [[1, 2], [0, 2], [0, 1]] xIndex = indexTable[viewIndex][0] yIndex = indexTable[viewIndex][1] self.ijk[xIndex] = int(x / self.zoomFactors[viewIndex]) self.ijk[yIndex] = self.imageRGB.shape[yIndex] - 1 - int( y / self.zoomFactors[viewIndex]) self.spin[xIndex].setValue(self.ijk[xIndex]) self.spin[yIndex].setValue(self.ijk[yIndex]) self.drawBaseImage(indexTable[viewIndex]) self.labelAreaValueR.clear() self.labelAreaValueL.clear() def saveScene(self): sceneRects = [0, 0, 0] for i in range(3): size = self.views[i].size().toTuple() x, y, _, _ = self.scenes[i].sceneRect().getRect() x += (size[0] - 10) / 2.0 y += (size[1] - 10) / 2.0 x /= self.zoomFactors[i] y /= self.zoomFactors[i] sceneRects[i] = [x, y] return sceneRects def restoreScene(self, sceneRects): for i in range(3): size = self.views[i].size().toTuple() x = sceneRects[i][0] * self.zoomFactors[i] y = sceneRects[i][1] * self.zoomFactors[i] self.scenes[i].setSceneRect(x - (size[0] - 10) / 2, y - (size[0] - 10) / 2, size[0] - 10, size[1] - 10) def setSceneIJK(self, viewIndex=(0, 1, 2)): for i in viewIndex: size = self.views[i].size().toTuple() xyCenter = [ self.ijk[tmp] * self.zoomFactors[i] for tmp in range(3) if tmp is not i ] self.scenes[i].setSceneRect(xyCenter[0] - size[0] / 2.0, xyCenter[1] - size[1] / 2.0, size[0] - 10, size[1] - 10) def setIJK(self, ijk='center'): if ijk == 'center': self.ijk = [ self.imageRGB.shape[0] / 2, self.imageRGB.shape[1] / 2, self.imageRGB.shape[2] / 2 ] else: self.ijk = ijk self.spin[0].setValue(self.ijk[0]) self.spin[1].setValue(self.ijk[1]) self.spin[2].setValue(self.ijk[2]) def get2D(self, plane): if plane == 0: return np.rot90(self.imageRGB[self.ijk[0], :, :, :]) elif plane == 1: return np.rot90(self.imageRGB[:, self.ijk[1], :, :]) elif plane == 2: return np.rot90(self.imageRGB[:, :, self.ijk[2], :]) def drawBaseImage(self, viewIndex=(0, 1, 2), eraseOthers=True): for i in viewIndex: imageArray3d = self.get2D(i) height, width, bytesPerComponent = imageArray3d.shape imageArray = imageArray3d.flatten() bytesPerLine = bytesPerComponent * width image = QImage(imageArray, width, height, bytesPerLine, QImage.Format_RGB888) #image = image.scaled( int(width*self.zoomFactors[i]), int(height*self.zoomFactors[i]), Qt.KeepAspectRatio, Qt.SmoothTransformation) image = image.scaled(int(width * self.zoomFactors[i]), int(height * self.zoomFactors[i]), QtCore.Qt.KeepAspectRatio) if self.sceneItems[i] is not None: #self.scenes[i].removeItem(self.sceneItems[i]) self.sceneItems[i].setPixmap(QPixmap.fromImage(image)) if False: items = self.scenes[i].items() for item in items: self.scenes[i].removeItem(item) self.sceneItems[i] = self.scenes[i].addPixmap( QPixmap.fromImage(image)) for item in items[1:]: self.scenes[i].additem(item) del items else: self.sceneItems[i] = self.scenes[i].addPixmap( QPixmap.fromImage(image)) if eraseOthers: for item in self.scenes[i].items(): if item != self.sceneItems[i]: self.scenes[i].removeItem(item) # TODO: where to put this self.drawHbPts(self.hbRight) self.drawHb(self.hbRight) self.drawHbPts(self.hbLeft) self.drawHb(self.hbLeft) def drawHbPts(self, hbDict): viewIndex = 1 if not hbDict.has_key(self.ijk[viewIndex]): return pts = [ self.ij2point(viewIndex, i, j) for (i, j) in hbDict[self.ijk[viewIndex]].get_points() ] for i in range(hbDict[self.ijk[viewIndex]].insert): hbDict['points'].insert( 0, self.scenes[viewIndex].addEllipse( pts[i][0] - 1, pts[i][1] - 1, 2, 2, pen=QPen(QColor(hbDict['color'])))) def drawHb(self, hbDict): viewIndex = 1 if not hbDict.has_key(self.ijk[viewIndex]): return if hbDict[self.ijk[viewIndex]].insert < 4: return a, b, c, d = [ self.ij2point(viewIndex, i, j) for (i, j) in hbDict[self.ijk[viewIndex]].get_points() ] cp = hbDict[self.ijk[viewIndex]].cp cp = self.ij2point(viewIndex, cp[0], cp[1]) vA = (a[0] - cp[0], a[1] - cp[1]) vB = (b[0] - cp[0], b[1] - cp[1]) vD = (d[0] - cp[0], d[1] - cp[1]) arcAD = QPainterPath() arcDB = QPainterPath() if hbDict['name'] == 'HbRight': sign = 1 startAngle = 0 else: sign = -1 startAngle = 180 angleADlad = sign * angleBw2Vectors(vA, vD) angleAD = 180 / np.pi * angleADlad if vD[0] * vD[0] + vD[1] * vD[1] >= vA[0] * vA[0] + vA[1] * vA[1]: rotD = (np.sqrt(vD[0] * vD[0] + vD[1] * vD[1]), 0) coefA = rotD[0] rotA = rotateVector(vA, angleADlad) coefB = np.sqrt(coefA * coefA / (coefA * coefA - rotA[0] * rotA[0]) * rotA[1] * rotA[1]) eccentricAnomalyAD = -180 / np.pi * np.arctan( coefA / coefB * np.tan(angleADlad)) arcAD.moveTo(cp[0] + sign * coefA, cp[1]) arcAD.arcTo(cp[0] - coefA, cp[1] - coefB, 2 * coefA, 2 * coefB, startAngle, eccentricAnomalyAD) else: rotA = (np.sqrt(vA[0] * vA[0] + vA[1] * vA[1]), 0) coefA = rotA[0] angleDAlad = sign * angleBw2Vectors(vD, vA) angleDA = 180 / np.pi * angleDAlad rotD = vD coefB = np.sqrt(coefA * coefA / (coefA * coefA - rotD[0] * rotD[0]) * rotD[1] * rotD[1]) eccentricAnomalyDA = 180 / np.pi * np.arctan( coefA / coefB * np.tan(angleDAlad)) arcAD.moveTo(cp[0] + sign * coefA, cp[1]) arcAD.arcTo(cp[0] - coefA, cp[1] - coefB, 2 * coefA, 2 * coefB, startAngle, eccentricAnomalyDA) angleAD = 0.0 if vD[0] * vD[0] + vD[1] * vD[1] >= vB[0] * vB[0] + vB[1] * vB[1]: rotD = (np.sqrt(vD[0] * vD[0] + vD[1] * vD[1]), 0) coefA = rotD[0] angleBDlad = sign * angleBw2Vectors(vD, vB) angleBD = 180 / np.pi * angleBDlad rotB = rotateVector(vB, angleADlad) coefB = np.sqrt(coefA * coefA / (coefA * coefA - rotB[0] * rotB[0]) * rotB[1] * rotB[1]) eccentricAnomalyDB = 180 / np.pi * np.arctan( coefA / coefB * np.tan(angleBDlad)) arcDB.moveTo(cp[0] + sign * coefA, cp[1]) arcDB.arcTo(cp[0] - coefA, cp[1] - coefB, 2 * coefA, 2 * coefB, startAngle, eccentricAnomalyDB) angleAB = 180 / np.pi * sign * angleBw2Vectors(vA, vD) else: rotB = (np.sqrt(vB[0] * vB[0] + vB[1] * vB[1]), 0) coefA = rotB[0] angleABlad = sign * angleBw2Vectors(vA, vB) angleAB = 180 / np.pi * angleABlad angleDBlad = sign * angleBw2Vectors(vD, vB) angleDB = 180 / np.pi * angleDBlad rotD = rotateVector(vD, angleABlad) coefB = np.sqrt(coefA * coefA / (coefA * coefA - rotD[0] * rotD[0]) * rotD[1] * rotD[1]) eccentricAnomalyDB = -180 / np.pi * np.arctan( coefA / coefB * np.tan(angleDBlad)) arcDB.moveTo(cp[0] + sign * coefA, cp[1]) arcDB.arcTo(cp[0] - coefA, cp[1] - coefB, 2 * coefA, 2 * coefB, startAngle, eccentricAnomalyDB) imgAC = self.scenes[viewIndex].addLine(a[0], a[1], cp[0], cp[1], pen=QPen(QColor( hbDict['color']))) imgBC = self.scenes[viewIndex].addLine(b[0], b[1], c[0], c[1], pen=QPen(QColor( hbDict['color']))) imgAD = self.scenes[viewIndex].addPath(arcAD, pen=QPen(QColor( hbDict['color']))) imgAD.setTransform(QTransform().translate( cp[0], cp[1]).rotate(-angleAD).translate(-cp[0], -cp[1])) imgDB = self.scenes[viewIndex].addPath(arcDB, pen=QPen(QColor( hbDict['color']))) imgDB.setTransform(QTransform().translate( cp[0], cp[1]).rotate(-angleAB).translate(-cp[0], -cp[1])) hbDict['images'] = [imgAD, imgDB, imgBC, imgAC] def getHbAreas(self): volumes = [] for hbDict in [self.hbRight, self.hbLeft]: keys = hbDict.keys() if not keys: volumes.append(0.0) continue print 'Calculate %s Volume...' % hbDict['name'] unit = self.loadImage.zooms[0] * self.loadImage.zooms[ 1] * self.loadImage.zooms[2] volume = 0.0 keys.sort() for key in keys: if type(key) == type(''): continue area = hbDict[key].area print ' %s: %s (voxel)' % (key, area) volume += area volume *= unit print 'volume = %s (mm^3)' % volume volumes.append(volume) return volumes
class AVRProgrammerDialog(QtFixes.QDialog): def __init__(self): super(AVRProgrammerDialog, self).__init__(CWMainGUI.getInstance()) # self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.avr = AVRProgrammer() self.setWindowTitle("ChipWhisperer-Lite AVR Programmer") layout = QVBoxLayout() layoutFW = QHBoxLayout() self.flashLocation = QtFixes.QLineEdit() flashFileButton = QPushButton("Find") flashFileButton.clicked.connect(self.findFlash) layoutFW.addWidget(QLabel("FLASH File")) layoutFW.addWidget(self.flashLocation) layoutFW.addWidget(flashFileButton) layout.addLayout(layoutFW) self.flashLocation.setText(QSettings().value("avr-flash-location")) # Add buttons readSigBut = QPushButton("Check Signature") readSigBut.clicked.connect(self.readSignature) verifyFlashBut = QPushButton("Verify FLASH") verifyFlashBut.clicked.connect(self.verifyFlash) verifyFlashBut.setEnabled(False) progFlashBut = QPushButton("Erase/Program/Verify FLASH") progFlashBut.clicked.connect(self.writeFlash) layoutBut = QHBoxLayout() layoutBut.addWidget(readSigBut) layoutBut.addWidget(verifyFlashBut) layoutBut.addWidget(progFlashBut) layout.addLayout(layoutBut) layoutFuse = QHBoxLayout() readFuseBut = QPushButton("Read Fuses") readFuseBut.clicked.connect(self.readFuses) writeFuseBut = QPushButton("Write Fuses") writeFuseBut.clicked.connect(self.writeFuses) self.lowfuseLine = QtFixes.QLineEdit("?") self.lowfuseLine.setMaxLength(2) self.lowfuseLine.setFixedWidth(25) self.highfuseLine = QtFixes.QLineEdit("?") self.highfuseLine.setMaxLength(2) self.highfuseLine.setFixedWidth(25) self.extfuseLine = QtFixes.QLineEdit("?") self.extfuseLine.setMaxLength(2) self.extfuseLine.setFixedWidth(25) # Don't allow use to change these fuses self.highfuseLine.setReadOnly(True) self.extfuseLine.setReadOnly(True) layoutFuse.addWidget(readFuseBut) layoutFuse.addWidget(QLabel("LOW:")) layoutFuse.addWidget(self.lowfuseLine) layoutFuse.addWidget(QLabel("HIGH:")) layoutFuse.addWidget(self.highfuseLine) layoutFuse.addWidget(QLabel("EXT:")) layoutFuse.addWidget(self.extfuseLine) layoutFuse.addWidget(writeFuseBut) layout.addLayout(layoutFuse) layoutExtra = QHBoxLayout() self.clockMode = QPushButton("Enable Slow Clock Mode") self.clockMode.setCheckable(True) self.clockMode.clicked.connect(self.toggleSlowClock) layoutExtra.addWidget(self.clockMode) layoutExtra.addStretch() layout.addLayout(layoutExtra) # Add status stuff self.statusLine = QPlainTextEdit() self.statusLine.setReadOnly(True) # self.statusLine.setFixedHeight(QFontMetrics(self.statusLine.font()).lineSpacing() * 5 + 10) self.statusLine.append = self.statusLine.appendPlainText layout.addWidget(self.statusLine) self.avr._logging = self.statusLine.append # Set dialog layout self.setLayout(layout) def toggleSlowClock(self): if self.clockMode.isChecked(): self.avr.avr.enableSlowClock(True) self.clockMode.setText("Disable Slow Clock Mode") else: self.avr.avr.enableSlowClock(False) self.clockMode.setText("Enable Slow Clock Mode") def reject(self): #Ensure we disable slow-clock mode if self.clockMode.isChecked(): self.clockMode.setChecked(False) self.toggleSlowClock() #Release AVR self.avr.close() QDialog.reject(self) def findFlash(self): fname, _ = QFileDialog.getOpenFileName(self, 'Find FLASH File', QSettings().value("avr-flash-location"), '*.hex') if fname: self.flashLocation.setText(fname) QSettings().setValue("avr-flash-location", fname) def readSignature(self, close=True): self.avr.find() if close: self.avr.close() def readFuses(self): try: self.readSignature(close=False) self.statusLine.append("Reading fuses") lfuse = self.avr.avr.readFuse("low") hfuse = self.avr.avr.readFuse("high") efuse = self.avr.avr.readFuse("extended") self.statusLine.append("OK: %02x %02x %02x" % (lfuse, hfuse, efuse)) self.lowfuseLine.setText("%02x" % lfuse) self.highfuseLine.setText("%02x" % hfuse) self.extfuseLine.setText("%02x" % efuse) except IOError: self.statusLine.append("Reading fuses failed") self.lowfuseLine.setText("?") self.highfuseLine.setText("?") self.extfuseLine.setText("?") self.avr.close() def writeFuses(self): lfuse = int(self.lowfuseLine.text(), 16) # hfuse = int(self.highfuseLine.text(), 16) # efuse = int(self.extfuseLine.text(), 16) self.statusLine.append("Writing fuse: not only 'low' fuse is written, as hfuse/efuse can disable device\n") try: self.readSignature(close=False) self.avr.avr.writeFuse("low", lfuse) # self.avr.avr.writeFuse("high", hfuse) # self.avr.avr.writeFuse("extended", efuse) # print("%x %x %x" % (lfuse, hfuse, efuse)) self.avr.close() except: self.avr.close() raise def verifyFlash(self): self.statusLine.append("Verify not implemented") def writeFlash(self, erase=True, verify=True): status = "FAILED" fname = self.flashLocation.text() self.statusLine.append("***Starting FLASH program process at %s***" % datetime.now().strftime('%H:%M:%S')) if (os.path.isfile(fname)): self.statusLine.append("File %s last changed on %s" % (fname, time.ctime(os.path.getmtime(fname)))) QCoreApplication.processEvents() try: self.statusLine.append("Entering Programming Mode") QCoreApplication.processEvents() self.readSignature(close=False) if erase: self.statusLine.append("Erasing Chip") QCoreApplication.processEvents() self.avr.erase() self.avr.close() self.readSignature(close=False) QCoreApplication.processEvents() self.avr.program(self.flashLocation.text(), memtype="flash", verify=verify) QCoreApplication.processEvents() self.statusLine.append("Exiting programming mode") self.avr.close() QCoreApplication.processEvents() status = "SUCCEEDED" except IOError as e: self.statusLine.append("FAILED: %s" % str(e)) try: self.avr.close() except IOError: pass else: self.statusLine.append("%s does not appear to be a file, check path" % fname) self.statusLine.append("***FLASH Program %s at %s***" % (status, datetime.now().strftime('%H:%M:%S'))) def setUSBInterface(self, iface): self.avr.setUSBInterface(iface)
class OptionsContainer(QWidget): def __init__(self,main_window): QWidget.__init__(self) self.main_window = main_window self.layout = QGridLayout() self.setLayout(self.layout) self.lr = numpy.zeros(2) self.fps = QSpinBox() self.fps.setValue(25) self.fps.setMinimum(1) self.fps.setMaximum(1000) self.layout.addWidget(QLabel("FPS:"),10,10) self.layout.addWidget(self.fps,10,11) self.capture_area_group = QButtonGroup() self.capture_area_fs = QRadioButton("Full Screen") self.connect(self.capture_area_fs, SIGNAL("clicked()"),self.capture_area_change) self.capture_area_fs.setChecked(True) self.capture_area_sa = QRadioButton("Selected Area") self.connect(self.capture_area_sa, SIGNAL("clicked()"),self.capture_area_change) self.capture_area_group.addButton(self.capture_area_fs) self.capture_area_group.addButton(self.capture_area_sa) self.capture_area_group.setExclusive(True) self.layout.addWidget(self.capture_area_fs,12,10) self.layout.addWidget(self.capture_area_sa,12,11) self.sa_group = QGroupBox() self.sa_grid = QGridLayout() self.sa_group.setLayout(self.sa_grid) self.sa_ul_bt = QPushButton("Select Upper Left") self.connect(self.sa_ul_bt, SIGNAL("clicked()"), self.select_ul) self.sa_lr_bt = QPushButton("Select Lower Right") self.connect(self.sa_lr_bt, SIGNAL("clicked()"), self.select_lr) self.sa_x = QSpinBox() self.sa_y = QSpinBox() self.sa_w = QSpinBox() self.sa_h = QSpinBox() for sb in [self.sa_h,self.sa_w,self.sa_x,self.sa_y]: sb.setMaximum(999999) sb.setMinimum(0) self.sa_grid.addWidget(self.sa_ul_bt,14,10,1,1) self.sa_grid.addWidget(self.sa_lr_bt,15,10,1,1) self.sa_grid.addWidget(QLabel("x"),14,11,1,1) self.sa_grid.addWidget(self.sa_x,14,12,1,1) self.sa_grid.addWidget(QLabel("y"),15,11,1,1) self.sa_grid.addWidget(self.sa_y,15,12,1,1) self.sa_grid.addWidget(QLabel("w"),16,11,1,1) self.sa_grid.addWidget(self.sa_w,16,12,1,1) self.sa_grid.addWidget(QLabel("h"),17,11,1,1) self.sa_grid.addWidget(self.sa_h,17,12,1,1) self.sa_show_bt = QPushButton("Show Area") self.sa_show_bt.setCheckable(True) self.connect(self.sa_show_bt, SIGNAL("clicked()"), self.show_selected_area) self.sa_grid.addWidget(self.sa_show_bt,18,10,1,10) self.sa_group.hide() self.layout.addWidget(self.sa_group,14,10,1,10) self.capture_delay = QSpinBox() self.capture_delay.setMinimum(0) self.capture_delay.setMaximum(10000) self.layout.addWidget(QLabel("Capture Delay"),18,10,1,1) self.layout.addWidget(self.capture_delay,18,11,1,1) self.capture_bt = QPushButton("Capture") self.stop_capture_bt = QPushButton("Stop") self.stop_capture_bt.hide() self.layout.addWidget(self.capture_bt,20,10,1,10) self.layout.addWidget(self.stop_capture_bt,30,10,1,10) self.ffmpeg_flags = QLineEdit() self.ffmpeg_flags.setText("-qscale 0 -vcodec mpeg4") self.layout.addWidget(QLabel("FFMPEG Flags:"),40,10) self.layout.addWidget(self.ffmpeg_flags,50,10,1,10) self.encode_bt = QPushButton("Encode Video") self.layout.addWidget(self.encode_bt,60,10,1,10) self.open_dir_bt = QPushButton("Open Directory") self.layout.addWidget(self.open_dir_bt,80,10,1,10) self.connect(self.open_dir_bt, SIGNAL("clicked()"),self.open_cwd) self.selected_area = SelectedArea() def show_selected_area(self): x = self.sa_x.value() y = self.sa_y.value() w = self.sa_w.value() h = self.sa_h.value() self.selected_area.setGeometry(x,y,w,h) self.selected_area.activateWindow() self.selected_area.raise_() if(self.sa_show_bt.isChecked()): self.selected_area.show() else:self.selected_area.hide() def select_ul(self): print "select_ul" self.clicked = False self.tw = TransWindow() self.tw.mouse_press = False self.tw.show() self.connect(self.tw, SIGNAL("mouse_press()"),self.set_ul) def select_lr(self): print "select_lr" self.clicked = False self.tw = TransWindow() self.tw.mouse_press = False self.tw.show() self.connect(self.tw, SIGNAL("mouse_press()"),self.set_lr) def set_ul(self): self.sa_x.setValue( self.tw.pos[0]) self.sa_y.setValue( self.tw.pos[1]) self.sa_w.setValue( self.lr[0] - self.sa_x.value()) self.sa_h.setValue( self.lr[1] - self.sa_y.value()) self.show_selected_area() def set_lr(self): self.lr = numpy.array([self.tw.pos[0],self.tw.pos[1]]) self.sa_w.setValue( self.tw.pos[0] - self.sa_x.value()) self.sa_h.setValue( self.tw.pos[1] - self.sa_y.value()) self.show_selected_area() def capture_area_change(self): print "capture_area_change" if(self.capture_area_fs.isChecked()): self.sa_group.hide() else: self.sa_group.show() self.adjustSize() self.main_window.adjustSize() def open_cwd(self): #will need to detect os and change accordingly os.system("open {}".format(os.getcwd()))
class ProfileSelection(QDialog): ''' classdocs ''' removeProfile = Signal(Athlete_Model) profileSelected = Signal(Athlete_Model) profileUpdate_request = Signal(Athlete_Model, Athlete_Model) lastProfileDeleted = Signal() def __init__(self, athletesList): ''' Constructor ''' QDialog.__init__(self) self.setWindowTitle("Profile Selection") self.athletesList = athletesList self._initGUI() def _initGUI(self): topHLayout = QHBoxLayout() hLayout = QHBoxLayout() vLayout = QVBoxLayout() # Label greeterText = QLabel("Welcome to <b>Pushup app</b>." + \ "<br><br> Select a profile:") vLayout.addWidget(greeterText) # List self.list = QListWidget() self.list.setMinimumWidth(150) self.list.setSelectionMode(QAbstractItemView.SingleSelection) # SingleSelection is the default value, but I prefer to be sure self.list.itemSelectionChanged.connect(self._activateButtons) for athlete in self.athletesList: iconW = QIcon.fromTheme("user-available") # doens't work on Mac and Windows # http://qt-project.org/doc/qt-4.8/qicon.html#fromTheme listW = QListWidgetItem(iconW, athlete._name) listW.setData(Qt.UserRole, athlete) self.list.addItem(listW) topHLayout.addWidget(self.list) self.profileWidget = ProfileFormWidget() self.profileWidget.hide() topHLayout.addWidget(self.profileWidget) vLayout.addLayout(topHLayout) vLayout.addLayout(hLayout) # Buttons self.okBtn = QPushButton("Ok") self.okBtn.setDisabled(True) self.okBtn.setDefault(True) self.okBtn.clicked.connect(self._okButtonSlot) self.list.itemDoubleClicked.connect(self._okButtonSlot) cancelBtn = QPushButton("Cancel") cancelBtn.clicked.connect(self._cancelButtonSlot) self.editBtn = QPushButton("Edit") self.editBtn.setDisabled(True) self.editBtn.setCheckable(True) self.editBtn.clicked.connect(self._toggleProfileEdit) self.saveBtn = QPushButton("Save changes") # Saves the changes made on the profile self.saveBtn.hide() self.saveBtn.clicked.connect(self._saveButtonSlot) self.removeProfileBtn = QPushButton("Remove Profile") self.removeProfileBtn.setDisabled(True) self.removeProfileBtn.clicked.connect(self._removeProfile_Dialog) hLayout.addWidget(self.editBtn) hLayout.addWidget(self.removeProfileBtn) hLayout.addWidget(cancelBtn) hLayout.addWidget(self.okBtn) hLayout.addWidget(self.saveBtn) self.setLayout(vLayout) def getSelectedProfile(self): selectedListItem = self.list.selectedItems()[0] athleteProfile = selectedListItem.data(Qt.UserRole) return athleteProfile def updateList(self, athletes): self.list.clear() self.athletesList = athletes for athlete in self.athletesList: iconW = QIcon.fromTheme("user-available") # doens't work on Mac and Windows # http://qt-project.org/doc/qt-4.8/qicon.html#fromTheme listW = QListWidgetItem(iconW, athlete._name) listW.setData(Qt.UserRole, athlete) self.list.addItem(listW) def resetWidget(self): """ Resets the widget to the initial laoyout. Should be used only in specific cases """ self.editBtn.setChecked(False) self._toggleProfileEdit() def _removeProfile_Dialog(self): """Runs a prompt dialog. Ask the user if he really wants to remove the selected profile. """ confirmationDialog = QMessageBox() confirmationDialog.setText("Do you really want to remove the selected profile ?") confirmationDialog.setInformativeText("Profile deletion can not be undone") confirmationDialog.setIcon(QMessageBox.Question) confirmationDialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No) confirmationDialog.accepted.connect(self._emitRemoveProfile) ret = confirmationDialog.exec_() if ret==QMessageBox.Yes: self._emitRemoveProfile() def _emitRemoveProfile(self): athlete = self.getSelectedProfile() rowToDelete = 0 for index, element in enumerate(self.athletesList): if element == athlete: rowToDelete = index self.list.takeItem(rowToDelete) self.athletesList.remove(athlete) self.removeProfile.emit(athlete) def _okButtonSlot(self): athlete = self.list.selectedItems()[0].data(Qt.UserRole) self.accept() # is it correct ? Maybe self.close() is better ? # Or should I redefine the accept() method ? #athleteProfile = self.getSelectedProfile() self.profileSelected.emit(athlete) def _cancelButtonSlot(self): if len(self.athletesList) == 0: self.lastProfileDeleted.emit() self.reject() def _saveButtonSlot(self): selectedProfile = self.getSelectedProfile() updatedProfile = self.profileWidget.getProfile() self.profileUpdate_request.emit(selectedProfile, updatedProfile) #self._toggleProfileEdit() def _toggleProfileEdit(self): if self.editBtn.isChecked(): self.profileWidget.setProfile(self.getSelectedProfile()) self.profileWidget.show() self.saveBtn.show() self.okBtn.hide() self.removeProfileBtn.hide() else: self.saveBtn.hide() self.profileWidget.hide() self.okBtn.show() self.removeProfileBtn.show() def _activateButtons(self): selectedItems = self.list.selectedItems() if len(selectedItems)!=0 : self.okBtn.setDisabled(False) self.removeProfileBtn.setDisabled(False) self.editBtn.setDisabled(False) else : self.okBtn.setDisabled(True) self.removeProfileBtn.setDisabled(True) self.editBtn.setDisabled(True)