Пример #1
0
    def nextFrame(self):
        mouse_pos = self.mapFromGlobal(QCursor.pos())
        mouse_x = mouse_pos.x()
        mouse_y = mouse_pos.y()

        self.x1 = mouse_x
        self.y1 = mouse_y
        self.radius1 = self.radius1 + math.sin(self.frame_count / 8) * 4

        delay = 20
        self.x2 += (mouse_x - self.x2) / delay
        self.y2 += (mouse_y - self.y2) / delay

        self.frame_count += 1

        if self.paint_image.width() != self.width() or self.paint_image.height() != self.height():
            self.paint_image = QPixmap(self.width(), self.height())
            self.paint_image.fill(self.background_color)

        p = QPainter()
        p.begin(self.paint_image) # auf das paint_image malen
        p.setBackground(self.background_color) # color when stuff is erased

        # Hintergrund löschen, wenn Rechteck bei der Maus angekommen ist
        # print("{0}, {1}".format(self.x2, mouse_x))
        if round(self.x2) == mouse_x and round(self.y2) == mouse_y:
            p.eraseRect(0, 0, self.paint_image.width(), self.paint_image.height())

        self.drawFrame(p)
        p.end()
        self.repaint()
Пример #2
0
    def paintEvent(self, event):
      side = min(self.width(), self.height())
      stime = QTime.currentTime().msec()

      painter = QPainter(self)
      painter.setRenderHint(QPainter.Antialiasing)
      #painter.translate(self.width() / 2, self.height() / 2)
      #painter.scale(side / 200.0, side / 200.0)

      painter.eraseRect( self.rect())
      painter.save()
      #New Pen, because we want to set multiple properties : color and width
      p = QPen(self.TimerColor)
      p.setWidth(10)
      # Use our pen
      painter.setPen( p )

      # Angle specified in 1/16th of a degree, so scale it up
      painter.drawArc(0, 0, 40, 40, 16.0 * 360 * stime / 1000, 120 * 16.0)
      painter.restore()

      #This be where object rendering happens, iter through obj collection
      self.lockShapes.acquire()
      try:
        for s in self.shapes:
          s.Render(painter, self.scale )
      finally:
        self.lockShapes.release()
Пример #3
0
    def paintEvent(self, ev):
        super(TagsLabelWidget, self).paintEvent(ev)

        painter = QPainter(self)

        painter.save()
        try:
            painter.setBackground(self.palette().brush(self.backgroundRole()))
            painter.eraseRect(ev.rect())

            painter.setClipRect(ev.rect())

            fm = QFontMetrics(self.font())  # TODO use style

            x = self.xmargin
            for sz, tag in self._positions(self.tags):
                fg, bg = tag_to_colors(tag)
                painter.setPen(fg.color())

                painter.fillRect(x, self.ymargin,
                                 sz.width() + 2 * self.xpadding, fm.height(),
                                 bg.color())
                painter.drawText(x + self.xpadding, self.ymargin + fm.ascent(),
                                 tag)
                x += sz.width() + self.xmargin + 2 * self.xpadding

        finally:
            painter.restore()
Пример #4
0
    def paintEvent(self, event):

        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing, True)
        painter.setRenderHint(QPainter.HighQualityAntialiasing, False)

        painter.eraseRect(0, 0, self.viewPort.getWidth(),
                          self.viewPort.getHeight())
        painter.fillRect(event.rect(), Qt.white)

        pen = QPen()
        pen.setColor(QColor(128, 128, 128))
        painter.setPen(pen)
        painter.drawRect(0, 0, self.viewPort.getWidth(),
                         self.viewPort.getHeight())

        if self.model is not None:

            ao = self.model.getObservedAgent()

            if ao is not None:
                self.updateViewPort(ao)

            self.drawEnvironment(painter, self.model.environment)
            self.drawAgents(painter, self.model.agents)
            self.drawGradient(painter, self.model.environment)

        painter.end()
Пример #5
0
    def drawAxisLines(self):
        if self.pixmap is None:
            painter = QPainter()
        else:
            painter = QPainter(self.pixmap)

        painter.eraseRect(self.frame)
        painter.setPen(Qt.darkGray)

        # Draw box outline.
        painter.drawRect(self.frame)

        # Draw horizonal zero voltage line.
        painter.drawLine(self.frame.left(),
                         self.frame.center().y(), self.frame.right(),
                         self.frame.center().y())

        # Draw vertical lines at 0 ms and 1 ms.
        painter.drawLine(
            self.frame.left() + (1.0 / 3.0) *
            (self.frame.right() - self.frame.left()) + 1, self.frame.top(),
            self.frame.left() + (1.0 / 3.0) *
            (self.frame.right() - self.frame.left()) + 1, self.frame.bottom())
        painter.drawLine(
            self.frame.left() + (2.0 / 3.0) *
            (self.frame.right() - self.frame.left()) + 1, self.frame.top(),
            self.frame.left() + (2.0 / 3.0) *
            (self.frame.right() - self.frame.left()) + 1, self.frame.bottom())

        self.update()
Пример #6
0
class DigitImage(QLabel):
    def __init__(self, *args):
        super().__init__(*args)
        self.setFixedSize(200, 200)
        self.setStyleSheet('border: 3px solid grey;')

    @pyqtSlot(int)
    def drawDigit(self, digit):
        print(digit)
        self.painter = QPainter(self.pixmap())
        self.painter.begin(self.pixmap())

        font = self.painter.font()
        font.setPointSize(60)
        self.painter.setFont(font)

        self.painter.drawText(self.rect(), QtCore.Qt.AlignCenter, str(digit))
        self.painter.end()
        self.repaint()

    @pyqtSlot()
    def clear(self):
        self.painter.begin(self.pixmap())
        self.painter.eraseRect(self.rect())
        self.painter.end()
        self.repaint()
Пример #7
0
    def from_svg_bytes(self, svg_bytes):
        """Paints an svg from a bytes object"""

        renderer = QSvgRenderer(svg_bytes)
        painter = QPainter(self)
        painter.eraseRect(self.rect())
        renderer.render(painter)
        painter.end()
Пример #8
0
def load_svg_sized_pixmap(path, w=100, h=100):
    svg_renderer = QSvgRenderer(path)
    image = QImage(w, h, QImage.Format_ARGB32)
    painter = QPainter(image)
    painter.eraseRect(0, 0, w, h)
    svg_renderer.render(painter)
    painter.end()
    return QPixmap.fromImage(image)
Пример #9
0
 def paintEvent(self, event):
     painter = QPainter(self)
     if self.layer is not None:
         painter.resetTransform()
         painter.drawImage(self.rect(), self.qImage)
         self.drawShapes(painter)
     else:
         painter.eraseRect(self.rect())
Пример #10
0
    def clearCanvas(self):

        self.last_click = None
        self.first_click = None
        self.lineCount = 0

        painter = QPainter(self.pixmap())
        painter.eraseRect(0, 0, self.canvas_size, self.canvas_size)
        painter.drawPixmap(0, 0, self.OGpixmap)
        painter.end()
        self.update()
Пример #11
0
    def clear(self):

        self.last_click = None
        self.first_click = None
        self.lineCount = 0
        self.array = np.zeros((512,512,3), dtype=np.uint8)

        painter = QPainter(self.pixmap())
        painter.eraseRect(0,0,512,512)
        painter.drawPixmap(0,0,self.OGpixmap)
        painter.end()
        self.update()
    def paintEvent(self, event):
        q = QPainter(self)
        p = QPen()
        p.setStyle(Qt.SolidLine)
        p.setWidth(5)
        q.setPen(p)

        if (self.isErase):
            q.eraseRect(self.rect())
            self.isErase = False

        for pos in self.chosen_points:
            q.drawPoint(pos)
Пример #13
0
    def paintEvent(self, event: QPaintEvent) -> None:
        qp = QPainter()
        qp.begin(self)

        if self.mouse_start_pos is not None and self.mouse_curr_pos is not None:
            qp.drawRect(
                QRect(self.mouse_start_pos.x(), self.mouse_start_pos.y(),
                      self.mouse_curr_pos.x() - self.mouse_start_pos.x(),
                      self.mouse_curr_pos.y() - self.mouse_start_pos.y()))

            # print('start:', (self.mouse_start_pos.x(), self.mouse_start_pos.y()),
            # 	   '\tend:', (self.mouse_curr_pos.x(), self.mouse_curr_pos.y()))
        else:
            qp.eraseRect(0, 0, self.screenHeight, self.screenWidth)

        qp.end()
Пример #14
0
    def click_del(self):
        if len(self.selectedTop) != 0:
            for x in self.selectedTop:
                self.brushColor = Qt.white
                painter = QPainter(self.image)
                self.pen(painter)
                #clear deleting top
                painter.drawEllipse(x.x() - Constant.rad / 2,
                                    x.y() - Constant.rad / 2, Constant.rad,
                                    Constant.rad)

                # clear conection lines
                for rib in x.list:
                    painter.drawLine(rib.to.x(), rib.to.y(), x.x(), x.y())

                    for k in range(self.countParam):
                        painter.eraseRect(
                            QRectF((x.x() + rib.to.x()) / 2 + 5,
                                   (x.y() + rib.to.y()) / 2 - 15, 50,
                                   10 * self.countParam))
                painter.eraseRect(
                    QRectF(x.x() - 15,
                           x.y() - 15, Constant.rad * 2, Constant.rad * 2))

                # restore adjacent circles
                self.brushColor = Qt.blue
                self.pen(painter)
                for rib in x.list:
                    painter.drawEllipse(rib.to.x() - Constant.rad / 2,
                                        rib.to.y() - Constant.rad / 2,
                                        Constant.rad, Constant.rad)
                    self.brushColor = Qt.black
                    self.pen(painter)
                    painter.drawText(QPointF(rib.to.x(), rib.to.y()),
                                     str(rib.to.getNumber()))

                self.graph.delete(x)
            self.selectedTop.clear()
        else:
            self.graph.deleteAll()
            self.image.fill(Qt.white)
            self.countCom = 0
            self.countCity = 0

        self.initNeed()
        self.update()
Пример #15
0
    def mouseReleaseEvent(self, event):
        X = 1920 - 2 * event.y()
        Y = 2 * event.x()
        print("(%s, %s)    %s" % (X, Y, datetime.now()))

        print("release")
        message = json.dumps({
            "x": X,
            "y": Y,
            "time": time.time(),
            "mouse": "release"
        })

        self.sock.sendto(message.encode(), self.udpaddr)
        painter = QPainter(self.image)
        painter.eraseRect(self.rect())
        self.drawing = False
Пример #16
0
 def screenshot(self):
     self.scene.clearSelection()
     image = QImage(self.centralWidget().size(),
                    QtGui.QImage.Format_ARGB32_Premultiplied)
     painter = QPainter()
     painter.begin(image)
     painter.eraseRect(self.centralWidget().rect())
     painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
     self.centralWidget().render(painter)
     painter.end()
     (file_path,
      file_format) = QFileDialog.getSaveFileName(self, 'Save file',
                                                 self.drawer.label + '.png',
                                                 ".png")
     if (file_path != ''):
         if (image.save(file_path, "PNG", 100)):
             message = QMessageBox.about(self, self.drawer.label,
                                         "Screenshot saved")
Пример #17
0
    def paintEvent(self, event: QPaintEvent):
        height = self.height()

        painter = QPainter(self)
        pen: QPen = painter.pen()

        blockColor = QColor(0, 0, 0, 255)
        painter.eraseRect(0, 0, self.width(), height)

        self.renderBegin.emit(painter)

        for poly in reversed(self.polygonFactory):
            if len(poly.points) > 0:
                r, g, b, a = poly.fillColor
                if poly.has_cache and a != 0:
                    col = QColor(r, g, b, a)
                    pen.setColor(blockColor)
                    painter.setPen(pen)

                    for y, x1, x2 in poly.cachedLines:
                        y = height - y

                        painter.fillRect(
                            x1,
                            y,
                            x2 - x1,
                            1,
                            col
                        )

                r, g, b, a = poly.outlineColor
                if poly.outlineThickness > 0 and a != 0:
                    pen.setColor(QColor(r, g, b, a))
                    pen.setWidth(poly.outlineThickness)
                    painter.setPen(pen)

                    points = [QPoint(i.x, height - i.y) for i in poly.points]

                    painter.drawPolygon(points[0], *points[1:])

        self.renderEnd.emit(painter)
Пример #18
0
    def draw_on_canvas(self):
        current_pos = QPoint(self.mouse_x, self.mouse_y)

        if self.current_canvas_name == 'sketch':
            if self.line_mode == 'straight' and self.mode == 'inputSketch':
                self.sketch_canvas = self.tmp_sketch_canvas.copy()

            painter = QPainter(self.sketch_canvas)
            painter.setPen(
                QPen(self.color, self.brushSize, Qt.SolidLine, Qt.RoundCap,
                     Qt.RoundJoin))

        elif self.current_canvas_name == 'detail':
            if self.line_mode == 'straight' and self.mode == 'inputDetail':
                self.detail_canvas = self.tmp_detail_canvas.copy()

            painter = QPainter(self.detail_canvas)
            painter.setPen(
                QPen(self.color, self.brushSize, Qt.SolidLine, Qt.RoundCap,
                     Qt.RoundJoin))

        if self.mode == 'inputErase':
            r = QRect(QPoint(), self._clear_size * QSize())
            r.moveCenter(current_pos)
            painter.save()
            painter.setCompositionMode(QPainter.CompositionMode_Clear)
            painter.eraseRect(r)
            painter.restore()

        elif self.line_mode == 'straight':
            painter.drawLine(self.start_pos, current_pos)

        elif self.line_mode == 'free':
            painter.drawLine(self.last_pos, current_pos)

        else:
            pass

        painter.end()
        self.last_pos = QPoint(self.mouse_x, self.mouse_y)
Пример #19
0
    def drawGradients(self, painter: QPainter):
        painter.setBackground(QBrush(Qt.cyan))
        painter.eraseRect(0, 0, self.width(), self.height())

        grad1 = QLinearGradient(0, 20, 0, 110)
        grad1.setColorAt(0.1, Qt.black)
        grad1.setColorAt(0.5, Qt.yellow)
        grad1.setColorAt(0.9, Qt.black)

        painter.fillRect(20, 20, 300, 90, grad1)

        grad2 = QLinearGradient(0, 55, 250, 0)
        grad2.setColorAt(0.2, Qt.black)
        grad2.setColorAt(0.5, Qt.red)
        grad2.setColorAt(0.8, Qt.black)

        painter.fillRect(20, 140, 300, 100, grad2)

        grad3 = QLinearGradient(0, 280, 0, 380)
        grad3.setColorAt(0.1, QColor(0xcc, 0xcc, 0xcc, 156))
        grad3.setColorAt(0.8, QColor(0xcc, 0xcc, 0xcc, 0))
        painter.fillRect(20, 280, 300, 100, grad3)
Пример #20
0
 def paintEvent(self, event):
     painter = QPainter(self)
     # erase background
     painter.setBackground(QBrush(Layer.color(LayerType.background)))
     painter.setClipping(True)
     painter.eraseRect(self.rect())
     # draw document
     if self._ctrl is not None:
         # draw grid
         painter.setRenderHint(QPainter.Antialiasing, False)
         pen = QPen(Layer.color(LayerType.grid))
         pen.setCapStyle(Qt.RoundCap)
         pen.setJoinStyle(Qt.RoundJoin)
         pen.setWidth(0)
         painter.setTransform(self._transform)
         painter.setPen(pen)
         self._drawGrid(painter)
         # draw drawables
         # painter.setRenderHint(QPainter.Antialiasing)
         for d in self._ctrl.getDrawables():
             d.draw(painter)
     painter.end()
Пример #21
0
 def paintEvent(self, event):
     painter = QPainter(self)
     # erase background
     painter.setBackground(QBrush(Layer.color(LayerType.background)))
     painter.setClipping(True)
     painter.eraseRect(self.rect())
     # draw document
     if self._ctrl is not None:
         # draw grid
         painter.setRenderHint(QPainter.Antialiasing, False)
         pen = QPen(Layer.color(LayerType.grid))
         pen.setCapStyle(Qt.RoundCap)
         pen.setJoinStyle(Qt.RoundJoin)
         pen.setWidth(0)
         painter.setTransform(self._transform)
         painter.setPen(pen)
         self._drawGrid(painter)
         # draw drawables
         # painter.setRenderHint(QPainter.Antialiasing)
         for d in self._ctrl.getDrawables():
             d.draw(painter)
     painter.end()
Пример #22
0
    def paintEvent(self, e):
        tabOverlap = QStyleOptionTab()
        tabOverlap.shape = QTabBar.RoundedNorth
        optTabBase = QStyleOptionTabBarBase()
        optTabBase.initFrom(self)
        optTabBase.shape = QTabBar.RoundedNorth
        optTabBase.tabBarRect = QRect()

        painter = QPainter(self)

        selected = (0, 0)

        for i in range(len(self.__tabList)):
            for j in range(len(self.__tabList[i])):
                tab = self.__getStyleOption(i, j)

                if not (tab.state & QStyle.State_Enabled):
                    tab.palette.setCurrentColorGroup(QPalette.Disabled)

                optTabBase.tabBarRect |= tab.rect

                if (i, j) == self.__selectedIndex:
                    selected = (i, j)
                    optTabBase.selectedTabRect = tab.rect
                    continue

                self.style().drawControl(QStyle.CE_TabBarTab, tab, painter,
                                         self)

        if selected != (-1, -1):
            for j in range(len(self.__tabList[selected[0]])):
                tab = self.__getStyleOption(selected[0], j)
                self.style().drawControl(QStyle.CE_TabBarTab, tab, painter,
                                         self)

            tab = self.__getStyleOption(selected[0], selected[1])
            painter.eraseRect(tab.rect)
            self.style().drawControl(QStyle.CE_TabBarTab, tab, painter, self)
Пример #23
0
    def drawOnCanvas(self, points):
        """
        Performs drawing on canvas.
        """
        painter = QPainter(self.pixmap())

        if self.antialiasing_status:
            painter.setRenderHint(QPainter.Antialiasing)

        if self.eraser_selected == False:
            pen = QPen(QColor(self.pen_color), self.pen_width)
            painter.setPen(pen)
            painter.drawLine(self.last_mouse_pos, points)

            # Update the mouse's position for next movement
            self.last_mouse_pos = points
        elif self.eraser_selected == True:
            # Use the eraser
            eraser = QRect(points.x(), points.y(), 12, 12)
            painter.eraseRect(eraser)

        painter.end()
        self.update()
Пример #24
0
    def refreshPixmap(self):
        # Pixel map used for double buffering.
        self.pixmap = QPixmap(self.size())
        self.pixmap.fill()

        painter = QPainter(self.pixmap)

        # Clear old display.
        painter.eraseRect(self.rect())

        # Draw box around entire display.
        painter.setPen(Qt.darkGray)
        r = QRect(self.rect())
        r.adjust(0, 0, -1, -1)
        painter.drawRect(r)

        # Plot all frames.
        for i in range(
                len(self.frameList[self.numFramesIndex[self.selectedPort]])):
            self.drawAxes(painter, i)

        self.tPosition = 0
        self.update()
Пример #25
0
class dibujito(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.mapa = QPixmap(700, 700)
        self.mapa.fill(QColor('WHITE'))
        self.label.setPixmap(self.mapa)
        self.painter = QPainter(self.label.pixmap())
        pen = QPen()
        pen.setWidth(3)
        pen.setColor(QColor('#7584F3'))
        self.painter.setRenderHint(QPainter.Antialiasing)
        self.painter.setPen(pen)
        cordenada = threading.Thread(daemon=True, target=union_puntos)
        cordenada.start()
        self.pushButton.clicked.connect(self.apachado)

    def paint(self, suma_x, suma_y):
        global x, y
        try:
            self.painter.drawLine(x, y, x + suma_x, y + suma_y)
            self.update()
            x = suma_x + x
            if x < 10:
                x = 700
            elif x >= 700:
                x = 10
            y = y + suma_y
            if y < 10:
                y = 700
            elif y >= 700:
                y = 10
        except:
            print('error pintar')

    def apachado(self):
        self.painter.eraseRect(0, 0, 700, 700)
Пример #26
0
 def paintEvent(self, event):
     painter = QPainter()
     painter.begin(self)
     
     painter.setRenderHint(QPainter.Antialiasing)
     
     painter.setBackground(QColor(52, 170, 253))
     painter.eraseRect(painter.viewport())
     
     painter.drawPixmap(QPoint(0, 0), self.__background)
     
     qfont = QFont("Arial")
     qfont.setPixelSize(72)
     qfont.setBold(QFont.Bold)
     self.__paint_outlined_text(painter, QPoint(150, 110), qfont, "UML")
     
     qfont.setPixelSize(45)
     self.__paint_outlined_text(painter, QPoint(330, 110), qfont, ".FRI")
     
     self.__paint_outlined_text(painter, QPoint(450, 110), qfont, Application().about.version.major_minor_string)
     
     painter.end()
     
     super().paintEvent(event)
Пример #27
0
    def paintEvent(self, event):
        width = self.width()
        height = self.height()
        center = QPoint((width + 1) / 2, (height + 1) / 2)
        diameterBpm = width - 2
        if (height < width):
            diameterBpm = height - 2
        widthBeam = diameterBpm * (self.beamWidth / self.bpmDiameter)
        heightBeam = diameterBpm * (self.beamHeight / self.bpmDiameter)
        horizontalGapWidth = diameterBpm * (self.bpmHorizontalGap /
                                            self.bpmDiameter)
        horizontalGap = QRect(center.x() + 1 - horizontalGapWidth / 2,
                              center.y() - diameterBpm / 2, horizontalGapWidth,
                              diameterBpm + 2)
        verticalGapWidth = diameterBpm * (self.bpmVerticalGap /
                                          self.bpmDiameter)
        verticalGap = QRect(center.x() - 1 - diameterBpm / 2,
                            center.y() + 1 - verticalGapWidth / 2,
                            diameterBpm + 2, verticalGapWidth)
        posX = center.x() + self.beamPosX * center.x() / 2
        posY = center.y() + self.beamPosY * center.y() / 2

        painter = QPainter()
        painter.begin(self)
        painter.setPen(QPen(Qt.white))
        painter.setBrush(Qt.white)
        painter.drawEllipse(center, diameterBpm / 2, diameterBpm / 2)
        painter.eraseRect(horizontalGap)
        painter.eraseRect(verticalGap)
        if (abs(self.beamPosX) <= 1 and abs(self.beamPosY) <= 1):
            painter.setPen(QPen(Qt.red))
            painter.setBrush(Qt.transparent)
            painter.drawEllipse(posX + 1 - widthBeam / 2,
                                posY + 1 - heightBeam / 2, widthBeam,
                                heightBeam)
        painter.end()
Пример #28
0
    def drawWaveforms(self):
        painter = QPainter(self.pixmap)
        length = Rhd2000DataBlock.getSamplesPerDataBlock(
        ) * self.numUsbBlocksToPlot

        polyline = [0] * (length + 1)

        # Assume all frames are the same size.
        yAxisLength = (self.frameList[self.numFramesIndex[self.selectedPort]]
                       [0].height() - 2) / 2.0
        tAxisLength = self.frameList[self.numFramesIndex[
            self.selectedPort]][0].width() - 1

        for j in range(
                len(self.frameList[self.numFramesIndex[self.selectedPort]])):
            stream = self.selectedChannelIndex(
                j + self.topLeftFrame[self.selectedPort]).boardStream
            channel = self.selectedChannelIndex(
                j + self.topLeftFrame[self.selectedPort]).chipChannel
            stype = self.selectedChannelIndex(
                j + self.topLeftFrame[self.selectedPort]).signalType

            if self.selectedChannelIndex(
                    j + self.topLeftFrame[self.selectedPort]).enabled:
                xOffset = self.frameList[self.numFramesIndex[
                    self.selectedPort]][j].left() + 1
                xOffset += self.tPosition * tAxisLength / self.tScale

                # Set clipping region
                adjustedFrame = copy(
                    self.frameList[self.numFramesIndex[self.selectedPort]][j])
                adjustedFrame.adjust(0, 1, 0, 0)
                painter.setClipRect(adjustedFrame)

                # Erase segment of old wavefrom
                eraseBlock = copy(adjustedFrame)
                eraseBlock.setLeft(xOffset)
                eraseBlock.setRight(
                    (tAxisLength * (1000.0 / self.sampleRate) / self.tScale) *
                    (length - 1) + xOffset)
                painter.eraseRect(eraseBlock)

                # Redraw y = 0 axis
                self.drawAxisLines(painter, j)

                if stype == constants.AmplifierSignal:
                    # Plot RHD2000 amplifier waveform

                    tStepMsec = 1000.0 / self.sampleRate
                    xScaleFactor = tAxisLength * tStepMsec / self.tScale
                    yScaleFactor = -yAxisLength / self.yScale
                    yOffset = self.frameList[self.numFramesIndex[
                        self.selectedPort]][j].center().y()

                    # build waveform
                    for i in range(length):
                        polyline[i + 1] = QPointF(
                            xScaleFactor * i + xOffset,
                            yScaleFactor * self.signalProcessor.
                            amplifierPostFilter[stream][channel][i] + yOffset)

                    # join to old waveform
                    if self.tPosition == 0.0:
                        polyline[0] = polyline[1]
                    else:
                        polyline[0] = QPointF(
                            xScaleFactor * -1 + xOffset,
                            yScaleFactor * self.plotDataOld[
                                j + self.topLeftFrame[self.selectedPort]] +
                            yOffset)

                    # save last point in waveform to join to next segment
                    self.plotDataOld[j + self.topLeftFrame[
                        self.
                        selectedPort]] = self.signalProcessor.amplifierPostFilter[
                            stream][channel][length - 1]

                    # draw waveform
                    painter.setPen(Qt.blue)
                    if self.pointPlotMode:
                        painter.drawPoints(QPolygonF(polyline))
                    else:
                        painter.drawPolyline(QPolygonF(polyline))

                elif stype == constants.AuxInputSignal:
                    # Plot RHD2000 auxiliary input signal

                    tStepMsec = 1000.0 / (self.sampleRate / 4)
                    xScaleFactor = tAxisLength * tStepMsec / self.tScale
                    yScaleFactor = -(2.0 * yAxisLength) / 2.5
                    yOffset = self.frameList[self.numFramesIndex[
                        self.selectedPort]][j].bottom()

                    # build waveform
                    for i in range(length / 4):
                        polyline[i + 1] = QPointF(
                            xScaleFactor * i + xOffset, yScaleFactor *
                            self.signalProcessor.auxChannel[stream][channel][i]
                            + yOffset)

                    # join to old waveform
                    if self.tPosition == 0.0:
                        polyline[0] = polyline[1]
                    else:
                        polyline[0] = QPointF(
                            xScaleFactor * -1 + xOffset,
                            yScaleFactor * self.plotDataOld[
                                j + self.topLeftFrame[self.selectedPort]] +
                            yOffset)

                    # save last point in waveform to join to next segment
                    self.plotDataOld[j + self.topLeftFrame[
                        self.selectedPort]] = self.signalProcessor.auxChannel[
                            stream][channel][(length / 4) - 1]

                    # draw waveform
                    pen = QPen()
                    pen.setColor(QColor(200, 50, 50))
                    painter.setPen(pen)
                    polyline = polyline[:(length // 4) + 1]
                    if self.pointPlotMode:
                        painter.drawPoints(QPolygonF(polyline))
                    else:
                        painter.drawPolyline(QPolygonF(polyline))

                elif stype == constants.SupplyVoltageSignal:
                    # Plot RHD2000 supply voltage signal

                    tStepMsec = 1000.0 / (self.sampleRate / 60.0)
                    xScaleFactor = tAxisLength * tStepMsec / self.tScale
                    yScaleFactor = -(2.0 * yAxisLength) / 1.5
                    yOffset = self.frameList[self.numFramesIndex[
                        self.selectedPort]][j].bottom()

                    voltageLow = False
                    voltageOutOfRange = False

                    # build waveform
                    for i in range(length / 60):
                        voltage = self.signalProcessor.supplyVoltage[stream][i]
                        polyline[i + 1] = QPointF(
                            xScaleFactor * i + xOffset,
                            yScaleFactor * (voltage - 2.5) + yOffset)
                        if voltage < 2.9 or voltage > 3.6:
                            voltageOutOfRange = True
                        elif voltage < 3.2:
                            voltageLow = True

                    # join to old waveform
                    if self.tPosition == 0.0:
                        polyline[0] = polyline[1]
                    else:
                        polyline[0] = QPointF(
                            xScaleFactor * -1 + xOffset,
                            yScaleFactor *
                            (self.plotDataOld[j + self.topLeftFrame[
                                self.selectedPort]] - 2.5) + yOffset)

                    # save last point in waveform to join to next segment
                    self.plotDataOld[j + self.topLeftFrame[
                        self.
                        selectedPort]] = self.signalProcessor.supplyVoltage[
                            stream][(length / 60) - 1]

                    # draw waveform
                    painter.setPen(Qt.green)
                    if voltageLow:
                        painter.setPen(Qt.yellow)
                    if voltageOutOfRange:
                        painter.setPen(Qt.red)

                    polyline = polyline[:(length // 60) + 1]
                    if self.pointPlotMode:
                        painter.drawPoints(QPolygonF(polyline))
                    else:
                        painter.drawPolyline(QPolygonF(polyline))

                elif stype == constants.BoardAdcSignal:
                    # Plot USB interface board ADC input signal

                    tStepMsec = 1000.0 / self.sampleRate
                    xScaleFactor = tAxisLength * tStepMsec / self.tScale
                    yScaleFactor = -(2.0 * yAxisLength) / 3.3
                    yOffset = self.frameList[self.numFramesIndex[
                        self.selectedPort]][j].bottom()

                    # build waveform
                    for i in range(length):
                        polyline[i + 1] = QPointF(
                            xScaleFactor * i + xOffset, yScaleFactor *
                            self.signalProcessor.boardAdc[channel][i] +
                            yOffset)

                    # join to old waveform
                    if self.tPosition == 0.0:
                        polyline[0] = polyline[1]
                    else:
                        polyline[0] = QPointF(
                            xScaleFactor * -1 + xOffset,
                            yScaleFactor * self.plotDataOld[
                                j + self.topLeftFrame[self.selectedPort]] +
                            yOffset)

                    # save last point in waveform to join to next segment
                    self.plotDataOld[j + self.topLeftFrame[
                        self.selectedPort]] = self.signalProcessor.boardAdc[
                            channel][length - 1]

                    # draw waveform
                    painter.setPen(Qt.darkGreen)
                    if self.pointPlotMode:
                        painter.drawPoints(QPolygonF(polyline))
                    else:
                        painter.drawPolyline(QPolygonF(polyline))

                elif stype == constants.BoardDigInSignal:
                    # Plot USB interface board digital input signal

                    tStepMsec = 1000.0 / self.sampleRate
                    xScaleFactor = tAxisLength * tStepMsec / self.tScale
                    yScaleFactor = -(2.0 * yAxisLength) / 2.0
                    yOffset = (self.frameList[self.numFramesIndex[
                        self.selectedPort]][j].bottom() +
                               self.frameList[self.numFramesIndex[
                                   self.selectedPort]][j].center().y()) / 2.0

                    # build waveform
                    for i in range(length):
                        polyline[i + 1] = QPointF(
                            xScaleFactor * i + xOffset, yScaleFactor *
                            self.signalProcessor.boardDigIn[channel][i] +
                            yOffset)

                    # join to old waveform
                    if self.tPosition == 0.0:
                        polyline[0] = polyline[1]
                    else:
                        polyline[0] = QPointF(
                            xScaleFactor * -1 + xOffset,
                            yScaleFactor * self.plotDataOld[
                                j + self.topLeftFrame[self.selectedPort]] +
                            yOffset)

                    # save last point in waveform to join to next segment
                    self.plotDataOld[j + self.topLeftFrame[
                        self.selectedPort]] = self.signalProcessor.boardDigIn[
                            channel][length - 1]

                    # draw waveform
                    pen = QPen()
                    pen.setColor(QColor(200, 50, 200))
                    painter.setPen(pen)
                    if self.pointPlotMode:
                        painter.drawPoints(QPolygonF(polyline))
                    else:
                        painter.drawPolyline(QPolygonF(polyline))
                painter.setClipping(False)

        tStepMsec = 1000.0 / self.sampleRate
        self.tPosition += length * tStepMsec
        if self.tPosition >= self.tScale:
            self.tPosition = 0.0
Пример #29
0
class MorphingApp(QMainWindow, Ui_Dialog):
    img1=None
    img2=None
    def __init__(self, parent=None):

        super(MorphingApp, self).__init__(parent)
        self.setupUi(self)
        self.slidervalue=0
        # self.loadimg1()
        self.load_start.clicked.connect(self.loadimg1)
        self.load_end.clicked.connect(self.loadimg2)
        self.alpha.setMaximum(100)
        self.alpha.setMinimum(0)
        self.alpha.setSingleStep(5)
        slidervalue=self.alpha.value()/100.0
        self.alpha_value.setText('%.2f'%slidervalue)
        self.alpha.valueChanged.connect(self.valChangeHandler)
        self.start_image.mousePressEvent=self.image1ClickHandler
        self.end_image.mousePressEvent=self.image2ClickHandler
        self.blending.clicked.connect(self.blendingBtnHandler)
        self.show_triangles.toggled.connect(self.checkboxChangeHandler)
        self.MarkLeft=1
        self.numPoints=0
        self.comfirmedLen=0
        self.fromfileLen=0
        self.leftPoints=[]
        self.rightPoints = []
        self.qp= QPainter()
        self.keyPressEvent=self.backspaceHandler
        self.leftPath=''
        self.rightPath=''
        self.allowbland=0
        self.itemArr=[]
        self.previndex=0
    def checkboxChangeHandler(self):
        try:
            self.draw1()
            self.draw2()
        except Exception as e:
            pass
    def mousePressEvent(self,event):
        if self.img1 == None or self.img2 == None:
            # self.leftPoints = []
            self.MarkLeft = 233
            return
        self.comfirmedLen=min(len(self.rightPoints),len(self.leftPoints))
        self.writePoints()
        try:
            self.draw1()
            self.draw2()
        except Exception as e:
            pass
    def image1ClickHandler(self,event):
        print('%d %d' % (self.fromfileLen, self.comfirmedLen))
        if os.path.exists(self.leftPath + '.png.txt') and os.path.exists(
                self.rightPath + '.png.txt') and self.img1 != None and self.img2 != None:
            self.allowbland = 1
        self.comfirmedLen = len(self.leftPoints)
        if self.MarkLeft==1:
            # save point info
            print('click detect1')
            print(event.localPos())
            print(self.img1)
            if self.img1==None or self.img2 ==None:
                self.leftPoints=[]
                self.MarkLeft = 233
                return
            self.leftPoints.append(event.localPos())
            self.MarkLeft=0
            self.writePoints()
            try:
                self.draw1()
                self.draw2()
            except Exception as e:
                pass

        else:
            pass

    def image2ClickHandler(self,event):
        print('%d %d' % (self.fromfileLen,self.comfirmedLen))
        if os.path.exists(self.leftPath + '.png.txt') and os.path.exists(
                self.rightPath + '.png.txt') and self.img1 != None and self.img2 != None:
            self.allowbland = 1
        self.comfirmedLen=max(len(self.rightPoints),len(self.leftPoints))-1
        if self.MarkLeft ==0:
            print('click detect2')
            print(event.localPos())
            if self.img1==None or self.img2 ==None:
                self.rightPoints=[]
                self.MarkLeft = 233
                return
            self.rightPoints.append(event.localPos())
            self.MarkLeft=1
            self.writePoints()
            try:
                self.draw1()
                self.draw2()
            except Exception as e:
                pass
        else:
            pass
    def backspaceHandler(self,event):
        if self.img1 == None or self.img2 == None:
            return
        print('%d %d'%(len(self.leftPoints),len(self.rightPoints)))
        if not event.key() ==Qt.Key_Backspace:
            return
        print('backspace pressed')
        if self.comfirmedLen==max(len(self.rightPoints),len(self.leftPoints)):
            return
        if len(self.leftPoints)==len(self.rightPoints):
            self.rightPoints=self.rightPoints[0:len(self.rightPoints)-1]
            self.draw2()
            self.MarkLeft=0
            return
        if len(self.leftPoints)>len(self.rightPoints):
            self.leftPoints=self.leftPoints[0:len(self.leftPoints)-1]
            self.draw1()
            self.MarkLeft = 1
            return
    def valChangeHandler(self):
        self.slidervalue=self.alpha.value()/100.0
        index=int(self.slidervalue/0.05)
        if index==self.previndex:
            return

        self.alpha_value.setText('%.2f'%self.slidervalue)
        if len(self.itemArr)!=21:
            return
        self.qp.eraseRect(QRectF(QPointF(0, 0), QPointF(480, 360)))
        newImg=self.itemArr[index]
        # print(index)
        self.imabland = QImage.fromData(newImg)
        self.imabland= QImage(newImg.data, newImg.shape[1], newImg.shape[0], newImg.strides[0], QImage.Format_RGB888);
        self.imabland=self.imabland.scaledToWidth(480-2)
        self.imabland=self.imabland.scaledToHeight(360-2)
        self.imabland=QPixmap.fromImage(self.imabland)
        self.MarkLeft=1
        self.blend_image.scene = QGraphicsScene()  # ???????????
        item = QGraphicsPixmapItem(self.imabland)  # ????????????????
        self.blend_image.scene.addItem(item)  # ??????????scene??
        self.blend_image.setScene(self.blend_image.scene)
    def loadimg1(self):
        self.image1 = QPixmap()
        sz = QSize(720, 540)
        path, _ = QFileDialog.getOpenFileName(self, 'choose image', None, 'Image files(*.jpg *.gif *.png)')
        self.leftPath=path[0:len(path)-4]
        # leftImage = imageio.imread(self.leftPath + '.png')
        # print(leftImage)
        print(self.leftPath)
        with open(path,'rb') as fp:
            img=fp.read()
        self.imageee1 = QImage.fromData(img)
        self.imageee1=self.imageee1.scaledToWidth(480-2)
        self.imageee1=self.imageee1.scaledToHeight(360-2)
        self.img1=self.imageee1

        self.image1=QPixmap.fromImage(self.imageee1)
        self.MarkLeft=1
        self.start_image.scene = QGraphicsScene()  # ???????????
        item = QGraphicsPixmapItem(self.image1)  # ????????????????
        self.start_image.scene.addItem(item)  # ??????????scene??
        self.start_image.setScene(self.start_image.scene)
        if self.img1!=None and self.img2!=None:
            self.loadPoints()


    def loadimg2(self):
        self.image2 = QPixmap()
        path, _ = QFileDialog.getOpenFileName(self, 'choose image', None, 'Image files(*.jpg *.gif *.png)')
        self.rightPath=path[0:len(path)-4]
        with open(path,'rb') as fp:
            img=fp.read()
        self.imageee2 = QImage.fromData(img)
        self.imageee2=self.imageee2.scaledToWidth(480-2)
        self.imageee2=self.imageee2.scaledToHeight(360-2)
        self.img2 = self.imageee2

        self.image2=QPixmap.fromImage(self.imageee2)
        self.end_image.scene = QGraphicsScene()  # ???????????
        item = QGraphicsPixmapItem(self.image2)  # ????????????????
        self.end_image.scene.addItem(item)  # ??????????scene??
        self.MarkLeft=1
        self.end_image.setScene(self.end_image.scene)
        if self.img1!=None and self.img2!=None:
            self.loadPoints()
    # def operatePointsFile(self):
    #     self.numPoints=min(len(self.rightPoints),len(self.leftPoints))
    #     if os.path.exists(self.leftPath+'.txt') and os.path.exists(self.rightPath+'.txt'):
    #         # tris=loadTriangles(self.leftPath+'.txt',self.rightPath+'.txt')
    #         pointL = np.loadtxt(self.leftPath+'.txt', dtype=np.float64)
    #         pointR = np.loadtxt(self.rightPath+'.txt', dtype=np.float64)
    #         self.rightPoints=[]
    #         self.leftPoints=[]
    #         for lp in pointL:
    #             self.leftPoints.append(QPointF(lp[0]/3,lp[1]/3))
    #         for rp in pointR:
    #             self.rightPoints.append(QPointF(rp[0]/3,rp[1]/3))
    #         self.draw1()
    #         self.draw2()
    #         print(self.numPoints)
    #         print(self.rightPoints)
    #     else:
    #         self.writePoints()

    def draw1(self):
        self.qp.eraseRect(QRectF(QPointF(0, 0), QPointF(480, 360)))
        with open(self.leftPath+'.png', 'rb') as fp:
            img = fp.read()
        self.imageee1 = QImage.fromData(img)
        self.imageee1=self.imageee1.scaledToWidth(480-2)
        self.imageee1=self.imageee1.scaledToHeight(360-2)
        self.img1=self.imageee1

        self.qp.begin(self.img1)
        self.qp.setPen(Qt.red)
        # self.qp.eraseRect(QRectF(QPointF(0, 0), QPointF(480, 360)))
        for i in range(0,len(self.leftPoints)):
            if i<self.fromfileLen:
                self.qp.setPen(Qt.red)
            elif i < self.comfirmedLen:
                self.qp.setPen(Qt.blue)
            else:
                self.qp.setPen(Qt.green)
            self.qp.drawEllipse(self.leftPoints[i], 2, 2)
            # self.qp.drawPoint(point)
        if self.show_triangles.isChecked()==True:
            self.qp.setPen(Qt.yellow)
            try:
                tris=loadTrianglesResize(self.leftPath+'.png.txt', self.rightPath+'.png.txt')
            except Exception as e:
                return
            print(len(tris[0]))
            print(self.comfirmedLen)
            for tri in tris[0]:
                tri=tri.vertices
            # print(tri)
                self.qp.drawLine(tri[0][0],tri[0][1],tri[1][0],tri[1][1])
                self.qp.drawLine(tri[0][0], tri[0][1], tri[2][0], tri[2][1])
                self.qp.drawLine(tri[1][0], tri[1][1], tri[2][0], tri[2][1])
        self.qp.end()
        item = QGraphicsPixmapItem(self.image1)  # ????????????????
        self.start_image.scene.addItem(item)  # ??????????scene??
        self.start_image.scene.addPixmap(QPixmap.fromImage(self.img1))
        self.start_image.setScene(self.start_image.scene)
        self.update()
        if os.path.exists(self.leftPath + '.png.txt') and os.path.exists(
                self.rightPath + '.png.txt') and self.img1 != None and self.img2 != None:
            self.allowbland = 1
        # QGraphicsScene.removeItem()
    def draw2(self):
        with open(self.rightPath + '.png', 'rb') as fp:
            img = fp.read()
        self.imageee2 = QImage.fromData(img)
        self.imageee2 = self.imageee2.scaledToWidth(480 - 2)
        self.imageee2 = self.imageee2.scaledToHeight(360 - 2)


        self.img2=self.imageee2

        self.qp.begin(self.img2)
        self.qp.setPen(Qt.green)
        for i in range(0,len(self.rightPoints)):
            if i<self.fromfileLen:
                self.qp.setPen(Qt.red)
            elif i < self.comfirmedLen:
                self.qp.setPen(Qt.blue)
            else:
                self.qp.setPen(Qt.green)
            self.qp.drawEllipse(self.rightPoints[i], 2, 2)
        if self.show_triangles.isChecked() == True:
            self.qp.setPen(Qt.yellow)
            try:
                tris = loadTrianglesResize(self.leftPath + '.png.txt', self.rightPath + '.png.txt')
            except Exception as e:
                return
            for tri in tris[1]:
                tri = tri.vertices
                # print(tri)
                self.qp.drawLine(tri[0][0], tri[0][1], tri[1][0], tri[1][1])
                self.qp.drawLine(tri[0][0], tri[0][1], tri[2][0], tri[2][1])
                self.qp.drawLine(tri[1][0], tri[1][1], tri[2][0], tri[2][1])
        self.qp.end()
        item = QGraphicsPixmapItem(self.image2)  # ????????????????
        self.end_image.scene.addItem(item)  # ??????????scene??
        self.end_image.scene.addPixmap(QPixmap.fromImage(self.img2))
        self.end_image.setScene(self.end_image.scene)
        self.update()
        if os.path.exists(self.leftPath + '.png.txt') and os.path.exists(
                self.rightPath + '.png.txt') and self.img1 != None and self.img2 != None:
            self.allowbland = 1
    def loadPoints(self):
        self.fromfileLen=0
        if os.path.exists(self.leftPath+'.png.txt') and os.path.exists(self.rightPath+'.png.txt'):
            # tris=loadTriangles(self.leftPath+'.txt',self.rightPath+'.txt')
            pointL = np.loadtxt(self.leftPath+'.png.txt', dtype=np.float64)
            pointR = np.loadtxt(self.rightPath+'.png.txt', dtype=np.float64)
            self.rightPoints=[]
            self.leftPoints=[]
            for lp in pointL:
                self.leftPoints.append(QPointF(lp[0]/3,lp[1]/3))
                self.fromfileLen+=1
            for rp in pointR:
                self.rightPoints.append(QPointF(rp[0]/3,rp[1]/3))
            self.comfirmedLen=self.fromfileLen
            print(self.leftPoints)
            print(self.fromfileLen)
            try:
                self.draw1()
                self.draw2()
            except Exception as e:
                pass

            # print(self.numPoints)
            # print(self.rightPoints)
    def writePoints(self):
        self.numPoints=min(len(self.leftPoints),len(self.rightPoints))
        fp1=open(self.leftPath+'.png.txt','w')
        fp2=open(self.rightPath+'.png.txt','w')
        # fp1=open('temp1.txt','w')
        # fp2=open('temp2.txt','w')
        for i in range(0,self.comfirmedLen):
            fp1.write('%.1f %.1f\n'%(self.leftPoints[i].x()*3,self.leftPoints[i].y()*3))
            fp2.write('%.1f %.1f\n' % (self.rightPoints[i].x()*3, self.rightPoints[i].y()*3))
        fp1.close()
        fp2.close()

    def blendingBtnHandler(self):

        t1=time.time()
        # for i in range(5):
        #     p.apply_async(long_time_task, args=(i,))
        # print('Waiting for all subprocesses done...')
        # p.close()
        # p.join()
        print('All subprocesses done.')
        # if os.path.exists(self.leftPath+'.png.txt') and os.path.exists(self.rightPath+'.png.txt') and self.img1!=None and self.img2!=None:
        #     self.allowbland=1
        if self.allowbland==0:
            return
        self.allowbland = 0
        # self.operatePointsFile()
        processPoll = Pool(8)
        resultlist=[]
        self.itemArr=[]
        path1=self.leftPath
        path2=self.rightPath
        for i in range (0,101,5):
            res=processPoll.apply_async(MorphImgxx,args=(path1,path2,i/100.0,))
            # res=self.MorphImg(alpha=i/100.0)
            resultlist.append(res)
            # print(i)
        processPoll.close()
        # print('xxx')
        processPoll.join()
        # print('yyy')
        self.allowbland=0
        for r in resultlist:
            # print(type(r))
            # print(r.get())
            self.itemArr.append(r.get())
        t2=time.time()
        print(t2-t1)
        self.previndex=-1
        self.valChangeHandler()
        # self.MorphImg(alpha=self.slidervalue)
    # def showTriangle(self):

    def MorphImg(self,alpha):
        # self.leftPath='TestData/LeftColor'
        # self.rightPath='TestData/RightColor'
        t1 = time.time()
        out = loadTrianglesResize(self.leftPath+'.png.txt', self.rightPath+'.png.txt')
        t3 = time.time()
        # out = loadTrianglesResize('temp1.txt','temp2.txt')
        # leftImage = imageio.imread(self.leftPath+'.png')
        leftImage = Image.open(self.leftPath + '.png')
        leftImage=leftImage.resize([480,360])
        # leftImage.show()
        leftImage=np.array(leftImage.getdata()).reshape(leftImage.size[1], leftImage.size[0], 3)

        rightImage = Image.open(self.rightPath+'.png')
        rightImage=rightImage.resize([480,360])
        # rightImage.show()
        rightImage=np.array(rightImage.getdata()).reshape(rightImage.size[1], rightImage.size[0], 3)

        morpher = MyMorpher(leftImage, out[0], rightImage, out[1])
        newImg=morpher.getImageAtAlpha(alpha)

        # self.imabland = QImage.fromData(newImg)
        # self.imabland= QImage(newImg.data, newImg.shape[1], newImg.shape[0], newImg.strides[0], QImage.Format_RGB888);
        # self.imabland=self.imabland.scaledToWidth(480-2)
        # self.imabland=self.imabland.scaledToHeight(360-2)
        # self.imabland=QPixmap.fromImage(self.imabland)
        # self.MarkLeft=1
        # self.blend_image.scene = QGraphicsScene()  # ???????????
        # item = QGraphicsPixmapItem(self.imabland)  # ????????????????
        # self.blend_image.scene.addItem(item)  # ??????????scene??
        # self.blend_image.setScene(self.blend_image.scene)

        t2 = time.time()
        print(t2-t1)
        return newImg
Пример #30
0
class App(QMainWindow):
    def __init__(self):
        super(App, self).__init__()

        # set main window attributes
        self.title = 'PROJECTION AR'
        self.left = 300
        self.top = 100
        self.camera = 2

        # offsets
        self.pointerOffsetX = 123
        self.pointerOffsetY = 63
        self.imageOffsetX = 250
        self.imageOffsetY = 200
        self.is_secondWindow = True
        self.secondTransparncy = True

        self.sizeObject = QtWidgets.QDesktopWidget().screenGeometry(-1)
        self.bold_font = QtGui.QFont("Times", 10, QtGui.QFont.Bold)
        self.secondaryWindow = ProjectorWindow(None)
        self.secondaryWindow_final = ProjectorWindow(self.secondTransparncy)
        self.preProcessingTool = PreProcessImages()
        self.PreProcessImagesV2Tool = PreProcessImagesV2()

        # Flags
        self.video_started = False
        self.pencil_started = False
        self.erase_flag = False

        # extra parameters
        self.timer = QTimer()
        self.cap = None
        self.filePath = None
        self.cursor = None

        # variable for annotation
        self.draw_pixmap = QPixmap(self.sizeObject.width() - self.imageOffsetX,
                                   self.sizeObject.height() - self.imageOffsetY)
        self.draw_pixmap.fill(Qt.transparent)
        self.painter = QPainter(self.draw_pixmap)
        self.annotation_label = QLabel(self)
        self.videoLabel = QLabel("Start Video", self)

        # custom drawing variables
        self.drawing = False
        self.brushSize = 6
        self.clear_size = 20
        self.brushColor = Qt.green
        self.lastPoint = QPoint()

        # cursor setting
        self.editCursor = QCursor(QPixmap("./assets/icons/cursor/icons8-edit-24.png"))
        self.eraseCursor = QCursor(QPixmap("./assets/icons/cursor/icons8-erase-28.png"))

        # side Button
        self.sideStartButton = QtWidgets.QToolButton(self)
        self.sideDrawButton = QtWidgets.QToolButton(self)
        self.sideEraseButton = QtWidgets.QToolButton(self)
        self.sidePauseButton = QtWidgets.QToolButton(self)
        self.sideExitButton = QtWidgets.QToolButton(self)

        # menu bar for file
        self.createMenu()
        # Build UI
        self.buildUI()

    def buildUI(self):
        """

        """
        # window location and title
        self.setWindowTitle(self.title)
        # self.setGeometry(self.left, self.top, self.width(), self.height())
        self.setWindowIcon(QIcon("./assets/icons/icon-green.png"))
        self.showMaximized()
        sideButtonSize = QtCore.QSize(85, 55)

        # side Button process
        self.sideStartButton.setToolButtonStyle(Qt.ToolButtonIconOnly)
        self.sideStartButton.setIcon(QIcon('./assets/icons/SideButton/sidePlayIcon.png'))
        self.sideStartButton.released.connect(self.startVideo)
        self.sideStartButton.setIconSize(sideButtonSize)

        self.sideDrawButton.setToolButtonStyle(Qt.ToolButtonIconOnly)
        self.sideDrawButton.setIcon(QIcon('./assets/icons/SideButton/sideEditIcon.png'))
        self.sideDrawButton.released.connect(self.drawUsingPencil)
        self.sideDrawButton.setIconSize(sideButtonSize)

        self.sideEraseButton.setToolButtonStyle(Qt.ToolButtonIconOnly)
        self.sideEraseButton.setIcon(QIcon('./assets/icons/SideButton/sideEraseIcon.png'))
        self.sideEraseButton.released.connect(self.eraseDrawing)
        self.sideEraseButton.setIconSize(sideButtonSize)

        self.sidePauseButton.setToolButtonStyle(Qt.ToolButtonIconOnly)
        self.sidePauseButton.setIcon(QIcon('./assets/icons/SideButton/sidePauseIcon.png'))
        self.sidePauseButton.released.connect(self.pauseDrawing)
        self.sidePauseButton.setIconSize(sideButtonSize)

        self.sideExitButton.setToolButtonStyle(Qt.ToolButtonIconOnly)
        self.sideExitButton.setIcon(QIcon('./assets/icons/SideButton/sideExitIcon.png'))
        self.sideExitButton.released.connect(self.exitApp)
        self.sideExitButton.setIconSize(sideButtonSize)

        # group the UI components
        buttonGroup = self.groupcomponents()

        #  final layout.. all components together
        self.finalUi(buttonGroup)

        # show the UI
        self.show()
        # create projector window
        self.secondaryWindow.show()

    def createMenu(self):
        """  Create and add menu items into menu bar
        """
        # list of menu bars
        self.fileMenuBar = self.menuBar().addMenu("&File")
        self.editMenuBar = self.menuBar().addMenu("&Edit")
        self.brushSizeBar = self.menuBar().addMenu("&Pencil Size")
        self.eraserSizeBar = self.menuBar().addMenu("&Eraser Size")

        # file menu Bar components
        self.startVideoButton = self.fileMenuBar.addAction("Strat Video")
        self.actionExit = self.fileMenuBar.addAction("Exit")
        self.actionOpen = self.fileMenuBar.addAction("Open File")

        # edit menu bar components
        self.pencilButton = self.editMenuBar.addAction("Draw")
        self.stopVideoButton = self.editMenuBar.addAction("Pause")
        self.eraseButton = self.editMenuBar.addAction("Erase")
        self.lassoButton = self.editMenuBar.addAction("Lasso")
        self.rectangleButton = self.editMenuBar.addAction("Select")

        # Pencil tool
        self.pencilButton.setIcon(QIcon("./assets/icons/icons8-pencil-50.png"))
        self.pencilButton.triggered.connect(self.drawUsingPencil)

        # rectangle tool
        self.rectangleButton.setIcon(QIcon("./assets/icons/icons8-rectangle-50.png"))

        # Erase tool
        self.eraseButton.setShortcut("Ctrl+X")
        self.eraseButton.setIcon(QIcon("./assets/icons/icons8-eraser.png"))
        self.eraseButton.triggered.connect(self.eraseDrawing)

        # lasso tool
        self.lassoButton.setShortcut("Ctrl+L")
        self.lassoButton.setIcon(QIcon("./assets/icons/icons8-lasso-tool-48.png"))

        # Stop Video button
        self.stopVideoButton.setShortcut('Ctrl+P')
        self.stopVideoButton.setIcon(QIcon("./assets/icons/icons8-stop-squared-50.png"))
        self.stopVideoButton.triggered.connect(self.pauseDrawing)

        # start button
        self.startVideoButton.setShortcut('Ctrl+S')
        self.startVideoButton.setIcon(QIcon("./assets/icons/icons8-start-50.png"))
        self.startVideoButton.triggered.connect(self.startVideo)

        # create menu bar to put some menu Options
        self.actionOpen.setShortcut('Ctrl+O')
        self.actionOpen.setIcon(QIcon("./assets/icons/open_file_icon.png"))
        self.actionOpen.triggered.connect(self.openFileNamesDialog)

        # add exit option to exit the program(keyboard shortcut ctrl+q)
        self.actionExit.setShortcut('Ctrl+Q')
        self.actionExit.setIcon(QIcon("./assets/icons/icons8-exit-50.png"))
        self.actionExit.triggered.connect(self.exitApp)

        # Pencil size menu
        self.threepxActionSize = self.brushSizeBar.addAction("3px")
        self.threepxActionSize.triggered.connect(lambda: self.changePencilSize(3))
        self.threepxActionSize.setIcon(QIcon("./assets/icons/penSize/px3.png"))

        self.fivepxActionSize = self.brushSizeBar.addAction("5px")
        self.fivepxActionSize.triggered.connect(lambda: self.changePencilSize(5))
        self.fivepxActionSize.setIcon(QIcon("./assets/icons/penSize/px5.png"))

        self.sevenpxActionSize = self.brushSizeBar.addAction("7px")
        self.sevenpxActionSize.triggered.connect(lambda: self.changePencilSize(7))
        self.sevenpxActionSize.setIcon(QIcon("./assets/icons/penSize/px7.png"))

        self.ninepxActionSize = self.brushSizeBar.addAction("9px")
        self.ninepxActionSize.triggered.connect(lambda: self.changePencilSize(9))
        self.ninepxActionSize.setIcon(QIcon("./assets/icons/penSize/px9.png"))

        # Eraser size menu
        self.erase10ActionSize = self.eraserSizeBar.addAction("10px")
        self.erase10ActionSize.triggered.connect(lambda: self.changeEraserSize(10))
        self.erase10ActionSize.setIcon(QIcon("./assets/icons/penSize/px3.png"))

        self.erase20ActionSize = self.eraserSizeBar.addAction("20px")
        self.erase20ActionSize.triggered.connect(lambda: self.changeEraserSize(20))
        self.erase20ActionSize.setIcon(QIcon("./assets/icons/penSize/px5.png"))

        self.erase30ActionSize = self.eraserSizeBar.addAction("30px")
        self.erase30ActionSize.triggered.connect(lambda: self.changeEraserSize(30))
        self.erase30ActionSize.setIcon(QIcon("./assets/icons/penSize/px7.png"))

        self.erase40ActionSize = self.eraserSizeBar.addAction("40px")
        self.erase40ActionSize.triggered.connect(lambda: self.changeEraserSize(40))
        self.erase40ActionSize.setIcon(QIcon("./assets/icons/penSize/px9.png"))

    def groupcomponents(self):
        """

        """
        # button group box
        toolsButtonGroupBox = QGroupBox("Tools")
        toolsButtonGroupBox.setFixedWidth(100)
        toolsButtonGroupBox.setMaximumHeight(450)

        # vertical layout
        vLayout = QVBoxLayout()
        vLayout.setSpacing(0)
        vLayout.setContentsMargins(1, 0, 0, 1)

        vLayout.addWidget(self.sideStartButton)
        vLayout.addWidget(self.sideDrawButton)
        vLayout.addWidget(self.sideEraseButton)
        vLayout.addWidget(self.sidePauseButton)
        vLayout.addWidget(self.sideExitButton)

        # set the layout to the button group
        toolsButtonGroupBox.setLayout(vLayout)
        return toolsButtonGroupBox

    def finalUi(self, buttonGroup):
        """

        """
        # button group box
        colorVBox = QGroupBox("Colors")
        colorVBox.setFixedWidth(45)
        colorVBox.setMaximumHeight(1000)

        # vertical layout
        colorVLayout = QVBoxLayout()
        colorVLayout.setSpacing(0)
        colorVLayout.setContentsMargins(0, 0, 0, 0)
        self.add_palette_buttons(colorVLayout)

        # set the layout to the button group
        colorVBox.setLayout(colorVLayout)

        gridLayout = QGridLayout()

        # add widgets to the layout
        gridLayout.addWidget(buttonGroup, 0, 0)
        gridLayout.addWidget(self.videoLabel, 0, 1)
        gridLayout.addWidget(self.annotation_label, 0, 1)
        gridLayout.addWidget(colorVBox, 0, 2)

        # widget for the general layout
        wid = QtWidgets.QWidget(self)
        self.setCentralWidget(wid)
        wid.setLayout(gridLayout)

    def add_palette_buttons(self, layout):
        for c in COLORS:
            b = QPaletteButton(c)
            b.pressed.connect(lambda c=c: self.set_pen_color(c))
            layout.addWidget(b)

    def set_pen_color(self, c):
        self.brushColor = QtGui.QColor(c)

    def startVideo(self):
        """  This will start the camera feed """
        try:
            # if timer is stopped
            if not self.timer.isActive():
                # create video capture  and start timer
                self.cap = cv2.VideoCapture(self.camera)

                self.videoLabel.setText("Connecting to camera")
                self.video_started = True
                # self.change_button_status()
                # set timer timeout callback function
                self.timer.timeout.connect(self.displayImage)
                self.timer.start(100)

        except Exception as ex:
            print(ex)

    def pauseDrawing(self):
        """ stop both plotting and erasing """

        if self.timer.isActive():
            self.drawing = False
            self.erase_flag = False
            QApplication.setOverrideCursor(Qt.UpArrowCursor)

        else:
            self.videoLabel.setText('Camera is not started')

    def displayImage(self):
        """ This function read the camera and display the image
        """
        try:
            # read form camera
            ret, image = self.cap.read()
            raw_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            wrapped = self.preProcessingTool.fourPointTransform(raw_image)

            #  recreate the second window
            if self.is_secondWindow:
                self.secondaryWindow.close()
                self.secondaryWindow_final.show()
                self.is_secondWindow = False

            wrapped = cv2.resize(wrapped, (
            self.sizeObject.width() - self.imageOffsetX, self.sizeObject.height() - self.imageOffsetY))
            # get image info
            height, width, channel = wrapped.shape
            step = channel * width

            # create QImage and show it onto the label
            qImg = QImage(wrapped.data, width, height, step, QImage.Format_RGB888)
            self.videoLabel.setPixmap(QPixmap.fromImage(qImg))

        except Exception as exc:
            print(exc)

    def drawUsingPencil(self):

        # change the cursor to pencil
        if self.video_started:
            self.startVideoButton.setEnabled(False)
            QApplication.setOverrideCursor(self.editCursor)
            self.drawing = True

    def eraseDrawing(self):
        if self.video_started:
            self.erase_flag = True
            QApplication.setOverrideCursor(self.eraseCursor)
            self.drawing = False

    # pencil size
    def changePencilSize(self, penSize):
        self.brushSize = penSize

    # Eraser Size
    def changeEraserSize(self, brushSize):
        self.clear_size = brushSize

    # open file to load image
    def openFileNamesDialog(self):
        options = QtWidgets.QFileDialog.Options()
        options |= QtWidgets.QFileDialog.DontUseNativeDialog
        files, _ = QtWidgets.QFileDialog.getOpenFileNames(
            self, "QtWidgets.QFileDialog.getOpenFileNames()",
            "", "png Files (*.png)", options=options)
        if files:
            self.filePath = files[0]
            # go ahead and read the file if necessary

    def pixmapToArray(self, pixmap):
        # Get the size of the current pixmap
        size = pixmap.size()
        h = size.width()
        w = size.height()
        channels_count = 4

        # Get the QImage Item and convert it to a byte string
        qimg = pixmap.toImage()
        s = qimg.bits().asstring(w * h * channels_count)
        img = np.fromstring(s, dtype=np.uint8).reshape((w, h, channels_count))

        return img

    # compute homography
    def getHomography(self):
        K_cam = np.array([[1198.370216, 0.0000, 558.550289],
                          [0, 1217.432399, 303.112548],
                          [0, 0, 1]])

        K_proj = np.array([[1682.580944, 0.0000, 377.944090],
                           [0, 1592.522801, 259.182582],
                           [0, 0, 1]])

        T = np.array([-100.121874, -35.443266, 86.250559])

        R = np.array([[9.9753117267249736e-001, 2.4600138893772598e-002, 6.5775319938706903e-002],
                      [-2.5830952403295852e-002, 9.9950555626341375e-001, 1.7927768865717380e-002],
                      [-6.5301772139589140e-002, -1.9582547458668855e-002, 9.9767339464899940e-001]])
        H = K_proj * R * (np.linalg.inv(K_cam))

        return H

    # apply image transform
    def getHomographyTransform(self, H, image):

        width = image.shape[0]
        height = image.shape[1]
        transformedImage = cv2.warpPerspective(image, H, (height, width))
        return transformedImage

    # normal application exit
    def exitApp(self):
        if self.timer.isActive():
            self.cap.release()
        sys.exit(0)

    # add different events
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton and self.video_started:
            self.lastPoint = event.pos()
            self.lastPoint.setX(self.lastPoint.x() - self.pointerOffsetX)
            self.lastPoint.setY(self.lastPoint.y() - self.pointerOffsetY)

    # mouseMoveEvent(sefl, event)
    # Works: yes
    # TODO:
    #   - rise the annotation image as size(secondScreen.width, secondScreen.height)
    #   - resize secondary image to fit the screen
    def mouseMoveEvent(self, event):

        if (event.buttons() & Qt.LeftButton) and self.rect().contains(event.pos()):
            self.painter.setOpacity(0.9)
            currentPoint = event.pos()
            currentPoint.setX(currentPoint.x() - self.pointerOffsetX)
            currentPoint.setY(currentPoint.y() - self.pointerOffsetY)

            # drawing annotation
            if self.drawing:
                self.painter.setPen(QPen(self.brushColor, self.brushSize, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
                self.painter.drawLine(self.lastPoint, currentPoint)

            # erasing the annotation
            elif self.erase_flag:
                r = QRect(QPoint(), self.clear_size * QSize())
                r.moveCenter(currentPoint)
                self.painter.save()

                self.painter.setCompositionMode(QtGui.QPainter.CompositionMode_Clear)
                self.painter.eraseRect(r)
                self.painter.restore()

            # set drawn annotation to the label and save last point
            self.annotation_label.setPixmap(self.draw_pixmap)
            self.lastPoint = currentPoint

            # update the paint in both screens
            scaled_pixmap = self.draw_pixmap.scaled(self.secondaryWindow_final.secWidth,
                                                    self.secondaryWindow_final.secHeight,
                                                    Qt.IgnoreAspectRatio, Qt.FastTransformation)

            # apply homography transform
            # numpyImage = self.pixmapToArray(QPixmap(scaled_pixmap))
            # H = self.getHomography()
            # hImage = self.getHomographyTransform(H, numpyImage)
            #
            # # display the image
            # # secImage = QPixmap.fromImage(hTransformed)
            # image = QtGui.QImage(hImage, hImage.shape[1], hImage.shape[0], hImage.shape[1] * 3,QtGui.QImage.Format_RGB888)
            # pix = QtGui.QPixmap(image)
            self.secondaryWindow_final.label.setPixmap(scaled_pixmap)
            # self.secondaryWindow_final.label.resize(self.secondaryWindow_final.width(), self.secondaryWindow_final.height())
            self.update()

    # highlight
    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton and self.video_started:
            # self.drawing = False
            self.save()

    def save(self):
        try:
            filePath = 'annotation.png'
            self.draw_pixmap.save(filePath)
        except Exception as ex:
            print(ex)
Пример #31
0
 def paintEvent(self, event):
     p = QPainter(self)
     p.eraseRect(event.rect())
     for i in range(0, 10):
         self.drawDisplaySlot888(p, i)
     p.end()