class RatingView(QtWidgets.QWidget): _ratings_ready = QtCore.pyqtSignal(object, object) _node_ratings_ready = QtCore.pyqtSignal(object) def __init__(self): super().__init__() layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) self._cubeable_plot = PlotWidget( axisItems={'bottom': TimeAxisItem(orientation='bottom')}) self._nodes_plot = PlotWidget( axisItems={'bottom': TimeAxisItem(orientation='bottom')}) self._splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self._splitter.setStretchFactor(0, 1) self._splitter.setStretchFactor(1, 1) layout.addWidget(self._splitter) self._splitter.addWidget(self._cubeable_plot) self._splitter.addWidget(self._nodes_plot) self._display_target: t.Optional[t.Tuple[int, CardboardCubeable]] = None self._ratings_ready.connect(self._set_cubeable_ratings) self._node_ratings_ready.connect(self._set_nodes_ratings) LOGIN_CONTROLLER.login_success.connect(self._on_login) @classmethod def _get_color(cls, n: int = 0) -> QColor: return QColor(100 + (n * 70) % 155, 100 + ((n + 1) * 50) % 155, 100 + ((n + 2) * 40) % 155) @functools.lru_cache(maxsize=128) def _get_rating_points( self, release_id: int, cardboard_cubeable: CardboardCubeable ) -> Promise[t.Sequence[RatingPoint]]: return Context.cube_api_client.rating_history_for_cardboard_cubeable( release_id, cardboard_cubeable, ) @functools.lru_cache(maxsize=256) def _get_node_rating_points( self, release_id: int, node: CardboardNodeChild) -> Promise[t.Sequence[NodeRatingPoint]]: return Context.cube_api_client.rating_history_for_node( release_id, node, ).then(lambda ratings: (node, ratings)) def _on_login(self, *args, **kwargs) -> None: self._get_rating_points.cache_clear() self._get_node_rating_points.cache_clear() def _set_cubeable_ratings(self, cardboard_cubeable: CardboardCubeable, ratings: t.Sequence[RatingPoint]) -> None: self._cubeable_plot.clear() data_item = self._cubeable_plot.plot( [p.rating_map.created_at.timestamp() for p in ratings], [p.rating for p in ratings]) legend = self._cubeable_plot.addLegend(labelTextSize='15pt') legend.addItem( data_item, cardboard_cubeable.name if isinstance( cardboard_cubeable, Cardboard) else cardboard_cubeable.description) self._cubeable_plot.getPlotItem().enableAutoRange() def _set_nodes_ratings( self, ratings: t.Iterable[t.Tuple[CardboardNodeChild, t.Sequence[NodeRatingPoint]]] ) -> None: self._nodes_plot.show() self._nodes_plot.clear() legend = self._nodes_plot.addLegend(labelTextSize='15pt') for idx, (node_child, ratings) in enumerate(ratings): data_item = self._nodes_plot.plot( [p.rating_map.created_at.timestamp() for p in ratings], [p.rating for p in ratings], pen=mkPen(color=self._get_color(idx)), ) legend.addItem( data_item, node_child.name if isinstance(node_child, Cardboard) else node_child.get_minimal_string()) self._nodes_plot.getPlotItem().enableAutoRange() def on_focus_event(self, focus_event: FocusEvent) -> None: if not self.isVisible( ) or not focus_event.release_id or Context.focus_card_frozen: return cardboard_cubeable = focusable_as_cardboards(focus_event.focusable) display_target = (focus_event.release_id, cardboard_cubeable) if display_target == self._display_target: return self._display_target = display_target promise = self._get_rating_points(focus_event.release_id, cardboard_cubeable) if promise.is_pending: promise.then(lambda ratings: self._ratings_ready.emit( cardboard_cubeable, ratings)).catch(logging.warning) elif promise.is_fulfilled: self._set_cubeable_ratings(cardboard_cubeable, promise.get()) if isinstance( cardboard_cubeable, CardboardTrap ) and cardboard_cubeable.intention_type == IntentionType.GARBAGE: promise = Promise.all([ self._get_node_rating_points(focus_event.release_id, node) for node in cardboard_cubeable.node.children.distinct_elements() ]) if promise.is_pending: promise.then(self._node_ratings_ready.emit).catch( logging.warning) elif promise.is_fulfilled: self._set_nodes_ratings(promise.get()) else: self._nodes_plot.hide()
class Ui_MainWindow(object): test_points = [(0.0, 1.0), (0.2, 1.02), (0.4, 1.08), (0.6, 1.12), (0.8, 1.34), (1.0, 1.54), (1.2, 1.81), (1.4, 2.15)] interpolation_ins = Interpolation() def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(816, 480) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.groupBox = QtWidgets.QGroupBox(self.centralwidget) self.groupBox.setGeometry(QtCore.QRect(10, 10, 121, 151)) self.groupBox.setTitle("") self.groupBox.setObjectName("groupBox") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_2.setObjectName("verticalLayout_2") self.label = QtWidgets.QLabel(self.groupBox) self.label.setWordWrap(True) self.label.setObjectName("label") self.verticalLayout_2.addWidget(self.label) self.editAppendX = QtWidgets.QLineEdit(self.groupBox) self.editAppendX.setAlignment(QtCore.Qt.AlignCenter) self.editAppendX.setObjectName("editAppendX") self.verticalLayout_2.addWidget(self.editAppendX) self.editAppendY = QtWidgets.QLineEdit(self.groupBox) self.editAppendY.setAlignment(QtCore.Qt.AlignCenter) self.editAppendY.setObjectName("editAppendY") self.verticalLayout_2.addWidget(self.editAppendY) self.appendPointBtn = QtWidgets.QPushButton(self.groupBox) self.appendPointBtn.setObjectName("appendPointBtn") self.appendPointBtn.clicked.connect(self.appendPointBtn_clicked) self.verticalLayout_2.addWidget(self.appendPointBtn) self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_2.setGeometry(QtCore.QRect(10, 230, 121, 131)) self.groupBox_2.setTitle("") self.groupBox_2.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout.setObjectName("verticalLayout") self.label_2 = QtWidgets.QLabel(self.groupBox_2) self.label_2.setWordWrap(True) self.label_2.setObjectName("label_2") self.verticalLayout.addWidget(self.label_2) self.editFindX = QtWidgets.QLineEdit(self.groupBox_2) self.editFindX.setAlignment(QtCore.Qt.AlignCenter) self.editFindX.setObjectName("editFindX") self.verticalLayout.addWidget(self.editFindX) self.interpolateBtn = QtWidgets.QPushButton(self.groupBox_2) self.interpolateBtn.setObjectName("interpolateBtn") self.interpolateBtn.clicked.connect(self.interpolateBtn_clicked) self.verticalLayout.addWidget(self.interpolateBtn) # chart self.graphicsView = PlotWidget(self.centralwidget) self.graphicsView.setGeometry(QtCore.QRect(170, 10, 621, 430)) self.graphicsView.setObjectName("graphicsView") self.graphicsView0 = PlotWidget(self.centralwidget) self.graphicsView0.setGeometry(QtCore.QRect(170, 10, 621, 430)) self.graphicsView0.setObjectName("graphicsView0") self.graphicsView0.hide() # Aitken table self.aitkenTable = QtWidgets.QTableWidget(self.centralwidget) self.aitkenTable.setGeometry(QtCore.QRect(170, 10, 621, 430)) self.aitkenTable.setObjectName("aitkenTable") self.aitkenTable.setColumnCount(self.interpolation_ins.get_width() + 3) header = self.aitkenTable.horizontalHeader() header.setResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) self.aitkenTable.hide() # Lagrangian polynomial self.lagrangianTextBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.lagrangianTextBrowser.setGeometry(QtCore.QRect(170, 10, 621, 430)) self.lagrangianTextBrowser.setObjectName("lagrangianTextBrowser") self.lagrangianTextBrowser.hide() self.clearPointsBtn = QtWidgets.QPushButton(self.centralwidget) self.clearPointsBtn.setGeometry(QtCore.QRect(10, 180, 121, 32)) self.clearPointsBtn.setObjectName("clearPointsBtn") self.clearPointsBtn.clicked.connect(self.clear_points) self.labelY = QtWidgets.QLabel(self.centralwidget) self.labelY.setGeometry(QtCore.QRect(15, 370, 130, 31)) self.labelY.setObjectName("labelY") self.labelY0 = QtWidgets.QLabel(self.centralwidget) self.labelY0.setGeometry(QtCore.QRect(15, 390, 130, 31)) self.labelY0.setObjectName("labelY0") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(5, 420, 151, 26)) self.comboBox.setObjectName("comboBox") self.comboBox.addItems([ "Lagrangian Graph", "Aitken Graph", "Aitken Table", "Lagrangian Polynomial" ]) self.comboBox.activated.connect(self.select_view) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 816, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "Append point to graph")) self.editAppendY.setPlaceholderText(_translate("MainWindow", "Y")) self.editAppendX.setPlaceholderText(_translate("MainWindow", "X")) self.appendPointBtn.setText(_translate("MainWindow", "Add Point")) self.label_2.setText( _translate("MainWindow", "Find Y for point with X coordinate")) self.labelY.setText(_translate("MainWindow", "Aitken Y: ")) self.labelY0.setText(_translate("MainWindow", "Lgrngn Y: ")) self.editFindX.setPlaceholderText(_translate("MainWindow", "X")) self.interpolateBtn.setText(_translate("MainWindow", "Interpolate")) self.clearPointsBtn.setText(_translate("MainWindow", "Clear Points")) self.comboBox.setItemText(0, _translate("MainWindow", "Lagrangian Graph")) self.comboBox.setItemText(1, _translate("MainWindow", "Aitken Graph")) self.comboBox.setItemText(2, _translate("MainWindow", "Aitken Table")) self.comboBox.setItemText( 3, _translate("MainWindow", "Lagrangian Polynomial")) def clear_points(self): self.graphicsView.clear() self.graphicsView0.clear() self.interpolation_ins.clear_points() self.aitkenTable.clear() self.lagrangianTextBrowser.clear() def select_view(self, i): print(i) self.comboBox.setCurrentIndex(i) if i == 0: self.graphicsView.show() self.graphicsView0.hide() self.aitkenTable.hide() self.lagrangianTextBrowser.hide() elif i == 1: self.graphicsView.hide() self.graphicsView0.show() self.aitkenTable.hide() self.lagrangianTextBrowser.hide() elif i == 2: self.graphicsView.hide() self.graphicsView0.hide() self.aitkenTable.show() self.lagrangianTextBrowser.hide() elif i == 3: self.graphicsView.hide() self.graphicsView0.hide() self.aitkenTable.hide() self.lagrangianTextBrowser.show() def update_Aitken(self, points): self.aitkenTable.setRowCount(len(points)) for i in range(len(points)): for j in range(len(points[0])): self.aitkenTable.setItem( i, j, QtWidgets.QTableWidgetItem(str(points[i][j]))) def update_Lagrangian(self): if not self.interpolation_ins.lagrangian: self.interpolation_ins.build_Lagrangian() self.lagrangianTextBrowser.clear() for i in self.interpolation_ins.lagrangian: self.lagrangianTextBrowser.append(i) self.lagrangianTextBrowser.append("\n") def add_default_points(self): if not len(self.interpolation_ins.get_points()): for (x, y) in self.test_points: p = Point(x, y) self.interpolation_ins.add_point(p) def appendPointBtn_clicked(self): try: x = float(self.editAppendX.text()) y = float(self.editAppendY.text()) p = Point(x, y) except Exception as e: print("-" * 50 + "\n", e) self.add_default_points() else: self.interpolation_ins.add_point(p) points = self.interpolation_ins.get_points() self.update_Lagrangian() self.update_Aitken(self.interpolation_ins.init_Aitken()) self.editAppendX.setText("") self.editAppendY.setText("") massiv_x = self.scatter() self.small_interval_lagrangian(massiv_x) self.small_interval_Aitken(massiv_x) def scatter(self, step=0.01): points = self.interpolation_ins.get_points() start, end = points[0].get_x(), points[-1].get_x() massiv_x = np.arange(start, end, step) return massiv_x def small_interval_lagrangian(self, massiv_x): massiv_y = [] for x in massiv_x: self.interpolation_ins.set_interpolation_point_x(x) y = self.interpolation_ins.Lagrangian_method() massiv_y.append(y) self.graphicsView.clear() self.graphicsView.plot(massiv_x, massiv_y) def small_interval_Aitken(self, massiv_x): massiv_y = [] xs, ys = self.interpolation_ins.get_split_points() for x in massiv_x: y = self.interpolation_ins.method(x, xs, ys) massiv_y.append(y) self.graphicsView0.clear() self.graphicsView0.plot(massiv_x, massiv_y, pen=pyqtgraph.mkPen('g')) def interpolateBtn_clicked(self): try: x = float(self.editFindX.text()) except Exception as e: print("Exception: ", e) return if not self.interpolation_ins.get_points(): print("No points for interpolation") else: self.select_view(0) self.interpolation_ins.set_interpolation_point_x(x) xs, ys = self.interpolation_ins.get_split_points() y_E = self.interpolation_ins.method(x, xs, ys) y = self.interpolation_ins.test() y_L = self.interpolation_ins.Lagrangian_method() text = "Aitken Y: " + str(y_E) self.labelY.setText(text) text = "Lagrangian Y: " + str(y_L) self.labelY0.setText(text) if self.interpolation_ins.is_in_interval(x): self.update_Aitken(self.interpolation_ins.get_table()) self.graphicsView.plot([x], [y_E], pen=None, symbol='o') self.graphicsView0.plot([x], [y_L], pen=pyqtgraph.mkPen('r'), symbol='o')
class CamViewer(Display): # Emitted when the user changes the value. roi_x_signal = Signal(str) roi_y_signal = Signal(str) roi_w_signal = Signal(str) roi_h_signal = Signal(str) def __init__(self, parent=None, args=None): super(CamViewer, self).__init__(parent=parent, args=args) # Set up the list of cameras, and all the PVs test_dict = { "image": "ca://MTEST:Image", "max_width": "ca://MTEST:ImageWidth", "max_height": "ca://MTEST:ImageWidth", "roi_x": None, "roi_y": None, "roi_width": None, "roi_height": None } # self.cameras = { "VCC": vcc_dict, "C-Iris": c_iris_dict, "Test": test_dict } self.cameras = {"Testing IOC Image": test_dict } self._channels = [] self.imageChannel = None # Populate the camera combo box self.ui.cameraComboBox.clear() for camera in self.cameras: self.ui.cameraComboBox.addItem(camera) # When the camera combo box changes, disconnect from PVs, re-initialize, then reconnect. self.ui.cameraComboBox.activated[str].connect(self.cameraChanged) # Set up the color map combo box. self.ui.colorMapComboBox.clear() for key, map_name in cmap_names.items(): self.ui.colorMapComboBox.addItem(map_name, userData=key) self.ui.imageView.colorMap = self.ui.colorMapComboBox.currentData() self.ui.colorMapComboBox.activated[str].connect(self.colorMapChanged) # Set up the color map limit sliders and line edits. # self._color_map_limit_sliders_need_config = True self.ui.colorMapMinSlider.valueChanged.connect(self.setColorMapMin) self.ui.colorMapMaxSlider.valueChanged.connect(self.setColorMapMax) self.ui.colorMapMinLineEdit.returnPressed.connect(self.colorMapMinLineEditChanged) self.ui.colorMapMaxLineEdit.returnPressed.connect(self.colorMapMaxLineEditChanged) # Set up the stuff for single-shot and average modes. self.ui.singleShotRadioButton.setChecked(True) self._average_mode_enabled = False self.ui.singleShotRadioButton.clicked.connect(self.enableSingleShotMode) self.ui.averageRadioButton.clicked.connect(self.enableAverageMode) self.ui.numShotsLineEdit.returnPressed.connect(self.numAverageChanged) # Add a plot for vertical lineouts self.yLineoutPlot = PlotWidget() self.yLineoutPlot.setMaximumWidth(80) self.yLineoutPlot.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) self.yLineoutPlot.getPlotItem().invertY() self.yLineoutPlot.hideAxis('bottom') # self.yLineoutPlot.setYLink(self.ui.imageView.getView()) self.ui.imageGridLayout.addWidget(self.yLineoutPlot, 0, 0) self.yLineoutPlot.hide() # We do some mangling of the .ui file here and move the imageView over a cell, kind of ugly. self.ui.imageGridLayout.removeWidget(self.ui.imageView) self.ui.imageGridLayout.addWidget(self.ui.imageView, 0, 1) # Add a plot for the horizontal lineouts self.xLineoutPlot = PlotWidget() self.xLineoutPlot.setMaximumHeight(80) self.xLineoutPlot.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.xLineoutPlot.hideAxis('left') # self.xLineoutPlot.setXLink(self.ui.imageView.getView()) self.ui.imageGridLayout.addWidget(self.xLineoutPlot, 1, 1) self.xLineoutPlot.hide() # Update the lineout plot ranges when the image gets panned or zoomed self.ui.imageView.getView().sigRangeChanged.connect(self.updateLineoutRange) # Instantiate markers. self.marker_dict = {1:{}, 2:{}, 3:{}, 4:{}} marker_size = QPointF(20., 20.) self.marker_dict[1]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((100, 100, 255), width=5)) self.marker_dict[1]['button'] = self.ui.marker1Button self.marker_dict[1]['xlineedit'] = self.ui.marker1XPosLineEdit self.marker_dict[1]['ylineedit'] = self.ui.marker1YPosLineEdit self.marker_dict[2]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((255, 100, 100), width=5)) self.marker_dict[2]['button'] = self.ui.marker2Button self.marker_dict[2]['xlineedit'] = self.ui.marker2XPosLineEdit self.marker_dict[2]['ylineedit'] = self.ui.marker2YPosLineEdit self.marker_dict[3]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((60, 255, 60), width=5)) self.marker_dict[3]['button'] = self.ui.marker3Button self.marker_dict[3]['xlineedit'] = self.ui.marker3XPosLineEdit self.marker_dict[3]['ylineedit'] = self.ui.marker3YPosLineEdit self.marker_dict[4]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((255, 60, 255), width=5)) self.marker_dict[4]['button'] = self.ui.marker4Button self.marker_dict[4]['xlineedit'] = self.ui.marker4XPosLineEdit self.marker_dict[4]['ylineedit'] = self.ui.marker4YPosLineEdit # Disable auto-ranging the image (it feels strange when the zoom changes as you move markers around.) self.ui.imageView.getView().disableAutoRange() for d in self.marker_dict: marker = self.marker_dict[d]['marker'] marker.setZValue(20) marker.hide() marker.sigRegionChanged.connect(self.markerMoved) self.ui.imageView.getView().addItem(marker) self.marker_dict[d]['button'].toggled.connect(self.enableMarker) curvepen = QPen(marker.pen) curvepen.setWidth(1) self.marker_dict[d]['xcurve'] = self.xLineoutPlot.plot(pen=curvepen) self.marker_dict[d]['ycurve'] = self.yLineoutPlot.plot(pen=curvepen) self.marker_dict[d]['xlineedit'].returnPressed.connect(self.markerPositionLineEditChanged) self.marker_dict[d]['ylineedit'].returnPressed.connect(self.markerPositionLineEditChanged) # Set up zoom buttons self.ui.zoomInButton.clicked.connect(self.zoomIn) self.ui.zoomOutButton.clicked.connect(self.zoomOut) self.ui.zoomToActualSizeButton.clicked.connect(self.zoomToActualSize) # Set up ROI buttons self.ui.setROIButton.clicked.connect(self.setROI) self.ui.resetROIButton.clicked.connect(self.resetROI) self.destroyed.connect(functools.partial(widget_destroyed, self.channels)) @Slot() def zoomIn(self): self.ui.imageView.getView().scaleBy((0.5, 0.5)) @Slot() def zoomOut(self): self.ui.imageView.getView().scaleBy((2.0, 2.0)) @Slot() def zoomToActualSize(self): if len(self.image_data) == 0: return self.ui.imageView.getView().setRange(xRange=(0, self.image_data.shape[0]), yRange=(0, self.image_data.shape[1]), padding=0.0) def disable_all_markers(self): for d in self.marker_dict: self.marker_dict[d]['button'].setChecked(False) self.marker_dict[d]['marker'].setPos((0, 0)) @Slot(bool) def enableMarker(self, checked): any_markers_visible = False for d in self.marker_dict: marker = self.marker_dict[d]['marker'] button = self.marker_dict[d]['button'] any_markers_visible = any_markers_visible or button.isChecked() marker.setVisible(button.isChecked()) self.markerMoved(d) self.marker_dict[d]['xcurve'].setVisible(button.isChecked()) self.marker_dict[d]['ycurve'].setVisible(button.isChecked()) self.marker_dict[d]['xlineedit'].setEnabled(button.isChecked()) self.marker_dict[d]['ylineedit'].setEnabled(button.isChecked()) if any_markers_visible: self.xLineoutPlot.show() self.yLineoutPlot.show() else: self.xLineoutPlot.hide() self.yLineoutPlot.hide() @Slot() def markerPositionLineEditChanged(self): for d in self.marker_dict: marker = self.marker_dict[d]['marker'] x_line_edit = self.marker_dict[d]['xlineedit'] y_line_edit = self.marker_dict[d]['ylineedit'] try: new_x = int(x_line_edit.text()) new_y = int(y_line_edit.text()) if new_x <= marker.maxBounds.width() and new_y <= marker.maxBounds.height(): marker.setPos((new_x, new_y)) except: pass coords = marker.getPixelCoords() x_line_edit.setText(str(coords[0])) y_line_edit.setText(str(coords[1])) @Slot(object) def markerMoved(self, marker): self.updateLineouts() for marker_index in self.marker_dict: marker = self.marker_dict[marker_index]['marker'] x_line_edit = self.marker_dict[marker_index]['xlineedit'] y_line_edit = self.marker_dict[marker_index]['ylineedit'] coords = marker.getPixelCoords() x_line_edit.setText(str(coords[0])) y_line_edit.setText(str(coords[1])) @Slot(object, object) def updateLineoutRange(self, view, new_ranges): self.ui.xLineoutPlot.setRange(xRange=new_ranges[0], padding=0.0) self.ui.yLineoutPlot.setRange(yRange=new_ranges[1], padding=0.0) def updateLineouts(self): for marker_index in self.marker_dict: marker = self.marker_dict[marker_index]['marker'] xcurve = self.marker_dict[marker_index]['xcurve'] ycurve = self.marker_dict[marker_index]['ycurve'] if marker.isVisible(): result, coords = marker.getArrayRegion(self.image_data, self.ui.imageView.getImageItem()) xcurve.setData(y=result[0], x=np.arange(len(result[0]))) ycurve.setData(y=np.arange(len(result[1])), x=result[1]) @Slot() def enableSingleShotMode(self): self._average_mode_enabled = False self._average_buffer = np.ndarray(0) @Slot() def enableAverageMode(self): self._average_mode_enabled = True @Slot(str) def cameraChanged(self, new_camera): new_camera = str(new_camera) if self.imageChannel == self.cameras[new_camera]["image"]: return close_widget_connections(self) self.disable_all_markers() self.initializeCamera(new_camera) def initializeCamera(self, new_camera): new_camera = str(new_camera) self._color_map_limit_sliders_need_config = True self.times = np.zeros(10) self.old_timestamp = 0 self.image_width = 0 # current width (width of ROI) self.image_max_width = 0 # full width. Only used to reset ROI to full. self.image_max_height = 0 # full height. Only used to reset ROI to full. self.image_data = np.zeros(0) self._average_counter = 0 self._average_buffer = np.ndarray(0) self._needs_auto_range = True self.imageChannel = self.cameras[new_camera]["image"] self.widthChannel = self.cameras[new_camera]["roi_width"] or self.cameras[new_camera]["max_width"] self.maxWidthChannel = self.cameras[new_camera]["max_width"] self.maxHeightChannel = self.cameras[new_camera]["max_height"] self.roiXChannel = self.cameras[new_camera]["roi_x"] self.roiYChannel = self.cameras[new_camera]["roi_y"] self.roiWidthChannel = self.cameras[new_camera]["roi_width"] self.roiHeightChannel = self.cameras[new_camera]["roi_height"] self._channels = [PyDMChannel(address=self.imageChannel, connection_slot=self.connectionStateChanged, value_slot=self.receiveImageWaveform, severity_slot=self.alarmSeverityChanged), PyDMChannel(address=self.widthChannel, value_slot=self.receiveImageWidth), PyDMChannel(address=self.maxWidthChannel, value_slot=self.receiveMaxWidth), PyDMChannel(address=self.maxHeightChannel, value_slot=self.receiveMaxHeight)] if self.roiXChannel and self.roiYChannel and self.roiWidthChannel and self.roiHeightChannel: self._channels.extend([PyDMChannel(address=self.roiXChannel, value_slot=self.receiveRoiX, value_signal=self.roi_x_signal, write_access_slot=self.roiWriteAccessChanged), PyDMChannel(address=self.roiYChannel, value_slot=self.receiveRoiY, value_signal=self.roi_y_signal), PyDMChannel(address=self.roiWidthChannel, value_slot=self.receiveRoiWidth, value_signal=self.roi_w_signal), PyDMChannel(address=self.roiHeightChannel, value_slot=self.receiveRoiHeight, value_signal=self.roi_h_signal)]) self.ui.roiXLineEdit.setEnabled(True) self.ui.roiYLineEdit.setEnabled(True) self.ui.roiWLineEdit.setEnabled(True) self.ui.roiHLineEdit.setEnabled(True) else: self.ui.roiXLineEdit.clear() self.ui.roiXLineEdit.setEnabled(False) self.ui.roiYLineEdit.clear() self.ui.roiYLineEdit.setEnabled(False) self.ui.roiWLineEdit.clear() self.ui.roiWLineEdit.setEnabled(False) self.ui.roiHLineEdit.clear() self.ui.roiHLineEdit.setEnabled(False) establish_widget_connections(self) @Slot() def setROI(self): self.roi_x_signal.emit(self.ui.roiXLineEdit.text()) self.roi_y_signal.emit(self.ui.roiYLineEdit.text()) self.roi_w_signal.emit(self.ui.roiWLineEdit.text()) self.roi_h_signal.emit(self.ui.roiHLineEdit.text()) @Slot() def resetROI(self): self.roi_x_signal.emit(str(0)) self.roi_y_signal.emit(str(0)) self.roi_w_signal.emit(str(self.image_max_width)) self.roi_h_signal.emit(str(self.image_max_height)) @Slot(str) def colorMapChanged(self, _): self.ui.imageView.colorMap = self.ui.colorMapComboBox.currentData() def configureColorMapLimitSliders(self, max_int): self.ui.colorMapMinSlider.setMaximum(max_int) self.ui.colorMapMaxSlider.setMaximum(max_int) self.ui.colorMapMaxSlider.setValue(max_int) self.ui.colorMapMinSlider.setValue(0) self.setColorMapMin(0) self.setColorMapMax(max_int) self._color_map_limit_sliders_need_config = False @Slot() def colorMapMinLineEditChanged(self): try: new_min = int(self.ui.colorMapMinLineEdit.text()) except: self.ui.colorMapMinLineEdit.setText(str(self.ui.colorMapMinSlider.value())) return if new_min < 0: new_min = 0 if new_min > self.ui.colorMapMinSlider.maximum(): new_min = self.ui.colorMapMinSlider.maximum() self.ui.colorMapMinSlider.setValue(new_min) @Slot(int) def setColorMapMin(self, new_min): if new_min > self.ui.colorMapMaxSlider.value(): self.ui.colorMapMaxSlider.setValue(new_min) self.ui.colorMapMaxLineEdit.setText(str(new_min)) self.ui.colorMapMinLineEdit.setText(str(new_min)) self.ui.imageView.setColorMapLimits(new_min, self.ui.colorMapMaxSlider.value()) @Slot() def colorMapMaxLineEditChanged(self): try: new_max = int(self.ui.colorMapMaxLineEdit.text()) except: self.ui.colorMapMaxLineEdit.setText(str(self.ui.colorMapMaxSlider.value())) return if new_max < 0: new_max = 0 if new_max > self.ui.colorMapMaxSlider.maximum(): new_max = self.ui.colorMapMaxSlider.maximum() self.ui.colorMapMaxSlider.setValue(new_max) @Slot(int) def setColorMapMax(self, new_max): if new_max < self.ui.colorMapMinSlider.value(): self.ui.colorMapMinSlider.setValue(new_max) self.ui.colorMapMinLineEdit.setText(str(new_max)) self.ui.colorMapMaxLineEdit.setText(str(new_max)) self.ui.imageView.setColorMapLimits(self.ui.colorMapMinSlider.value(), new_max) def createAverageBuffer(self, size, type, initial_val=[]): num_shots = 1 try: num_shots = int(self.ui.numShotsLineEdit.text()) except: self.ui.numShotsLineEdit.setText(str(num_shots)) if num_shots < 1: num_shots = 1 self.ui.numShotsLineEdit.setText(str(num_shots)) if num_shots > 200: num_shots = 200 self.ui.numShotsLineEdit.setText(str(num_shots)) if len(initial_val) > 0: return np.full((num_shots, size), initial_val, dtype=type) else: return np.zeros(shape=(num_shots, size), dtype=type) @Slot() def numAverageChanged(self): self._average_buffer = np.zeros(0) @Slot(np.ndarray) def receiveImageWaveform(self, new_waveform): if not self.image_width: return # Calculate the average rate new_timestamp = time.time() if not (self.old_timestamp == 0): delta = new_timestamp - self.old_timestamp self.times = np.roll(self.times, 1) self.times[0] = delta avg_delta = np.mean(self.times) self.ui.dataRateLabel.setText("{:.1f} Hz".format((1.0 / avg_delta))) self.ui.displayRateLabel.setText("{:.1f} Hz".format((1.0 / avg_delta))) self.old_timestamp = new_timestamp # If this is the first image, set up the color map slider limits if self._color_map_limit_sliders_need_config: max_int = np.iinfo(new_waveform.dtype).max self.configureColorMapLimitSliders(max_int) # If we are in average mode, add this image to the circular averaging buffer, otherwise just display it. if self._average_mode_enabled: if len(self._average_buffer) == 0: self._average_buffer = self.createAverageBuffer(len(new_waveform), new_waveform.dtype, new_waveform) self._average_counter = 0 self._average_counter = (self._average_counter + 1) % len(self._average_buffer) # self._average_buffer = np.roll(self._average_buffer, 1, axis=0) self._average_buffer[self._average_counter] = new_waveform mean = np.mean(self._average_buffer, axis=0).astype(new_waveform.dtype) self.image_data = mean.reshape((int(self.image_width), -1), order='F') else: self.image_data = new_waveform.reshape((int(self.image_width), -1), order='F') self.setMarkerBounds() self.updateLineouts() self.ui.imageView.image_value_changed(self.image_data) self.calculateStats() if self._needs_auto_range: self.ui.imageView.getView().autoRange(padding=0.0) current_range = self.ui.imageView.getView().viewRange() self._needs_auto_range = False def calculateStats(self): # Full image stats mean = np.mean(self.image_data) std = np.std(self.image_data) width = self.image_data.shape[0] height = self.image_data.shape[1] min_val = np.min(self.image_data) max_val = np.max(self.image_data) self.ui.imageStatsLabel.setText("Mean: {0:.2f}, Std: {1:.2f}, Min: {2}, Max: {3}, Width: {4}, Height: {5}".format(mean, std, min_val, max_val, width, height)) # Current view stats current_range = self.ui.imageView.getView().viewRange() view_x_min = int(max(0, current_range[0][0])) view_x_max = int(min(self.image_data.shape[0], current_range[0][1])) view_y_min = int(max(0, current_range[1][0])) view_y_max = int(min(self.image_data.shape[1], current_range[1][1])) view_slice = self.image_data[view_x_min:view_x_max, view_y_min:view_y_max] mean = np.mean(view_slice) std = np.std(view_slice) width = view_slice.shape[0] height = view_slice.shape[1] min_val = np.min(view_slice) max_val = np.max(view_slice) self.ui.viewStatsLabel.setText("Mean: {0:.2f}, Std: {1:.2f}, Min: {2}, Max: {3}, Width: {4}, Height: {5}".format(mean, std, min_val, max_val, width, height)) def setMarkerBounds(self): for marker_index in self.marker_dict: marker = self.marker_dict[marker_index]['marker'] marker.maxBounds = QRectF(0, 0, self.image_data.shape[0] + marker.size()[0] - 1, self.image_data.shape[1] + marker.size()[1] - 1) @Slot(int) def receiveImageWidth(self, new_width): self.image_width = new_width self.ui.imageView.image_width_changed(self.image_width) @Slot(int) def receiveMaxWidth(self, new_max_width): self.image_max_width = new_max_width @Slot(int) def receiveMaxHeight(self, new_max_height): self.image_max_height = new_max_height @Slot(int) def receiveRoiX(self, new_roi_x): self.ui.roiXLineEdit.setText(str(new_roi_x)) @Slot(int) def receiveRoiY(self, new_roi_y): self.ui.roiYLineEdit.setText(str(new_roi_y)) @Slot(int) def receiveRoiWidth(self, new_roi_w): self.ui.roiWLineEdit.setText(str(new_roi_w)) @Slot(int) def receiveRoiHeight(self, new_roi_h): self.ui.roiHLineEdit.setText(str(new_roi_h)) # -2 to +2, -2 is LOLO, -1 is LOW, 0 is OK, etc. @Slot(int) def alarmStatusChanged(self, new_alarm_state): pass # 0 = NO_ALARM, 1 = MINOR, 2 = MAJOR, 3 = INVALID @Slot(int) def alarmSeverityChanged(self, new_alarm_severity): pass @Slot(bool) def roiWriteAccessChanged(self, can_write_roi): self.ui.setROIButton.setEnabled(can_write_roi) self.ui.resetROIButton.setEnabled(can_write_roi) self.ui.roiXLineEdit.setReadOnly(not can_write_roi) self.ui.roiYLineEdit.setReadOnly(not can_write_roi) self.ui.roiWLineEdit.setReadOnly(not can_write_roi) self.ui.roiHLineEdit.setReadOnly(not can_write_roi) # false = disconnected, true = connected @Slot(bool) def connectionStateChanged(self, connected): if connected: self.ui.imageView.redraw_timer.start() else: self.ui.imageView.redraw_timer.stop() self.ui.connectedLabel.setText({True: "Yes", False: "No"}[connected]) def ui_filename(self): return 'camviewer.ui' def channels(self): return self._channels
class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) startdlg = StartDialog(None) self.widget = uic.loadUi(_UI, self) window_title = "Rhythm" self.setWindowTitle(window_title) self.vt = self.vtdial.value() self.ie = self.iedial.value() self.rr = self.rrdial.value() self.fio2 = self.fiodial.value() self.generator = GcodeGenerator(self.vt, self.rr, self.ie, self.fio2) self.lungpressuredata = deque() self.lungpressurepeakdata = deque() self.peeppressuredata = deque() self.peeppressurepeakdata = deque() self.dvdata = deque() self.deriv_points = deque() self.timesnap = 0.0 self.tic = 0.0 self.lungpressure_line_pen = pg.mkPen(200, 100, 0) self.plotter = PlotWidget() self.plotter.showGrid(x=True, y=True, alpha=None) self.plotter.setTitle("Pressure") self.curve1 = self.plotter.plot(0, 0, "lungpressure", 'b') self.curve2 = self.plotter.plot(0, 0, "peakpressure", pen=self.lungpressure_line_pen) self.derivative_pen = pg.mkPen(200, 200, 10) self.derivative_pen_in = pg.mkPen(10, 200, 10) self.derivative_pen_out = pg.mkPen(10, 200, 200) #self.dvcurve = self.plotter.plot(0,0,"dvcurve", pen = self.derivative_pen) self.inhale_t_count = 0 self.inhale_t = 0 self.exhale_t = 0 self.exhale_t_count = 0 self.flag_idle = True self.idle_count = 0 #self.dvcurve.setPen() self.flowplotter = PlotWidget() self.flowplotter.showGrid(x=True, y=True, alpha=None) self.flowplotter.setTitle("Flow") self.dvcurve = self.flowplotter.plot(0, 0, "dvcurve", pen=self.derivative_pen) self.volplotter = PlotWidget() self.volplotter.showGrid(x=True, y=True, alpha=None) self.volplotter.setTitle("Volume") self.CalculateSettings() self.verticalLayout_2.addWidget(self.plotter) self.verticalLayout_2.addWidget(self.flowplotter) self.verticalLayout_2.addWidget(self.volplotter) #self.flowplotter.hide() self.volplotter.hide() self.gcodetable = QTableWidget(self) self.gcodetable.setRowCount(1) self.gcodetable.setColumnCount(1) #self.verticalLayout_2.addWidget(self.gcodetable) self.hbox = QHBoxLayout() #self.verticalLayout_2.addChildLayout(self.hbox) self.verticalLayout_2.addLayout(self.hbox) self.hbox.addWidget(self.gcodetable) self.txrxtable = QTableWidget() self.txrxtable.setRowCount(1) self.txrxtable.setColumnCount(1) self.gcodetable.hide() self.txrxtable.hide() self.txrxtablevisible = False self.hbox.addWidget(self.txrxtable) self.peepdial.valueChanged.connect(self.peepDialChanged) self.peeplcd.display(self.peepdial.value()) self.peakdial.valueChanged.connect(self.peakDialChanged) self.peaklcd.display(self.peakdial.value()) self.ipapdial.valueChanged.connect(self.ipapDialChanged) self.ipaplcd.display(self.ipapdial.value()) self.vtdial.valueChanged.connect(self.vtDialChanged) self.vtlcd.display(self.vtdial.value()) self.iedial.valueChanged.connect(self.ieDialChanged) self.ielcd.display(self.iedial.value()) self.rrdial.valueChanged.connect(self.rrDialChanged) self.rrlcd.display(self.rrdial.value()) self.fiodial.valueChanged.connect(self.fioDialChanged) self.fiolcd.display(self.fiodial.value()) self.lowpdial.valueChanged.connect(self.lowpDialChanged) self.lowplcd.display(self.lowpdial.value()) self.peeplcd.display(self.peepdial.value()) self.himinitdial.valueChanged.connect(self.himinitDialChanged) self.himinitlcd.display(self.himinitdial.value()) self.lowminitdial.valueChanged.connect(self.lowminitDialChanged) self.lowminitlcd.display(self.lowminitdial.value()) self.alarm.hide() self.startpush.hide() self.btnhault.hide() self.portsList.hide() self.monitoringPort.hide() self.scanPorts.hide() #self.vtdial.setStyleSheet("{ background-color: rgb(20,20,20) }") self.serialMarlin = "" self.serialSensor = "" self.ports = list(port_list.comports()) self.marlinPortOpen = False self.sensorPortOpen = False self.gengcode.hide() self.childrenMakeMouseTransparen() self.flag_sensorlimit_tx = True self.sensorLimitTimer = QTimer(self) self.sensorLimitTimer.timeout.connect(self.checkSensorLimitChanged) self.ComPorts = {'Marlin': 'NA', 'Sensor': 'NA'} self.selected_ports = [] self.sensorLimitTimer.start(1000) @Slot() def on_btnmachinesetup_clicked(self): pass @Slot() def on_btnsavemachinesetup_clicked(self): pass def checkSensorLimitChanged(self): pass def childrenMakeMouseTransparen(self): self.label_13.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.vtlcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.ilcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.ielcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.rrlcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.fiolcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.label_15.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.label_17.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.label_14.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.label_16.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.peaklcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.peeplcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.lowplcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.lowminitlcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) self.himinitlcd.setAttribute(Qt.WA_TransparentForMouseEvents, True) def peepDialChanged(self): pass def peakDialChanged(self): pass def lowpDialChanged(self): pass def himinitDialChanged(self): pass def lowminitDialChanged(self): pass def ipapDialChanged(self): pass def vtDialChanged(self): pass def ieDialChanged(self): pass def rrDialChanged(self): pass def fioDialChanged(self): pass def ShowGcodeTable(self): pass def CalculateSettings(self): pass @Slot() def on_gengcode_clicked(self): pass @Slot() def on_scanPorts_clicked(self): pass @Slot() def on_btninit_clicked(self): pass @Slot() def on_runloop_clicked(self): pass @Slot() def on_disconnect_clicked(self): pass @Slot() def on_btnalarmpage_clicked(self): pass @Slot() def on_startpush_clicked(self): pass @Slot() def on_connect_clicked(self): pass @Slot() def on_gcodeshow_clicked(self): pass @Slot() def on_alarm_clicked(self): pass
class CamViewer(Display): #Emitted when the user changes the value. roi_x_signal = pyqtSignal(str) roi_y_signal = pyqtSignal(str) roi_w_signal = pyqtSignal(str) roi_h_signal = pyqtSignal(str) def __init__(self, display_manager_window): super(CamViewer, self).__init__(display_manager_window) #Set up the list of cameras, and all the PVs vcc_dict = { "image": "ca://CAMR:IN20:186:IMAGE", "max_width": "ca://CAMR:IN20:186:N_OF_COL", "max_height": "ca://CAMR:IN20:186:N_OF_ROW", "roi_x": None, "roi_y": None, "roi_width": None, "roi_height": None } c_iris_dict = { "image": "ca://CAMR:LR20:119:Image:ArrayData", "max_width": "ca://CAMR:LR20:119:MaxSizeX_RBV", "max_height": "ca://CAMR:LR20:119:MaxSizeY_RBV", "roi_x": "ca://CAMR:LR20:119:MinX", "roi_y": "ca://CAMR:LR20:119:MinY", "roi_width": "ca://CAMR:LR20:119:SizeX", "roi_height": "ca://CAMR:LR20:119:SizeY" } test_dict = { "image": "ca://MTEST:Image", "max_width": "ca://MTEST:ImageWidth", "max_height": "ca://MTEST:ImageWidth", "roi_x": None, "roi_y": None, "roi_width": None, "roi_height": None } self.cameras = { "VCC": vcc_dict, "C-Iris": c_iris_dict, "Test": test_dict } self._channels = [] #Populate the camera combo box self.ui.cameraComboBox.clear() for camera in self.cameras: self.ui.cameraComboBox.addItem(camera) #Clear out any image data, reset width, get PVs ready for connection self.initializeCamera(self.ui.cameraComboBox.currentText()) #When the camera combo box changes, disconnect from PVs, re-initialize, then reconnect. self.ui.cameraComboBox.activated[str].connect(self.cameraChanged) #Set up the color map combo box. self.ui.colorMapComboBox.clear() for map_name in self.ui.imageView.color_maps: self.ui.colorMapComboBox.addItem(map_name) self.ui.imageView.setColorMapToPreset( self.ui.colorMapComboBox.currentText()) self.ui.colorMapComboBox.activated[str].connect(self.colorMapChanged) #Set up the color map limit sliders and line edits. #self._color_map_limit_sliders_need_config = True self.ui.colorMapMinSlider.valueChanged.connect(self.setColorMapMin) self.ui.colorMapMaxSlider.valueChanged.connect(self.setColorMapMax) self.ui.colorMapMinLineEdit.returnPressed.connect( self.colorMapMinLineEditChanged) self.ui.colorMapMaxLineEdit.returnPressed.connect( self.colorMapMaxLineEditChanged) #Set up the stuff for single-shot and average modes. self.ui.singleShotRadioButton.setChecked(True) self._average_mode_enabled = False self.ui.singleShotRadioButton.clicked.connect( self.enableSingleShotMode) self.ui.averageRadioButton.clicked.connect(self.enableAverageMode) self.ui.numShotsLineEdit.returnPressed.connect(self.numAverageChanged) #Add a plot for vertical lineouts self.yLineoutPlot = PlotWidget() self.yLineoutPlot.setMaximumWidth(80) self.yLineoutPlot.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) self.yLineoutPlot.getPlotItem().invertY() self.yLineoutPlot.hideAxis('bottom') #self.yLineoutPlot.setYLink(self.ui.imageView.getView()) self.ui.imageGridLayout.addWidget(self.yLineoutPlot, 0, 0) self.yLineoutPlot.hide() #We do some mangling of the .ui file here and move the imageView over a cell, kind of ugly. self.ui.imageGridLayout.removeWidget(self.ui.imageView) self.ui.imageGridLayout.addWidget(self.ui.imageView, 0, 1) #Add a plot for the horizontal lineouts self.xLineoutPlot = PlotWidget() self.xLineoutPlot.setMaximumHeight(80) self.xLineoutPlot.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.xLineoutPlot.hideAxis('left') #self.xLineoutPlot.setXLink(self.ui.imageView.getView()) self.ui.imageGridLayout.addWidget(self.xLineoutPlot, 1, 1) self.xLineoutPlot.hide() #Update the lineout plot ranges when the image gets panned or zoomed self.ui.imageView.getView().sigRangeChanged.connect( self.updateLineoutRange) #Instantiate markers. self.marker_dict = {1: {}, 2: {}, 3: {}, 4: {}} marker_size = QPointF(20., 20.) self.marker_dict[1]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((100, 100, 255), width=3)) self.marker_dict[1]['button'] = self.ui.marker1Button self.marker_dict[1]['xlineedit'] = self.ui.marker1XPosLineEdit self.marker_dict[1]['ylineedit'] = self.ui.marker1YPosLineEdit self.marker_dict[2]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((255, 100, 100), width=3)) self.marker_dict[2]['button'] = self.ui.marker2Button self.marker_dict[2]['xlineedit'] = self.ui.marker2XPosLineEdit self.marker_dict[2]['ylineedit'] = self.ui.marker2YPosLineEdit self.marker_dict[3]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((60, 255, 60), width=3)) self.marker_dict[3]['button'] = self.ui.marker3Button self.marker_dict[3]['xlineedit'] = self.ui.marker3XPosLineEdit self.marker_dict[3]['ylineedit'] = self.ui.marker3YPosLineEdit self.marker_dict[4]['marker'] = ImageMarker((0, 0), size=marker_size, pen=mkPen((255, 60, 255), width=3)) self.marker_dict[4]['button'] = self.ui.marker4Button self.marker_dict[4]['xlineedit'] = self.ui.marker4XPosLineEdit self.marker_dict[4]['ylineedit'] = self.ui.marker4YPosLineEdit #Disable auto-ranging the image (it feels strange when the zoom changes as you move markers around.) self.ui.imageView.getView().disableAutoRange() for d in self.marker_dict: marker = self.marker_dict[d]['marker'] marker.setZValue(20) marker.hide() marker.sigRegionChanged.connect(self.markerMoved) self.ui.imageView.getView().addItem(marker) self.marker_dict[d]['button'].toggled.connect(self.enableMarker) curvepen = QPen(marker.pen) curvepen.setWidth(1) self.marker_dict[d]['xcurve'] = self.xLineoutPlot.plot( pen=curvepen) self.marker_dict[d]['ycurve'] = self.yLineoutPlot.plot( pen=curvepen) self.marker_dict[d]['xlineedit'].returnPressed.connect( self.markerPositionLineEditChanged) self.marker_dict[d]['ylineedit'].returnPressed.connect( self.markerPositionLineEditChanged) #Set up zoom buttons self.ui.zoomInButton.clicked.connect(self.zoomIn) self.ui.zoomOutButton.clicked.connect(self.zoomOut) self.ui.zoomToActualSizeButton.clicked.connect(self.zoomToActualSize) #Set up ROI buttons self.ui.setROIButton.clicked.connect(self.setROI) self.ui.resetROIButton.clicked.connect(self.resetROI) @pyqtSlot() def zoomIn(self): self.ui.imageView.getView().scaleBy((0.5, 0.5)) @pyqtSlot() def zoomOut(self): self.ui.imageView.getView().scaleBy((2.0, 2.0)) @pyqtSlot() def zoomToActualSize(self): if len(self.image_data) == 0: return self.ui.imageView.getView().setRange(xRange=(0, self.image_data.shape[0]), yRange=(0, self.image_data.shape[1]), padding=0.0) def disable_all_markers(self): for d in self.marker_dict: self.marker_dict[d]['button'].setChecked(False) self.marker_dict[d]['marker'].setPos((0, 0)) @pyqtSlot(bool) def enableMarker(self, checked): any_markers_visible = False for d in self.marker_dict: marker = self.marker_dict[d]['marker'] button = self.marker_dict[d]['button'] any_markers_visible = any_markers_visible or button.isChecked() marker.setVisible(button.isChecked()) self.markerMoved(d) self.marker_dict[d]['xcurve'].setVisible(button.isChecked()) self.marker_dict[d]['ycurve'].setVisible(button.isChecked()) self.marker_dict[d]['xlineedit'].setEnabled(button.isChecked()) self.marker_dict[d]['ylineedit'].setEnabled(button.isChecked()) if any_markers_visible: self.xLineoutPlot.show() self.yLineoutPlot.show() else: self.xLineoutPlot.hide() self.yLineoutPlot.hide() @pyqtSlot() def markerPositionLineEditChanged(self): for d in self.marker_dict: marker = self.marker_dict[d]['marker'] x_line_edit = self.marker_dict[d]['xlineedit'] y_line_edit = self.marker_dict[d]['ylineedit'] try: new_x = int(x_line_edit.text()) new_y = int(y_line_edit.text()) if new_x <= marker.maxBounds.width( ) and new_y <= marker.maxBounds.height(): marker.setPos((new_x, new_y)) return except: pass coords = marker.getPixelCoords() x_line_edit.setText(str(coords[0])) y_line_edit.setText(str(coords[1])) @pyqtSlot(object) def markerMoved(self, marker): self.updateLineouts() for marker_index in self.marker_dict: marker = self.marker_dict[marker_index]['marker'] x_line_edit = self.marker_dict[marker_index]['xlineedit'] y_line_edit = self.marker_dict[marker_index]['ylineedit'] coords = marker.getPixelCoords() x_line_edit.setText(str(coords[0])) y_line_edit.setText(str(coords[1])) @pyqtSlot(object, object) def updateLineoutRange(self, view, new_ranges): self.ui.xLineoutPlot.setRange(xRange=new_ranges[0], padding=0.0) self.ui.yLineoutPlot.setRange(yRange=new_ranges[1], padding=0.0) def updateLineouts(self): for marker_index in self.marker_dict: marker = self.marker_dict[marker_index]['marker'] xcurve = self.marker_dict[marker_index]['xcurve'] ycurve = self.marker_dict[marker_index]['ycurve'] if marker.isVisible(): result, coords = marker.getArrayRegion( self.image_data, self.ui.imageView.getImageItem()) xcurve.setData(y=result[0], x=np.arange(len(result[0]))) ycurve.setData(y=np.arange(len(result[1])), x=result[1]) @pyqtSlot() def enableSingleShotMode(self): self._average_mode_enabled = False self._average_buffer = np.ndarray(0) @pyqtSlot() def enableAverageMode(self): self._average_mode_enabled = True @pyqtSlot(str) def cameraChanged(self, new_camera): new_camera = str(new_camera) if self.imageChannel == self.cameras[new_camera]["image"]: return self.display_manager_window.close_widget_connections(self) self.disable_all_markers() self.initializeCamera(new_camera) self.display_manager_window.establish_widget_connections(self) def initializeCamera(self, new_camera): new_camera = str(new_camera) self._color_map_limit_sliders_need_config = True self.times = np.zeros(10) self.old_timestamp = 0 self.image_width = 0 #current width (width of ROI) self.image_max_width = 0 #full width. Only used to reset ROI to full. self.image_max_height = 0 #full height. Only used to reset ROI to full. self.image_data = np.zeros(0) self._average_counter = 0 self._average_buffer = np.ndarray(0) self._needs_auto_range = True self.imageChannel = self.cameras[new_camera]["image"] self.widthChannel = self.cameras[new_camera][ "roi_width"] or self.cameras[new_camera]["max_width"] self.maxWidthChannel = self.cameras[new_camera]["max_width"] self.maxHeightChannel = self.cameras[new_camera]["max_height"] self.roiXChannel = self.cameras[new_camera]["roi_x"] self.roiYChannel = self.cameras[new_camera]["roi_y"] self.roiWidthChannel = self.cameras[new_camera]["roi_width"] self.roiHeightChannel = self.cameras[new_camera]["roi_height"] self._channels = [ PyDMChannel(address=self.imageChannel, connection_slot=self.connectionStateChanged, waveform_slot=self.receiveImageWaveform, severity_slot=self.alarmSeverityChanged), PyDMChannel(address=self.widthChannel, value_slot=self.receiveImageWidth), PyDMChannel(address=self.maxWidthChannel, value_slot=self.receiveMaxWidth), PyDMChannel(address=self.maxHeightChannel, value_slot=self.receiveMaxHeight) ] if self.roiXChannel and self.roiYChannel and self.roiWidthChannel and self.roiHeightChannel: self._channels.extend([ PyDMChannel(address=self.roiXChannel, value_slot=self.receiveRoiX, value_signal=self.roi_x_signal, write_access_slot=self.roiWriteAccessChanged), PyDMChannel(address=self.roiYChannel, value_slot=self.receiveRoiY, value_signal=self.roi_y_signal), PyDMChannel(address=self.roiWidthChannel, value_slot=self.receiveRoiWidth, value_signal=self.roi_w_signal), PyDMChannel(address=self.roiHeightChannel, value_slot=self.receiveRoiHeight, value_signal=self.roi_h_signal) ]) self.ui.roiXLineEdit.setEnabled(True) self.ui.roiYLineEdit.setEnabled(True) self.ui.roiWLineEdit.setEnabled(True) self.ui.roiHLineEdit.setEnabled(True) else: self.ui.roiXLineEdit.clear() self.ui.roiXLineEdit.setEnabled(False) self.ui.roiYLineEdit.clear() self.ui.roiYLineEdit.setEnabled(False) self.ui.roiWLineEdit.clear() self.ui.roiWLineEdit.setEnabled(False) self.ui.roiHLineEdit.clear() self.ui.roiHLineEdit.setEnabled(False) @pyqtSlot() def setROI(self): self.roi_x_signal.emit(self.ui.roiXLineEdit.text()) self.roi_y_signal.emit(self.ui.roiYLineEdit.text()) self.roi_w_signal.emit(self.ui.roiWLineEdit.text()) self.roi_h_signal.emit(self.ui.roiHLineEdit.text()) @pyqtSlot() def resetROI(self): self.roi_x_signal.emit(str(0)) self.roi_y_signal.emit(str(0)) self.roi_w_signal.emit(str(self.image_max_width)) self.roi_h_signal.emit(str(self.image_max_height)) @pyqtSlot(str) def colorMapChanged(self, new_map_name): self.ui.imageView.setColorMapToPreset(new_map_name) def configureColorMapLimitSliders(self, max_int): self.ui.colorMapMinSlider.setMaximum(max_int) self.ui.colorMapMaxSlider.setMaximum(max_int) self.ui.colorMapMaxSlider.setValue(max_int) self.ui.colorMapMinSlider.setValue(0) self.setColorMapMin(0) self.setColorMapMax(max_int) self._color_map_limit_sliders_need_config = False @pyqtSlot() def colorMapMinLineEditChanged(self): try: new_min = int(self.ui.colorMapMinLineEdit.text()) except: self.ui.colorMapMinLineEdit.setText( str(self.ui.colorMapMinSlider.value())) return if new_min < 0: new_min = 0 if new_min > self.ui.colorMapMinSlider.maximum(): new_min = self.ui.colorMapMinSlider.maximum() self.ui.colorMapMinSlider.setValue(new_min) @pyqtSlot(int) def setColorMapMin(self, new_min): if new_min > self.ui.colorMapMaxSlider.value(): self.ui.colorMapMaxSlider.setValue(new_min) self.ui.colorMapMaxLineEdit.setText(str(new_min)) self.ui.colorMapMinLineEdit.setText(str(new_min)) self.ui.imageView.setColorMapLimits(new_min, self.ui.colorMapMaxSlider.value()) @pyqtSlot() def colorMapMaxLineEditChanged(self): try: new_max = int(self.ui.colorMapMaxLineEdit.text()) except: self.ui.colorMapMaxLineEdit.setText( str(self.ui.colorMapMaxSlider.value())) return if new_max < 0: new_max = 0 if new_max > self.ui.colorMapMaxSlider.maximum(): new_max = self.ui.colorMapMaxSlider.maximum() self.ui.colorMapMaxSlider.setValue(new_max) @pyqtSlot(int) def setColorMapMax(self, new_max): if new_max < self.ui.colorMapMinSlider.value(): self.ui.colorMapMinSlider.setValue(new_max) self.ui.colorMapMinLineEdit.setText(str(new_max)) self.ui.colorMapMaxLineEdit.setText(str(new_max)) self.ui.imageView.setColorMapLimits(self.ui.colorMapMinSlider.value(), new_max) def createAverageBuffer(self, size, type, initial_val=[]): num_shots = 1 try: num_shots = int(self.ui.numShotsLineEdit.text()) except: self.ui.numShotsLineEdit.setText(str(num_shots)) if num_shots < 1: num_shots = 1 self.ui.numShotsLineEdit.setText(str(num_shots)) if num_shots > 200: num_shots = 200 self.ui.numShotsLineEdit.setText(str(num_shots)) if len(initial_val) > 0: return np.full((num_shots, size), initial_val, dtype=type) else: return np.zeros(shape=(num_shots, size), dtype=type) @pyqtSlot() def numAverageChanged(self): self._average_buffer = np.zeros(0) @pyqtSlot(np.ndarray) def receiveImageWaveform(self, new_waveform): if not self.image_width: return #Calculate the average rate new_timestamp = time.time() if not (self.old_timestamp == 0): delta = new_timestamp - self.old_timestamp self.times = np.roll(self.times, 1) self.times[0] = delta avg_delta = np.mean(self.times) self.ui.dataRateLabel.setText("{:.1f} Hz".format( (1.0 / avg_delta))) self.ui.displayRateLabel.setText("{:.1f} Hz".format( (1.0 / avg_delta))) self.old_timestamp = new_timestamp #If this is the first image, set up the color map slider limits if self._color_map_limit_sliders_need_config: max_int = np.iinfo(new_waveform.dtype).max self.configureColorMapLimitSliders(max_int) #If we are in average mode, add this image to the circular averaging buffer, otherwise just display it. if self._average_mode_enabled: if len(self._average_buffer) == 0: self._average_buffer = self.createAverageBuffer( len(new_waveform), new_waveform.dtype, new_waveform) self._average_counter = 0 self._average_counter = (self._average_counter + 1) % len( self._average_buffer) #self._average_buffer = np.roll(self._average_buffer, 1, axis=0) self._average_buffer[self._average_counter] = new_waveform mean = np.mean(self._average_buffer, axis=0).astype(new_waveform.dtype) self.image_data = mean.reshape((int(self.image_width), -1), order='F') else: self.image_data = new_waveform.reshape((int(self.image_width), -1), order='F') self.setMarkerBounds() self.updateLineouts() self.ui.imageView.receiveImageWaveform(self.image_data) self.calculateStats() if self._needs_auto_range: self.ui.imageView.getView().autoRange(padding=0.0) current_range = self.ui.imageView.getView().viewRange() self._needs_auto_range = False def calculateStats(self): # Full image stats mean = np.mean(self.image_data) std = np.std(self.image_data) width = self.image_data.shape[0] height = self.image_data.shape[1] min_val = np.min(self.image_data) max_val = np.max(self.image_data) self.ui.imageStatsLabel.setText( "Mean: {0:.2f}, Std: {1:.2f}, Min: {2}, Max: {3}, Width: {4}, Height: {5}" .format(mean, std, min_val, max_val, width, height)) # Current view stats current_range = self.ui.imageView.getView().viewRange() view_x_min = int(max(0, current_range[0][0])) view_x_max = int(min(self.image_data.shape[0], current_range[0][1])) view_y_min = int(max(0, current_range[1][0])) view_y_max = int(min(self.image_data.shape[1], current_range[1][1])) view_slice = self.image_data[view_x_min:view_x_max, view_y_min:view_y_max] mean = np.mean(view_slice) std = np.std(view_slice) width = view_slice.shape[0] height = view_slice.shape[1] min_val = np.min(view_slice) max_val = np.max(view_slice) self.ui.viewStatsLabel.setText( "Mean: {0:.2f}, Std: {1:.2f}, Min: {2}, Max: {3}, Width: {4}, Height: {5}" .format(mean, std, min_val, max_val, width, height)) def setMarkerBounds(self): for marker_index in self.marker_dict: marker = self.marker_dict[marker_index]['marker'] marker.maxBounds = QRectF( 0, 0, self.image_data.shape[0] + marker.size()[0] - 1, self.image_data.shape[1] + marker.size()[1] - 1) @pyqtSlot(int) def receiveImageWidth(self, new_width): self.image_width = new_width self.ui.imageView.receiveImageWidth(self.image_width) @pyqtSlot(int) def receiveMaxWidth(self, new_max_width): self.image_max_width = new_max_width @pyqtSlot(int) def receiveMaxHeight(self, new_max_height): self.image_max_height = new_max_height @pyqtSlot(int) def receiveRoiX(self, new_roi_x): self.ui.roiXLineEdit.setText(str(new_roi_x)) @pyqtSlot(int) def receiveRoiY(self, new_roi_y): self.ui.roiYLineEdit.setText(str(new_roi_y)) @pyqtSlot(int) def receiveRoiWidth(self, new_roi_w): self.ui.roiWLineEdit.setText(str(new_roi_w)) @pyqtSlot(int) def receiveRoiHeight(self, new_roi_h): self.ui.roiHLineEdit.setText(str(new_roi_h)) # -2 to +2, -2 is LOLO, -1 is LOW, 0 is OK, etc. @pyqtSlot(int) def alarmStatusChanged(self, new_alarm_state): pass #0 = NO_ALARM, 1 = MINOR, 2 = MAJOR, 3 = INVALID @pyqtSlot(int) def alarmSeverityChanged(self, new_alarm_severity): pass @pyqtSlot(bool) def roiWriteAccessChanged(self, can_write_roi): self.ui.setROIButton.setEnabled(can_write_roi) self.ui.resetROIButton.setEnabled(can_write_roi) self.ui.roiXLineEdit.setReadOnly(not can_write_roi) self.ui.roiYLineEdit.setReadOnly(not can_write_roi) self.ui.roiWLineEdit.setReadOnly(not can_write_roi) self.ui.roiHLineEdit.setReadOnly(not can_write_roi) #false = disconnected, true = connected @pyqtSlot(bool) def connectionStateChanged(self, connected): self.ui.connectedLabel.setText({True: "Yes", False: "No"}[connected]) def ui_filename(self): return 'camviewer.ui' def ui_filepath(self): return path.join(path.dirname(path.realpath(__file__)), self.ui_filename()) def channels(self): return self._channels
class Plotter: """ This class communicates with the matplotlib library and plot the data """ def __init__(self, size): """Initialize the plot window, size defines the shape and size of the figure 0 - None, 1 - 8x6, 11 (default) - 12x8, 2 - 2 figs 8x8, 12 - 2 figs 12x8 """ # print('ok') class CustomViewBox(pg.ViewBox): def __init__(self, *args, **kwds): pg.ViewBox.__init__(self, *args, **kwds) self.setMouseMode(self.RectMode) ## reimplement right-click to zoom out def mouseClickEvent(self, ev): if ev.button( ) == QtCore.Qt.RightButton and QtGui.QApplication.keyboardModifiers( ) == QtCore.Qt.ControlModifier: self.autoRange() else: pg.ViewBox.mouseClickEvent(self, ev) def mouseDragEvent(self, ev): mod = QtGui.QApplication.keyboardModifiers() if mod == QtCore.Qt.ControlModifier: self.setMouseMode(self.PanMode) else: self.setMouseMode(self.RectMode) if ev.button() == QtCore.Qt.RightButton: pg.ViewBox.mouseDragEvent(self, ev) else: pg.ViewBox.mouseDragEvent(self, ev) self.vb = CustomViewBox() # not necessary? def clear(self): def ylog(self): """ Change y-scale to log """ vr = self._widget.plotItem.viewRange() xr = vr[0] yr = vr[1] # print(xr,yr) if yr[0] <= 0: yr[0] = 1 yr[0] = np.log10(yr[0]) yr[1] = np.log10(yr[1]) # print(xr,yr) self._widget.plotItem.disableAutoRange() self._widget.plotItem.setLogMode(x=False, y=True) self._widget.plotItem.setRange(xRange=xr, yRange=yr, padding=None) def ylin(self): """ Change y-scale to linear """ vr = self._widget.plotItem.viewRange() xr = vr[0] yr = vr[1] # print(xr,yr) yr[0] = 10**yr[0] yr[1] = 10**yr[1] # print(xr,yr) self._widget.plotItem.disableAutoRange() self._widget.plotItem.setLogMode(x=False, y=False) self._widget.plotItem.setRange(xRange=xr, yRange=yr, padding=None) def plot1d(self, plot, xlim=None, ylim=None): """ Plot 1D histogram The mode defines the way the data are presented, 'histogram' is displayed with steps 'function' with continuus line 'errorbar' with yerrorbars The norm (normalization factor) and bin_size are given for the display purposes only. The histogram is not altered. """ histo = plot.histogram self._widget = PlotWidget(viewBox=self.vb) plt = self._widget.plotItem plt.setTitle(histo.title) plt.plot(histo.x_axis, histo.weights) self._widget.show() # if plot.mode == 'histogram': # current_plot.plot() # win.show() # app.processEvents() def _repr_png_(self): self._widget.hide() QtGui.QApplication.processEvents() try: self.image = QImage(self._widget.viewRect().size().toSize(), QImage.Format_RGB32) except AttributeError: self._widget.updateGL() self.image = self._widget.grabFrameBuffer() painter = QPainter(self.image) self._widget.render(painter) byte_array = QByteArray() buffer = QBuffer(byte_array) buffer.open(QIODevice.ReadWrite) self.image.save(buffer, 'PNG') buffer.close() return bytes(byte_array) def xlim(self, x_range): """ Set x range of plot preserving y limits. """ if x_range == None: yar = self._widget.plotItem.getViewBox().autoRangeEnabled()[1] if yar == False: yr = self._widget.viewRange()[1] else: yr = None # self._widget.plotItem.autoRange() self._widget.plotItem.enableAutoRange() self._widget.plotItem.setAutoVisible(x=True, y=True) if yr != None: self._widget.plotItem.setRange(yRange=yr, padding=None) return None else: if x_range[0] == None: x_range[0] = 0 if x_range[1] == None: self._widget.plotItem.setAutoVisible(x=True, y=False) xr = self._widget.viewRange()[0] x_range[1] = xr[1] self._widget.plotItem.setXRange(x_range[0], x_range[1]) self._widget.plotItem.setAutoVisible(x=False, y=True) def ylim(self, y_range): """ Set y range of plot preserving x limits. """ if y_range == None: xar = self._widget.plotItem.getViewBox().autoRangeEnabled()[0] if xar == False: xr = self._widget.viewRange()[0] else: xr = None self._widget.plotItem.enableAutoRange() self._widget.plotItem.setAutoVisible(x=True, y=True) if xr != None: self._widget.plotItem.setRange(xRange=xr, padding=None) return None else: if y_range[0] == None: y_range[0] = 0 if y_range[1] == None: self._widget.plotItem.setAutoVisible(y=True, x=False) yr = self._widget.viewRange()[1] y_range[1] = yr[1] self._widget.plotItem.setYRange(y_range[0], y_range[1]) self._widget.plotItem.setAutoVisible(y=False, x=True) # def plot1d_4panel(self, plot, ranges): """ Special 1D histogram plot. The plot is broken into 4 panels (stacked verically) the ranges variable should be given in a (x0, x1, x2, x3, x4) format, where xi defines the ranges of the subplots (x0-x1, x1-x2, x2-x3, x3-x4) """ def plot2d(self, plot, xc=None, yc=None, logz=False): """Plot 2D histogram xc is x range, yc is y range """ if plot.histogram.dim != 2: raise GeneralError('plot2d function needs a 2D histogram!') x = plot.histogram.x_axis y = plot.histogram.y_axis w = plot.histogram.weights if xc is not None: x = x[xc[0]:xc[1]] w = w[xc[0]:xc[1], :] if yc is not None: y = y[yc[0]:yc[1]] w = w[:, yc[0]:yc[1]] title = plot.histogram.title # If logaritmic scale is used, mask values <= 0 if logz: w = numpy.ma.masked_where(w <= 0, numpy.log10(w)) title += ' (log10)' self._widget = pg.ImageView(view=pg.PlotItem(title=title)) gv = self._widget.getView() gv.invertY(False) self._widget.setImage(w, pos=[x[0] - 0.5, y[0] - 0.5]) self._widget.show()
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(844, 833) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.gridLayout = QtGui.QGridLayout(self.centralwidget) self.gridLayout.setMargin(4) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.splitter_3 = QtGui.QSplitter(self.centralwidget) self.splitter_3.setOrientation(QtCore.Qt.Horizontal) self.splitter_3.setObjectName(_fromUtf8("splitter_3")) self.splitter = QtGui.QSplitter(self.splitter_3) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName(_fromUtf8("splitter")) self.treeWidget = MyTreeWidget(self.splitter) self.treeWidget.setObjectName(_fromUtf8("treeWidget")) self.treeWidget_2 = MyTreeWidget(self.splitter) self.treeWidget_2.setObjectName(_fromUtf8("treeWidget_2")) self.splitter_2 = QtGui.QSplitter(self.splitter_3) self.splitter_2.setOrientation(QtCore.Qt.Vertical) self.splitter_2.setObjectName(_fromUtf8("splitter_2")) self.graphicsView_8 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_8.setObjectName(_fromUtf8("graphicsView_8")) self.graphicsView_7 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_7.setObjectName(_fromUtf8("graphicsView_7")) self.graphicsView_6 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_6.setObjectName(_fromUtf8("graphicsView_6")) self.graphicsView_5 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_5.setObjectName(_fromUtf8("graphicsView_5")) self.graphicsView_4 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_4.setObjectName(_fromUtf8("graphicsView_4")) self.graphicsView_3 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_3.setObjectName(_fromUtf8("graphicsView_3")) self.graphicsView_2 = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView_2.setObjectName(_fromUtf8("graphicsView_2")) self.graphicsView = PlotWidget(self.splitter_2, axisItems={'bottom': CustomAxis(orientation='bottom')}) self.graphicsView.setObjectName(_fromUtf8("graphicsView")) self.gridLayout.addWidget(self.splitter_3, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 844, 25)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuMenu = QtGui.QMenu(self.menubar) self.menuMenu.setObjectName(_fromUtf8("menuMenu")) self.menuLayout = QtGui.QMenu(self.menubar) self.menuLayout.setObjectName(_fromUtf8("menuLayout")) self.menuNumber_of_Graph_Windows = QtGui.QMenu(self.menuLayout) self.menuNumber_of_Graph_Windows.setObjectName(_fromUtf8("menuNumber_of_Graph_Windows")) self.menuScroll = QtGui.QMenu(self.menubar) self.menuScroll.setObjectName(_fromUtf8("menuScroll")) self.menuROI = QtGui.QMenu(self.menubar) self.menuROI.setObjectName(_fromUtf8("menuROI")) self.menuInsert_2 = QtGui.QMenu(self.menuROI) self.menuInsert_2.setObjectName(_fromUtf8("menuInsert_2")) self.menuArrow = QtGui.QMenu(self.menubar) self.menuArrow.setObjectName(_fromUtf8("menuArrow")) self.menuInsert = QtGui.QMenu(self.menuArrow) self.menuInsert.setObjectName(_fromUtf8("menuInsert")) self.menuBG_Fill = QtGui.QMenu(self.menubar) self.menuBG_Fill.setObjectName(_fromUtf8("menuBG_Fill")) self.menuData = QtGui.QMenu(self.menubar) self.menuData.setObjectName(_fromUtf8("menuData")) MainWindow.setMenuBar(self.menubar) self.toolBar = QtGui.QToolBar("File", MainWindow) self.toolBar.setObjectName(_fromUtf8("toolBar")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) self.toolBar_2 = QtGui.QToolBar("Layout", MainWindow) self.toolBar_2.setObjectName(_fromUtf8("toolBar_2")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar_2) MainWindow.insertToolBarBreak(self.toolBar_2) self.toolBar_3 = QtGui.QToolBar("Scroll", MainWindow) self.toolBar_3.setObjectName(_fromUtf8("toolBar_3")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar_3) MainWindow.insertToolBarBreak(self.toolBar_3) self.toolBar_4 = QtGui.QToolBar("ROI", MainWindow) self.toolBar_4.setObjectName(_fromUtf8("toolBar_4")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar_4) MainWindow.insertToolBarBreak(self.toolBar_4) self.actionFile = QtGui.QAction(MainWindow) self.actionFile.setObjectName(_fromUtf8("actionFile")) self.action12 = QtGui.QAction(MainWindow) self.action12.setObjectName(_fromUtf8("action12")) self.action1 = QtGui.QAction(MainWindow) self.action1.setObjectName(_fromUtf8("action1")) self.action2 = QtGui.QAction(MainWindow) self.action2.setObjectName(_fromUtf8("action2")) self.action3 = QtGui.QAction(MainWindow) self.action3.setObjectName(_fromUtf8("action3")) self.action4 = QtGui.QAction(MainWindow) self.action4.setObjectName(_fromUtf8("action4")) self.action5 = QtGui.QAction(MainWindow) self.action5.setObjectName(_fromUtf8("action5")) self.action6 = QtGui.QAction(MainWindow) self.action6.setObjectName(_fromUtf8("action6")) self.action7 = QtGui.QAction(MainWindow) self.action7.setObjectName(_fromUtf8("action7")) self.action8 = QtGui.QAction(MainWindow) self.action8.setObjectName(_fromUtf8("action8")) self.actionStart = QtGui.QAction(MainWindow) self.actionStart.setObjectName(_fromUtf8("actionStart")) self.actionPause = QtGui.QAction(MainWindow) self.actionPause.setObjectName(_fromUtf8("actionPause")) self.actionResume = QtGui.QAction(MainWindow) self.actionResume.setObjectName(_fromUtf8("actionResume")) self.actionStop = QtGui.QAction(MainWindow) self.actionStop.setObjectName(_fromUtf8("actionStop")) self.actionSet_Scroll_Options = QtGui.QAction(MainWindow) self.actionSet_Scroll_Options.setObjectName(_fromUtf8("actionSet_Scroll_Options")) self.actionArrow_1 = QtGui.QAction(MainWindow) self.actionArrow_1.setObjectName(_fromUtf8("actionArrow_1")) self.actionArrow_2 = QtGui.QAction(MainWindow) self.actionArrow_2.setObjectName(_fromUtf8("actionArrow_2")) self.actionLine = QtGui.QAction(MainWindow) self.actionLine.setObjectName(_fromUtf8("actionLine")) self.actionRectangle = QtGui.QAction(MainWindow) self.actionRectangle.setObjectName(_fromUtf8("actionRectangle")) self.actionW = QtGui.QAction(MainWindow) self.actionW.setObjectName(_fromUtf8("actionW")) self.actionM = QtGui.QAction(MainWindow) self.actionM.setObjectName(_fromUtf8("actionM")) self.actionTriangle = QtGui.QAction(MainWindow) self.actionTriangle.setObjectName(_fromUtf8("actionTriangle")) self.actionEllipse = QtGui.QAction(MainWindow) self.actionEllipse.setObjectName(_fromUtf8("actionEllipse")) self.actionRemove_All = QtGui.QAction(MainWindow) self.actionRemove_All.setObjectName(_fromUtf8("actionRemove_All")) self.actionArrow_3 = QtGui.QAction(MainWindow) self.actionArrow_3.setObjectName(_fromUtf8("actionArrow_3")) self.actionArrow_4 = QtGui.QAction(MainWindow) self.actionArrow_4.setObjectName(_fromUtf8("actionArrow_4")) self.actionArrow_5 = QtGui.QAction(MainWindow) self.actionArrow_5.setObjectName(_fromUtf8("actionArrow_5")) self.actionArrow_6 = QtGui.QAction(MainWindow) self.actionArrow_6.setObjectName(_fromUtf8("actionArrow_6")) self.actionRemove_All_2 = QtGui.QAction(MainWindow) self.actionRemove_All_2.setObjectName(_fromUtf8("actionRemove_All_2")) self.actionSave = QtGui.QAction(MainWindow) self.actionSave.setObjectName(_fromUtf8("actionSave")) self.actionSave_as = QtGui.QAction(MainWindow) self.actionSave_as.setObjectName(_fromUtf8("actionSave_as")) self.actionClose = QtGui.QAction(MainWindow) self.actionClose.setObjectName(_fromUtf8("actionClose")) self.action1_2 = QtGui.QAction(MainWindow) self.action1_2.setObjectName(_fromUtf8("action1_2")) self.action2_2 = QtGui.QAction(MainWindow) self.action2_2.setObjectName(_fromUtf8("action2_2")) self.action3_2 = QtGui.QAction(MainWindow) self.action3_2.setObjectName(_fromUtf8("action3_2")) self.action4_2 = QtGui.QAction(MainWindow) self.action4_2.setObjectName(_fromUtf8("action4_2")) self.action5_2 = QtGui.QAction(MainWindow) self.action5_2.setObjectName(_fromUtf8("action5_2")) self.action6_2 = QtGui.QAction(MainWindow) self.action6_2.setObjectName(_fromUtf8("action6_2")) self.action7_2 = QtGui.QAction(MainWindow) self.action7_2.setObjectName(_fromUtf8("action7_2")) self.action8_2 = QtGui.QAction(MainWindow) self.action8_2.setObjectName(_fromUtf8("action8_2")) self.actionBG_Fill = QtGui.QAction(MainWindow) self.actionBG_Fill.setObjectName(_fromUtf8("actionBG_Fill")) self.actionMax_Min = QtGui.QAction(MainWindow) self.actionMax_Min.setObjectName(_fromUtf8("actionMax_Min")) self.menuMenu.addAction(self.actionFile) self.menuMenu.addAction(self.actionSave) self.menuMenu.addAction(self.actionSave_as) self.menuMenu.addAction(self.actionClose) self.menuNumber_of_Graph_Windows.addAction(self.action1_2) self.menuNumber_of_Graph_Windows.addAction(self.action2_2) self.menuNumber_of_Graph_Windows.addAction(self.action3_2) self.menuNumber_of_Graph_Windows.addAction(self.action4_2) self.menuNumber_of_Graph_Windows.addAction(self.action5_2) self.menuNumber_of_Graph_Windows.addAction(self.action6_2) self.menuNumber_of_Graph_Windows.addAction(self.action7_2) self.menuNumber_of_Graph_Windows.addAction(self.action8_2) self.menuLayout.addAction(self.menuNumber_of_Graph_Windows.menuAction()) self.menuScroll.addAction(self.actionStart) self.menuScroll.addAction(self.actionPause) self.menuScroll.addAction(self.actionResume) self.menuScroll.addAction(self.actionStop) self.menuScroll.addSeparator() self.menuScroll.addAction(self.actionSet_Scroll_Options) self.menuInsert_2.addAction(self.actionLine) self.menuInsert_2.addAction(self.actionRectangle) self.menuInsert_2.addAction(self.actionW) self.menuInsert_2.addAction(self.actionM) self.menuInsert_2.addAction(self.actionTriangle) self.menuInsert_2.addAction(self.actionEllipse) self.menuROI.addAction(self.menuInsert_2.menuAction()) self.menuROI.addAction(self.actionRemove_All) self.menuInsert.addAction(self.actionArrow_1) self.menuInsert.addAction(self.actionArrow_2) self.menuInsert.addAction(self.actionArrow_3) self.menuInsert.addAction(self.actionArrow_4) self.menuInsert.addAction(self.actionArrow_5) self.menuInsert.addAction(self.actionArrow_6) self.menuArrow.addAction(self.menuInsert.menuAction()) self.menuArrow.addAction(self.actionRemove_All_2) self.menuBG_Fill.addAction(self.actionBG_Fill) self.menuData.addAction(self.actionMax_Min) self.menubar.addAction(self.menuMenu.menuAction()) self.menubar.addAction(self.menuLayout.menuAction()) self.menubar.addAction(self.menuScroll.menuAction()) self.menubar.addAction(self.menuROI.menuAction()) self.menubar.addAction(self.menuArrow.menuAction()) self.menubar.addAction(self.menuBG_Fill.menuAction()) self.menubar.addAction(self.menuData.menuAction()) self.toolBar.addAction(self.actionFile) self.toolBar.addAction(self.actionSave) self.toolBar.addAction(self.actionSave_as) self.toolBar.addAction(self.actionClose) self.toolBar_2.addAction(self.action1_2) self.toolBar_2.addAction(self.action2_2) self.toolBar_2.addAction(self.action3_2) self.toolBar_2.addAction(self.action4_2) self.toolBar_2.addAction(self.action5_2) self.toolBar_2.addAction(self.action6_2) self.toolBar_2.addAction(self.action7_2) self.toolBar_2.addAction(self.action8_2) self.toolBar_3.addAction(self.actionStart) self.toolBar_3.addAction(self.actionPause) self.toolBar_3.addAction(self.actionResume) self.toolBar_3.addAction(self.actionStop) self.toolBar_3.addAction(self.actionSet_Scroll_Options) self.toolBar_4.addAction(self.actionLine) self.toolBar_4.addAction(self.actionRectangle) self.toolBar_4.addAction(self.actionW) self.toolBar_4.addAction(self.actionM) self.toolBar_4.addAction(self.actionTriangle) self.toolBar_4.addAction(self.actionEllipse) self.toolBar_4.addAction(self.actionRemove_All) """ Graph Layout 액션에 함수 연결 """ self.action1_2.triggered.connect(lambda: self.graphWindow(1)) self.action2_2.triggered.connect(lambda: self.graphWindow(2)) self.action3_2.triggered.connect(lambda: self.graphWindow(3)) self.action4_2.triggered.connect(lambda: self.graphWindow(4)) self.action5_2.triggered.connect(lambda: self.graphWindow(5)) self.action6_2.triggered.connect(lambda: self.graphWindow(6)) self.action7_2.triggered.connect(lambda: self.graphWindow(7)) self.action8_2.triggered.connect(lambda: self.graphWindow(8)) """ self.plotwidget_lst = 그래프를 위에서부터 넣은 리스트 """ self.plotwidget_lst = [self.graphicsView, self.graphicsView_2, self.graphicsView_3, self.graphicsView_4, self.graphicsView_5, self.graphicsView_6, self.graphicsView_7, self.graphicsView_8] self.plotwidget_lst.reverse() """ File 관련 액션에 함수 연결 """ self.actionFile.triggered.connect(self.open) self.actionSave.triggered.connect(self.save) self.actionSave_as.triggered.connect(self.save_as) self.actionClose.triggered.connect(self.close) """ 화살표 액션 연결 코드 """ self.actionArrow_1.triggered.connect(lambda: self.insertArrow(1)) self.actionArrow_2.triggered.connect(lambda: self.insertArrow(2)) self.actionArrow_3.triggered.connect(lambda: self.insertArrow(3)) self.actionArrow_4.triggered.connect(lambda: self.insertArrow(4)) self.actionArrow_5.triggered.connect(lambda: self.insertArrow(5)) self.actionArrow_6.triggered.connect(lambda: self.insertArrow(6)) self.actionRemove_All_2.triggered.connect(self.removeArrowAll) #Scroll function connect self.actionStart.triggered.connect(self.startScroll) self.actionPause.triggered.connect(self.pauseScroll) self.actionResume.triggered.connect(self.resumeScroll) self.actionStop.triggered.connect(self.stopScroll) self.actionSet_Scroll_Options.triggered.connect(self.optionScroll) #ROI function Connect self.actionLine.triggered.connect(lambda: self.setROI(0)) self.actionRectangle.triggered.connect(lambda: self.setROI(1)) self.actionW.triggered.connect(lambda: self.setROI(2)) self.actionM.triggered.connect(lambda: self.setROI(3)) self.actionTriangle.triggered.connect(lambda: self.setROI(4)) self.actionEllipse.triggered.connect(lambda: self.setROI(5)) self.actionRemove_All.triggered.connect(self.removeROIAll) """ 배경 칠하기 기능 관련 모음 """ self.actionBG_Fill.triggered.connect(self.bg_fill) self.bg_rect_lst = [] self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.restore(MainWindow) """ Max Min 기능 연결 """ self.actionMax_Min.triggered.connect(self.data_stat) """ control panel의 tree widget에 mainwindow를 넘겨줌 """ self.treeWidget.setMainWindow(self) self.treeWidget_2.setMainWindow(self) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) self.menuMenu.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8)) self.menuLayout.setTitle(QtGui.QApplication.translate("MainWindow", "Layout", None, QtGui.QApplication.UnicodeUTF8)) self.menuNumber_of_Graph_Windows.setTitle(QtGui.QApplication.translate("MainWindow", "Number of Graph Windows", None, QtGui.QApplication.UnicodeUTF8)) self.menuScroll.setTitle(QtGui.QApplication.translate("MainWindow", "Scroll", None, QtGui.QApplication.UnicodeUTF8)) self.menuROI.setTitle(QtGui.QApplication.translate("MainWindow", "ROI", None, QtGui.QApplication.UnicodeUTF8)) self.menuInsert_2.setTitle(QtGui.QApplication.translate("MainWindow", "Insert", None, QtGui.QApplication.UnicodeUTF8)) self.menuArrow.setTitle(QtGui.QApplication.translate("MainWindow", "Arrow", None, QtGui.QApplication.UnicodeUTF8)) self.menuInsert.setTitle(QtGui.QApplication.translate("MainWindow", "Insert", None, QtGui.QApplication.UnicodeUTF8)) self.menuBG_Fill.setTitle(QtGui.QApplication.translate("MainWindow", "BG Fill", None, QtGui.QApplication.UnicodeUTF8)) self.menuData.setTitle(QtGui.QApplication.translate("MainWindow", "Data", None, QtGui.QApplication.UnicodeUTF8)) self.actionFile.setText(QtGui.QApplication.translate("MainWindow", "Open", None, QtGui.QApplication.UnicodeUTF8)) self.action12.setText(QtGui.QApplication.translate("MainWindow", "12", None, QtGui.QApplication.UnicodeUTF8)) self.action1.setText(QtGui.QApplication.translate("MainWindow", "1", None, QtGui.QApplication.UnicodeUTF8)) self.action2.setText(QtGui.QApplication.translate("MainWindow", "2", None, QtGui.QApplication.UnicodeUTF8)) self.action3.setText(QtGui.QApplication.translate("MainWindow", "3", None, QtGui.QApplication.UnicodeUTF8)) self.action4.setText(QtGui.QApplication.translate("MainWindow", "4", None, QtGui.QApplication.UnicodeUTF8)) self.action5.setText(QtGui.QApplication.translate("MainWindow", "5", None, QtGui.QApplication.UnicodeUTF8)) self.action6.setText(QtGui.QApplication.translate("MainWindow", "6", None, QtGui.QApplication.UnicodeUTF8)) self.action7.setText(QtGui.QApplication.translate("MainWindow", "7", None, QtGui.QApplication.UnicodeUTF8)) self.action8.setText(QtGui.QApplication.translate("MainWindow", "8", None, QtGui.QApplication.UnicodeUTF8)) self.actionStart.setText(QtGui.QApplication.translate("MainWindow", "Start", None, QtGui.QApplication.UnicodeUTF8)) self.actionPause.setText(QtGui.QApplication.translate("MainWindow", "Pause", None, QtGui.QApplication.UnicodeUTF8)) self.actionResume.setText(QtGui.QApplication.translate("MainWindow", "Resume", None, QtGui.QApplication.UnicodeUTF8)) self.actionStop.setText(QtGui.QApplication.translate("MainWindow", "Stop", None, QtGui.QApplication.UnicodeUTF8)) self.actionSet_Scroll_Options.setText(QtGui.QApplication.translate("MainWindow", "Set Scroll Options", None, QtGui.QApplication.UnicodeUTF8)) self.actionArrow_1.setText(QtGui.QApplication.translate("MainWindow", "Arrow 1", None, QtGui.QApplication.UnicodeUTF8)) self.actionArrow_2.setText(QtGui.QApplication.translate("MainWindow", "Arrow 2", None, QtGui.QApplication.UnicodeUTF8)) self.actionLine.setText(QtGui.QApplication.translate("MainWindow", "Line", None, QtGui.QApplication.UnicodeUTF8)) self.actionRectangle.setText(QtGui.QApplication.translate("MainWindow", "Rectangle", None, QtGui.QApplication.UnicodeUTF8)) self.actionW.setText(QtGui.QApplication.translate("MainWindow", "W", None, QtGui.QApplication.UnicodeUTF8)) self.actionM.setText(QtGui.QApplication.translate("MainWindow", "M", None, QtGui.QApplication.UnicodeUTF8)) self.actionTriangle.setText(QtGui.QApplication.translate("MainWindow", "Triangle", None, QtGui.QApplication.UnicodeUTF8)) self.actionEllipse.setText(QtGui.QApplication.translate("MainWindow", "Ellipse", None, QtGui.QApplication.UnicodeUTF8)) self.actionRemove_All.setText(QtGui.QApplication.translate("MainWindow", "Remove All", None, QtGui.QApplication.UnicodeUTF8)) self.actionArrow_3.setText(QtGui.QApplication.translate("MainWindow", "Arrow 3", None, QtGui.QApplication.UnicodeUTF8)) self.actionArrow_4.setText(QtGui.QApplication.translate("MainWindow", "Arrow 4", None, QtGui.QApplication.UnicodeUTF8)) self.actionArrow_5.setText(QtGui.QApplication.translate("MainWindow", "Arrow 5", None, QtGui.QApplication.UnicodeUTF8)) self.actionArrow_6.setText(QtGui.QApplication.translate("MainWindow", "Arrow 6", None, QtGui.QApplication.UnicodeUTF8)) self.actionRemove_All_2.setText(QtGui.QApplication.translate("MainWindow", "Remove All", None, QtGui.QApplication.UnicodeUTF8)) self.actionSave.setText(QtGui.QApplication.translate("MainWindow", "Save", None, QtGui.QApplication.UnicodeUTF8)) self.actionSave_as.setText(QtGui.QApplication.translate("MainWindow", "Save as", None, QtGui.QApplication.UnicodeUTF8)) self.actionClose.setText(QtGui.QApplication.translate("MainWindow", "Close", None, QtGui.QApplication.UnicodeUTF8)) self.action1_2.setText(QtGui.QApplication.translate("MainWindow", "1", None, QtGui.QApplication.UnicodeUTF8)) self.action2_2.setText(QtGui.QApplication.translate("MainWindow", "2", None, QtGui.QApplication.UnicodeUTF8)) self.action3_2.setText(QtGui.QApplication.translate("MainWindow", "3", None, QtGui.QApplication.UnicodeUTF8)) self.action4_2.setText(QtGui.QApplication.translate("MainWindow", "4", None, QtGui.QApplication.UnicodeUTF8)) self.action5_2.setText(QtGui.QApplication.translate("MainWindow", "5", None, QtGui.QApplication.UnicodeUTF8)) self.action6_2.setText(QtGui.QApplication.translate("MainWindow", "6", None, QtGui.QApplication.UnicodeUTF8)) self.action7_2.setText(QtGui.QApplication.translate("MainWindow", "7", None, QtGui.QApplication.UnicodeUTF8)) self.action8_2.setText(QtGui.QApplication.translate("MainWindow", "8", None, QtGui.QApplication.UnicodeUTF8)) self.actionBG_Fill.setText(QtGui.QApplication.translate("MainWindow", "BG_Fill", None, QtGui.QApplication.UnicodeUTF8)) self.actionMax_Min.setText(QtGui.QApplication.translate("MainWindow", "Max_Min", None, QtGui.QApplication.UnicodeUTF8)) def setSize(self, MainWindow): # 저장된 설정 파일이 없을 때 최초로 ui 크기를 설정해 주는 함수 width = MainWindow.width() self.splitter_3.setSizes([width / 4, 3 * width / 4]) self.graphicsView_8.hide() self.graphicsView_7.hide() self.graphicsView_6.hide() self.graphicsView_5.hide() self.graphicsView_4.hide() self.graphicsView_3.hide() self.graphicsView_2.hide() def graphWindow(self, num): # 인자로 받는 num의 수만큼 그래프를 표시해주고 크기도 균등하게 나눔. self.num = num idx = 0 width = self.splitter_2.height() / num lst = [] for graph in reversed(self.plotwidget_lst): if num > idx: graph.show() lst.append(width) else: graph.hide() lst.append(0) idx += 1 lst.reverse() self.splitter_2.setSizes(lst) #특정한 파일이 열려있는지 정보를 저장 is_something_open = False def open(self): # 파일을 여는 함수. 확장자가 .csv이면 최초로 여는 것이고 .st이면 저장된 세팅을 불러와서 연다. self.fname = "" fname = QtGui.QFileDialog.getOpenFileName(None, 'Open file', '~/') name = fname.split("/") if name[len(name) - 1][-4:] == '.csv': if(self.is_something_open == True): self.close() self.is_something_open = False self.file_name = name[len(name) - 1] rd = pd.read_csv(str(fname), index_col=[0], header=None, names=['dt', 'value']) rd2 = pd.read_csv(str(fname), header=None, names=['dt', '']) self.times = [] self.lst = [] """ 시간 정보를 받아서 timestamp 형태로 변환 """ for dt in rd2.dt: try: t = time.strptime(dt, '%Y-%m-%d %H:%M:%S.%f') stamp = time.mktime(t) * 1000 + t.microsecond / 1000 except: stamp = time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S')) * 1000 self.times += [stamp] """ depth 정보를 리스트에 저장함. """ for val in rd.value: self.lst += [val] """ parameter를 초기화하고 widget에 추가해 줌. """ self.arrowParameter = ArrowParameter(name='Arrow') self.roiParameter = ROIParameter(name='ROI') self.parameter_1 = Parameter.create(name='Arrow', type='group', children=[self.roiParameter]) self.treeWidget.setParameters(self.parameter_1, showTop=False) self.parameter = Parameter.create(name='Arrow', type='group', children=[self.arrowParameter]) self.treeWidget_2.setParameters(self.parameter, showTop=False) self.graph = CustomGraph(self.lst, self.plotwidget_lst, self.times) #ROI Controller self.roic = ROIController(self) self.roi_setting_lst = [] #화살표 리스트 초기화 self.arrow_lst = [] self.arrow_setting_lst = [] #파일이 열려있다는 것을 알려줌 self.is_something_open = True elif name[len(name) - 1].split(".")[1] == "st": if(self.is_something_open == True): self.close() self.is_something_open = False self.fname = fname f = open(name[len(name) - 1], 'r') settings = pickle.load(f) f.close() self.file_name = (settings['file_name']) #Layout 설정 복구 self.splitter_3.setSizes(settings['main']) self.splitter.setSizes(settings['control']) self.graphWindow(settings['graph_num']) self.splitter_2.setSizes(settings['graph']) #graph_file = './' + settings['file_name'] rd = pd.read_csv(str(settings['file_name']), index_col=[0], header=None, names=['dt', 'value']) rd2 = pd.read_csv(str(settings['file_name']), header=None, names=['dt', '']) self.times = [] self.lst = [] # csv 파일 파싱 for dt in rd2.dt: try: t = time.strptime(dt, '%Y-%m-%d %H:%M:%S.%f') stamp = time.mktime(t) * 1000 + t.microsecond / 1000 except: stamp = time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S')) * 1000 self.times += [stamp] for val in rd.value: self.lst += [val] #화살표 리스트 초기화 self.arrow_lst = [] self.arrow_setting_lst = [] self.arrowParameter = ArrowParameter(name='Arrow') self.parameter = Parameter.create(name='Arrow', type='group', children=[self.arrowParameter]) self.treeWidget_2.setParameters(self.parameter, showTop=False) self.roiParameter = ROIParameter(name='ROI') self.parameter_1 = Parameter.create(name='Arrow', type='group', children=[self.roiParameter]) self.treeWidget.setParameters(self.parameter_1, showTop=False) self.parameter = Parameter.create(name='Arrow', type='group', children=[self.arrowParameter]) self.treeWidget_2.setParameters(self.parameter, showTop=False) self.graph = CustomGraph(self.lst, self.plotwidget_lst, self.times) self.graph.restoreRegion(settings['region_width']) """ 화살표 복구 """ for arrow in settings['arrow']: x = arrow['x'] y = arrow['y'] num = arrow['num'] arrow_type = arrow['type'] self.arrowRestore(x, y, num, arrow_type) #ROI Controller self.roic = ROIController(self) self.roi_setting_lst = [] # ROI Restore for roi in settings['roi']: if roi == None: continue coor = roi['coor'] num = roi['num'] shape = roi['shape'] self.restoreROI(coor, num, shape) #파일이 열려있다는 것을 알려줌 self.is_something_open = True def save_setting(self): # 화면 Layout을 저장한다. 표시되는 그래프의 수 및 각 layout의 크기를 저장. main_setting = self.splitter_3.sizes() control_setting = self.splitter.sizes() graph_setting = self.splitter_2.sizes() graph_num = 0 for graph in graph_setting: if graph != 0: graph_num += 1 settings = {'main': main_setting, 'control': control_setting, 'graph': graph_setting, 'graph_num': graph_num} f = open('setting', 'w+') pickle.dump(settings, f) f.close() def save(self): # 저장해야 될 정보를 저장하는 함수. pickle을 이용해서 저장한다. if self.fname is not "": pass else: self.fname = QtGui.QFileDialog.getSaveFileName(None, 'Save file', '~/') + ".st" name = self.fname.split("/") region_width_lst = [] # 파일 이름 및 Region 저장 for region in self.graph.region_lst: region_width_lst.append(region.getRegion()) main_setting = self.splitter_3.sizes() control_setting = self.splitter.sizes() graph_setting = self.splitter_2.sizes() graph_num = 0 for graph in graph_setting: if graph != 0: graph_num += 1 settings = {'file_name': self.file_name, 'region_width': region_width_lst, 'main': main_setting, 'control': control_setting, 'graph': graph_setting, 'graph_num': graph_num, 'arrow': self.arrow_setting_lst, 'roi': self.roi_setting_lst} f = open(name[len(name) - 1], 'w+') pickle.dump(settings, f) f.close() """ 최초로 save할 때와 같은 함수 내용을 사용한다. """ def save_as(self): self.fname = QtGui.QFileDialog.getSaveFileName(None, 'Save file As', '~/') + ".st" name = self.fname.split("/") region_width_lst = [] # 파일 이름 및 Region 저장 for region in self.graph.region_lst: region_width_lst.append(region.getRegion()) main_setting = self.splitter_3.sizes() control_setting = self.splitter.sizes() graph_setting = self.splitter_2.sizes() graph_num = 0 for graph in graph_setting: if graph != 0: graph_num += 1 settings = {'file_name': self.file_name, 'region_width': region_width_lst, 'main': main_setting, 'control': control_setting, 'graph': graph_setting, 'graph_num': graph_num, 'arrow': self.arrow_setting_lst, 'roi': self.roi_setting_lst} f = open(name[len(name) - 1], 'w+') pickle.dump(settings, f) f.close() """ 저장 파일의 이름을 초기화하고 widget에서 plot을 지우고 ROI와 Arrow Parameter를 지운다. """ def close(self): self.fname = "" for widget in self.plotwidget_lst: widget.clear() self.roic.clear() self.arrowParameter.remove() self.roiParameter.remove() self.is_something_open = False #최초에 프로그램을 열 때 호출되는 함수로, 저장된 layout설정 파일이 있으면 파일을 열어서 설정을 복구한다. def restore(self, MainWindow): try: f = open('setting', 'r') settings = pickle.load(f) self.splitter_3.setSizes(settings['main']) self.splitter.setSizes(settings['control']) self.graphWindow(settings['graph_num']) self.splitter_2.setSizes(settings['graph']) except IOError: self.setSize(MainWindow) self.graphWindow(1) """ 화살표 삽입 함수. 화살표 종류를 int 인자로 받아서 타입에 맞춰 적절한 화살표를 삽입한다. 가장 아래쪽에 있는 그래프의 가운데에 삽입하도록 되어있다. 각 graph widget에 삽입한 화살표를 리스트로 만들고 그 리스트를 다시 self.arrow_lst라는 리스트에 추가한다. 마지막으로 이 화살표에 해당하는 parameter를 추가한다. """ def insertArrow(self, arrow_type): arrow_lst = [] for widget in self.plotwidget_lst: if arrow_type == 1: arrow = pg.ArrowItem(angle=-120, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='b') elif arrow_type == 2: arrow = pg.ArrowItem(angle=-90, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='b') elif arrow_type == 3: arrow = pg.ArrowItem(angle=-60, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='b') elif arrow_type == 4: arrow = pg.ArrowItem(angle=-120, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='r') elif arrow_type == 5: arrow = pg.ArrowItem(angle=-90, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='r') else: arrow = pg.ArrowItem(angle=-60, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='r') x1, x2 = self.plotwidget_lst[7 - self.num + 1].getViewBox().viewRange()[0] x_pos = (x2 - x1) / 2 + x1 i = bisect_right(self.times, x_pos) arrow.setPos(self.times[i], self.lst[i]) widget.addItem(arrow) arrow_lst.append(arrow) self.arrow_lst.append(arrow_lst) num = self.arrowParameter.addArrow(datetime.fromtimestamp(x_pos / 1000).strftime('%y-%m-%d %H:%M:%S'), self.lst[i], arrow_type) self.arrow_setting_lst.append({'x': self.times[i], 'y': self.lst[i], 'num': num, 'type': arrow_type}) """ 저장된 화살표를 복구하기 위해 사용하는 함수 """ def arrowRestore(self, x, y, num, arrow_type): arrow_lst = [] for widget in self.plotwidget_lst: if arrow_type == 1: arrow = pg.ArrowItem(angle=-120, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='b') elif arrow_type == 2: arrow = pg.ArrowItem(angle=-90, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='b') elif arrow_type == 3: arrow = pg.ArrowItem(angle=-60, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='b') elif arrow_type == 4: arrow = pg.ArrowItem(angle=-120, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='r') elif arrow_type == 5: arrow = pg.ArrowItem(angle=-90, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='r') else: arrow = pg.ArrowItem(angle=-60, tipAngle=30, baseAngle=20, headLen=20, tailLen=20, tailWidth=10, brush='r') arrow.setPos(x, y) widget.addItem(arrow) arrow_lst.append(arrow) self.arrow_lst.append(arrow_lst) self.arrowParameter.restoreArrow(datetime.fromtimestamp(x / 1000).strftime('%y-%m-%d %H:%M:%S'), y, num, arrow_type) self.arrow_setting_lst.append({'x': x, 'y': y, 'num': num, 'type': arrow_type}) """ item으로 받은 화살표를 제거할 때에 사용된다. 그래프 상에서 제거할 뿐만 아니라 parameter에서 제거할 수 있도록 parameter의 제거 함수를 호출한다. """ def removeArrow(self, item): arrow_num = int(item.text(0).split("Arrow")[1]) i = 0 for arrow_setting in self.arrow_setting_lst: if arrow_setting['num'] == arrow_num: d = arrow_setting break i += 1 for (arrow, widget) in zip(self.arrow_lst[i], self.plotwidget_lst): widget.removeItem(arrow) self.arrow_setting_lst.remove(d) self.arrowParameter.removeArrow(item.text(0)) """ 모든 화살표를 제거한다. parameter도 함께 제거함. """ def removeArrowAll(self): for arrow_lst in self.arrow_lst: for (arrow, widget) in zip(arrow_lst, self.plotwidget_lst): widget.removeItem(arrow) self.arrow_lst = [] self.arrow_setting_lst = [] self.arrowParameter.removeArrowAll() timer = 0 #스크롤이 현재 진행되고 있는지 저장 scroll_active = False #이벤트 함수 호출을 위한 타이머 오브젝트 저장공간 timer = 0 #1초당 움직이는 범위 velocity = 10 #스크롤 할 그래프의 레벨 scroll_level = 1 #스크롤 하면서 움직일 애로우 오브젝트 저장공간 curve_arrow = 0 def scrollEvent(self): """ 자동스크롤 시 타이머에 의해 호출되어 그래프를 스크롤한다 """ cont = self.graph.scroll(self.plotwidget_lst[8 - self.scroll_level], self.scroll_level, self.velocity, self.curve_arrow) #자동스크롤 시 화면 범위를 넘어가면 콘솔에 메세지를 출력하고 스크롤이 중단함 if cont == False: print('Out of Bonud!') self.pauseScroll() def startScroll(self): """ 자동스크롤을 시작한다 """ #스크롤이 Stop상태가 아니면 동작하지 않음 if(self.timer != 0): return #CurveArrow의 위치를 계산 cur_viewrange = self.plotwidget_lst[8 - self.scroll_level].getViewBox().viewRange()[0] cur_region = self.graph.region_lst[8 - self.scroll_level].getRegion() cur_region_mid = (cur_region[0] + cur_region[1]) / 2 cur_index = bisect_left(self.graph.times, cur_region_mid) #CurveArrow를 추가해줌 self.curve_arrow = pg.CurveArrow(self.plotwidget_lst[8 - self.scroll_level].getPlotItem().listDataItems()[0], index=cur_index) self.plotwidget_lst[8 - self.scroll_level].addItem(self.curve_arrow) #타이머 오브젝트 생성 self.timer = QtCore.QTimer() self.timer.timeout.connect(self.scrollEvent) self.scroll_active = True self.timer.start(250) def pauseScroll(self): """ 자동스크롤을 일시정지시킨다 """ try: #현재 스크롤 하고 있지 않으면 아무일도 하지 않음 if(self.scroll_active != True): return self.scroll_active = False #타이머를 일시 정지시킴 self.timer.stop() except: print('Error!') def resumeScroll(self): """ 일시정지 되어있던 자동스크롤을 다시 시작한다 """ try: #현재 스크롤이 멈춰있지 않으면 아무일도 하지 않음 if(self.scroll_active != False): return self.timer.start(250) self.scroll_active = True except: print('Error!') def stopScroll(self): """ 자동 스크롤을 완전히 멈춘다 """ try: #timer 오브젝트 제거 del self.timer self.timer = 0 #CurveArrow제거 self.plotwidget_lst[8 - self.scroll_level].removeItem(self.curve_arrow) del self.curve_arrow self.curve_arrow = 0 self.scroll_active = False except: print('Error!') def optionScroll(self): """ 스크롤 팝업창을 띄운다. """ self.w = ScrollPopup(self) #self.w.setGeometry(QtCore.QRect(100, 100, 400, 400)) #self.w.show() def parameterScroll(self, param_name): """ 더블클릭한 Arrow나 ROI로 리젼을 이동한다 """ if param_name.contains('Arrow'): arrow = True num = param_name.split('Arrow')[1] else: arrow = False num = param_name.split('ROI')[1] if arrow: for arrow_setting in self.arrow_setting_lst: if arrow_setting['num'] == int(num): self.graph.parameterScroll(arrow_setting['x'], self.plotwidget_lst) else: for roi_setting in self.roi_setting_lst: if roi_setting == None: continue elif roi_setting['num'] == int(num): ((x1, _), (x2, _)) = roi_setting['coor'] self.graph.parameterScroll((x1 + x2) / 2, self.plotwidget_lst) """ 지정된 영역에 대해 배경색을 변경하도록 한다. 시작 일시와 종료 일시 모두 현 그래프의 시작점으로 맞춰준다. """ def bg_fill(self): self.bg = BG_Popup.BGFill_Dialog(self.times[0]) value = self.bg.activate() if len(self.bg_rect_lst) != 0: for (rect, widget) in zip(self.bg_rect_lst, self.plotwidget_lst): widget.removeItem(rect) self.bg_rect_lst = [] start = value['start'] end = value['end'] start_stamp = time.mktime(datetime(start['year'], start['month'], start['day'], start['time'].hour(), start['time'].minute(), start['time'].second()).timetuple()) * 1000 end_stamp = time.mktime(datetime(end['year'], end['month'], end['day'], end['time'].hour(), end['time'].minute(), end['time'].second()).timetuple()) * 1000 for widget in self.plotwidget_lst: rect = pg.QtGui.QGraphicsRectItem(start_stamp, -10000, end_stamp - start_stamp, 20000) rect.setBrush(pg.mkBrush('#C9BB89')) rect.setZValue(-1000) widget.addItem(rect) self.bg_rect_lst.append(rect) """ Max와 Min을 보여주는 기능. 그래프 별로 보이는 영역의 범위를 얻어온 뒤 그 안에 해당하는 y축 값들에서 최대 최소인 값을 찾아낸 뒤 팝업에 넘겨준다. """ def data_stat(self): max_lst = [] min_lst = [] self.plotwidget_lst.reverse() for widget in self.plotwidget_lst[0:self.num]: x1, x2 = widget.getViewBox().viewRange()[0] x_start = bisect_right(self.times, x1) x_end = bisect_left(self.times, x2) if x_start < x_end: max_lst.append(max(self.lst[x_start:x_end])) min_lst.append(min(self.lst[x_start:x_end])) else: max_lst.append('empty') min_lst.append('empty') self.plotwidget_lst.reverse() values = {'max': max_lst, 'min': min_lst} ds = Data_Popup.DataStat_Dialog(values) # ROI def dragev(self, ev, i, shape): '''ROI를 삽입할 때의 마우스 드래그 이벤트 관리 함수이다. 마우스로 드래그한 영역의 좌표를 계산하여, 이를 바탕으로 ROI를 삽입한다''' ev.accept() vb = self.plotwidget_lst[i].getViewBox() pos = ev.pos() if self.roi_loc == 1 and ev.button() == QtCore.Qt.LeftButton: if ev.isFinish(): vb.rbScaleBox.hide() # set region _, _, xax, yax = vb.rect().getCoords() x1, x2 = self.plotwidget_lst[i].getViewBox().viewRange()[0] y1, y2 = self.plotwidget_lst[i].getViewBox().viewRange()[1] p1, p2 = ev.buttonDownPos(ev.button()), pos xlen, ylen = x2 - x1, y2 - y1 fx1 = x1 + xlen * p1.x() / xax fy1 = y1 + ylen * (yax - p1.y()) / yax fx2 = x1 + xlen * p2.x() / xax fy2 = y1 + ylen * (yax - p2.y()) / yax # make ROI self.roic.setROI(shape, ((fx1, fy1), (fx2, fy2))) self.roi_loc = 0 num = self.roiParameter.addROI(datetime.fromtimestamp((fx1 + fx2) / 2000).strftime('%y-%m-%d %H:%M:%S'), shape) self.roi_setting_lst.append({'coor': ((fx1, fy1), (fx2, fy2)), 'num': num, 'shape': shape}) else: vb.updateScaleBox(ev.buttonDownPos(), ev.pos()) else: pg.ViewBox.mouseDragEvent(vb, ev) def setROI(self, shape): '''드래그로 범위 지정을 하기위해 위젯 뷰의 마우스 이벤트를 조작한다.''' self.roi_loc = 1 self.plotwidget_lst[0].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 0, shape)) self.plotwidget_lst[1].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 1, shape)) self.plotwidget_lst[2].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 2, shape)) self.plotwidget_lst[3].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 3, shape)) self.plotwidget_lst[4].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 4, shape)) self.plotwidget_lst[5].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 5, shape)) self.plotwidget_lst[6].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 6, shape)) self.plotwidget_lst[7].getViewBox().mouseDragEvent = (lambda ev: self.dragev(ev, 7, shape)) def restoreROI(self, coor, num, shape): '''OPEN 시에 ROI를 복구하는 메서드이다''' (x1, _), (x2, _) = coor self.roic.setROI(shape, coor) self.roiParameter.restoreROI(datetime.fromtimestamp((x1 + x2) / 2000).strftime('%y-%m-%d %H:%M:%S'), num, shape) self.roi_setting_lst.append({'coor': coor, 'num': num, 'shape': shape}) def removeROIByObj(self, roi): '''ROI 오브젝트를 인자로 받아 해당 ROI를 제거한다''' roi_num = 0 for rois in self.roic.getROIList(): if rois == None: continue else: found = False for aroi in rois: if aroi == roi: found = True break if found: break roi_num += 1 for i in xrange(len(self.roi_setting_lst)): if self.roi_setting_lst[i] == None: continue elif self.roi_setting_lst[i]['num'] == roi_num: self.roi_setting_lst[i] = None self.roic.removeROI(i) break self.roiParameter.removeROI("ROI" + str(roi_num)) def removeROIByItem(self, item): '''Parameter의 ROI 아이템을 인자로 받아 해당 ROI를 제거하는 메서드''' roi_num = int(item.text(0).split("ROI")[1]) for i in xrange(len(self.roi_setting_lst)): if self.roi_setting_lst[i] == None: continue elif self.roi_setting_lst[i]['num'] == roi_num: self.roi_setting_lst[i] = None self.roic.removeROI(i) break self.roiParameter.removeROI(item.text(0)) def removeROIAll(self): self.roic.removeAll() self.roiParameter.removeROIAll()
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(1366, 713) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.tabWidget = QtGui.QTabWidget(self.centralwidget) self.tabWidget.setGeometry(QtCore.QRect(0, 0, 1361, 691)) self.tabWidget.setObjectName(_fromUtf8("tabWidget")) self.Spectra = QtGui.QWidget() self.Spectra.setObjectName(_fromUtf8("Spectra")) self.layoutWidget = QtGui.QWidget(self.Spectra) self.layoutWidget.setGeometry(QtCore.QRect(4, 5, 1343, 623)) self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) self.gridLayout_8 = QtGui.QGridLayout(self.layoutWidget) self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) self.gridLayout_3 = QtGui.QGridLayout() self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.frame = QtGui.QFrame(self.layoutWidget) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.frame.sizePolicy().hasHeightForWidth()) self.frame.setSizePolicy(sizePolicy) self.frame.setMinimumSize(QtCore.QSize(428, 114)) self.frame.setMaximumSize(QtCore.QSize(428, 114)) self.frame.setFrameShape(QtGui.QFrame.StyledPanel) self.frame.setFrameShadow(QtGui.QFrame.Raised) self.frame.setObjectName(_fromUtf8("frame")) self.gridLayout = QtGui.QGridLayout(self.frame) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label = QtGui.QLabel(self.frame) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 0, 0, 1, 2) self.label_2 = QtGui.QLabel(self.frame) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label_2.setFont(font) self.label_2.setAlignment(QtCore.Qt.AlignCenter) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 3, 1, 3) self.checkBoxinf_1 = QtGui.QCheckBox(self.frame) self.checkBoxinf_1.setChecked(False) self.checkBoxinf_1.setAutoExclusive(False) self.checkBoxinf_1.setObjectName(_fromUtf8("checkBoxinf_1")) self.gridLayout.addWidget(self.checkBoxinf_1, 1, 0, 1, 2) self.radioButtoncomma_1 = QtGui.QRadioButton(self.frame) self.radioButtoncomma_1.setChecked(True) self.radioButtoncomma_1.setObjectName(_fromUtf8("radioButtoncomma_1")) self.gridLayout.addWidget(self.radioButtoncomma_1, 1, 2, 1, 2) self.radioButtonspace_1 = QtGui.QRadioButton(self.frame) self.radioButtonspace_1.setObjectName(_fromUtf8("radioButtonspace_1")) self.gridLayout.addWidget(self.radioButtonspace_1, 1, 4, 1, 2) self.radioButtoncolon_1 = QtGui.QRadioButton(self.frame) self.radioButtoncolon_1.setObjectName(_fromUtf8("radioButtoncolon_1")) self.gridLayout.addWidget(self.radioButtoncolon_1, 1, 6, 1, 1) self.checkBoxspectra_1 = QtGui.QCheckBox(self.frame) self.checkBoxspectra_1.setObjectName(_fromUtf8("checkBoxspectra_1")) self.gridLayout.addWidget(self.checkBoxspectra_1, 2, 0, 1, 2) spacerItem = QtGui.QSpacerItem(20, 28, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem, 2, 2, 1, 1) spacerItem1 = QtGui.QSpacerItem(20, 28, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem1, 2, 4, 1, 1) self.openButton_1 = QtGui.QPushButton(self.frame) self.openButton_1.setObjectName(_fromUtf8("openButton_1")) self.gridLayout.addWidget(self.openButton_1, 3, 0, 1, 1) self.calculateButton_1 = QtGui.QPushButton(self.frame) self.calculateButton_1.setObjectName(_fromUtf8("calculateButton_1")) self.gridLayout.addWidget(self.calculateButton_1, 3, 1, 1, 4) self.saveButton_1 = QtGui.QPushButton(self.frame) self.saveButton_1.setObjectName(_fromUtf8("saveButton_1")) self.gridLayout.addWidget(self.saveButton_1, 3, 5, 1, 3) spacerItem2 = QtGui.QSpacerItem(20, 28, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem2, 2, 5, 1, 1) spacerItem3 = QtGui.QSpacerItem(38, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem3, 1, 7, 2, 1) self.gridLayout_3.addWidget(self.frame, 0, 0, 1, 1) spacerItem4 = QtGui.QSpacerItem(888, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout_3.addItem(spacerItem4, 0, 1, 1, 1) self.gridLayout_8.addLayout(self.gridLayout_3, 0, 0, 1, 1) self.frame_2 = QtGui.QFrame(self.layoutWidget) self.frame_2.setMinimumSize(QtCore.QSize(1341, 501)) self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel) self.frame_2.setFrameShadow(QtGui.QFrame.Raised) self.frame_2.setObjectName(_fromUtf8("frame_2")) self.gridLayout_2 = QtGui.QGridLayout(self.frame_2) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.Plot1_1 = PlotWidget(self.frame_2) self.Plot1_1.setObjectName(_fromUtf8("Plot1_1")) self.gridLayout_2.addWidget(self.Plot1_1, 0, 0, 1, 1) self.Plot2_1 = PlotWidget(self.frame_2) self.Plot2_1.setObjectName(_fromUtf8("Plot2_1")) self.gridLayout_2.addWidget(self.Plot2_1, 0, 1, 1, 1) self.gridLayout_8.addWidget(self.frame_2, 1, 0, 1, 1) self.tabWidget.addTab(self.Spectra, _fromUtf8("")) self.Spectra_analysis = QtGui.QWidget() self.Spectra_analysis.setObjectName(_fromUtf8("Spectra_analysis")) self.layoutWidget1 = QtGui.QWidget(self.Spectra_analysis) self.layoutWidget1.setGeometry(QtCore.QRect(10, 13, 1337, 611)) self.layoutWidget1.setObjectName(_fromUtf8("layoutWidget1")) self.gridLayout_7 = QtGui.QGridLayout(self.layoutWidget1) self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) self.gridLayout_6 = QtGui.QGridLayout() self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.frame_4 = QtGui.QFrame(self.layoutWidget1) self.frame_4.setMinimumSize(QtCore.QSize(351, 61)) self.frame_4.setMaximumSize(QtCore.QSize(351, 61)) self.frame_4.setFrameShape(QtGui.QFrame.StyledPanel) self.frame_4.setFrameShadow(QtGui.QFrame.Raised) self.frame_4.setObjectName(_fromUtf8("frame_4")) self.pushButtonImport_2 = QtGui.QPushButton(self.frame_4) self.pushButtonImport_2.setGeometry(QtCore.QRect(10, 10, 111, 24)) self.pushButtonImport_2.setAutoFillBackground(False) self.pushButtonImport_2.setObjectName(_fromUtf8("pushButtonImport_2")) self.radioButtonFrmclc_2 = QtGui.QRadioButton(self.frame_4) self.radioButtonFrmclc_2.setGeometry(QtCore.QRect(120, 10, 131, 21)) self.radioButtonFrmclc_2.setChecked(True) self.radioButtonFrmclc_2.setObjectName( _fromUtf8("radioButtonFrmclc_2")) self.radioButtonFrmcsv_2 = QtGui.QRadioButton(self.frame_4) self.radioButtonFrmcsv_2.setGeometry(QtCore.QRect(120, 30, 97, 21)) self.radioButtonFrmcsv_2.setObjectName( _fromUtf8("radioButtonFrmcsv_2")) self.pushButtonSave_2 = QtGui.QPushButton(self.frame_4) self.pushButtonSave_2.setGeometry(QtCore.QRect(250, 10, 94, 24)) self.pushButtonSave_2.setObjectName(_fromUtf8("pushButtonSave_2")) self.pushButtonReset_2 = QtGui.QPushButton(self.frame_4) self.pushButtonReset_2.setGeometry(QtCore.QRect(250, 30, 94, 24)) self.pushButtonReset_2.setObjectName(_fromUtf8("pushButtonReset_2")) self.gridLayout_6.addWidget(self.frame_4, 0, 0, 1, 1) spacerItem5 = QtGui.QSpacerItem(978, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout_6.addItem(spacerItem5, 0, 1, 1, 1) self.gridLayout_7.addLayout(self.gridLayout_6, 0, 0, 1, 1) self.frame_3 = QtGui.QFrame(self.layoutWidget1) self.frame_3.setMinimumSize(QtCore.QSize(1335, 542)) self.frame_3.setFrameShape(QtGui.QFrame.StyledPanel) self.frame_3.setFrameShadow(QtGui.QFrame.Raised) self.frame_3.setObjectName(_fromUtf8("frame_3")) self.gridLayout_5 = QtGui.QGridLayout(self.frame_3) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.Plot1_2 = PlotWidget(self.frame_3) self.Plot1_2.setMinimumSize(QtCore.QSize(1258, 528)) self.Plot1_2.setMouseTracking(False) self.Plot1_2.setObjectName(_fromUtf8("Plot1_2")) self.gridLayout_5.addWidget(self.Plot1_2, 0, 0, 1, 1) self.gridLayout_7.addWidget(self.frame_3, 1, 0, 1, 1) self.tabWidget.addTab(self.Spectra_analysis, _fromUtf8("")) self.Results = QtGui.QWidget() self.Results.setObjectName(_fromUtf8("Results")) self.graphicsView = QtGui.QGraphicsView(self.Results) self.graphicsView.setGeometry(QtCore.QRect(490, 10, 851, 641)) self.graphicsView.setObjectName(_fromUtf8("graphicsView")) self.tableWidget = QtGui.QTableWidget(self.Results) self.tableWidget.setGeometry(QtCore.QRect(10, 10, 471, 641)) self.tableWidget.setColumnCount(3) self.tableWidget.setObjectName(_fromUtf8("tableWidget")) self.tableWidget.setRowCount(0) item = QtGui.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0, item) item = QtGui.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(1, item) item = QtGui.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(2, item) self.tableWidget.horizontalHeader().setCascadingSectionResizes(True) self.tableWidget.horizontalHeader().setDefaultSectionSize(155) self.tableWidget.horizontalHeader().setMinimumSectionSize(100) self.tableWidget.horizontalHeader().setStretchLastSection(True) self.tabWidget.addTab(self.Results, _fromUtf8("")) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle( _translate("MainWindow", "FT-I.R. Analysis Tool", None)) self.label.setText( _translate("MainWindow", "Select Source Data Type:", None)) self.label_2.setText(_translate("MainWindow", "Csv Delimiter:", None)) self.checkBoxinf_1.setText( _translate("MainWindow", "Spectra to Interferogram", None)) self.radioButtoncomma_1.setText( _translate("MainWindow", "Comma ", None)) self.radioButtonspace_1.setText(_translate("MainWindow", "Space", None)) self.radioButtoncolon_1.setText(_translate("MainWindow", "Colon", None)) self.checkBoxspectra_1.setText( _translate("MainWindow", "Interferrogram to Spectra", None)) self.openButton_1.setText( _translate("MainWindow", "Open csv Source File", None)) self.calculateButton_1.setText( _translate("MainWindow", "Calculate", None)) self.saveButton_1.setText(_translate("MainWindow", "Save Result", None)) self.tabWidget.setTabText( self.tabWidget.indexOf(self.Spectra), _translate("MainWindow", "Spectra Calculations", None)) self.pushButtonImport_2.setText( _translate("MainWindow", "Import Data", None)) self.radioButtonFrmclc_2.setText( _translate("MainWindow", "From Calculation", None)) self.radioButtonFrmcsv_2.setText( _translate("MainWindow", "From Csv", None)) self.pushButtonSave_2.setText( _translate("MainWindow", "Save Result", None)) self.pushButtonReset_2.setText(_translate("MainWindow", "Reset", None)) self.tabWidget.setTabText( self.tabWidget.indexOf(self.Spectra_analysis), _translate("MainWindow", "Peak Picking Tool", None)) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Wavenumber(1/cm)", None)) item = self.tableWidget.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "Relative Intensity", None)) item = self.tableWidget.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Zone", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.Results), _translate("MainWindow", "Results", None)) # hide unused components temporararily self.Plot1_1.clear() self.Plot2_1.clear() self.Plot1_1.hide() self.Plot2_1.hide() self.Plot1_2.hide() self.tabWidget.setTabEnabled(2, False) self.radioButtonFrmclc_2.setEnabled(False) self.pushButtonSave_2.setEnabled(False)
class Ui_MainWindow(QtGui.QMainWindow): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(846, 718) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.resume = QtWidgets.QPushButton(self.centralwidget) font = QtGui.QFont() font.setFamily("Yu Gothic UI") font.setPointSize(11) font.setBold(True) font.setWeight(75) self.resume.setFont(font) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("icons8-play-button-circled-96.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.resume.setIcon(icon) self.resume.setIconSize(QtCore.QSize(50, 50)) self.resume.setObjectName("resume") self.horizontalLayout.addWidget(self.resume) self.pause = QtWidgets.QPushButton(self.centralwidget) font = QtGui.QFont() font.setFamily("Yu Gothic UI") font.setPointSize(11) font.setBold(True) font.setWeight(75) self.pause.setFont(font) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("icons8-pause-squared-96.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pause.setIcon(icon1) self.pause.setIconSize(QtCore.QSize(50, 50)) self.pause.setObjectName("pause") self.horizontalLayout.addWidget(self.pause) self.clear = QtWidgets.QPushButton(self.centralwidget) font = QtGui.QFont() font.setFamily("Yu Gothic UI") font.setPointSize(11) font.setBold(True) font.setWeight(75) self.clear.setFont(font) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("icons8-erase-128xxx.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.clear.setIcon(icon2) self.clear.setIconSize(QtCore.QSize(50, 50)) self.clear.setObjectName("clear") self.horizontalLayout.addWidget(self.clear) self.verticalLayout.addLayout(self.horizontalLayout) self.show_ch1 = QtWidgets.QCheckBox(self.centralwidget) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.show_ch1.setFont(font) self.show_ch1.setObjectName("show_ch1") self.verticalLayout.addWidget(self.show_ch1) self.graphicsView = PlotWidget(self.centralwidget) self.graphicsView.setObjectName("graphicsView") self.verticalLayout.addWidget(self.graphicsView) self.graphicsView.plotItem.showGrid(x=True, y=True) self.graphicsView.plotItem.setMenuEnabled(False) self.graphicsView.plotItem.setLimits(xMin=0, xMax=15, yMin=-0.7, yMax=0.7) self.show_ch2 = QtWidgets.QCheckBox(self.centralwidget) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.show_ch2.setFont(font) self.show_ch2.setObjectName("show_ch2") self.verticalLayout.addWidget(self.show_ch2) self.graphicsView_2 = PlotWidget(self.centralwidget) self.graphicsView_2.setObjectName("graphicsView_2") self.verticalLayout.addWidget(self.graphicsView_2) self.graphicsView_2.plotItem.showGrid(x=True, y=True) self.graphicsView_2.plotItem.setMenuEnabled(False) self.show_cch3 = QtWidgets.QCheckBox(self.centralwidget) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.show_cch3.setFont(font) self.show_cch3.setObjectName("show_cch3") self.verticalLayout.addWidget(self.show_cch3) self.graphicsView_3 = PlotWidget(self.centralwidget) self.graphicsView_3.setObjectName("graphicsView_3") self.verticalLayout.addWidget(self.graphicsView_3) self.graphicsView_3.plotItem.showGrid(x=True, y=True) self.graphicsView_3.plotItem.setMenuEnabled(False) self.show_ch4 = QtWidgets.QCheckBox(self.centralwidget) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.show_ch4.setFont(font) self.show_ch4.setObjectName("show_ch4") self.verticalLayout.addWidget(self.show_ch4) self.graphicsView_4 = PlotWidget(self.centralwidget) self.graphicsView_4.setObjectName("graphicsView_4") self.verticalLayout.addWidget(self.graphicsView_4) self.graphicsView_4.plotItem.showGrid(x=True, y=True) self.graphicsView_4.plotItem.setMenuEnabled(False) self.show_ch5 = QtWidgets.QCheckBox(self.centralwidget) font = QtGui.QFont() font.setPointSize(8) font.setBold(True) font.setWeight(75) self.show_ch5.setFont(font) self.show_ch5.setObjectName("show_ch5") self.verticalLayout.addWidget(self.show_ch5) self.graphicsView_5 = PlotWidget(self.centralwidget) self.graphicsView_5.setObjectName("graphicsView_5") self.verticalLayout.addWidget(self.graphicsView_5) self.graphicsView_5.plotItem.showGrid(x=True, y=True) self.graphicsView_5.plotItem.setMenuEnabled(False) self.label = QtWidgets.QLabel(self.centralwidget) font = QtGui.QFont() font.setBold(True) font.setWeight(75) self.label.setFont(font) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.verticalLayout_2.addLayout(self.verticalLayout) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 846, 25)) self.menubar.setObjectName("menubar") self.menuchannel_1 = QtWidgets.QMenu(self.menubar) self.menuchannel_1.setObjectName("menuchannel_1") self.menuchannel_2 = QtWidgets.QMenu(self.menubar) self.menuchannel_2.setObjectName("menuchannel_2") self.menuchannel_3 = QtWidgets.QMenu(self.menubar) self.menuchannel_3.setObjectName("menuchannel_3") self.menuchannel_4 = QtWidgets.QMenu(self.menubar) self.menuchannel_4.setObjectName("menuchannel_4") self.menuchannel_5 = QtWidgets.QMenu(self.menubar) self.menuchannel_5.setObjectName("menuchannel_5") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.open_ch1 = QtWidgets.QAction(MainWindow) self.open_ch1.setObjectName("open_ch1") self.open_ch2 = QtWidgets.QAction(MainWindow) self.open_ch2.setObjectName("open_ch2") self.open_ch3 = QtWidgets.QAction(MainWindow) self.open_ch3.setObjectName("open_ch3") self.open_ch4 = QtWidgets.QAction(MainWindow) self.open_ch4.setObjectName("open_ch4") self.open_ch5 = QtWidgets.QAction(MainWindow) self.open_ch5.setObjectName("open_ch5") self.menuchannel_1.addAction(self.open_ch1) self.menuchannel_2.addAction(self.open_ch2) self.menuchannel_3.addAction(self.open_ch3) self.menuchannel_4.addAction(self.open_ch4) self.menuchannel_5.addAction(self.open_ch5) self.menubar.addAction(self.menuchannel_1.menuAction()) self.menubar.addAction(self.menuchannel_2.menuAction()) self.menubar.addAction(self.menuchannel_3.menuAction()) self.menubar.addAction(self.menuchannel_4.menuAction()) self.menubar.addAction(self.menuchannel_5.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) #creating timers self.timer1 = QtCore.QTimer() self.timer2 = QtCore.QTimer() self.timer3 = QtCore.QTimer() self.timer4 = QtCore.QTimer() self.timer5 = QtCore.QTimer() #events self.open_ch1.triggered.connect(lambda: self.load1()) self.open_ch2.triggered.connect(lambda: self.load2()) self.open_ch3.triggered.connect(lambda: self.load3()) self.open_ch4.triggered.connect(lambda: self.load4()) self.open_ch5.triggered.connect(lambda: self.load5()) self.pause.clicked.connect(lambda: self.pause_all()) self.resume.clicked.connect(lambda: self.resume_all()) self.clear.clicked.connect(lambda: self.clear_all()) self.show_ch1.stateChanged.connect(lambda: self.hide1()) self.show_ch2.stateChanged.connect(lambda: self.hide2()) self.show_cch3.stateChanged.connect(lambda: self.hide3()) self.show_ch4.stateChanged.connect(lambda: self.hide4()) self.show_ch5.stateChanged.connect(lambda: self.hide5()) def hide1(self): if (self.show_ch1.isChecked()): self.graphicsView.hide() else: self.graphicsView.show() def hide2(self): if (self.show_ch2.isChecked()): self.graphicsView_2.hide() else: self.graphicsView_2.show() def hide3(self): if (self.show_cch3.isChecked()): self.graphicsView_3.hide() else: self.graphicsView_3.show() def hide4(self): if (self.show_ch4.isChecked()): self.graphicsView_4.hide() else: self.graphicsView_4.show() def hide5(self): if (self.show_ch5.isChecked()): self.graphicsView_5.hide() else: self.graphicsView_5.show() def pause_all(self): self.timer1.stop() self.timer2.stop() self.timer3.stop() self.timer4.stop() self.timer5.stop() def resume_all(self): self.timer1.start() self.timer2.start() self.timer3.start() self.timer4.start() self.timer5.start() def clear_all(self): self.graphicsView.clear() self.graphicsView_2.clear() self.graphicsView_3.clear() self.graphicsView_4.clear() self.graphicsView_5.clear() self.pause_all() def read_file1(self): self.fname1 = QtGui.QFileDialog.getOpenFileName( self, 'Open only txt or CSV or xls', os.getenv('HOME'), "csv(*.csv);; text(*.txt) ;; xls(*.xls)") path = self.fname1[0] #self.name1= self.fname1 if pathlib.Path(path).suffix == ".txt": self.data1 = np.genfromtxt(path, delimiter=',') self.x1 = self.data1[:, 0] self.y1 = self.data1[:, 1] self.x1 = list(self.x1[:]) self.y1 = list(self.y1[:]) elif pathlib.Path(path).suffix == ".csv": self.data1 = np.genfromtxt(path, delimiter=' ') self.x1 = self.data1[:, 0] self.y1 = self.data1[:, 1] self.x1 = list(self.x1[:]) self.y1 = list(self.y1[:]) elif pathlib.Path(path).suffix == ".xls": self.data1 = np.genfromtxt(path, delimiter=',') self.x1 = self.data1[:, 0] self.y1 = self.data1[:, 1] self.x1 = list(self.x1[:]) self.y1 = list(self.y1[:]) def read_file2(self): fname = QtGui.QFileDialog.getOpenFileName( self, 'Open only txt or CSV or xls', os.getenv('HOME'), "csv(*.csv);; text(*.txt) ;; xls(*.xls)") path = fname[0] if pathlib.Path(path).suffix == ".txt": self.data2 = np.genfromtxt(path, delimiter=',') self.x2 = self.data2[:, 0] self.y2 = self.data2[:, 1] self.x2 = list(self.x2[:]) self.y2 = list(self.y2[:]) elif pathlib.Path(path).suffix == ".csv": self.data2 = np.genfromtxt(path, delimiter=' ') self.x2 = self.data2[:, 0] self.y2 = self.data2[:, 1] self.x2 = list(self.x2[:]) self.y2 = list(self.y2[:]) elif pathlib.Path(path).suffix == ".xls": self.data2 = np.genfromtxt(path, delimiter=',') self.x2 = self.data2[:, 0] self.y2 = self.data2[:, 1] self.x2 = list(self.x2[:]) self.y2 = list(self.y2[:]) def read_file3(self): fname = QtGui.QFileDialog.getOpenFileName( self, 'Open only txt or CSV or xls', os.getenv('HOME'), "csv(*.csv);; text(*.txt) ;; xls(*.xls)") path = fname[0] if pathlib.Path(path).suffix == ".txt": self.data3 = np.genfromtxt(path, delimiter=',') self.x3 = self.data3[:, 0] self.y3 = self.data3[:, 1] self.x3 = list(self.x3[:]) self.y3 = list(self.y3[:]) elif pathlib.Path(path).suffix == ".csv": self.data3 = np.genfromtxt(path, delimiter=' ') self.x3 = self.data3[:, 0] self.y3 = self.data3[:, 1] self.x3 = list(self.x3[:]) self.y3 = list(self.y3[:]) elif pathlib.Path(path).suffix == ".xls": self.data3 = np.genfromtxt(path, delimiter=',') self.x3 = self.data3[:, 0] self.y3 = self.data3[:, 1] self.x3 = list(self.x3[:]) self.y3 = list(self.y3[:]) def read_file4(self): fname = QtGui.QFileDialog.getOpenFileName( self, 'Open only txt or CSV or xls', os.getenv('HOME'), "csv(*.csv);; text(*.txt) ;; xls(*.xls)") path = fname[0] if pathlib.Path(path).suffix == ".txt": self.data4 = np.genfromtxt(path, delimiter=',') self.x4 = self.data4[:, 0] self.y4 = self.data4[:, 1] self.x4 = list(self.x4[:]) self.y4 = list(self.y4[:]) elif pathlib.Path(path).suffix == ".csv": self.data4 = np.genfromtxt(path, delimiter=' ') self.x4 = self.data4[:, 0] self.y4 = self.data4[:, 1] self.x4 = list(self.x4[:]) self.y4 = list(self.y4[:]) elif pathlib.Path(path).suffix == ".xls": self.data4 = np.genfromtxt(path, delimiter=',') self.x4 = self.data4[:, 0] self.y4 = self.data4[:, 1] self.x4 = list(self.x4[:]) self.y4 = list(self.y4[:]) def read_file5(self): fname = QtGui.QFileDialog.getOpenFileName( self, 'Open only txt or CSV or xls', os.getenv('HOME'), "csv(*.csv);; text(*.txt) ;; xls(*.xls)") path = fname[0] if pathlib.Path(path).suffix == ".txt": self.data5 = np.genfromtxt(path, delimiter=',') self.x5 = self.data5[:, 0] self.y5 = self.data5[:, 1] self.x5 = list(self.x5[:]) self.y5 = list(self.y5[:]) elif pathlib.Path(path).suffix == ".csv": self.data5 = np.genfromtxt(path, delimiter=' ') self.x5 = self.data5[:, 0] self.y5 = self.data5[:, 1] self.x5 = list(self.x5[:]) self.y5 = list(self.y5[:]) elif pathlib.Path(path).suffix == ".xls": self.data5 = np.genfromtxt(path, delimiter=',') self.x5 = self.data5[:, 0] self.y5 = self.data5[:, 1] self.x5 = list(self.x5[:]) self.y5 = list(self.y5[:]) def load1(self): self.read_file1() self.pen = pg.mkPen(color=(255, 0, 0)) self.data_line1 = self.graphicsView.plot(self.x1, self.y1, pen=self.pen) self.graphicsView.plotItem.setLimits(xMin=0, xMax=12, yMin=-0.6, yMax=0.6) self.idx1 = 0 self.timer1.setInterval(100) self.timer1.timeout.connect(self.update_plot_data1) self.timer1.start() def load2(self): self.read_file2() self.pen = pg.mkPen(color=(0, 160, 0)) self.data_line2 = self.graphicsView_2.plot(self.x2, self.y2, pen=self.pen) self.graphicsView_2.plotItem.setLimits(xMin=0, xMax=12, yMin=-0.6, yMax=0.6) #self.graphicsView_2.plotItem.setXRange(0 , 0.5) #self.graphicsView.plotItem.enableAutoRange(enable=True) self.idx2 = 0 self.timer2.setInterval(60) self.timer2.timeout.connect(self.update_plot_data2) self.timer2.start() def load3(self): self.read_file3() self.pen = pg.mkPen(color=(255, 255, 0)) self.data_line3 = self.graphicsView_3.plot(self.x3, self.y3, pen=self.pen) self.graphicsView_3.plotItem.setLimits(xMin=0, xMax=12, yMin=-0.6, yMax=0.6) self.idx3 = 0 self.timer3.setInterval(20) self.timer3.timeout.connect(self.update_plot_data3) self.timer3.start() def load4(self): self.read_file4() self.pen = pg.mkPen(color=(0, 160, 255)) self.data_line4 = self.graphicsView_4.plot(self.x4, self.y4, pen=self.pen) self.graphicsView_4.plotItem.setLimits(xMin=0, xMax=12, yMin=-0.6, yMax=0.6) self.idx4 = 0 self.timer4.setInterval(20) self.timer4.timeout.connect(self.update_plot_data4) self.timer4.start() def load5(self): self.read_file5() self.pen = pg.mkPen(color=(0, 255, 255)) self.data_line5 = self.graphicsView_5.plot(self.x5, self.y5, pen=self.pen) self.graphicsView_5.plotItem.setLimits(xMin=0, xMax=12, yMin=-0.6, yMax=0.6) self.idx5 = 0 self.timer5.setInterval(20) self.timer5.timeout.connect(self.update_plot_data5) self.timer5.start() def update_plot_data1(self): x = self.x1[:self.idx1] y = self.y1[:self.idx1] self.idx1 += 10 if self.idx1 > len(self.x1): self.idx1 = 0 if self.x1[self.idx1] > 0.5: self.graphicsView.setLimits( xMin=min(x, default=0), xMax=max(x, default=0)) #disable paning over xlimits self.graphicsView.plotItem.setXRange( max(x, default=0) - 0.5, max(x, default=0)) self.data_line1.setData(x, y) def update_plot_data2(self): x = self.x2[:self.idx2] y = self.y2[:self.idx2] self.idx2 += 10 if self.idx2 > len(self.x2): self.idx2 = 0 if self.x2[self.idx2] > 0.5: self.graphicsView_2.setLimits( xMin=min(x, default=0), xMax=max(x, default=0)) #disable paning over xlimits self.graphicsView_2.plotItem.setXRange( max(x, default=0) - 0.5, max(x, default=0)) self.data_line2.setData(x, y) # Update the data. def update_plot_data3(self): x = self.x3[:self.idx3] y = self.y3[:self.idx3] self.data_line3.setData(x, y) # Update the data. self.idx3 += 10 if self.idx3 > len(self.x3): self.idx3 = 0 if self.x3[self.idx3] > 0.5: self.graphicsView_3.setLimits(xMin=min(x, default=0), xMax=max(x, default=0)) self.graphicsView_3.plotItem.setXRange( max(x, default=0) - 0.5, max(x, default=0)) def update_plot_data4(self): x = self.x4[:self.idx4] y = self.y4[:self.idx4] #self.y2.append( self.ytemp) #Add a new random value. self.data_line4.setData(x, y) # Update the data. self.idx4 += 10 if self.idx4 > len(self.x4): self.idx4 = 0 if self.x4[self.idx4] > 0.5: self.graphicsView_4.setLimits(xMin=min(x, default=0), xMax=max(x, default=0)) self.graphicsView_4.plotItem.setXRange( max(x, default=0) - 0.5, max(x, default=0)) def update_plot_data5(self): x = self.x5[:self.idx5] y = self.y5[:self.idx5] self.data_line5.setData(x, y) # Update the data. self.idx5 += 10 if self.idx5 > len(self.x5): self.idx5 = 0 if self.x5[self.idx5] > 0.5: self.graphicsView_5.setLimits( xMin=min(x, default=0), xMax=max(x, default=0)) #disable paning over xlimits self.graphicsView_5.plotItem.setXRange( max(x, default=0) - 0.5, max(x, default=0)) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "RRE Signal Viewer")) MainWindow.setWindowIcon(QtGui.QIcon('logo3.png')) self.resume.setText(_translate("MainWindow", "Resume")) self.pause.setText(_translate("MainWindow", "Pause")) self.clear.setText(_translate("MainWindow", "Clear")) self.show_ch1.setText(_translate("MainWindow", "Hide channel 1")) self.show_ch2.setText(_translate("MainWindow", "Hide channel 2")) self.show_cch3.setText(_translate("MainWindow", "Hide channel 3")) self.show_ch4.setText(_translate("MainWindow", "Hide channel 4")) self.show_ch5.setText(_translate("MainWindow", "Hide channel 5")) self.label.setText( _translate( "MainWindow", " To zoom drag the graph to the right" )) self.menuchannel_1.setTitle(_translate("MainWindow", "channel 1")) self.menuchannel_2.setTitle(_translate("MainWindow", "channel 2")) self.menuchannel_3.setTitle(_translate("MainWindow", "channel 3")) self.menuchannel_4.setTitle(_translate("MainWindow", "channel 4")) self.menuchannel_5.setTitle(_translate("MainWindow", "channel 5")) self.open_ch1.setText(_translate("MainWindow", "open with")) self.open_ch2.setText(_translate("MainWindow", "open with")) self.open_ch3.setText(_translate("MainWindow", "open with")) self.open_ch4.setText(_translate("MainWindow", "open with")) self.open_ch5.setText(_translate("MainWindow", "open with"))
class Plotter: """ This class communicates with the matplotlib library and plot the data """ def __init__(self, size): """Initialize the plot window, size defines the shape and size of the figure 0 - None, 1 - 8x6, 11 (default) - 12x8, 2 - 2 figs 8x8, 12 - 2 figs 12x8 """ # print('ok') class CustomViewBox(pg.ViewBox): def __init__(self, *args, **kwds): pg.ViewBox.__init__(self, *args, **kwds) self.setMouseMode(self.RectMode) ## reimplement right-click to zoom out def mouseClickEvent(self, ev): if ev.button() == QtCore.Qt.RightButton and QtGui.QApplication.keyboardModifiers()==QtCore.Qt.ControlModifier: self.autoRange() else: pg.ViewBox.mouseClickEvent(self, ev) def mouseDragEvent(self, ev): mod = QtGui.QApplication.keyboardModifiers() if mod == QtCore.Qt.ControlModifier: self.setMouseMode(self.PanMode) else: self.setMouseMode(self.RectMode) if ev.button() == QtCore.Qt.RightButton: pg.ViewBox.mouseDragEvent(self, ev) else: pg.ViewBox.mouseDragEvent(self, ev) self.vb = CustomViewBox() # not necessary? def clear(self): def ylog(self): """ Change y-scale to log """ vr = self._widget.plotItem.viewRange() xr = vr[0] yr = vr[1] # print(xr,yr) if yr[0]<=0: yr[0]=1 yr[0]=np.log10(yr[0]) yr[1]=np.log10(yr[1]) # print(xr,yr) self._widget.plotItem.disableAutoRange() self._widget.plotItem.setLogMode(x=False, y=True) self._widget.plotItem.setRange(xRange=xr, yRange=yr,padding=None) def ylin(self): """ Change y-scale to linear """ vr = self._widget.plotItem.viewRange() xr = vr[0] yr = vr[1] # print(xr,yr) yr[0]=10**yr[0] yr[1]=10**yr[1] # print(xr,yr) self._widget.plotItem.disableAutoRange() self._widget.plotItem.setLogMode(x=False, y=False) self._widget.plotItem.setRange(xRange=xr, yRange=yr,padding=None) def plot1d(self, plot, xlim=None, ylim=None): """ Plot 1D histogram The mode defines the way the data are presented, 'histogram' is displayed with steps 'function' with continuus line 'errorbar' with yerrorbars The norm (normalization factor) and bin_size are given for the display purposes only. The histogram is not altered. """ histo = plot.histogram self._widget = PlotWidget(viewBox=self.vb) plt = self._widget.plotItem plt.setTitle(histo.title) plt.plot(histo.x_axis, histo.weights) self._widget.show() # if plot.mode == 'histogram': # current_plot.plot() # win.show() # app.processEvents() def _repr_png_(self): self._widget.hide() QtGui.QApplication.processEvents() try: self.image = QImage(self._widget.viewRect().size().toSize(), QImage.Format_RGB32) except AttributeError: self._widget.updateGL() self.image = self._widget.grabFrameBuffer() painter = QPainter(self.image) self._widget.render(painter) byte_array = QByteArray() buffer = QBuffer(byte_array) buffer.open(QIODevice.ReadWrite) self.image.save(buffer, 'PNG') buffer.close() return bytes(byte_array) def xlim(self, x_range): """ Set x range of plot preserving y limits. """ if x_range==None: yar=self._widget.plotItem.getViewBox().autoRangeEnabled()[1] if yar==False: yr=self._widget.viewRange()[1] else: yr=None # self._widget.plotItem.autoRange() self._widget.plotItem.enableAutoRange() self._widget.plotItem.setAutoVisible(x=True,y=True) if yr!=None: self._widget.plotItem.setRange(yRange=yr,padding=None) return None else: if x_range[0]==None: x_range[0]=0 if x_range[1]==None: self._widget.plotItem.setAutoVisible(x=True,y=False) xr=self._widget.viewRange()[0] x_range[1]=xr[1] self._widget.plotItem.setXRange(x_range[0],x_range[1]) self._widget.plotItem.setAutoVisible(x=False,y=True) def ylim(self, y_range): """ Set y range of plot preserving x limits. """ if y_range==None: xar=self._widget.plotItem.getViewBox().autoRangeEnabled()[0] if xar==False: xr=self._widget.viewRange()[0] else: xr=None self._widget.plotItem.enableAutoRange() self._widget.plotItem.setAutoVisible(x=True,y=True) if xr!=None: self._widget.plotItem.setRange(xRange=xr,padding=None) return None else: if y_range[0]==None: y_range[0]=0 if y_range[1]==None: self._widget.plotItem.setAutoVisible(y=True,x=False) yr=self._widget.viewRange()[1] y_range[1]=yr[1] self._widget.plotItem.setYRange(y_range[0],y_range[1]) self._widget.plotItem.setAutoVisible(y=False,x=True) # def plot1d_4panel(self, plot, ranges): """ Special 1D histogram plot. The plot is broken into 4 panels (stacked verically) the ranges variable should be given in a (x0, x1, x2, x3, x4) format, where xi defines the ranges of the subplots (x0-x1, x1-x2, x2-x3, x3-x4) """ def plot2d(self, plot, xc=None, yc=None, logz=False): """Plot 2D histogram xc is x range, yc is y range """ if plot.histogram.dim != 2: raise GeneralError('plot2d function needs a 2D histogram!') x = plot.histogram.x_axis y = plot.histogram.y_axis w = plot.histogram.weights if xc is not None: x = x[xc[0]:xc[1]] w = w[xc[0]:xc[1],:] if yc is not None: y = y[yc[0]:yc[1]] w = w[:, yc[0]:yc[1]] title = plot.histogram.title # If logaritmic scale is used, mask values <= 0 if logz: w = numpy.ma.masked_where(w <= 0, numpy.log10(w)) title += ' (log10)' self._widget = pg.ImageView(view=pg.PlotItem(title=title)) gv = self._widget.getView() gv.invertY(False) self._widget.setImage(w,pos=[x[0]-0.5,y[0]-0.5]) self._widget.show()