2015-09-09 1 views
0

Моя цель - Я пытаюсь вычислить [x, y] узлы после того, как узел перетаскивается так, что узел занимает позицию, основанную на том, что я вычислял, а не там, где она была отброшена.Узлы и ссылки для развертывания силы D3js

Соответствующие примеры - Я видел примеры обновления узлов и ссылок в forcelayout. Скажем, например,

https://gist.github.com/mbostock/1095795

http://bl.ocks.org/mbostock/1095795

Мой подход (который не работает) -

В моем случае требование немного отличается от примера выше. После перетаскивания узла (я делаю force.stop(), чтобы избежать силового макета, занимающего назначение позиции для перетаскиваемого узла), я переназначаю узел другому [x, y], основанному на том, где узел удален. Дайте ему d.fixed. После этого я обновляю свои узлы. Узел занимает расчетную позицию [x.y], а не там, где она была сброшена. До этого шага все прекрасно.

Однако при последующих перетаскиваниях других узлов (когда функция drag.resume() запускается автоматически), узел, который был перетащен на предыдущем шаге, занимает [x, y] на основе того, где он был удален раньше и не был основан на мой расчетный [x, y], который он хорошо использовал при завершении предыдущего шага.

Я думал, что макет силы не обновляется узлами и ссылками. Поэтому я обновил силовую схему с новыми узлами и ссылками, как показано ниже:

force.nodes (newNodes) .links (newLinks) .start();

Я делаю это в mouseup.drag

Тем не менее он не работает, любая помощь приветствуется. Спасибо

+0

Вы должны показать нам код здесь. –

+0

Пожалуйста, найдите ссылку для скрипки ниже. jsfiddle.net/lkanikka/Lymtedrq Для простоты, после того, как узел перетаскивается, я помещаю его в [10,10]. На практическом примере это другое. После того, как узел установлен, после перетаскивания перетащите другой узел. Узел, который я перетащил ранее, возвращается к [xy], где он был сброшен, а не [10,10] (расчетный [x, y]) ... Похож на [x, y], где он отбрасывается, сохраняется в макете силы. Как обновить forcelayout с помощью новых [x, y]? Я обновил массив графа в mouseup и сделал force.start(). Это не сработало ... –

+0

Вам также нужно установить атрибуты 'px' и' py' https://jsfiddle.net/Lymtedrq/1/ –

ответ

0

При настройке позиции вам необходимо установить атрибуты px и py, которые также используются макетом внутри. Измененный (и упрощенный) пример here.