Моя компания создает редактор графического представления для чат-ботов. Для этого мы используем Cytoscape вместе с расширением cytoscape-cola
. Одна из проблем, с которой мы сталкиваемся, - это динамическое добавление новых узлов в граф без их перекрытия с существующими узлами на графике.
Я просматривал предыдущие подобные вопросы (перечисленные ниже), но безрезультатно:
Cytoscape - обрабатывать заблокированные узлы Я попробовал решение там, то есть применение макета только к вновь добавленным узлам, но они продолжают располагаться в центре экрана.
Cytoscape -игнорировать заблокированные узлы Я пробовал решение, упомянутое здесь, но независимо от блокировки узлов за один раз, т.е. cy.nodes().lock()
или по отдельности, т.е. cy.nodes().forEach(node => node.lock())
, заблокированные узлы все еще продолжают двигаться. Здесь также интересно отметить, что при индивидуальной блокировке узлов вновь добавленные узлы также блокируются независимо от того, блокирую ли я вызов выше или нет.
Cytoscape - динамически добавлять узлы безПеремещение других Я также попробовал это решение, но заблокированные узлы все еще перемещаются, и полный макет изменяется - иногда совсем, иногда просто немного.
Код
Этов настоящее время то, что я использую для построения графа:
const layoutConfig = {
name: "cola",
handleDisconnected: true,
animate: true,
avoidOverlap: true,
infinite: false,
unconstrIter: 1,
userConstIter: 0,
allConstIter: 1,
ready: e => {
e.cy.fit()
e.cy.center()
}
}
this.graph = Cytoscape({ ... })
this.layout = this.grapg.makeLayout(layoutConfig)
this.layout.run();
Это то, что я использую для добавления новых узлов к графу:
const addElements = (elements: ElementSingular | ElementMultiple) => {
this.graph.nodes().forEach(node => {
node.lock();
})
this.graph.add(elements)
this.layout = this.graph.makeLayout(layoutConfig)
this.layout.on("layoutready", () => {
this.nodes().forEach(node => {
node.unlock();
})
})
this.layout.run()
this.graph.nodes().forEach(node => {
node.unlock();
})
}
Я бы хотелвыполните одно из следующих действий:
- Поймите, что я делаю неправильно , если то, что я пытаюсь выполнить, возможно, но мой код не достигает этого
- Поймите, почему я не смогу это сделать, то есть ограничения, которые управляют этим