コード例 #1
0
ファイル: ratingview.py プロジェクト: guldfisk/deckeditor
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()
コード例 #2
0
ファイル: QTFile.py プロジェクト: Mikkicon/PyQT_Interpolation
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')
コード例 #3
0
ファイル: camviewer.py プロジェクト: slaclab/pydm
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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()
コード例 #7
0
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()
コード例 #8
0
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)
コード例 #9
0
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"))
コード例 #10
0
ファイル: plotter.py プロジェクト: ntbrewer/Pyspeqtr
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()