diff --git a/StoryPresent/dag_layout.cpp b/StoryPresent/dag_layout.cpp index df08a12..88b0542 100644 --- a/StoryPresent/dag_layout.cpp +++ b/StoryPresent/dag_layout.cpp @@ -228,7 +228,7 @@ QList> DAGGraph::tidy_graph_nodes() { } #include -void dags::DAGGraph::graph_layout_nodes_forward(const QList>& nodes) +void dags::DAGGraph::graph_layout_layers_forward(const QList>& nodes) { for (auto layer_index = 0; layer_index < maxLayerCount(); ++layer_index) { this->nodes_sort_forward_within_layer(layer_index, nodes); @@ -360,7 +360,7 @@ void dags::DAGGraph::nodes_sort_with_above(int layer_index, const QList>& total_nodes) +void dags::DAGGraph::graph_adjust_layers_backward(const QList>& total_nodes) { auto layer_index = this->maxLayerCount() - 1; while (layer_index > -1) { @@ -470,17 +470,39 @@ void dags::DAGGraph::nodes_sort_with_belows(int curr_layer, const QList>& total_nodes) { int layer_index = 0; - while (this->node_adjust_inlayer_forward(layer_index, total_nodes)) { + while (this->nodes_revise_forward_within_layer(layer_index, total_nodes)) { this->node_adjust_inlayer_partition_indi(layer_index, total_nodes); this->nodes_sort_with_above(layer_index, total_nodes); layer_index++; } } +bool dags::DAGGraph::nodes_revise_forward_within_layer(int layer_index, const QList>& nodes) +{ + if (layer_index) { + QList> nodes_within_current_layer; + std::copy_if(nodes.begin(), nodes.end(), std::back_inserter(nodes_within_current_layer), + [=](std::shared_ptr n) { return n->layerNumber() == layer_index; }); + + QList> sort_arrows; + std::for_each(nodes_within_current_layer.begin(), nodes_within_current_layer.end(), + [&](std::shared_ptr curr_node) { + auto prev_nodes = curr_node->getUpstreamNodes(); + std::for_each(prev_nodes.begin(), prev_nodes.end(), + [&](std::shared_ptr n) { + sort_arrows << std::make_pair(n->sortNumber().toInt(), curr_node->sortNumber().toInt()); + }); + }); + + + } + return true; +} + +/* bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList>& total_nodes) { // 挑选当前层次节点 @@ -541,7 +563,7 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList>& total_nodes) { // 提取层次节点并排序节点 @@ -624,13 +646,13 @@ bool dags::DAGGraph::node_adjust_inlayer_partition_indi(int layer_index, const Q this->current_nodelist_filling_indi(nodes_within_current_layer); return true; } - -std::pair dags::DAGGraph::node_evaluate_with_downstream(std::shared_ptr node, const QList>& total_nodes) +/* +std::pair dags::DAGGraph::node_evaluate_with_downstream(std::shared_ptr curr_node, const QList>& total_nodes) { - decltype(node) next_node; - if (node->isFakeNode()) { - auto n_data = node->headsNode(); - next_node = *std::find_if(total_nodes.begin(), total_nodes.end(), [&](decltype(node) n) { + decltype(curr_node) next_node; + if (curr_node->isFakeNode()) { + auto n_data = curr_node->headsNode(); + next_node = *std::find_if(total_nodes.begin(), total_nodes.end(), [&](decltype(curr_node) n) { if (!n->isFakeNode()) { return n->layerNode() == n_data; } @@ -638,14 +660,14 @@ std::pair dags::DAGGraph::node_evaluate_with_downstream(st }); } else { - auto n_datas = node->layerNode()->nextNodes(); + auto n_datas = curr_node->layerNode()->nextNodes(); if (!n_datas.size()) - return std::make_pair(node->layerNumber(), node->sortNumber().toLongLong()); + return std::make_pair(curr_node->layerNumber(), curr_node->sortNumber().toLongLong()); QList> next_nodes; std::transform(n_datas.begin(), n_datas.end(), std::back_inserter(next_nodes), [&](std::shared_ptr inst) { - auto rst = std::find_if(total_nodes.begin(), total_nodes.end(), [&](decltype(node) n) { + auto rst = std::find_if(total_nodes.begin(), total_nodes.end(), [&](decltype(curr_node) n) { if (!n->isFakeNode()) { return n->layerNode() == inst; } @@ -664,11 +686,11 @@ std::pair dags::DAGGraph::node_evaluate_with_downstream(st return std::make_pair(next_node->layerNumber(), next_node->sortNumber().toLongLong()); } -std::pair dags::DAGGraph::node_evaluate_with_upstream(std::shared_ptr node, const QList>& total_nodes) +std::pair dags::DAGGraph::node_evaluate_with_upstream(std::shared_ptr curr_node, const QList>& total_nodes) { - auto prim_nodes = node->getUpstreamNodes(); + auto prim_nodes = curr_node->getUpstreamNodes(); if (!prim_nodes.size()) - return std::make_pair(node->layerNumber(), node->sortNumber().toLongLong()); + return std::make_pair(curr_node->layerNumber(), curr_node->sortNumber().toLongLong()); QList> prev_nodes; std::transform(prim_nodes.begin(), prim_nodes.end(), std::back_inserter(prev_nodes), @@ -721,18 +743,18 @@ void dags::DAGGraph::primitiveGraphLayout() { } auto tidy_nodes = this->tidy_graph_nodes(); - this->graph_layout_nodes_forward(tidy_nodes); + this->graph_layout_layers_forward(tidy_nodes); this->node_with_layout = tidy_nodes; } void dags::DAGGraph::forwardsLayoutImpls() { - this->graph_layout_nodes_forward(this->node_with_layout); + this->graph_layout_layers_forward(this->node_with_layout); } void dags::DAGGraph::backwardsLayoutImpls() { - this->graph_adjust_nodes_backward(this->node_with_layout); + this->graph_adjust_layers_backward(this->node_with_layout); } void dags::DAGGraph::adjustLayoutImpls() diff --git a/StoryPresent/dag_layout.h b/StoryPresent/dag_layout.h index 5ae0923..ec9c9a4 100644 --- a/StoryPresent/dag_layout.h +++ b/StoryPresent/dag_layout.h @@ -91,10 +91,10 @@ namespace dags { int node_layering_adj(std::shared_ptr inst); QList> tidy_graph_nodes(); - void graph_layout_nodes_forward(const QList>& total_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_nodes_backward(const QList>& total_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); @@ -102,9 +102,12 @@ namespace dags { 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 node_adjust_ingraph_forward(const QList>& total_nodes); + void node_adjust_ingraph_forward(const QList>& total_nodes); + bool nodes_revise_forward_within_layer(int layer_index, const QList>& nodes); + bool node_adjust_inlayer_partition_indi(int layer_index, const QList>& total_nodes); + + //bool node_adjust_inlayer_forward(int curr_layer, const QList>& total_nodes); - //bool node_adjust_inlayer_partition_indi(int layer_index, 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);