我一直在努力从 d3 节点获取标签的宽度和高度。我在节点上有一个图标,它将切换一个子图。但我需要根据标签的大小动态设置节点的宽度和高度。一旦我得到标签的宽度,我就可以为图标腾出空间。标签尺寸可能会改变,所以我需要知道宽度。这是我所拥有的,我正在使用 dagre-d3 来定位和渲染节点:
nodes = [
{id: 1, shape: "diamond", label: "Start"}
]
for (var i = 0; i < nodes.length; i++) {
g.setNode(nodes[i].id, {
label: nodes[i].label
width: // I want to set the width here based on the width of the label
});
}
非常感谢任何帮助。如果需要,很高兴显示更多代码。
更新:
这是我为获取每个节点的文本所做的工作:
svgGroup.selectAll("tspan").each(function (object:any) {
object = parseInt(object, 10) // gives me the id of each node
var nodeObject = g.node(object); // get the full node
var length = this.getComputedTextLength();
for (var i = 0; i < nodes.length; i++) {
if (node[i].id === object) {
// add the node label width to the nodes array
nodes[i].labelWidth = length;
}
}
}
以上允许我根据标签+切换图标设置节点的宽度。我遇到的一个问题是,如果一个节点有一个子图,我注意到“svgGroup.selectAll(“tspan”)”只是获取顶级节点。例如,我的节点如下所示:
this.nodes = [
{id: 1, shape: "ellipse", label: "start",
subGraph: {
nodes = [
{id: 10, shape: "ellipse", label: "SubNode1"},
{id: 11, shape: "ellipse", label: "SubNode2"}
],
edges = [
{from: 10, to: 11, type: "vee", label: ""}
]
}
},
{id: 2, shape: "rect", label: "Square"}
]
“svgGroup.selectAll”语句仅获取 id 1 和 id 2 的顶部节点的 tspan。有没有办法获取 id 10 和 id 11 的子图节点的 tspan。因为 id 10 或 11 可能有一个subGraph 嵌套在其中,如果是这种情况,我还需要获取这些节点的标签宽度。