Cytoscape.js динамически добавляет узлы, не перемещая остальные - PullRequest
1 голос
/ 05 марта 2019

Я работаю над приложением, которое извлекает данные из базы данных, и я хотел бы показать их в виде графика.

Я управлял событием "tap" на узле, показывая их соседей (узлы и соединения)).

Проблема в том, что каждый раз, когда я хочу показать соседей, весь граф перерисовывается, и если некоторые узлы были перемещены ранее, они теряют свою прежнюю позицию.

IsЕсть ли способ добавить только соседей, не влияя на положение узла, уже присутствующего в макете?

Важно : ограничение состоит в том, что все узлы должны быть «подвижными»: числоколичество узлов в графе может легко увеличиться, и я хотел бы иметь возможность перемещать / организовывать их без потери результата при добавлении новых (щелкая по узлу)

Я использую кола-макет в моем проекте.

Вот как мне удалось добавить соседей:

function addNeighbour(node, link) {
    cy.startBatch();
    addNode(link.otherNode.type, link.otherNode.name, link.otherNode.properties);
    cy.add([
      {
        group: 'edges',
        data:
        {
          id: node + ":" + link.type + ":" + link.otherNode.type + ":" + link.otherNode.name,
          source: source,
          target: target,
          type: link.type,
          properties: linkproperties
        }
      }
    ]);
    refreshLayout()
    cy.endBatch();
  }
}

var layoutOpts = {
    name: 'cola',
    refresh: 2,
    edgeLength: 200,
    fit: false
}

function refreshLayout() {
    layout.stop();
    layout = cy.elements().makeLayout(layoutOpts);
    layout.run();
}

Заранее спасибо

1 Ответ

1 голос
/ 12 марта 2019

(1) Вы можете заблокировать узел, чтобы сделать его положение неизменным, с помощью nodes.lock().

(2) Вы можете запустить макет на подмножестве графика, чтобы исключить определенные элементы, с помощью eles.layout().

Любая из этих стратегий может использоваться в целом, или они могут использоваться в тандеме.

В вашем случае это звучит так, как будто вы должны использовать (1).

  • Блокировка существующих узлов.
  • Добавить новые узлы.
  • Запустите Cola на всем графике.
  • Когда кола будет готова, освободите заблокированные узлы.

Обратите внимание, однако, что это не всегда дает хороший результат. Вы могли бы чрезмерно ограничить систему. Если вы хотите получить хороший результат макета, вероятно, лучше всего запустить макет на всем без блокировки, как предложил Стефан Т.

...