def adjust(self):
        if self.__source:
            self.beginCp.setVisible(False)
            line1 = QLineF(self.mapFromItem(self.__source, 0, 0), self._edge1)
            length1 = line1.length()
            if length1 > 20.0:
                edgeOffset = QPointF(line1.dx() * 10 / length1,
                                     line1.dy() * 10 / length1)
                self.__sourcePoint = line1.p1() + edgeOffset
            else:
                self.__sourcePoint = line1.p1()
        else:
            self.beginCp.setVisible(True)
            self.beginCp.setPoint(self.__sourcePoint)
        if self.__dest:
            self.endCp.setVisible(False)
            line2 = QLineF(self.mapFromItem(self.__dest, 0, 0), self._edge2)
            length2 = line2.length()
            if length2 > 20.0:
                edgeOffset = QPointF(line2.dx() * 10 / length2,
                                     line2.dy() * 10 / length2)
                if self._isDigraph:
                    self.__destPoint = line2.p1() + edgeOffset * 2.3
                else:
                    self.__destPoint = line2.p1() + edgeOffset
            else:
                self.__destPoint = line2.p1()
        else:
            self.endCp.setVisible(True)
            self.endCp.setPoint(self.__destPoint)

        self.prepareGeometryChange()
示例#2
0
 def update_line(self):
     overlapping_arcs = [
         arc for arc in self.rel_item.arc_items
         if arc.obj_item == self.obj_item
     ]
     count = len(overlapping_arcs)
     path = QPainterPath(self.rel_item.pos())
     if count == 1:
         path.lineTo(self.obj_item.pos())
     else:
         rank = overlapping_arcs.index(self)
         line = QLineF(self.rel_item.pos(), self.obj_item.pos())
         line.setP1(line.center())
         line = line.normalVector()
         line.setLength(self._width * count)
         line.setP1(2 * line.p1() - line.p2())
         t = rank / (count - 1)
         ctrl_point = line.pointAt(t)
         path.quadTo(ctrl_point, self.obj_item.pos())
     self.setPath(path)
示例#3
0
    def paint(self, painter, option, widget):
        pen = QPen()
        pen.setColor(QColor(150, 150, 150))
        pen.setWidth(1)
        painter.setPen(pen)

        if not self._fromNode() or not self._toNode():
            return

        line = QLineF(self.fromPoint, self.toPoint)
        if line.length() == 0.0:
            return

        # self.drawArc(painter, line)
        topLeftPoint = self.calculatePerpendicularPoint(
            self.fromPoint, 50, line)
        arcRect = QRectF(topLeftPoint, QSizeF(line.length(), 100))
        if self._fromNode is self._toNode:
            spanAngle = -360
        else:
            spanAngle = -180
        # painter.drawArc(arcRect, 0, spanAngle)

        colliding = self.collidingItems()
        if len(colliding) > 0:
            line.setP1(line.p1() + QPointF(10, 10))
            line.setP2(line.p2() + QPointF(10, 10))
            line.translate(10, 10)
        painter.drawLine(line)

        midpoint = QPointF(line.center().x(), line.center().y())
        labelCenterPoint = self.calculatePerpendicularPoint(midpoint, 75, line)
        self.labelBox.setPos(labelCenterPoint)

        angle = math.acos(line.dx() / line.length())
        self.drawArrowHead(painter, angle, line.p2())