diagramBackup/diagramCavas/include/graphicsItem/electricConnectLineItem.h

51 lines
2.4 KiB
C
Raw Normal View History

2024-12-07 17:24:36 +08:00
#ifndef ELECTRICCONNECTLINEITEM_H
#define ELECTRICCONNECTLINEITEM_H
#include <QPainterPath>
2025-02-06 16:36:50 +08:00
#include <QUuid>
2024-12-07 17:24:36 +08:00
#include "graphicsBaseItem.h"
class ElectricConnectLineItem : public GraphicsProjectModelItem
2024-12-07 17:24:36 +08:00
{
public:
ElectricConnectLineItem(QGraphicsItem *parent = 0);
2025-11-14 19:31:09 +08:00
ElectricConnectLineItem(const ElectricConnectLineItem&); //暂不拷贝位置关系,由线自己计算
2024-12-07 17:24:36 +08:00
virtual ~ElectricConnectLineItem();
2025-11-14 19:31:09 +08:00
virtual ElectricConnectLineItem* clone() const override;
2024-12-07 17:24:36 +08:00
void setStartPoint(const QPointF& p);
void setEndPoint(const QPointF& p);
2024-12-07 17:24:36 +08:00
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<QRectF>& obstacleShapes); // 使用形状进行避障
double calculatePathLength(const QList<QPointF>& path);
bool lineIntersectsRect(const QLineF& line, const QRectF& rect);
bool isSegmentSafe(const QPointF& p1, const QPointF& p2,const QList<QRectF>& components);
bool isPathSafe(const QList<QPointF>& path,const QList<QRectF>& components);
bool segmentPenetratesComponent(const QLineF& segment,const QRectF& component);
QRectF getTotalComponentsBounds(const QList<QRectF>& components);
void collectRectilinearPaths(const QPointF& start, const QPointF& end,const QList<QRectF>& components,QMultiMap<double, QList<QPointF>>& paths);
void addPathIfRectilinear(const QList<QPointF>& path,QMultiMap<double, QList<QPointF>>& paths);
void collectBypassPaths(const QPointF& start, const QPointF& end,const QList<QRectF>& components,QMultiMap<double, QList<QPointF>>& paths);
void generateForcedRectilinearBypass(const QPointF& start, const QPointF& end,const QList<QRectF>& components);
QRectF findFirstBlockingComponent(const QPointF& start, const QPointF& end,const QList<QRectF>& components);
2024-12-07 17:24:36 +08:00
virtual QPainterPath shape() const override;
virtual QRectF boundingRect() const override;
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
protected:
2025-11-14 19:31:09 +08:00
void initial();
2024-12-07 17:24:36 +08:00
private:
QPainterPath m_points;
QPainterPath m_pointsBoundingRect; //包裹点的矩形集合
QList<QPointF> m_lstPoints;
QPoint _curLine; //参数1用点序号表示的当前线段起始点,参数2表示线段方向
2024-12-07 17:24:36 +08:00
};
#endif