我有一个GoJS画布,用户可以根据自己的意愿创建该画布,应用程序需要按顺序处理节点。
因此,根据GoJS文档,有gojsNodeObject.findTreeLevel(),它返回图中节点的级别。
到目前为止,它的工作还不错,但最近它引起了一个问题。
请看一下我下面关于小提琴http://jsfiddle.net/2pqretgu/1/的图表
根据逻辑,它返回给我的序列是
["s1", "s2", "s3", "s4", "i1", "i2", "i3", "j1", "j2", "j3", "i4", "j4"]
但我希望这个序列是
i1应该在j1之前
j1应该在i2和i3之前
i2和i3应该在j2和j3之前
j4应该是最后一个
简而言之,我正在按照分层布局创建的层执行节点,但我不能依靠布局来找到它的位置,因为用户可以更改布局。
如有任何帮助或指点,将不胜感激。
发布于 2022-01-28 15:01:11
在我看来,如果库的实现不适合您,最好自己实现逻辑。
这正是我所做的,看看这个小提琴:https://jsfiddle.net/Ba2siK/8megtv0k/
我将节点映射到一个图中,然后递归遍历该图以计算每个节点的深度。输出是:["s1", "s2", "i1", "j1", "s3", "s4", "i2", "i3", "j2", "j3", "i4", "j4"]
// Create an object that maps each node to its children
const graph = {};
myDiagram.nodes.each(node => {
graph[node.data.key] = flattenIterator(node.findNodesOutOf());
});
const nodesLevels = getNodesLevels(myDiagram);
const sortedLevelsInfo = Object.keys(nodesLevels).sort((a, b) => nodesLevels[a] - nodesLevels[b]);
console.log(nodesLevels);
console.log(sortedLevelsInfo);
// Output: ["s1", "s2", "i1", "j1", "s3", "s4", "i2", "i3", "j2", "j3", "i4", "j4"]
// Convert an iterator to an array, to make the code more readable
function flattenIterator(collection) {
const items = [];
var it = collection.iterator;
while (it.next()) {
items.push(it.value);
}
return items;
}
function getNodesLevels(diagram) {
const treeLevels = {};
var nodeIterator = diagram.nodes.iterator;
while (nodeIterator.next()) {
findNodeLevel(graph, nodeIterator.value, treeLevels);
}
const maxLevel = Math.max(...Object.values(treeLevels));
// Reversing the order of node depths, since deepest node starts from 0
Object.keys(treeLevels).map((key, index) => {
treeLevels[key] = maxLevel - treeLevels[key];
});
return treeLevels;
}
function findNodeLevel(graph, node, levels) {
const key = node.data.key;
if (!Object.keys(levels).includes(key)) {
const child = graph[key];
if (!child) {
levels[key] = 0
} else {
if (child.length) {
const childrenLevels = child.map(child => findNodeLevel(graph, child, levels) + 1);
levels[key] = Math.max(...childrenLevels);
} else {
levels[key] = 0;
}
}
}
return levels[key];
}https://stackoverflow.com/questions/67436655
复制相似问题