From b57ca6e57eec202c6b29807173cec88c14a18d06 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sun, 6 Oct 2024 20:35:18 +0800 Subject: [PATCH] 1 --- StoryPresent/dag_layout.cpp | 85 +++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/StoryPresent/dag_layout.cpp b/StoryPresent/dag_layout.cpp index 4e95b9a..d24b076 100644 --- a/StoryPresent/dag_layout.cpp +++ b/StoryPresent/dag_layout.cpp @@ -507,13 +507,15 @@ void dags::DAGGraph::node_adjust_ingraph_forward(const QListnode_adjust_inlayer_forward(layer_index, total_nodes)) { + this->sort_index_partition_indi(layer_index, total_nodes); + this->nodes_sort_with_above(layer_index, total_nodes); layer_index++; - } - - for (auto idx = 0; idx < layer_index; ++idx) { - this->sort_index_partition_indi(idx, total_nodes); - this->nodes_sort_with_above(idx, total_nodes); } + + //for (auto idx = 0; idx < layer_index; ++idx) { + // this->sort_index_partition_indi(idx, total_nodes); + // this->nodes_sort_with_above(idx, total_nodes); + //} } bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList>& total_nodes) @@ -530,8 +532,8 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList, qlonglong, qlonglong, qlonglong, qlonglong>> orders_helper; std::transform(curr_layer_nodes.begin(), curr_layer_nodes.end(), std::back_inserter(orders_helper), [&](std::shared_ptr ins) { - auto val_n = this->node_evaluate_with_downstream(ins, total_nodes); auto val_p = this->node_evaluate_with_upstream(ins, total_nodes); + auto val_n = this->node_evaluate_with_downstream(ins, total_nodes); return std::make_tuple(ins, val_n.first, val_n.second, val_p.first, val_p.second); }); @@ -540,17 +542,40 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList, qlonglong, qlonglong, qlonglong, qlonglong> a, std::tuple, qlonglong, qlonglong, qlonglong, qlonglong> b) { - if (std::get<1>(a) == std::get<1>(b)) { - if (std::get<2>(a) == std::get<2>(b)) { - if (std::get<3>(a) == std::get<3>(b)) { - return std::get<4>(a) < std::get<4>(b); + auto prev_nodesa = std::get<0>(a)->getUpstreamNodes(); + auto prev_nodesb = std::get<0>(b)->getUpstreamNodes(); + if (!prev_nodesa.size() && !prev_nodesb.size()) + return a < b; + + if (prev_nodesa.size() && prev_nodesb.size()) { + if (std::get<3>(a) == std::get<3>(b)) { + if (std::get<4>(a) == std::get<4>(b)) { + if (std::get<1>(a) == std::get<1>(b)) { + return std::get<2>(a) < std::get<2>(b); + } + return std::get<1>(a) < std::get<1>(b); } - return std::get<3>(a) < std::get<3>(b); + return std::get<4>(a) < std::get<4>(b); } - return std::get<2>(a) < std::get<2>(b); + return std::get<3>(a) < std::get<3>(b); } - return std::get<1>(a) < std::get<1>(b); + if (prev_nodesa.size()) { + return false; + } + return true; + + //if (std::get<1>(a) == std::get<1>(b)) { + // if (std::get<2>(a) == std::get<2>(b)) { + // if (std::get<3>(a) == std::get<3>(b)) { + // return std::get<4>(a) < std::get<4>(b); + // } + // return std::get<3>(a) < std::get<3>(b); + // } + // return std::get<2>(a) < std::get<2>(b); + //} + + //return std::get<1>(a) < std::get<1>(b); }); QList sort_values; @@ -568,22 +593,19 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList>& total_nodes) { - // 提取层次节点 + // 提取层次节点并排序节点 QList> nodes_within_current_layer; std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(nodes_within_current_layer), [=](std::shared_ptr inst) { return layer_index == inst->layerNumber(); }); - // 排序节点 std::sort(nodes_within_current_layer.begin(), nodes_within_current_layer.end(), [](std::shared_ptr a, std::shared_ptr b) { return a->sortNumber() < b->sortNumber(); }); - if (!nodes_within_current_layer.size()) return false; - // 获取布局系数 QList, QVariant>> sort_helper; for (auto& inst : nodes_within_current_layer) { @@ -597,9 +619,18 @@ bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList a, std::shared_ptr b) { return a->layerNumber() < b->layerNumber(); }); - sort_helper.append(std::make_pair(*anchor_it, (*anchor_it)->sortNumber())); + sort_helper.append(std::make_pair(inst, (*anchor_it)->sortNumber())); } + QList sort_backup; + std::transform(sort_helper.begin(), sort_helper.end(), std::back_inserter(sort_backup), + [](std::pair, QVariant> u) { return u.second; }); + + auto aligned_items_count = std::count_if(sort_backup.begin(), sort_backup.end(), [](QVariant u) { return !u.isNull(); }); + if (!aligned_items_count) + return false; + + // 补全布局系数 QVariant start_value; for (auto idx = 0; idx < sort_helper.size(); ++idx) { auto curr_u = sort_helper[idx]; @@ -612,9 +643,6 @@ bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList, QVariant> u) { - u.first->setSortNumber(u.second.toDouble()); + [=](std::pair, QVariant> u) { + u.first->setSortNumber(u.second.toDouble() - val_revised); }); this->current_nodelist_filling_indi(nodes_within_current_layer);