GridFrame/diagramCavas/include/diagramEditor/editorDiagramLayoutEngine.h

139 lines
5.8 KiB
C
Raw Normal View History

2026-05-07 14:58:42 +08:00
#include "common/core_model/diagram.h"
#include "diagramEditor/editorLayoutConfig.h"
#include <QStandardItem>
// layout_engine.h
/********editor布局生成核心类**********/
2026-05-11 18:38:15 +08:00
class DiagramEditorModel;
2026-05-07 14:58:42 +08:00
class DiagramLayoutEngine {
public:
2026-05-08 18:03:54 +08:00
struct Context {
int sourceId = 0;
2026-05-28 10:43:54 +08:00
QString currentRouteId; // 当前正在处理的线路ID
bool isRemovingRoute = false; // 是否为删除操作
2026-05-08 18:03:54 +08:00
bool saveToModel = false;
QMap<QString, QStandardItem*> itemCache;
QMap<QString, DiagramEditorComponentInfo> componentsCache;
2026-05-14 20:11:48 +08:00
QMap<QString, QSet<Direction>> branchUsedDirections; //key: 组件名 value: 已被支线占用的方向集合
2026-05-28 10:43:54 +08:00
QMap<QString, QMap<int,DirectionOccupancyRecord>> directionOccupancyMap;
QMap<QString, DirectionOccupancyRouteInfo> routeDirectionMap;
2026-05-08 18:03:54 +08:00
void initComponentsCache(const QMap<QString, DiagramEditorComponentInfo>& compos) {
componentsCache = compos;
}
2026-05-28 10:43:54 +08:00
void initDirectionOccupancyCache(const QMap<QString, QMap<int,DirectionOccupancyRecord>>& occus){
directionOccupancyMap = occus;
}
void initRouteDirectionMapCache(const QMap<QString, DirectionOccupancyRouteInfo>& routes){
routeDirectionMap = routes;
}
};
enum class DirectionOperation {
ADD, // 添加方向
REMOVE, // 移除方向
SET // 设置方向(替换)
2026-05-07 14:58:42 +08:00
};
2026-05-11 18:38:15 +08:00
explicit DiagramLayoutEngine(DiagramEditorModel* model)
: m_model(model) {}
2026-05-08 18:03:54 +08:00
QRectF executeLayout(
QMap<QString, DiagramEditorRouteInfo>& routes,
QMap<QString, DiagramEditorComponentInfo>& components,
2026-05-28 10:43:54 +08:00
QMap<QString, QMap<int,DirectionOccupancyRecord>>& directionOccupancyMap,
QMap<QString, DirectionOccupancyRouteInfo>& routeDirectionMap,
2026-05-08 18:03:54 +08:00
const LayoutConfig& config,
Context& context
);
2026-05-28 10:43:54 +08:00
bool clearRouteDirectionOccupancy(const QString& routeId,Context& context);
2026-05-07 14:58:42 +08:00
private:
2026-05-08 18:03:54 +08:00
// 主线相关
QString findMainRoute(const QMap<QString, DiagramEditorRouteInfo>& routes);
2026-05-07 14:58:42 +08:00
void layoutMainRoute(DiagramEditorRouteInfo& route,
const LayoutConfig& config,
2026-05-08 18:03:54 +08:00
Context& context);
2026-05-28 10:43:54 +08:00
void layoutMainRouteInternal(DiagramEditorRouteInfo& route,const LayoutConfig& config,Context& context);
2026-05-07 14:58:42 +08:00
2026-05-08 18:03:54 +08:00
// 支线相关
2026-05-07 14:58:42 +08:00
void layoutBranchRoute(DiagramEditorRouteInfo& route,
const LayoutConfig& config,
2026-05-08 18:03:54 +08:00
Context& context);
2026-05-07 14:58:42 +08:00
void splitBranchRoute(DiagramEditorRouteInfo& route,
2026-05-08 18:03:54 +08:00
Context& context);
void layoutBranchSequence(QList<DiagramEditorComponentInfo>& sequence,
Direction branchDir,
const LayoutConfig& config,
Context& context,
2026-05-11 18:38:15 +08:00
bool isOrder,
int polarity);
2026-05-08 18:03:54 +08:00
// 组件相关
Direction determineBranchDirection(const DiagramEditorComponentInfo& currentNode,
Direction preferredDir,
Context& context);
QPoint getComponentPosition(const QString& componentName,
Context& context);
void updateComponent(DiagramEditorComponentInfo& compo,
2026-05-22 16:08:15 +08:00
int dir,
2026-05-08 18:03:54 +08:00
const QPoint& position,
int rotate,
Context& context);
2026-05-28 10:43:54 +08:00
//记录线路在组件上的方向占用
bool recordRouteDirectionOccupancy(const QString& routeId,const QString& compoName,int directionMask,Context& context); //线路ID,组件名称,方向位掩码
/**
* @brief
* @param compoName
* @param directionMask (8,4,2,1)
* @param operation :
* @param context
* @return
*/
bool updateComponentDirections(const QString& compoName,int directionMask,DirectionOperation operation,Context& context);
bool updateComponentCacheInternal(const QString& compoName,int directionMask,DirectionOperation operation,Context& context);
bool updateComponentModel(const QString& compoName,int directionMask,DirectionOperation operation,Context& context);
2026-05-07 14:58:42 +08:00
2026-05-08 18:03:54 +08:00
// 辅助函数
QStandardItem* getNameItem(const QString& name, Context& context);
int getComponentDirection(const QString& compoName, Context& context);
QRectF calculateBoundingRect(const QMap<QString, DiagramEditorComponentInfo>& components);
2026-05-14 20:11:48 +08:00
Direction getRouteDirection(const QString& routeName,const QMap<QString, DiagramEditorRouteInfo>& routes);
2026-05-28 10:43:54 +08:00
int getComponentTotalOccupiedDirections(const QString& compoName, Context& context); //从总占用表中获取元件占用方向
int getComponentDirectionFromCache(const QString& compoName,const QString& routeId,Context& context); //从缓存获取方向占用
QString getDirectionName(int dirBit) {
switch (dirBit) {
case 8: return "";
case 4: return "";
case 2: return "";
case 1: return "";
default: return QString("未知(%1)").arg(dirBit);
}
}
2026-05-07 14:58:42 +08:00
2026-05-28 10:43:54 +08:00
int getOppositeDirection(int dirBit) {
switch (dirBit) {
case 8: return 4; // 上 ↔ 下
case 4: return 8; // 下 ↔ 上
case 2: return 1; // 左 ↔ 右
case 1: return 2; // 右 ↔ 左
default: return 0;
}
}
int getDirectionIndex(int dirBit) {
switch (dirBit) {
case 1: return 0; // 右
case 2: return 1; // 左
case 4: return 2; // 下
case 8: return 3; // 上
default: return -1;
}
}
2026-05-07 14:58:42 +08:00
private:
2026-05-08 18:03:54 +08:00
int m_compoWidth = 50;
int m_compoHeight = 30;
2026-05-11 18:38:15 +08:00
DiagramEditorModel* m_model = nullptr;
2026-05-07 14:58:42 +08:00
};