def _radius_from_point_and_angle(self, point, angle): line = QLineF() line.setP1(point) line.setAngle(angle) normal = line.normalVector() normal.setLength(self.magic_number / 2) return QPointF(normal.dx(), normal.dy())
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())
def calculatePerpendicularPoint(self, startingPoint, distance, line): labelHelperLine = QLineF() labelHelperLine.setP1(startingPoint) labelHelperLine.setAngle(line.angle() + 90) labelHelperLine.setLength(distance) return labelHelperLine.p2()