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()
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)
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())