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 drawArrow(self): line = QLineF(self._edge2, self.__destPoint) v = line.unitVector() v.setLength(12) v.translate(QPointF(line.dx(), line.dy())) n = v.normalVector() n.setLength(n.length() * 0.5) n2 = n.normalVector().normalVector() p1 = v.p2() p2 = n.p2() p3 = n2.p2() return QPolygonF([p1, p2, p3, p1])
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 reverseStandardData(self, excelData): graphName = excelData[0] mode = excelData[1] nodes = [] edges = [] texts = [] self.ui.actionDigraph_Mode.setChecked(bool(mode)) for nodeDetail in excelData[2]: node = BezierNode() node.textCp.setPlainText(f"V{nodeDetail[0]}") node.setData(self.__ItemId, nodeDetail[0]) nodeText = self._tr("MainWindow", "顶点") node.setData(self.__ItemDesc, nodeText) if len(nodeDetail) < 3: for i in range(2): intRandom = randint(-400, 400) nodeDetail.append(intRandom) node.setPos(QPointF(nodeDetail[2], nodeDetail[3])) node.weightCp.setPlainText(str(nodeDetail[1])) nodes.append(node) for edgeDetail in excelData[3]: edge = BezierEdge() edge.setData(self.__ItemId, edgeDetail[0]) edge.setData(self.__ItemDesc, "边") edge.textCp.setPlainText(f"e{edgeDetail[0]}") edge.weightCp.setPlainText(str(edgeDetail[3])) if len(edgeDetail) <= 4: for i in range(10): intRandom = randint(-400, 400) edgeDetail.append(intRandom) edge.setPos(QPointF(edgeDetail[12], edgeDetail[13])) if edgeDetail[1] >= 0: for node in nodes: node: BezierNode if node.data(self.__ItemId) == edgeDetail[1]: edge.setSourceNode(node) node.addBezierEdge(edge, ItemType.SourceType) line = QLineF(edge.mapFromScene(node.pos()), edge.edge1Cp.point()) length = line.length() edgeOffset = QPointF(line.dx() * 10 / length, line.dy() * 10 / length) source = edge.mapFromScene(node.pos()) + edgeOffset edge.setSpecialControlPoint(source, ItemType.SourceType) edge.beginCp.setVisible(False) else: edge.setSpecialControlPoint( QPointF(edgeDetail[4], edgeDetail[5]), ItemType.SourceType) if edgeDetail[2] >= 0: for node in nodes: node: BezierNode if node.data(self.__ItemId) == edgeDetail[2]: edge.setDestNode(node) node.addBezierEdge(edge, ItemType.DestType) line = QLineF(edge.mapFromScene(node.pos()), edge.edge2Cp.point()) length = line.length() edgeOffset = QPointF(line.dx() * 10 / length, line.dy() * 10 / length) if mode: dest = edge.mapFromScene( node.pos()) + edgeOffset * 2.3 else: dest = edge.mapFromScene(node.pos()) + edgeOffset edge.setSpecialControlPoint(dest, ItemType.DestType) edge.endCp.setVisible(False) else: edge.setSpecialControlPoint( QPointF(edgeDetail[10], edgeDetail[11]), ItemType.DestType) edge.setEdgeControlPoint(QPointF(edgeDetail[6], edgeDetail[7]), ItemType.SourceType) edge.setEdgeControlPoint(QPointF(edgeDetail[8], edgeDetail[9]), ItemType.DestType) edge.centerCp.setPoint(edge.updateCenterPos()) edges.append(edge) if len(excelData) <= 4: return [graphName, nodes + edges] for textDetail in excelData[4]: text = BezierText(str(textDetail[1])) text.setData(self.__ItemId, textDetail[0]) text.setData(self.__ItemDesc, "文本") text.setPos(textDetail[2], textDetail[3]) texts.append(text) return [graphName, nodes + edges + texts]