Exemple #1
0
    def paintEvent(self, event):
        rect = QRect(10, 20, 80, 60)

        path = QPainterPath()
        path.moveTo(20, 80)
        path.lineTo(20, 30)
        path.cubicTo(80, 0, 50, 50, 80, 80)

        startAngle = 30 * 16
        arcLength = 120 * 16

        painter = QPainter(self)
        painter.setPen(self.pen)
        painter.setBrush(self.brush)
        if self.antialiased:
            painter.setRenderHint(QPainter.Antialiasing)

        for x in range(0, self.width(), 100):
            for y in range(0, self.height(), 100):
                painter.save()
                painter.translate(x, y)
                if self.transformed:
                    painter.translate(50, 50)
                    painter.rotate(60.0)
                    painter.scale(0.6, 0.9)
                    painter.translate(-50, -50)

                if self.shape == RenderArea.Line:
                    painter.drawLine(rect.bottomLeft(), rect.topRight())
                elif self.shape == RenderArea.Points:
                    painter.drawPoints(RenderArea.points)
                elif self.shape == RenderArea.Polyline:
                    painter.drawPolyline(RenderArea.points)
                elif self.shape == RenderArea.Polygon:
                    painter.drawPolygon(RenderArea.points)
                elif self.shape == RenderArea.Rect:
                    painter.drawRect(rect)
                elif self.shape == RenderArea.RoundedRect:
                    painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
                elif self.shape == RenderArea.Ellipse:
                    painter.drawEllipse(rect)
                elif self.shape == RenderArea.Arc:
                    painter.drawArc(rect, startAngle, arcLength)
                elif self.shape == RenderArea.Chord:
                    painter.drawChord(rect, startAngle, arcLength)
                elif self.shape == RenderArea.Pie:
                    painter.drawPie(rect, startAngle, arcLength)
                elif self.shape == RenderArea.Path:
                    painter.drawPath(path)
                elif self.shape == RenderArea.Text:
                    painter.drawText(rect, Qt.AlignCenter,
                                     "PyQt by\nRiverbank Computing")
                elif self.shape == RenderArea.Pixmap:
                    painter.drawPixmap(10, 10, self.pixmap)

                painter.restore()

        painter.setPen(self.palette().dark().color())
        painter.setBrush(Qt.NoBrush)
        painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
Exemple #2
0
    def paintEvent(self, event):
        rect = QRect(10, 20, 80, 60)

        path = QPainterPath()
        path.moveTo(20, 80)
        path.lineTo(20, 30)
        path.cubicTo(80, 0, 50, 50, 80, 80)

        startAngle = 30 * 16
        arcLength = 120 * 16

        painter = QPainter(self)
        painter.setPen(self.pen)
        painter.setBrush(self.brush)
        if self.antialiased:
            painter.setRenderHint(QPainter.Antialiasing)

        for x in range(0, self.width(), 100):
            for y in range(0, self.height(), 100):
                painter.save()
                painter.translate(x, y)
                if self.transformed:
                    painter.translate(50, 50)
                    painter.rotate(60.0)
                    painter.scale(0.6, 0.9)
                    painter.translate(-50, -50)

                if self.shape == RenderArea.Line:
                    painter.drawLine(rect.bottomLeft(), rect.topRight())
                elif self.shape == RenderArea.Points:
                    painter.drawPoints(RenderArea.points)
                elif self.shape == RenderArea.Polyline:
                    painter.drawPolyline(RenderArea.points)
                elif self.shape == RenderArea.Polygon:
                    painter.drawPolygon(RenderArea.points)
                elif self.shape == RenderArea.Rect:
                    painter.drawRect(rect)
                elif self.shape == RenderArea.RoundedRect:
                    painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
                elif self.shape == RenderArea.Ellipse:
                    painter.drawEllipse(rect)
                elif self.shape == RenderArea.Arc:
                    painter.drawArc(rect, startAngle, arcLength)
                elif self.shape == RenderArea.Chord:
                    painter.drawChord(rect, startAngle, arcLength)
                elif self.shape == RenderArea.Pie:
                    painter.drawPie(rect, startAngle, arcLength)
                elif self.shape == RenderArea.Path:
                    painter.drawPath(path)
                elif self.shape == RenderArea.Text:
                    painter.drawText(rect, Qt.AlignCenter,
                            "PyQt by\nRiverbank Computing")
                elif self.shape == RenderArea.Pixmap:
                    painter.drawPixmap(10, 10, self.pixmap)

                painter.restore()

        painter.setPen(self.palette().dark().color())
        painter.setBrush(Qt.NoBrush)
        painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
Exemple #3
0
    def paintEvent(self, event):
        painter = QPainter(self)

        # complete graph ratio
        scale, translation = self._get_scale_translation()

        if self.need_draw_grid:
            self.draw_grid(scale, translation)

        painter.drawPixmap(QPoint(), self.pixmap)

        ############ EXTERIOR #################################
        painter.setPen(self.external_contour_pen)
        exterior_coords_on_screen = [
            QPoint(*tuple(p * scale + translation))
            for p in self.current_polygon_exterior
        ]
        painter.drawPolyline(QPolygon(exterior_coords_on_screen))

        ############ INTERIOR #################################
        painter.setPen(self.internal_contour_pen)
        interior_coords_list = []
        for current_polygon_interior in self.current_polygon_interiors:
            interior_coords_on_screen = [
                QPoint(*tuple(p * scale + translation))
                for p in current_polygon_interior
            ]
            painter.drawPolyline(QPolygon(interior_coords_on_screen))
            interior_coords_list.append(interior_coords_on_screen)

        ####################### Points of each point ##########
        # Draw selected Point in different color
        if self.current_selected_tuple is not None and self.current_selected_tuple[
                0] == 'exterior':
            exterior_coords_on_screen = self.draw_exterior_selected_point(
                exterior_coords_on_screen, painter)

        if self.current_selected_tuple is not None and self.current_selected_tuple[
                0] == 'interior':
            interior_coords_list = self.draw_interior_selected_point(
                interior_coords_list, painter)

        painter.setPen(self.external_point_pen)
        painter.drawPoints(QPolygon(exterior_coords_on_screen))

        painter.setPen(self.internal_point_pen)
        for interior_coord in interior_coords_list:
            painter.drawPoints(QPolygon(interior_coord))

        ###################### Each tile in the solution ###############
        if self.current_best_solution is not None:
            self.draw_solution(painter)
 def paintEvent(self, e):
     QLabel.paintEvent(self, e)
     qp = QPainter(self)
     qp.setRenderHint(QPainter.Antialiasing)
     for color in [Qt.red, Qt.blue, Qt.green]:
         pen = QPen(color, 5)
         brush = QBrush(color)
         qp.setPen(pen)
         qp.setBrush(brush)
         for point in self.points:
             qp.drawPoints(
                 QPolygon([
                     x['point'] for x in self.points if x['color'] == color
                 ]))
Exemple #5
0
    def paintEvent(self, QPaintEvent):
        p = QPainter(self)
        p.setPen(self.pen)
        p.setBrush(self.brush)

        rect = QRect(50, 100, 300, 200)
        points = [
            QPoint(150, 100),
            QPoint(300, 150),
            QPoint(350, 250),
            QPoint(100, 300)
        ]
        startAngle = 30 * 16
        spanAngle = 120 * 16

        path = QPainterPath()
        path.addRect(150, 150, 100, 100)
        path.moveTo(100, 100)
        path.cubicTo(300, 100, 200, 200, 300, 300)
        path.cubicTo(100, 300, 200, 200, 100, 100)

        if self.shape == "Line":
            p.drawLine(rect.topLeft(), rect.bottomRight())
        elif self.shape == "Rectangle":
            p.drawRect(rect)
        elif self.shape == 'Rounded Rectangle':
            p.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
        elif self.shape == "Ellipse":
            p.drawEllipse(rect)
        elif self.shape == "Polygon":
            p.drawPolygon(QPolygon(points), Qt.WindingFill)
        elif self.shape == "Polyline":
            p.drawPolyline(QPolygon(points))
        elif self.shape == "Points":
            p.drawPoints(QPolygon(points))
        elif self.shape == "Pie":
            p.drawPie(rect, startAngle, spanAngle)
        elif self.shape == "Arc":
            p.drawArc(rect, startAngle, spanAngle)
        elif self.shape == "Chord":
            p.drawChord(rect, startAngle, spanAngle)
        elif self.shape == "Path":
            p.drawPath(path)
        elif self.shape == "Text":
            p.drawText(rect, Qt.AlignCenter, "Hello Qt!")
        elif self.shape == "Pixmap":
            p.drawPixmap(150, 150, QPixmap("images/qt-logo.png"))
    def paintEvent(self, event):
        pp = QPainter(self.pix)
        # pp.setPen(Qt.red)
        pp.setPen(QPen(Qt.red, 20))

        pp.drawArc(0, 0, 100, 100, 0, 45 * 16)
        # 根据鼠标指针前后两个位置绘制直线
        pp.drawPoints(self.lastPoint, self.endPoint)
        # pp.drawArc(0, 0, self.lastPoint, self.endPoint, 0, 360 * 16)

        # pp.drawLine(self.lastPoint, self.endPoint)
        # 让前一个坐标值等于后一个坐标值,
        # 这样就能实现画出连续的线
        self.lastPoint = self.endPoint
        painter = QPainter(self)
        painter.drawPixmap(0, 0, self.pix)

        self.label_29.setPixmap(self.pix)
Exemple #7
0
    def set_pixels(self):
        painter = QPainter(self.pixmap())
        self.clear_background(painter)

        painter.setPen(Qt.white)

        size_screen_ram = 8192  # self.screen_width * self.screen_height / 16

        x = y = 0
        points = []
        self.request_screen_memory.emit()
        for i in range(size_screen_ram):
            word = self.bits[i * 16:(i + 1) * 16]
            for bit in word:
                x += 1
                if x == self.screen_width:
                    x = 0
                    y += 1
                if bit:
                    points.append(QPoint(x, y))
                    # painter.drawPoint(x, y)
        painter.drawPoints(QPolygon(points))
        painter.end()
        self.update()
Exemple #8
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
Exemple #9
0
class QtRenderer(Renderer):
    """An implementation of :class:`~renderer.Renderer` for PyQt5.
       
       This renderer will draw on any `QPaintDevice`
    """
    def __init__(self, paint_device):
        """Creates a new renderer based on a QPaintDevice pd"""
        self._grid_pen = QPen(QColor(0x808080))
        self._grid_pen.setStyle(Qt.DashLine)
        self._painter = None
        Renderer.__init__(self, paint_device)

    def set_canvas(self, canvas):
        """Tell the renderer to draw on canvas
        The type of canvas is implementation-dependent"""
        if self._painter is not None:
            self._painter.restore()
            self._painter.restore()
            self._painter.end()
        
        self._paintdevice = canvas
        self._painter = QPainter(canvas)
        self._painter.setRenderHint(QPainter.Antialiasing)

        # invert the y axis
        self._painter.scale(1,-1)
        self._painter.translate(0,-canvas.height())

        Renderer.set_canvas(self,canvas)

    def _get_canvas_size(self,pd):
        """Get the canvas size tuple (width,height)"""
        return (pd.width(), pd.height())

    def push_state(self):
        """Store the current state on the stack.
        Current state includes default pose, pen and brush"""
        ### FIXME store things
        self._painter.save()

    def pop_state(self):
        """Restore the last saved state from the stack
        The state includes default pose, pen and brush"""
        ### FIXME store things
        self._painter.restore()

    def _calculate_bounds(self):
        transform = self._painter.worldTransform().inverted()[0]
        xs,ys = zip(
                    transform.map(0.0,0.0),
                    transform.map(0.0,float(self.size[1])),
                    transform.map(float(self.size[0]),float(self.size[1])),
                    transform.map(float(self.size[0]),0.0)
                    )

        self._bounds = (min(xs), min(ys), max(xs), max(ys))

    def _draw_grid(self):
        self.reset_pose()
        self._painter.setPen(self._grid_pen)
        xmin, ymin, xmax, ymax = self._bounds

        # Determine min/max x & y line indices:
        x_ticks = (int(xmin//self._grid_spacing), int(xmax//self._grid_spacing + 1))
        y_ticks = (int(ymin//self._grid_spacing), int(ymax//self._grid_spacing + 1))

        self._painter.drawLines(
            [QLineF(xmin, i * self._grid_spacing,
                    xmax, i * self._grid_spacing)
                for i in range(*y_ticks)])
        self._painter.drawLines(
            [QLineF(i * self._grid_spacing, ymin,
                    i * self._grid_spacing, ymax)
                for i in range(*x_ticks)])

    def scale(self, factor):
        """Scale drawing operations by factor
        To be implemented in subclasses."""
        self._painter.scale(factor,factor)

    def rotate(self, angle):
        """Rotate canvas by angle (in radians)
        To be implemented in subclasses."""
        self._painter.rotate(degrees(angle))

    def translate(self, dx, dy):
        """Translate canvas by dx, dy
        To be implemented in subclasses."""
        self._painter.translate(dx,dy)

    def clear_screen(self):
        """Erases the current screen with a white brush"""
        self._painter.save()
        self._painter.resetTransform()
        self.set_pen(0xFFFFFF)
        self.set_brush(0xFFFFFF)
        self.draw_rectangle(0,0,self.size[0],self.size[1])
        self._painter.restore()
        Renderer.clear_screen(self)

    @staticmethod
    def __qcolor(color):
        """Returns qcolor for a given ARGB color"""
        c = QColor(color)
        if color > 0xFFFFFF:
            c.setAlpha((color >> 24) & 0xFF)
        return c

    def set_pen(self,color=0, thickness=0):
        """Sets the line color and thickness.
        Color is interpreted as 0xAARRGGBB."""
        if color is None:
            self._painter.setPen(Qt.NoPen)
        else:
            self._painter.setPen(QPen(self.__qcolor(color),thickness))

    def set_brush(self,color):
        """Sets the fill color.
        Color is interpreted as 0xAARRGGBB."""
        if color is None:
            self._painter.setBrush(Qt.NoBrush)
        else:
            self._painter.setBrush(self.__qcolor(color))

    def draw_polygon(self,points):
        """Draws a polygon.
        Expects a list of points as a list of tuples or as a numpy array."""
        self._painter.drawPolygon(QPolygonF([QPointF(*point[:2]) for point in points]))

    def draw_ellipse(self, cx, cy, ra, rb = None):
        """Draws an ellipse."""
        if rb is None:
            rb = ra
        self._painter.drawEllipse(QRectF(cx-ra,cy-ra,2*ra,2*rb))

    def draw_rectangle(self, x, y, w, h):
        """Draws a rectangle."""
        self._painter.drawRect(QRectF(x,y,w,h))

    def draw_text(self, text, x, y, bgcolor = 0):
        """Draws a text string at the defined position."""
        pass

    def draw_line(self, x1, y1, x2, y2):
        """Draws a line using the current pen from (x1,y1) to (x2,y2)"""
        self._painter.drawLine(QLineF(x1,y1,x2,y2))
        
    def draw_point(self,x,y):
        """Draw a single point using the current pen at (x,y)"""
        self._painter.drawPoint(QPointF(x,y))
        
    def draw_points(self,points):
        """Draw a set of points, given as [(x,y)], using the current pen"""
        self._painter.drawPoints(QPolygonF([QPointF(x,y) for x,y in points]))
Exemple #10
0
class AniState:
    """Wrapper class around QPainter to ease its usage."""
    def __init__(self, widget, frame, time, dt, center=False):
        self._painter = QPainter(widget)
        self._painter.setRenderHint(QPainter.Antialiasing, True)
        if center:
            self._painter.translate(widget.width() / 2, widget.height() / 2)

        self.width = widget.width()
        self.height = widget.height()
        self.frame = frame
        self.time = time
        self.dt = dt

    def color(self, value):
        """
        Sets the border color. The input value might be ``None`` to use
        no border, a tuple consisting of (r, g, b, [a]), a string or an
        integer representing the color, or a QColor/QPen itself.
        """
        width = self._painter.pen().widthF()
        if value is None:
            self._painter.setPen(Qt.NoPen)
        elif isinstance(value, tuple):
            self._painter.setPen(QPen(QColor(*value), width))
        elif isinstance(value, (str, int)):
            self._painter.setPen(QPen(QColor(value), width))
        elif isinstance(value, QColor):
            self._painter.setPen(QPen(value, width))
        elif isinstance(value, QPen):
            self._painter.setPen(value)
        return self

    def fill(self, value):
        """
        Sets the fill color. The input value might be ``None`` to use
        no fill, a tuple consisting of (r, g, b, [a]), a string or an
        integer representing the color, or a QColor/QBrush itself.
        """
        if value is None:
            self._painter.setBrush(Qt.NoBrush)
        elif isinstance(value, tuple):
            self._painter.setBrush(QBrush(QColor(*value)))
        elif isinstance(value, (str, int)):
            self._painter.setBrush(QBrush(QColor(value)))
        elif isinstance(value, QColor):
            self._painter.setBrush(QBrush(value))
        elif isinstance(value, QBrush):
            self._painter.setBrush(value)
        return self

    def size(self, size):
        """
        Sets the size for lines and points.
        """
        pen = self._painter.pen()
        pen.setWidthF(size)
        self._painter.setPen(pen)
        return self

    def line(self, x1, y1, x2=None, y2=None):
        """
        Draws a line between the input positions.

        If list/tuples are given as the first two arguments, they should
        consist of two elements representing elements in a position vector.
        """
        if isinstance(x1, (tuple, list)):
            x2 = y1
            x1, y1 = x1
        if isinstance(x2, (tuple, list)):
            x2, y2 = x2
        self._painter.drawLine(x1, y1, x2, y2)
        return self

    def point(self, x, y=None):
        """
        Draws a single point.

        If a list/tuple is supplied as the first argument, it should
        consist of two elements representing elements in a position vector.
        """
        if isinstance(x, (tuple, list)):
            x, y = x
        self._painter.drawPoint(x, y)
        return self

    def points(self, values):
        """
        Draws a series of points. If the first element of the list of
        values is a list/tuple, then the following must be the same type.
        """
        assert len(values) % 2 == 0
        if isinstance(values[0], (tuple, list)):
            self._painter.drawPoints(*[QPointF(x, y) for x, y, in values])
        else:
            self._painter.drawPoints(*[QPointF(values[i], values[i + 1])
                                       for i in range(0, len(values), 2)])

    def lines(self, values, closed=False):
        """
        Draws a series of connected lines. If the first element of the list
        of values is a list/tuple, then the following must be the same type.

        If ``closed``, the first point will be connected to the last.
        """
        assert len(values) > 4 and len(values) % 2 == 0
        if isinstance(values[0], (tuple, list)):
            self._painter.drawLines(*[
                QLineF(
                    values[i - 1][0], values[i - 1][1],
                    values[i][0],     values[i][0]
                )
                for i in range(0 if closed else 1, len(values))
            ])
        else:
            self._painter.drawLines(*[
                QLineF(
                    values[i - 2], values[i - 1],
                    values[i],     values[i + 1]
                )
                for i in range(0 if closed else 2, len(values), 2)
            ])
        return self

    def box(self, x, y, width, height):
        """Draws a box at the given position with the given size."""
        self._painter.drawRect(x, y, width, height)

    def rect(self, x1, y1, x2, y2):
        """Wrapper around anistate.box(x1, y1, x2 - x1, y2 - y1)."""
        if x2 < x1:
            x1, x2 = x2, x1
        if y2 < y1:
            y1, y2 = y2, y1
        self._painter.drawRect(x1, y1, x2 - x1, y2 - y1)

    def circle(self, x, y, radius):
        """Draws a centered circle at the given position and radius."""
        self._painter.drawEllipse(QPointF(x, y), radius, radius)

    def poly(self, values):
        """Draws a filled polygon with the shape of the input values."""
        assert len(values) % 2 == 0
        if isinstance(values[0], (tuple, list)):
            self._painter.drawPolygon(*[QPointF(x, y) for x, y, in values])
        else:
            self._painter.drawPolygon(*[QPointF(values[i], values[i + 1])
                                        for i in range(0, len(values), 2)])
        return self