Фиксированные узлы в силовой компоновке для d3v4 и d4v5
В d3v3 d.fixed
будут фиксированы узлы в d.x
и d.y
; однако в d3v4 / 5 этот метод больше не поддерживается. В документации d3 указано:
. Чтобы исправить узел в данной позиции, вы можете указать два дополнительных свойства:
fx - the node’s fixed x-position
fy - the node’s fixed y-position
В конце каждого тика после применения любых сил узел с определенным узлом.fx имеет node.x сбрасывается на это значение и устанавливается node.vx до нуля; Аналогично, узел с определенным узлом.fy имеет node.y сбрасывается на это значение, а node.vy устанавливается на ноль. Чтобы исключить ранее установленный узел, установите node.fx и node.fy в значение null или удалите эти свойства.
Вы можете установить атрибуты
fx
иfy
для силы узлов в вашем источнике данных, или вы можете динамически добавлять и удалять значенияfx
иfy
. Ниже приведенный ниже фрагмент устанавливает эти свойства в конце событий перетаскивания, просто перетащите узел, чтобы зафиксировать его положение:
var data ={ "nodes": [{"id": "A"},{"id": "B"},{"id": "C"},{"id":"D"}], "links": [{"source": "A", "target": "B"}, {"source": "B", "target": "C"}, {"source": "C", "target": "A"}, {"source": "D", "target": "A"}] } var height = 250; var width = 400; var svg = d3.select("body").append("svg") .attr("width",width) .attr("height",height); var simulation = d3.forceSimulation() .force("link", d3.forceLink().id(function(d) { return d.id; }).distance(50)) .force("charge", d3.forceManyBody()) .force("center", d3.forceCenter(width / 2, height / 2)); var link = svg.append("g") .selectAll("line") .data(data.links) .enter().append("line") .attr("stroke","black"); var node = svg.append("g") .selectAll("circle") .data(data.nodes) .enter().append("circle") .attr("r", 5) .call(d3.drag() .on("drag", dragged) .on("end", dragended)); simulation .nodes(data.nodes) .on("tick", ticked) .alphaDecay(0); simulation.force("link") .links(data.links); function ticked() { link .attr("x1", function(d) { return d.source.x; }) .attr("y1", function(d) { return d.source.y; }) .attr("x2", function(d) { return d.target.x; }) .attr("y2", function(d) { return d.target.y; }); node .attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }); } function dragged(d) { d.fx = d3.event.x; d.fy = d3.event.y; } function dragended(d) { d.fx = d3.event.x; d.fy = d3.event.y; }
В случае, если кто-то еще столкнется с той же проблемой - мне нужно было иметь все 3 дополнительных поля, включая известные Длина
let stream = new Readable();
stream.push(foo);
stream.push(null);
form.append('inputFiles[]', stream, {
filename : 'test.xml',
contentType: 'application/xml',
knownLength: foo.length
}); //extra fields necessary
Могу ли я предложить другой подход? Поскольку вы используете ответ с 2014 года ...
let form = new FormData();
form.append('fieldName', 'fileBuffer/DataString', 'fileName');
axios.post('url', form, {
headers: {
'Content-Type': `multipart/form-data; boundary=${form._boundary}`
}
}).then((res) => {
console.log(res.data);
res.json(responseFromServer.data);
}).catch((err) => {
res.status(400).send(err);
});