gpt4 book ai didi

c++ - 在OGDF中设置节点边界框​​大小

转载 作者:行者123 更新时间:2023-12-03 07:21:55 25 4
gpt4 key购买 nike

我正在尝试使用OGDF库和Sugiyama布局在Qt中布局和可视化代码流程图。我使用的版本是v2020.02,在撰写本文时应为最新版本。
我的问题:
创建节点时,我将它们设置为各种大小,但是在调用SugiyamaLayout算法后,所有节点大小都重置为20x20(大概是默认值?)。
如果改用其他算法(例如PlanarizationLayout),问题将消失,节点大小将保留其分配的值。
我尝试了不同的配置,例如排名,crossMins和布局,但是节点大小不受这些影响。
最小的可重现示例:

//Create graph and attributes
graph_ = new Graph();
GA_ = new GraphAttributes(*graph_, GraphAttributes::nodeGraphics | GraphAttributes::nodeType |
GraphAttributes::nodeLabel | GraphAttributes::nodeStyle | GraphAttributes::edgeGraphics |
GraphAttributes::edgeType | GraphAttributes::edgeArrow);

//Create node and set size
node n = graph_->newNode();
GA_->width(n) = 80; //Or any other dimensions
GA_->height(n) = 40;
//Other nodes and edges omitted

//Create layout
SugiyamaLayout slayout;
slayout.setRanking(new OptimalRanking());
slayout.setCrossMin(new MedianHeuristic());
OptimalHierarchyLayout* ohl = new OptimalHierarchyLayout;
ohl->layerDistance(30.0);
ohl->nodeDistance(25.0);
ohl->weightBalancing(0.8);
slayout.setLayout(ohl);
slayout.call(*GA_);

//Retrieve new node position and size
double x = GA_->x(n);
double y = GA_->y(n);
double w = GA_->width(n); //This always retrieves w*h of 20x20,
double h = GA_->height(n); //no matter what node dimensions were initially set

//Draw graph, etc. (omitted)

最佳答案

经过更多研究后,OGDF邮件列表为我提供了答案。
这种现象确实是由HierarchyLayoutModule.h中的错误引起的,该错误未保留正确的边界框大小。
可以在here中找到相应的Github问题,并将在下一版本中修复。
同时,可以通过使用以下代码片段替换HierarchyLayoutModule::call中的\include\ogdf\layered\HierarchyLayoutModule.h方法来解决此问题:

/**
* \brief Computes a hierarchy layout of \p levels in \p GA
* @param levels is the input hierarchy.
* @param GA is assigned the hierarchy layout.
*/
void call(const HierarchyLevelsBase &levels, GraphAttributes &GA) {
GraphAttributes AGC(levels.hierarchy());
// Copy over relevant nodeGraphics attributes that may be used by doCall or need to be preserved
// edgeGraphics' bend points need to be cleared and aren't copied over
if (GA.has(GraphAttributes::nodeGraphics)) {
const GraphCopy &GC = dynamic_cast<const GraphCopy&>(AGC.constGraph());
for (node vOrig: GA.constGraph().nodes)
{
node v = GC.copy(vOrig);
if (v != nullptr) {
AGC.height(v) = GA.height(vOrig);
AGC.width(v) = GA.width(vOrig);
AGC.shape(v) = GA.shape(vOrig);
}
}
}
doCall(levels,AGC);
AGC.transferToOriginal(GA);
}

关于c++ - 在OGDF中设置节点边界框​​大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64857175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com