pyqtgraph) 다각형 그리기 예제(draw polygon item example)

작성자: [관리자] 하얀설표

2024.12.23 09:38 (KST) 작성됨

2024.12.23 09:44 (KST) 수정됨






(2024.12.23) 수정됨.

pyqtgraph에는 polygon(다각형)을 그리는 Item object가 존재하지 않는다.
관련 기능을 원한다면 사용자가 직접 작성해야 하는데, 다음과 같이 코드를 작성하면 다각형을 그릴 수 있게 된다.

코드는 테스트용으로 작성한 것이라 많이 조악하다.

코드 작성 방법은 다음 링크 참고.

https://white.seolpyo.com/entry/143/

import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui


class PolygonItem(pg.GraphicsObject):
    list_polygon = []

    def __init__(self, segment, pen=None, brush=None, *args, **kwargs):
        super().__init__()

        if not pen: pen = pg.mkPen('r')
        if not brush: brush = pg.mkBrush('y')

        x, y = ([], [])
        for s in segment:
            for i in s: (x.append(i[0]), y.append(i[1]))
        self.xmin, self.xmax = (min(x), max(x))
        self.ymin, self.ymax = (min(y), max(y))

        self.segment = segment
        self.pen, self.brush = (pen, brush)

        return

    def set_polygon(self):
        segment = self.segment
        points = []
        for s in segment:
            points.clear()
            for i in s: points.append(QtCore.QPointF(*i))
            polygon = QtGui.QPolygonF(points)
            self.list_polygon.append(polygon)
        return

    def paint(self, p: QtGui.QPainter, *args):
        if not self.list_polygon: self.set_polygon()
        (p.setBrush(self.brush), p.setPen(self.pen))
        for polygon in self.list_polygon: p.drawPolygon(polygon)
        return

    def boundingRect(self):
        xmin, xmax = (self.xmin, self.xmax)
        ymin, ymax = (self.ymin, self.ymax)

        px = py = 0
        pxPad = 0.4
        px, py = self.pixelVectors()
        # print(f'{(px, py)=}')

        px = 0 if px is None else px.length()
        py = 0 if py is None else py.length()
        px *= pxPad
        py *= pxPad

        r = QtCore.QRectF(xmin-px, ymin-py, (2*px)+xmax-xmin, (2*py)+ymax-ymin)
        return r

segment = [
    (
        (5, 5),
        (2, 2),
        (8, 3),
        (1, 3),
        (6.5, 2),
    ),
    (
        (10, 5),
        (11, 2),
        (16, 8),
        (13, 6),
    ),
]
widget = pg.plot(title='draw polygon item')
pi = PolygonItem(segment)
widget.addItem(pi)
pg.exec()

 






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #pyqtgraph 예제 관련 게시물