#ifndef ELECTRICCONNECTLINEITEM_H #define ELECTRICCONNECTLINEITEM_H #include #include #include "graphicsBaseItem.h" class ElectricConnectLineItem : public GraphicsProjectModelItem { public: ElectricConnectLineItem(QGraphicsItem *parent = 0); ElectricConnectLineItem(const ElectricConnectLineItem&); //暂不拷贝位置关系,由线自己计算 virtual ~ElectricConnectLineItem(); virtual ElectricConnectLineItem* clone() const override; void setStartPoint(const QPointF& p); void setEndPoint(const QPointF& p); QPainterPath getPoints(void) const { return m_points; } void moveLine(QPointF); //鼠标点击拖动 void resetCurLine(){_curLine = QPoint();} void calculatePath(); void generateAvoidancePath(const QPointF& start, const QPointF& end,const QList& obstacleShapes); // 使用形状进行避障 double calculatePathLength(const QList& path); bool lineIntersectsRect(const QLineF& line, const QRectF& rect); bool isSegmentSafe(const QPointF& p1, const QPointF& p2,const QList& components); bool isPathSafe(const QList& path,const QList& components); bool segmentPenetratesComponent(const QLineF& segment,const QRectF& component); QRectF getTotalComponentsBounds(const QList& components); void collectRectilinearPaths(const QPointF& start, const QPointF& end,const QList& components,QMultiMap>& paths); void addPathIfRectilinear(const QList& path,QMultiMap>& paths); void collectBypassPaths(const QPointF& start, const QPointF& end,const QList& components,QMultiMap>& paths); void generateForcedRectilinearBypass(const QPointF& start, const QPointF& end,const QList& components); QRectF findFirstBlockingComponent(const QPointF& start, const QPointF& end,const QList& components); virtual QPainterPath shape() const override; virtual QRectF boundingRect() const override; virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; protected: void initial(); private: QPainterPath m_points; QPainterPath m_pointsBoundingRect; //包裹点的矩形集合 QList m_lstPoints; QPoint _curLine; //参数1用点序号表示的当前线段起始点,参数2表示线段方向 }; #endif