我有一个允许平移和缩放行为的 d3 图表。它还具有 subGraph 功能,允许用户展开和折叠 subGraph。当用户单击图标打开和关闭 subGraph 时,此代码运行:
btn.on("click", function(d:any, i:any) {
parentNode = nodeObject; // gives me he x and y coordinates of the parent node
d3.event["stopPropagation"]();
e["subGraph"].expand = !expand; // add or remove subGraph
window.resetGraph = !window.resetGraph;
console.log(window.resetGraph);
if (window.resetGraph) {
window.scale = window.zoom.scale();
window.translate = window.zoom.translate();
window.zoom.scale(1).translate([0 , 0]);
} else {
window.zoom.scale(window.scale).translate(window.translate);
}
console.log(window.zoom.scale());
console.log(translate);
renderGraph();
});
我实质上是在单击图标时添加和删除节点的 subGraph 属性。然后完全重绘图形。
我可以获得父容器的 x 和 y 坐标,但是如果我要重新渲染图形,我该如何渲染图形,以便图形保持与单击时相同的比例和平移切换子图图标。我试图在与之前相同的位置重新绘制图表,只是子图展开或折叠。以下是图表呈现时似乎与我作斗争的代码:
var scaleGraph = function() {
var graphWidth = g.graph().width + 4;
var graphHeight = g.graph().height + 4;
var width = parseInt(svg.style("width").replace(/px/, ""), 10);
var height = parseInt(svg.style("height").replace(/px/, ""), 10);
var zoomScale = originalZoomScale;
// Zoom and scale to fit
if (ctrl.autoResizeGraph === "original") {
zoomScale = initialZoomScale;
}
translate = [(width / 2) - ((graphWidth * zoomScale) / 2) + 2, 1];
zoom.center([width / 2, height / 2]);
zoom.size([width, height]);
zoom.translate(translate);
zoom.scale(zoomScale);
zoom.event(svg);
};
如果我检查是否已单击切换图标,是否可以使用与重绘前相同的比例和平移来重绘图形?
谢谢