#include "common/core_model/diagram.h" #include "diagramEditor/editorLayoutConfig.h" #include // layout_engine.h /********editor布局生成核心类**********/ class DiagramEditorModel; class DiagramLayoutEngine { public: struct Context { int sourceId = 0; bool saveToModel = false; QMap itemCache; QMap componentsCache; void initComponentsCache(const QMap& compos) { componentsCache = compos; } }; explicit DiagramLayoutEngine(DiagramEditorModel* model) : m_model(model) {} QRectF executeLayout( QMap& routes, QMap& components, const LayoutConfig& config, Context& context ); private: // 主线相关 QString findMainRoute(const QMap& routes); void layoutMainRoute(DiagramEditorRouteInfo& route, const LayoutConfig& config, Context& context); // 支线相关 void layoutBranchRoute(DiagramEditorRouteInfo& route, const LayoutConfig& config, Context& context); void splitBranchRoute(DiagramEditorRouteInfo& route, Context& context); void layoutBranchSequence(QList& sequence, Direction branchDir, const LayoutConfig& config, Context& context, bool isOrder, int polarity); // 组件相关 Direction determineBranchDirection(const DiagramEditorComponentInfo& currentNode, Direction preferredDir, Context& context); QPoint getComponentPosition(const QString& componentName, Context& context); void updateComponent(DiagramEditorComponentInfo& compo, Direction dir, const QPoint& position, int rotate, Context& context); // 辅助函数 QStandardItem* getNameItem(const QString& name, Context& context); int getComponentDirection(const QString& compoName, Context& context); QRectF calculateBoundingRect(const QMap& components); private: int m_compoWidth = 50; int m_compoHeight = 30; DiagramEditorModel* m_model = nullptr; };