Esempio n. 1
0
    def __init__(self, parent=None):
        super().__init__(parent)
        self.monitorWin = parent
        if self.monitorWin:
            self.monitorWin.sigTaskUpdating.connect(self.slotTaskUpdate)

        self.scene = QGraphicsScene(self)
        self.scene.setSceneRect(0, 0, self.SIZE[0], self.SIZE[1])
        self.setScene(self.scene)

        self._speedsPen = QPen(Qt.white)

        gradient = QLinearGradient(0, 0, self.SIZE[0], self.SIZE[1])
        gradient.setColorAt(0.0, Qt.darkGreen)
        gradient.setColorAt(1.0, Qt.yellow)
        self._speedsBrush = QBrush(gradient)

        # add elements to the scene
        self._speedsPolygon = self.scene.addPolygon(QPolygonF(),
                                                    self._speedsPen,
                                                    self._speedsBrush)
        self._progressText = self.scene.addText("")
        self._progressText.setPos(10, 0)

        self.setupDropSupport()
def polygonFromArc(center, radius, start, end, seg):
    poly = QPolygonF()
    for k in range(0, seg):
        theta = 2 * pi / 360 * (start + k * (end - start) / seg)
        point = center + radius * QPointF(cos(theta), sin(theta))
        poly.append(point)
    return poly
Esempio n. 3
0
 def mouseMoveEvent(self, event):
     e = event.pos()
     e = self.mapToScene(e)
     area_select = QRectF(e.x() - 3, e.y() - 3, 6, 6)
     items = self.scene_v.items(area_select)
     if not self.buttonPressed:
         dx = e.x() - self._startPos.x()
         dy = e.y() - self._startPos.y()
         new_x = self.horizontalScrollBar().value() - dx
         new_y = self.verticalScrollBar().value() - dy
         self.horizontalScrollBar().setValue(new_x)
         self.verticalScrollBar().setValue(new_y)
     if self.is_pipe and self.cond_pipe:
         if items:
             l_n = self.l_i_nodes + self.l_i_reservoir
             l_n_2 = self.l_nodes + self.l_reservoir
             if items[0] in l_n:
                 e.setX(l_n_2[l_n.index(items[0])].x)
                 e.setY(l_n_2[l_n.index(items[0])].y)
         self.current_item.setLine(self.start_e.x(), self.start_e.y(),
                                   e.x(), e.y())
         pen = QPen(QColor('black'))
         pen.setWidth(1)
         pen.setStyle(Qt.DotLine)
         self.current_item.setPen(pen)
     if self.is_area_select and len(self.area_select) > 1:
         self.area_select.append(e)
         self.current_item.setPolygon(QPolygonF(self.area_select))
         self.area_select = self.area_select[:-1]
Esempio n. 4
0
    def draw(self,qwidget_obj,qp,GISView_view):
        qPolygonFsToScreen = GISView_view.toScreenPolygon(self.List_allvertex)
        qwidget_obj.scene.addItem(QGraphicsPolygonItem(QPolygonF(qPolygonFsToScreen)))
            #pen = QPen(Qt.blue, 1, Qt.SolidLine)
            #qwidget_obj.scene.addLine(qLineF , pen)

        return
Esempio n. 5
0
    def calc_path(self):
        path = QPainterPath(QPointF(self.pos_src[0], self.pos_src[1]))  # 起点
        path.lineTo(QPointF(self.pos_dst[0], self.pos_dst[1]))  # 终点
        if self.directed:
            # 画箭头
            self.line = QLineF(QPointF(self.pos_src[0], self.pos_src[1]), QPointF(self.pos_dst[0], self.pos_dst[1]))
            if self.flag == 0:
                self.line.setLength(self.line.length() - 20)
            else:
                self.line.setLength(self.line.length() - self.edge_wrap.end_item.r)
            v = self.line.unitVector()
            v.setLength(20)
            v.translate(QPointF(self.line.dx(), self.line.dy()))

            n = v.normalVector()
            n.setLength(n.length() * 0.5)
            n2 = n.normalVector().normalVector()

            p1 = v.p2()
            p2 = n.p2()
            p3 = n2.p2()
            # 方法2
            arrow = QPolygonF([p1, p2, p3, p1])
            path.addPolygon(arrow)
        # path = QPainterPath(QPointF(self.pos_src[0], self.pos_src[1]))
        # path.lineTo(self.pos_dst[0], self.pos_dst[1])
        return path
Esempio n. 6
0
 def sharedToHalfPolygons(self):
     result = []
     for m in self.shared:
         qpointsf = []
         qpointsf2 = []
         d = {}
         c = m.corners(self.hexagons['layout'])
         for i in range(2, 6):
             qpointsf.append(QPointF(c[i].x, c[i].y))
         qpointsf2.append(QPointF(c[5].x, c[5].y))
         for i in range(0, 3):
             qpointsf2.append(QPointF(c[i].x, c[i].y))
         d['left'] = QPolygonF(qpointsf)
         d['right'] = QPolygonF(qpointsf2)
         result.append(d)
     return result
Esempio n. 7
0
    def __init__(self, x, y, color, max_speed, name):
        super().__init__(None)
        self._x = x
        self._y = y
        self._theta = 0
        self.setPos(self._x, self._y)
        self.setRotation(self._theta)
        self._color = color
        self._speed = max_speed
        # randint(1, 100)/100 * max_speed

        points = [QPointF(10, 0), QPointF(8, -3), QPointF(5, -5), QPointF(-10, 0), QPointF(5, 5), QPointF(8, 3)]
        polygon = QPolygonF(points)
        self._path = QPainterPath()
        self._path.addPolygon(polygon)
        self._path.closeSubpath()

        self._swim_counter = 0
        self._theta_swim = 0

        self._name = name

        # SETTINGS ======================================================================================#
        self._max_speed = max_speed
        self._cohesive_rad = 50
        self._repulsive_rad = 3
        self._cohesion_factor = 0.3
        self._repulsion_factor = 0.3
        self._random_factor = 0.2

        self._obstacle_distance = 50
Esempio n. 8
0
def sutherland_hodgman(clip, pol, norm):
    # дублируем начальную вершину отсекателя в конец
    clip.append(clip[0])

    s = None
    f = None
    # цикл по вершинам отсекателя
    for i in range(len(clip) - 1):
        new = []  # новый массив вершин
        for j in range(len(pol)):  # цикл по вершинам многоугольника
            if j == 0:
                f = pol[j]
            else:
                t = is_intersection([s, pol[j]], [clip[i], clip[i + 1]], norm)
                if t:
                    new.append(t)

            s = pol[j]
            if is_visiable(s, clip[i], clip[i + 1], norm):
                new.append(s)

        if len(new) != 0:
            t = is_intersection([s, f], [clip[i], clip[i + 1]], norm)
            if t:
                new.append(t)

        pol = copy.deepcopy(new)

    if len(pol) == 0:
        return False
    else:
        return QPolygonF(pol)
Esempio n. 9
0
 def pixelRectToScreenPolygon(self, rect):
     polygon = QPolygonF()
     polygon.append(QPointF(self.pixelToScreenCoords_(rect.topLeft())))
     polygon.append(QPointF(self.pixelToScreenCoords_(rect.topRight())))
     polygon.append(QPointF(self.pixelToScreenCoords_(rect.bottomRight())))
     polygon.append(QPointF(self.pixelToScreenCoords_(rect.bottomLeft())))
     return polygon
Esempio n. 10
0
 def add_triangle(self, x, y, l):
     polygon = QPolygonF()
     polygon.append(QPoint(x, y))
     polygon.append(QPoint(x + l // 2, y - l))
     polygon.append(QPoint(x - l // 2, y - l))
     polygon.append(QPoint(x, y))
     self.scene.addPolygon(polygon, QPen(), QBrush(Qt.black))
Esempio n. 11
0
    def get_polygon(self):
        contours, hierarchy = cv.findContours(self._mask, cv.RETR_CCOMP,
                                              cv.CHAIN_APPROX_NONE)
        if len(contours) < 1:
            return None

        # 현재는 최대 크기 polygon 만을 반환.
        # index = contours.index(max(contours, key=lambda x: cv.contourArea(x)))

        key = np.array([cv.contourArea(contour) for contour in contours])
        index = np.argmax(key)
        x = contours[index][:, 0][:, 0].tolist()
        y = contours[index][:, 0][:, 1].tolist()

        # hierarchy : [Next, Previous, First_Child, Parent]
        if hierarchy[0][index][2] != -1:
            # Child 가 존재할 경우
            x.extend(contours[hierarchy[0][index][2]][:, 0][:, 0].tolist())
            y.extend(contours[hierarchy[0][index][2]][:, 0][:, 1].tolist())

        elif hierarchy[0][index][3] != -1:
            # Parent 가 존재할 경우
            x = contours[hierarchy[0][index][2]][:, 0][:, 0].tolist() + x
            y = contours[hierarchy[0][index][2]][:, 0][:, 1].tolist() + y

        # Create Polygon
        polygon = QPolygonF()
        for idx in range(len(x)):
            polygon.append(QPointF(x[idx], y[idx]))

        return polygon
Esempio n. 12
0
    def __init__(self, start, dst, offset, color=Qt.black):
        """
        Constructor for a conjunction.
        It generates all necessary variables and calls the draw function
        It adds also the parent arrow from the source to the conjunction rectangle

        :param start: Starting object of the arrow
        :param dst: End object of the arrow
        :param offset: left/right offset for the starting arrow
        :param color: Color of the arrow
        """
        super().__init__()

        self.arrowHead = QPolygonF()

        self.start = start
        self.dst = dst

        self.offset = offset

        self.setFlag(QGraphicsItem.ItemIsSelectable, True)

        self.setPen(QPen(color, 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))

        self.updatePosition()
Esempio n. 13
0
	def drawD2(self):
		if self.vtkViewer.reader == None:
			return

		num = self.inputD2.text()
		try:
			num = list(map(int, num.split(' ')))
		except Exception:
			return
		if len(num) != 2 or num[0] <= 1 or num[1] <= 1:
			return

		self.clear()

		histogram, scale = self.vtkViewer.d2Sample(num[0], num[1])

		d2Chart = QChart()
		d2Chart.legend().hide()
		polyline = QPolygonF(num[0])
		pointer = polyline.data()
		dtype, tinfo = np.float, np.finfo
		pointer.setsize(2*polyline.size()*tinfo(dtype).dtype.itemsize)
		memory = np.frombuffer(pointer, dtype)
		memory[:(num[0]-1)*2+1:2] = scale
		memory[1:(num[0]-1)*2+2:2] = histogram
		curve = QLineSeries()
		curve.append(polyline)

		d2Chart.addSeries(curve)
		d2Chart.createDefaultAxes()

		ChartView = QChartView(d2Chart)
		self.d2ChartLayout.addWidget(ChartView)
Esempio n. 14
0
def Segments2QPolygonF(segList):
    '''Given an unordered list of line segments ((x1,y1),(x2,y2)), return an (ordered) QPolygonF.
     Delete converted line segments from list.
     Does not work for disconnected polygons.
  '''
    # Seed list of ordered points with an arbitrary pair of (necessarily adjacent) points
    poly = list(segList.pop())
    # Keep extending list of ordered points by finding the matching line segment
    p = poly[1]
    while segList != []:
        found = False
        for i in range(len(segList)):
            if segList[i][0] == p:
                p = segList[i][1]
                found = True
                break
            elif segList[i][1] == p:
                p = segList[i][0]
                found = True
                break
        if found:
            poly.append(p)
            del segList[i]
        else:
            # This algorithm doesn't work if segments can't be ordered into a single chain
            raise RuntimeError(
                'error converting segments to polygon: segList = {}, poly = {}, p = {}'
                .format(segList, poly, p))
    return QPolygonF(map(lambda xy: QPointF(*xy), poly))
Esempio n. 15
0
    def paintEvent(self, event):
        if self.display_status:
            super().paintEvent(event)
            painter = QPainter(self)
            painter_path = QPainterPath()

            qt_pen_1 = QPen(Qt.red, 2, Qt.SolidLine)
            qt_pen_2 = QPen(Qt.green, 10, Qt.SolidLine)
            qt_pen_3 = QPen(Qt.red, 2, Qt.DotLine)

            painter.setPen(qt_pen_1)
            painter.drawPolygon(QPolygon(self.roi_rect), Qt.WindingFill)

            painter_path.addPolygon(QPolygonF(self.roi_rect))
            painter_path.closeSubpath()

            # qt_brush = QBrush(Qt.green)
            qt_brush = QBrush(QColor(0, 255, 0, 64))

            painter.setBrush(qt_brush)
            painter.drawPath(painter_path)

            # painter.drawPoint(self.tmp_center_pt)
            painter.setPen(qt_pen_3)
            painter.drawLine(self.roi_rect[0], self.roi_rect[2])
            painter.drawLine(self.roi_rect[1], self.roi_rect[3])

            painter.setPen(qt_pen_2)
            for elem in self.roi_rect:
                painter.drawPoint(elem)
            # for elem in self.img_rect:
            # painter.drawPoint(elem)
            if self.default_rect:
                self.update()
Esempio n. 16
0
    def __init__(self):
        super().__init__()

        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        self.setScene(QGraphicsScene())
        self.setBackgroundBrush(Qt.transparent)
        self.setRenderHint(QPainter.Antialiasing)

        self.graph = self.scene().addPolygon(QPolygonF(), QPen(Qt.transparent),
                                             QBrush())

        color = QColor.fromRgb(0x35, 0x37, 0x72)
        pen = QPen(color, 3)
        pen.setCapStyle(Qt.RoundCap)
        self.path = self.scene().addPath(QPainterPath(), pen)

        self.score_text = self.scene().addText("")
        self.score_text.setDefaultTextColor(color)

        self.msg_text = self.scene().addText("")
        self.msg_text.setDefaultTextColor(color)
        self.msg_text.setX(0)
        self.msg_text.setY(0)

        self.sitting_time_text = self.scene().addText("")
        self.sitting_time_text.setDefaultTextColor(color)

        self.score_list = [0]
        self.minimize = False
        self.size_changed(False)

        self.connected_changed(False)
Esempio n. 17
0
def test_scene_set_nodes_polygons(mod, scene, polygon_ids):
    """Check that setNodesPolygons change overlay brushes for all nodes."""
       
    polygon_ids = [NodePolygon(id) for id in polygon_ids]
    circle = NodePolygon.Circle
    
    polygons = [NODE_POLYGON_MAP[id] if id != NodePolygon.Circle else QPolygonF()
                for id in polygon_ids]
    if mod.__name__ == 'PyQtNetworkView._pure':  # Python
        assert type(mod.NodePolygon).__name__ == 'EnumMeta'
    else:  # C++/SIP
        assert type(mod.NodePolygon).__name__ == 'enumtype'                   
        polygon_ids = [id.value for id in polygon_ids]
        circle = circle.value
        
    for node in scene.nodes():
        assert node.polygon() == mod.NodePolygon.Circle
        assert node.customPolygon().isEmpty() 
        
    scene.setNodesPolygons(polygon_ids)   
    
    if len(polygons) >= len(scene.nodes()):
        for i, node in enumerate(scene.nodes()):
            assert node.polygon() == polygon_ids[i]
            assert node.customPolygon().size() == polygons[i].size()
        assert scene.nodesPolygons() == polygon_ids
    else:
        for node in scene.nodes():
            assert node.polygon() == circle
Esempio n. 18
0
    def __init__(self, starCount=1, maxStarCount=5):
        self._starCount = starCount
        self._maxStarCount = maxStarCount

        self.starPolygon = QPolygonF([QPointF(1.0, 0.5)])
        for i in range(5):
            self.starPolygon << QPointF(
                0.5 + 0.5 * math.cos(0.8 * i * math.pi),
                0.5 + 0.5 * math.sin(0.8 * i * math.pi))

        self.diamondPolygon = QPolygonF()
        self.diamondPolygon << QPointF(0.4, 0.5) \
                            << QPointF(0.5, 0.4) \
                            << QPointF(0.6, 0.5) \
                            << QPointF(0.5, 0.6) \
                            << QPointF(0.4, 0.5)
	def __init__(self, parentItem, segments, colour):
		QGraphicsItem.__init__(self, parent=parentItem)
		self.colour_name = colour
		self.shape = QPainterPath()
		self.labels = QGraphicsItemGroup(self)
		self.bbox = QRectF(0, 0, 0, 0)
		for (p1, p2), label in segments:
			lvect = QVector2D(p2 - p1)
			lpath = QPainterPath()
			m = TWY_line_margin
			l = lvect.length()
			plst = [QPointF(-m, 0), QPointF(-m/3, -m), QPointF(l + m/3, -m), QPointF(l + m, 0), QPointF(l + m/3, m), QPointF(-m/3, m)]
			lpath.addPolygon(QPolygonF(plst))
			lrot = QTransform()
			lrot.rotateRadians(atan2(lvect.y(), lvect.x()))
			lpath = lrot.map(lpath)
			lpath.translate(p1)
			self.shape.addPath(lpath)
			rect = QRectF(p1, p2).normalized()
			if label != None:
				self.labels.addToGroup(TaxiwayLabelItem(label, rect.center(), self))
			self.bbox |= rect
		self.shape.setFillRule(Qt.WindingFill)
		self.mouse_highlight = False
		self.labels.setVisible(False)
Esempio n. 20
0
    def draw_polygons(self, event):
        if self.polygons:
            painter = QPainter(self)

            # painter.drawEllipse(0, 0, self.width()/2, self.width()/2)
            for (pa, pb, pc), color in self.polygons:
                a = QPoint(pa.x, pa.y)
                b = QPoint(pb.x, pb.y)
                c = QPoint(pc.x, pc.y)

                pen = QPen()

                if color:
                    pen.setColor(color)
                else:
                    pen.setColor(QColor(0, 0, 0))

                painter.setPen(pen)

                polygon = QPolygonF([a, b, c])

                painter.drawPolygon(polygon)

                if color:
                    path = QPainterPath()
                    path.addPolygon(polygon)

                    # painter.setBrush(QBrush(color))
                    painter.fillPath(path, QBrush(color))
Esempio n. 21
0
    def FOV(self, Robo):
        view = QPainterPath()

        xPos = math.cos(math.radians(Robo.alpha +
                                     (Robo.FOV / 2))) * Robo.radius
        yPos = math.sin(math.radians(Robo.alpha +
                                     (Robo.FOV / 2))) * Robo.radius

        xPos2 = math.cos(math.radians(Robo.alpha -
                                      (Robo.FOV / 2))) * Robo.radius
        yPos2 = math.sin(math.radians(Robo.alpha -
                                      (Robo.FOV / 2))) * Robo.radius

        x1 = QPoint(
            int(round(Robo.position.x())) + Robo.radius,
            int(round(Robo.position.y())) + Robo.radius)
        x2 = x1 + QPoint(
            (int(round(Robo.position.x())) + Robo.radius) + 1000 * xPos,
            (int(round(Robo.position.y())) + Robo.radius) - 1000 * yPos)
        x3 = x1 + QPoint(
            (int(round(Robo.position.x())) + Robo.radius) + 1000 * xPos2,
            (int(round(Robo.position.y())) + Robo.radius) - 1000 * yPos2)

        view.addPolygon(QPolygonF([x1, x2, x3]))
        view.closeSubpath()

        return view
Esempio n. 22
0
    def __init__(self,
                 startp=Point(),
                 endp=None,
                 length=60.0,
                 angle=50.0,
                 color=QtCore.Qt.red,
                 pencolor=QtCore.Qt.green,
                 startarrow=True):
        """
        Initialisation of the class.
        """
        self.sc = None
        super(Arrow, self).__init__()

        self.startp = QtCore.QPointF(startp.x, -startp.y)
        self.endp = endp

        self.length = length
        self.angle = angle
        self.startarrow = startarrow
        self.allwaysshow = False

        self.arrowHead = QPolygonF()
        self.setFlag(QGraphicsItem.ItemIsSelectable, False)
        self.myColor = color
        self.pen = QPen(pencolor, 1, QtCore.Qt.SolidLine)
        self.pen.setCosmetic(True)
        self.arrowSize = 8.0
    def setPolyline(self, frameNo=None):
        if frameNo is not None:
            self.currentFrameNo = frameNo

            key = str(self.currentFrameNo)
            if key in self.data.keys():
                self.show()

                for i, rectItems in enumerate(self.rectItemsList):
                    poly = QPolygonF()
                    line_data = self.data[key][i]

                    current_range = len(rectItems)
                    for j in range(current_range, len(line_data)):
                        rectItems.append(QGraphicsRectItem(self))

                    for p, rect_item in zip(line_data, rectItems):
                        q_pt = QPointF(*p)
                        rect_item.setPos(q_pt)
                        rect_item.mouseMoveEvent = self.generateItemMouseMoveEvent(
                            rect_item, p)

                        rect = QRectF(-self.markSize / 2, -self.markSize / 2,
                                      self.markSize, self.markSize)
                        rect_item.setRect(rect)

                        rect_item.show()

                    for j in range(len(line_data), len(rectItems)):
                        rectItems[j].hide()

                self.setItemsAreMovable(self.isItemMovable)

            else:
                self.hide()
Esempio n. 24
0
    def mousePressEvent(self, e):
        #logger.debug('DragPoly.mousePressEvent, at point: %s on scene: %s '%\
        #             (str(e.pos()), str(e.scenePos()))) # self.__class__.__name__
        QGraphicsPolygonItem.mousePressEvent(self, e) # points would not show up w/o this line

        if e.button()==Qt.RightButton: self._end_of_add = True

        ps = e.scenePos()
        #print('%s.mousePressEvent itemAt:' % self.__class__.__name__, self.scene().itemAt(ps))

        t = self.scene().views()[0].transform()
        item_sel = self.scene().itemAt(ps.x(), ps.y(), t)
        #item_sel = self.scene().itemAt(ps)

        if self.lst_ctl_points is None:
            logger.warning('DragPoly.lst_ctl_points is None')
            return

        if item_sel in self.lst_ctl_points:
            self.indx_sel = self.lst_ctl_points.index(item_sel)
            print('XXX  DragPoly.mousePressEvent index_selected = ', self.indx_sel)

            self.set_drag_mode(EDIT)
            self.set_child_item_sel(item_sel)

            if item_sel == self.ped: self.control_point_menu()

            if self.poly0 is not None: del self.poly0
            self.poly0 = QPolygonF(self.polygon())
            self.pos0 = [gi.pos() for gi in self.lst_ctl_points]
def rectToPoly(rect):
    poly = QPolygonF()
    poly.append(rect.topLeft())
    poly.append(rect.topRight())
    poly.append(rect.bottomRight())
    poly.append(rect.bottomLeft())
    return poly
Esempio n. 26
0
    def createPoly(self, n, r, s,pos):
        polygon = QPolygonF()
        w = 360 / n  # angle per step
        maxX=0
        maxY=0
        minX = 0
        minY = 0
        first = True
        for i in range(n):  # add the points of polygon
            t = w * i + s
            rand = random.randint(80,100)/100
            rad =  r *rand
            x = rad * math.cos(math.radians(t))
            y = rad * math.sin(math.radians(t))
            Xpos=pos.x() + x
            Ypos = pos.y() + y
            if Xpos>maxX:
                maxX =Xpos
            if Ypos>maxY:
                maxY =Ypos
            if Xpos<minX:
                minX =Xpos
            if Ypos < minY:
                minY = Ypos
            if(first):
                maxX = Xpos
                maxY = Ypos
                minX = Xpos
                minY = Ypos
                first=False
            polygon.append(QPointF(Xpos,Ypos))

        return {'polygon':polygon,'maxX':maxX,'maxY':maxY,'minX':minX,'minY':minY}
    def _drawSkel(self, worm_qimg, skel_dat, skel_colors = GOOD_SKEL_COLOURS):

        qPlg = {}
        for tt, dat in skel_dat.items():
            qPlg[tt] = QPolygonF()
            for p in dat:
                #do not add point if it is nan
                if p[0] == p[0]:
                    qPlg[tt].append(QPointF(*p))


        if not qPlg or len(qPlg['skeleton']) == 0:
            return

        pen = QPen()
        pen.setWidth(1)

        painter = QPainter()
        painter.begin(worm_qimg)

        for k, pol_v in qPlg.items():
            color = skel_colors[k]
            pen.setColor(QColor(*color))
            painter.setPen(pen)
            painter.drawPolyline(pol_v)

        pen.setColor(Qt.black)
        painter.setBrush(Qt.white)
        painter.setPen(pen)

        radius = 3
        painter.drawEllipse(qPlg['skeleton'][0], radius, radius)
        painter.drawEllipse(QPointF(0,0), radius, radius)

        painter.end()
Esempio n. 28
0
    def paint(self, painter, option, widget):
        if self.line().length() == 0:
            return

        pen = self.pen()
        pen.setColor(constants.LINECOLOR)
        painter.setPen(pen)
        painter.setBrush(constants.LINECOLOR)

        arrow_size = 10.0

        angle = math.acos(self.line().dx() / self.line().length())

        if self.line().dy() >= 0:
            angle = (math.pi * 2) - angle

        arrow_p1 = self.line().p2() - QPointF(
            math.sin(angle + math.pi / 2.5) * arrow_size,
            math.cos(angle + math.pi / 2.5) * arrow_size)

        arrow_p2 = self.line().p2() - QPointF(
            math.sin(angle + math.pi - math.pi / 2.5) * arrow_size,
            math.cos(angle + math.pi - math.pi / 2.5) * arrow_size)

        arrow_head = QPolygonF()
        arrow_head.append(self.line().p2())
        arrow_head.append(arrow_p1)
        arrow_head.append(arrow_p2)

        painter.drawLine(self.line())
        painter.drawPolygon(arrow_head)
Esempio n. 29
0
    def image(cls, **kwargs):
        """
        Returns an image suitable for the palette.
        :rtype: QPixmap
        """
        # INITIALIZATION
        pixmap = QPixmap(kwargs['w'], kwargs['h'])
        pixmap.fill(Qt.transparent)
        painter = QPainter(pixmap)
        # INITIALIZE EDGE LINE
        pp1 = QPointF(((kwargs['w'] - 52) / 2), kwargs['h'] / 2)
        pp2 = QPointF(((kwargs['w'] - 52) / 2) + 52 - 2, kwargs['h'] / 2)
        line = QLineF(pp1, pp2)
        # CALCULATE HEAD COORDINATES
        angle = radians(line.angle())
        p1 = QPointF(line.p2().x() + 2, line.p2().y())
        p2 = p1 - QPointF(sin(angle + M_PI / 3.0) * 8, cos(angle + M_PI / 3.0) * 8)
        p3 = p1 - QPointF(sin(angle + M_PI - M_PI / 3.0) * 8, cos(angle + M_PI - M_PI / 3.0) * 8)
        # INITIALIZE EDGE HEAD
        head = QPolygonF([p1, p2, p3])
        # DRAW THE POLYGON
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(QColor(0, 0, 0), 1.1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
        painter.drawLine(line)
        # DRAW HEAD
        painter.setPen(QPen(QColor(0, 0, 0), 1.1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
        painter.setBrush(QColor(0, 0, 0))
        painter.drawPolygon(head)
        # DRAW THE TEXT ON TOP OF THE EDGE
        space = 2 if Platform.identify() is Platform.Darwin else 0
        painter.setFont(Font('Arial', 9, Font.Light))
        painter.drawText(pp1.x() + space, (kwargs['h'] / 2) - 4, 'instanceOf')

        return pixmap
Esempio n. 30
0
 def draw_pattern(self):
     path = './patterns/' + self.pattern
     lines, ellipses, rectangles, polygons = get_picture.read_file(path)
     x, y = self.get_start_pattern(lines, ellipses, rectangles, polygons)
     if len(lines) != 0:
         for line in lines:
             points, pencil = get_picture.get_inf_line(line)
             new_points = self.get_new_points(points, [], x, y)
             self.draw_line(new_points, pencil)
     if len(ellipses) != 0:
         for ellipse in ellipses:
             points, width, height,\
              pencil, fill = get_picture.get_inf_ellipse(ellipse)
             new_points = self.get_new_points(points, [], x, y)
             width = width * self.figure_size / 180
             height = height * self.figure_size / 180
             self.draw_ellipse(new_points, width, height, pencil, fill)
     if len(rectangles) != 0:
         for rectangle in rectangles:
             points, width, height,\
              pencil, fill = get_picture.get_inf_rectangle(rectangle)
             new_points = self.get_new_points(points, [], x, y)
             width = width * self.figure_size / 180
             height = height * self.figure_size / 180
             self.draw_rectangle(new_points, width, height, pencil, fill)
     if len(polygons) != 0:
         for polygon in polygons:
             polygon, pencil, fill = get_picture.get_inf_polygon(polygon)
             newpolygon = self.get_new_points(polygon, QPolygonF(), x, y)
             self.draw_polygon(newpolygon, pencil, fill)