#pragma once #include "data_type.h" #include #include #include namespace dags { /// /// 节点分层辅助数据 /// class DAGLayerHelper { private: graph_data::Node bind_node; int input_count = 0; QList> next_points; int layer_v = 0; public: explicit DAGLayerHelper(const graph_data::Node& bind); graph_data::Node bindPoint() const; int& inputCount(); int layerValue() const; void setLayerValue(int v); void nextAppend(std::shared_ptr inst); QList> nextNodes() const; }; /// /// 节点排序辅助节点 /// class DAGOrderHelper { private: std::shared_ptr layer_bind = nullptr; std::shared_ptr relate_bind = nullptr; std::shared_ptr towards_to = nullptr; int layer_number = 0; QVariant sort_number; QList> __prev_layer_nodes; public: /// /// 构建一个可视图形节点 /// /// 图形节点 DAGOrderHelper(std::shared_ptr bind); /// /// 构建一个辅助的不可视图形节点 /// /// 起始节点 /// 终止节点 DAGOrderHelper(std::shared_ptr f, std::shared_ptr t); bool isFakeNode() const; std::shared_ptr layerNode() const; std::shared_ptr tailsNode() const; std::shared_ptr headsNode() const; int layerNumber() const; void setLayerNumber(int v); QVariant sortNumber() const; void setSortNumber(double v); QList> getUpstreamNodes() const; void appendUpstreamNode(std::shared_ptr inst); }; class DAGGraph { private: QHash> graph_inst; QList> node_with_layout; int max_layer_count = 0; public: void rebuildFromEdges(const QList& arrow_list); void primitiveGraphLayout(); void forwardsLayoutImpls(); void backwardsLayoutImpls(); void adjustLayoutImpls(); QList> nodeWithLayout() const; int maxLayerCount() const; private: std::shared_ptr spawns_peak(QList>& ref_set); void graph_recovery(const QList> &sort_seqs); int node_layering(const std::shared_ptr &inst, int layer_current); int node_layering_adj(std::shared_ptr inst); QList> tidy_graph_nodes(); void graph_layout_layers_forward(const QList>& total_nodes); void nodes_sort_forward_within_layer(int layer_index, const QList> &nodes); void graph_adjust_layers_backward(const QList>& total_nodes); QList> layer_adjust_via_next_sibling(int curr_layer, const QList>& total_nodes); void node_adjust_via_next_sibling(std::shared_ptr curr_node, const QList>& total_nodes); bool current_nodelist_filling_indi(const QList>& ordered_nodes); void nodes_sort_with_above(int curr_layer, const QList>& total_nodes); void nodes_sort_with_belows(int curr_layer, const QList>& total_nodes); //void graph_springs_layout_forward(const QList>& total_nodes); //QList> nodes_revise_forward_within_layer(int layer_index, const QList>& nodes); //double node_revise_via_upstream(const QList, double>>& prev_nodes, std::shared_ptr node); //bool current_nodelist_filling_springs(const QList>& ordered_nodes); //bool node_adjust_inlayer_forward(int curr_layer, const QList>& total_nodes); //std::pair node_evaluate_with_downstream(std::shared_ptr node, const QList>& total_nodes); //std::pair node_evaluate_with_upstream(std::shared_ptr node, const QList>& total_nodes); }; }