rebuild nodes move from js to css transition (not completed)

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-12-07 19:31:35 +10:00
parent 743ac4f653
commit bb51a6869a

502
graph.js
View File

@ -51,13 +51,13 @@ class graph {
} }
// Реестр узлов // Реестр узлов
#nodes = new Set(); #nodes = new Set;
get nodes() { get nodes() {
return this.#nodes; return this.#nodes;
} }
// Реестр соединений // Реестр соединений
#connections = new Set(); #connections = new Set;
get connections() { get connections() {
return this.#connections; return this.#connections;
} }
@ -174,6 +174,7 @@ class graph {
*/ */
actions = { actions = {
collision: { collision: {
active: false,
max: 100, max: 100,
current: 0, current: 0,
flow: { flow: {
@ -182,6 +183,7 @@ class graph {
} }
}, },
pushing: { pushing: {
active: true,
max: 100, max: 100,
current: 0, current: 0,
flow: { flow: {
@ -190,6 +192,7 @@ class graph {
} }
}, },
pulling: { pulling: {
active: false,
max: 100, max: 100,
current: 0, current: 0,
flow: { flow: {
@ -204,21 +207,21 @@ class graph {
* *
* Реестр узлов которые обработали столкновения с целевым узлом в потоке * Реестр узлов которые обработали столкновения с целевым узлом в потоке
*/ */
collisions = new Set(); collisions = new Set;
/** /**
* Отталкивания * Отталкивания
* *
* Реестр узлов которые обработали столкновения с целевым узлом в потоке * Реестр узлов которые обработали столкновения с целевым узлом в потоке
*/ */
pushings = new Set(); pushings = new Set;
/** /**
* Притягивания * Притягивания
* *
* Реестр узлов которые обработали притягивание с целевым узлом в потоке * Реестр узлов которые обработали притягивание с целевым узлом в потоке
*/ */
pullings = new Set(); pullings = new Set;
/** /**
* Конструктор узла * Конструктор узла
@ -554,6 +557,12 @@ class graph {
// Запись отступа заголовка (чтобы был по центру описания) // Запись отступа заголовка (чтобы был по центру описания)
a.style.left = description.offsetWidth / 2 - a.offsetWidth / 2 + 'px'; a.style.left = description.offsetWidth / 2 - a.offsetWidth / 2 + 'px';
// Запись в свойство
this.#element = article;
// Инициализация
this.init();
/** /**
* Показать описание * Показать описание
*/ */
@ -613,11 +622,8 @@ class graph {
_this.move(null, null, true); _this.move(null, null, true);
} }
// Запись в свойство // Запись в реестр
this.#element = article; this.#operator.nodes.add(this);
// Инициализация
this.init();
// Сброс данных потока // Сброс данных потока
this.reset(); this.reset();
@ -715,9 +721,6 @@ class graph {
// Ограничение выполнения // Ограничение выполнения
if (++this.actions.pushing.current >= this.actions.pushing.max) break; if (++this.actions.pushing.current >= this.actions.pushing.max) break;
// Защита от повторной обработки
if (this.pushings.has(connection.to)) continue;
// Удаление из буфера реестра узлов // Удаление из буфера реестра узлов
registry.delete(connection.to); registry.delete(connection.to);
@ -731,9 +734,6 @@ class graph {
// Ограничение выполнения // Ограничение выполнения
if (++this.actions.pushing.current >= this.actions.pushing.max) break; if (++this.actions.pushing.current >= this.actions.pushing.max) break;
// Защита от повторной обработки
if (this.pushings.has(connection.from)) continue;
// Удаление из буфера реестра узлов // Удаление из буфера реестра узлов
registry.delete(connection.from); registry.delete(connection.from);
@ -751,9 +751,6 @@ class graph {
// Ограничение выполнения // Ограничение выполнения
if (++this.actions.pulling.current >= this.actions.pulling.max) break; if (++this.actions.pulling.current >= this.actions.pulling.max) break;
// Защита от повторной обработки
if (this.pullings.has(connection.to)) continue;
// Удаление из буфера реестра узлов // Удаление из буфера реестра узлов
registry.delete(connection.to); registry.delete(connection.to);
@ -767,9 +764,6 @@ class graph {
// Ограничение выполнения // Ограничение выполнения
if (++this.actions.pulling.current >= this.actions.pulling.max) break; if (++this.actions.pulling.current >= this.actions.pulling.max) break;
// Защита от повторной обработки
if (this.pullings.has(connection.from)) continue;
// Удаление из буфера реестра узлов // Удаление из буфера реестра узлов
registry.delete(connection.from); registry.delete(connection.from);
@ -788,88 +782,18 @@ class graph {
for (const connection of this.inputs) connection.synchronize(this); for (const connection of this.inputs) connection.synchronize(this);
} }
collision(nodes, hard = false) {
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) return (this.iteration = 0, false);
// Инициализация буфера реестра узлов
const registry = new Set(nodes);
// Удаление текущего узла из буфера
registry.delete(this);
// Обработка столкновения с узлами
for (const node of registry) {
// Перебор узлов в реестре
// Защита от повторной обработки узла
if (typeof this.collisions === 'object' && this.collisions.has(node)) continue;
// Инициализация счётчика итераций
let iterations = 0;
// Инициализация универсального буфера
let buffer;
do {
// Произошла коллизия (границы кругов пересеклись)
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) break;
// Проверка на превышение ограничения по числу итераций у обрабатываемого узла
if (++node.iteration >= node.limit) break;
// Инициализация координат целевого узла
const x1 = (isNaN((buffer = parseInt(node.element.style.left))) ? 0 : buffer) + node.element.offsetWidth / 2;
const y1 = (isNaN((buffer = parseInt(node.element.style.top))) ? 0 : buffer) + node.element.offsetHeight / 2;
// Инициализация координат обрабатываемого узла
const x2 = (isNaN((buffer = parseInt(this.element.style.left))) ? 0 : buffer) + this.element.offsetWidth / 2;
const y2 = (isNaN((buffer = parseInt(this.element.style.top))) ? 0 : buffer) + this.element.offsetHeight / 2;
// Инициализация вектора между узлами
const between = new Victor(x1 - x2, y1 - y2);
// Узлы преодолели расстояние столкновения? (ограничение выполнения)
if (
between.length() > node.diameter / 2 + this.diameter / 2 ||
++iterations > (hard ? this.actions.collision.flow.hard : this.actions.collision.flow.medium)
) break;
// Реинициализация реестра обработанных узлов и запись целевого узла
node.collisions = node.#operator.actions.collision ? new Set([this]) : null;
// Реинициализация счётчиков итераций
node.actions.collision.current = 0;
// Инициализация координат вектора (узла с которым произошло столкновение)
let vector = new Victor(x1, y1)
.add(new Victor(between.x, between.y).norm().unfloat())
.subtract(new Victor(node.element.offsetWidth / 2, node.element.offsetHeight / 2));
// Перемещение узла
node.move(vector.x, vector.y);
// Проверка на столкновение узлов
} while (
++this.actions.collision.current < this.actions.collision.max &&
between.length() <= node.diameter / 2 + this.diameter / 2
);
}
}
/** /**
* Обработать отталкивания * Обработать столкновения
* *
* @param {*} nodes * @param {*} nodes
* @param {*} add
* @param {*} hard * @param {*} hard
* @param {*} distance
* *
* @returns * @returns
*/ */
pushing(nodes = [], add, hard = false, distance = 100) { collision(nodes, hard = false) {
// Проверка на активность столкновения
if (!this.#operator.actions.collision || !this.actions.collision.active) return false;
// Проверка на превышение ограничения по числу итераций у целевого узла // Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) return (this.iteration = 0, false); if (++this.iteration >= this.limit) return (this.iteration = 0, false);
@ -883,15 +807,18 @@ class graph {
const operator = this; const operator = this;
/** /**
* Оттолкнуть * Столкнуть
* *
* @param {*} node * @param {*} node
* *
* @returns {boolean} Узлы преодолели расстояние отталкивания? * @returns {boolean} Узлы преодолели расстояние отталкивания?
*/ */
function move(node) { function move(node) {
// Защита от повторной обработки узла // Проверка на активность столкновения обрабатываемого узла
if (typeof operator.pushings === 'object' && operator.pushings.has(node)) return false; if (!node.#operator.actions.collision || !node.actions.collision.active) return false;
// Защита от повторной обработки обрабатываемого узла
if (typeof operator.collisions === 'object' && operator.collisions.has(node)) return false;
// Проверка на превышение ограничения по числу итераций у целевого узла // Проверка на превышение ограничения по числу итераций у целевого узла
if (++operator.iteration >= operator.limit) return (operator.iteration = 0, false); if (++operator.iteration >= operator.limit) return (operator.iteration = 0, false);
@ -907,30 +834,20 @@ class graph {
// Инициализация вектора между узлами // Инициализация вектора между узлами
const between = new Victor(x1 - x2, y1 - y2); const between = new Victor(x1 - x2, y1 - y2);
// Инициализация увеличения // Узлы преодолели расстояние столкновения? (ограничение выполнения)
const increase =
operator.shift + node.shift +
(operator.diameter + node.diameter) /
2 ** (operator.increase + node.increase);
// Узлы преодолели расстояние отталкивания?
if ( if (
between.length() > between.length() > node.diameter / 2 + operator.diameter / 2 ||
(node.diameter + operator.diameter) / 2 + ++iterations > (hard ? operator.actions.collision.flow.hard : operator.actions.collision.flow.medium)
distance + ) return false;
increase +
(typeof add === 'number' ? add : 0) ||
++iterations > (hard ? operator.actions.pushing.flow.hard : operator.actions.pushing.flow.medium)
) return true;
// Реинициализация реестра обработанных узлов и запись целевого узла // Реинициализация реестра обработанных узлов и запись целевого узла
node.pushings = node.#operator.actions.pushing ? new Set([operator]) : null; node.collisions = node.#operator.actions.collision ? new Set([operator]) : null;
// Реинициализация счётчиков итераций // Реинициализация счётчиков итераций
node.actions.pushing.current = 0; node.actions.collision.current = 0;
// Инициализация координат обрабатываемого узла (с которым произошло столкновение) // Инициализация координат вектора (узла с которым произошло столкновение)
const vector = new Victor(x1, y1) let vector = new Victor(x1, y1)
.add(new Victor(between.x, between.y).norm().unfloat()) .add(new Victor(between.x, between.y).norm().unfloat())
.subtract(new Victor(node.element.offsetWidth / 2, node.element.offsetHeight / 2)); .subtract(new Victor(node.element.offsetWidth / 2, node.element.offsetHeight / 2));
@ -938,7 +855,7 @@ class graph {
node.move(vector.x, vector.y); node.move(vector.x, vector.y);
// Вход в рекурсию // Вход в рекурсию
setTimeout(move, between.length() / 100, node); move(node);
} }
// Инициализация буфера реестра узлов // Инициализация буфера реестра узлов
@ -947,8 +864,82 @@ class graph {
// Удаление текущего узла из буфера // Удаление текущего узла из буфера
registry.delete(this); registry.delete(this);
// Обработка отталкивания // Обработка столкновения с узлами
for (const node of registry) if (++this.actions.pushing.current < this.actions.pushing.max) move(node); for (const node of registry) if (++this.actions.collision.current < this.actions.collision.max) move(node);
}
/**
* Обработать отталкивания
*
* @param {*} nodes
* @param {*} add
* @param {*} hard
* @param {*} distance
*
* @returns
*/
pushing(nodes = [], add, hard = false, distance = 100) {
// Проверка на активность отталкивания целевого узла
if (!this.#operator.actions.pushing || !this.actions.pushing.active) return false;
// Инициализация счётчика итераций
let iterations = 0;
// Инициализация буфера реестра узлов
const registry = new Set(nodes);
// Удаление текущего узла из буфера
registry.delete(this);
for (const node of registry) {
// Перебор обрабатываемых узлов
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) return (this.iteration = 0, false);
// Проверка на превышение ограничения по числу итераций для отталкивания у обрабатываемого узла
if (++node.actions.pushing.current > node.actions.pushing.max) continue;
// Проверка на активность отталкивания обрабатываемого узла
if (!node.#operator.actions.pushing || !node.actions.pushing.active) continue;
// Защита от повторной обработки обрабатываемого узла
if (typeof this.pushings === 'object' && this.pushings.has(node)) continue;
// Инициализация координат целевого узла
const x1 = node.element.offsetLeft + node.element.offsetWidth / 2;
const y1 = node.element.offsetTop + node.element.offsetHeight / 2;
// Инициализация координат обрабатываемого узла
const x2 = this.element.offsetLeft + this.element.offsetWidth / 2;
const y2 = this.element.offsetTop + this.element.offsetHeight / 2;
// Инициализация вектора между узлами
const between = new Victor(x1 - x2, y1 - y2);
// Вычисление разницы между необходимым расстоянием и текущим
const difference = (node.diameter + this.diameter) / 2 + distance + this.shift + node.shift + (this.diameter + node.diameter) / 2 ** (this.increase + node.increase) + (typeof add === 'number' ? add : 0) - between.length();
// Узлы преодолели расстояние отталкивания?
if (difference <= 0 || ++iterations > (hard ? this.actions.pushing.flow.hard : this.actions.pushing.flow.medium)) continue;
// Реинициализация реестра обработанных узлов и запись целевого узла
node.pushings = node.#operator.actions.pushing ? new Set([this]) : null;
// Реинициализация счётчиков итераций
node.actions.pushing.current = 0;
// Инициализация расстояния сдвига
const offset = new Victor(difference, difference);
// Инициализация координат обрабатываемого узла
const vector = new Victor(x1, y1)
.add(offset.rotate(between.angle() - offset.angle()))
.subtract(new Victor(node.element.offsetWidth / 2, node.element.offsetHeight / 2));
// Перемещение
node.move(vector.x, vector.y);
}
} }
/** /**
@ -962,85 +953,69 @@ class graph {
* @returns * @returns
*/ */
pulling(nodes = [], add, hard = false, distance = 150) { pulling(nodes = [], add, hard = false, distance = 150) {
// Проверка на превышение ограничения по числу итераций у целевого узла // Проверка на активность притягивания целевого узла
if (++this.iteration >= this.limit) return (this.iteration = 0, false); if (!this.#operator.actions.pulling || !this.actions.pulling.active) return false;
// Инициализация счётчика итераций // Инициализация счётчика итераций
let iterations = 0; let iterations = 0;
// Инициализация универсального буфера
let buffer;
// Инициализация ссылки на ядро
const operator = this;
/**
* Притянуть
*
* @param {*} node
*
* @returns {boolean} Узлы преодолели расстояние отталкивания?
*/
function move(node) {
// Защита от повторной обработки узла
if (typeof operator.pullings === 'object' && operator.pullings.has(node)) return false;
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++operator.iteration >= operator.limit) return (operator.iteration = 0, false);
// Инициализация координат целевого узла
const x1 = (isNaN((buffer = parseInt(node.element.style.left))) ? 0 : buffer) + node.element.offsetWidth / 2;
const y1 = (isNaN((buffer = parseInt(node.element.style.top))) ? 0 : buffer) + node.element.offsetHeight / 2;
// Инициализация координат обрабатываемого узла
const x2 = (isNaN((buffer = parseInt(operator.element.style.left))) ? 0 : buffer) + operator.element.offsetWidth / 2;
const y2 = (isNaN((buffer = parseInt(operator.element.style.top))) ? 0 : buffer) + operator.element.offsetHeight / 2;
// Инициализация вектора между узлами
const between = new Victor(x1 - x2, y1 - y2);
// Инициализация увеличения
const increase =
operator.shift + node.shift +
(operator.diameter + node.diameter) /
2 ** (operator.increase + node.increase);
// Узлы преодолели расстояние притягивания?
if (
between.length() <=
(node.diameter + operator.diameter) / 2 +
distance +
increase +
(typeof add === 'number' ? add : 0) ||
++iterations > (hard ? operator.actions.pulling.flow.hard : operator.actions.pulling.flow.medium)
) return true;
// Реинициализация реестра обработанных узлов и запись целевого узла
node.pullings = node.#operator.actions.pulling ? new Set([operator]) : null;
// Реинициализация счётчиков итераций
node.actions.pulling.current = 0;
// Инициализация координат обрабатываемого узла (с которым произошло столкновение)
const vector = new Victor(x1, y1)
.add(new Victor(between.x, between.y).norm().invert().unfloat())
.subtract(new Victor(node.element.offsetWidth / 2, node.element.offsetHeight / 2));
// Перемещение узла
node.move(vector.x, vector.y);
// Вход в рекурсию
setTimeout(move, between.length() / 10 - between.length() / 10, node);
}
// Инициализация буфера реестра узлов // Инициализация буфера реестра узлов
const registry = new Set(nodes); const registry = new Set(nodes);
// Удаление текущего узла из буфера // Удаление текущего узла из буфера
registry.delete(this); registry.delete(this);
// Обработка отталкивания for (const node of registry) {
for (const node of registry) if (++this.actions.pulling.current < this.actions.pulling.max) move(node); // Перебор обрабатываемых узлов
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) return (this.iteration = 0, false);
// Проверка на превышение ограничения по числу итераций для отталкивания у обрабатываемого узла
if (++node.actions.pulling.current > node.actions.pulling.max) continue;
// Проверка на активность притягивания у обрабатываемого узла
if (!node.#operator.actions.pulling || !node.actions.pulling.active) continue;
// Защита от повторной обработки обрабатываемого узла
if (typeof this.pullings === 'object' && this.pullings.has(node)) continue;
// Инициализация координат целевого узла
const x1 = node.element.offsetLeft + node.element.offsetWidth / 2;
const y1 = node.element.offsetTop + node.element.offsetHeight / 2;
// Инициализация координат обрабатываемого узла
const x2 = this.element.offsetLeft + this.element.offsetWidth / 2;
const y2 = this.element.offsetTop + this.element.offsetHeight / 2;
// Инициализация вектора между узлами
const between = new Victor(x1 - x2, y1 - y2);
// Вычисление разницы между необходимым расстоянием и текущим
const difference = (node.diameter + this.diameter) / 2 + distance + this.shift + node.shift + (this.diameter + node.diameter) / 2 ** (this.increase + node.increase) + (typeof add === 'number' ? add : 0) - between.length();
console.log(difference);
// Узлы преодолели расстояние отталкивания?
if (difference > 0 || ++iterations > (hard ? this.actions.pulling.flow.hard : this.actions.pulling.flow.medium)) continue;
// Реинициализация реестра обработанных узлов и запись целевого узла
node.pullings = node.#operator.actions.pulling ? new Set([this]) : null;
// Реинициализация счётчиков итераций
node.actions.pulling.current = 0;
// Инициализация расстояния сдвига
const offset = new Victor(difference, difference);
// Инициализация координат обрабатываемого узла
const vector = new Victor(x1, y1)
.add(offset.rotate(between.angle() - offset.angle()).invert())
.subtract(new Victor(node.element.offsetWidth / 2, node.element.offsetHeight / 2));
// Перемещение узла
node.move(vector.x, vector.y);
}
} }
configure(attribute) { configure(attribute) {
@ -1141,6 +1116,46 @@ class graph {
return this.#operator; return this.#operator;
} }
// Сессии синхронизации позиции узлов с соединениями
#sessions = new Map;
// Прочитать сессии синхронизации позиции узлов с соединениями
get sessions() {
return this.#sessions;
}
// Координата X (основной узел)
#x1
// Прочитать координату X (основной узел)
get x1() {
return this.#x1;
}
// Координата Y (основной узел)
#y1
// Прочитать координату Y (основной узел)
get y1() {
return this.#y1;
}
// Координата X (связанный узел)
#x2
// Прочитать координату X (связанный узел)
get x2() {
return this.#x2;
}
// Координата X (связанный узел)
#y2
// Прочитать координату X (связанный узел)
get y2() {
return this.#y2;
}
/** /**
* Конструктор соединения * Конструктор соединения
* *
@ -1178,34 +1193,21 @@ class graph {
// Инициализация универсального буфера // Инициализация универсального буфера
let buffer; let buffer;
// Инициализация координат
this.#x1 = (isNaN((buffer = parseInt(from.element.style.left))) ? 0 : buffer) + from.element.offsetWidth / 2;
this.#y1 = (isNaN((buffer = parseInt(from.element.style.top))) ? 0 : buffer) + from.element.offsetHeight / 2;
this.#x2 = (isNaN((buffer = parseInt(to.element.style.left))) ? 0 : buffer) + to.element.offsetWidth / 2;
this.#y2 = (isNaN((buffer = parseInt(to.element.style.top))) ? 0 : buffer) + to.element.offsetHeight / 2;
// Инициализация оболочки // Инициализация оболочки
const line = document.createElementNS( const line = document.createElementNS(
'http://www.w3.org/2000/svg', 'http://www.w3.org/2000/svg',
'line' 'path'
);
line.setAttribute(
'x1',
(isNaN((buffer = parseInt(from.element.style.left))) ? 0 : buffer) +
from.element.offsetWidth / 2
);
line.setAttribute(
'y1',
(isNaN((buffer = parseInt(from.element.style.top))) ? 0 : buffer) +
from.element.offsetHeight / 2
);
line.setAttribute(
'x2',
(isNaN((buffer = parseInt(to.element.style.left))) ? 0 : buffer) +
to.element.offsetWidth / 2
);
line.setAttribute(
'y2',
(isNaN((buffer = parseInt(to.element.style.top))) ? 0 : buffer) +
to.element.offsetHeight / 2
); );
line.setAttribute('d', `M${this.x1} ${this.y1} L${this.x2} ${this.y2}`);
line.setAttribute('stroke', 'grey'); line.setAttribute('stroke', 'grey');
line.setAttribute('stroke-width', '8px'); line.setAttribute('stroke-width', '8px');
line.id = this.#operator.id + '_connection_' + operator.connections.size; line.id = this.#operator.id + '_connection_' + this.#operator.connections.size;
line.classList.add(...this.operator.classes.connection.element); line.classList.add(...this.operator.classes.connection.element);
line.setAttribute('data-from', from.element.id); line.setAttribute('data-from', from.element.id);
line.setAttribute('data-to', to.element.id); line.setAttribute('data-to', to.element.id);
@ -1215,6 +1217,9 @@ class graph {
// Запись в свойство // Запись в свойство
this.#element = line; this.#element = line;
// Запись в реестр
this.#operator.connections.add(this);
} }
/** /**
@ -1223,42 +1228,28 @@ class graph {
* @param {node} node Инстанция узла (связанного с соединением) * @param {node} node Инстанция узла (связанного с соединением)
*/ */
synchronize(node) { synchronize(node) {
// Инициализация названий аттрибутов // Удаление интервала
let x = 'x', clearInterval(this.#sessions.get(node.element.id));
y = 'y';
if (node === this.from) { // Инициализация интервала
// Исходящее соединение this.#sessions.set(node.element.id, setInterval(fn => {
if (node === this.from) {
// Исходящее соединение
// Запись названий аттрибутов // Инициализация координат
x += 1; this.#x1 = node.element.offsetLeft + node.element.offsetWidth / 2;
y += 1; this.#y1 = node.element.offsetTop + node.element.offsetHeight / 2;
} else if (node === this.to) { } else if (node === this.to) {
// Входящее соединение // Входящее соединение
// Запись названий аттрибутов // Инициализация координат
x += 2; this.#x2 = node.element.offsetLeft + node.element.offsetWidth / 2;
y += 2; this.#y2 = node.element.offsetTop + node.element.offsetHeight / 2;
} else return; } else return;
// Инициализация универсального буфера // Запись координат
let buffer; this.element.setAttribute('d', `M${this.x1} ${this.y1} L${this.x2} ${this.y2}`);
}, 0));
// Запись отступа (координаты по горизонтали)
this.element.setAttribute(
x,
-this.#shell.getAttribute('data-x') +
(isNaN((buffer = parseInt(node.element.style.left))) ? 0 : buffer) +
node.element.offsetWidth / 2
);
// Запись отступа (координаты по вертикали)
this.element.setAttribute(
y,
-this.#shell.getAttribute('data-y') +
(isNaN((buffer = parseInt(node.element.style.top))) ? 0 : buffer) +
node.element.offsetHeight / 2
);
} }
}; };
@ -1400,8 +1391,8 @@ class graph {
// Позиционирование над остальными узлами // Позиционирование над остальными узлами
node.element.style.zIndex = 5000; node.element.style.zIndex = 5000;
// Инициализация буферов значения количества столкновений, притягиваний и отталкиваний // Блокировка анимации
let collision, pushing, pulling; node.element.style.transition = 'unset';
if (!_this.#camera) { if (!_this.#camera) {
// Запрещено двигать камеру (оболочку) // Запрещено двигать камеру (оболочку)
@ -1415,6 +1406,22 @@ class graph {
// Сброс данных потока // Сброс данных потока
node.reset(); node.reset();
for (const connection of node.outputs) {
// Перебор исходящих соединений
// Синхронизация местоположения
for (const _connection of connection.to.inputs) _connection.synchronize(connection.to);
for (const _connection of connection.to.outputs) _connection.synchronize(connection.to);
}
for (const connection of node.inputs) {
// Перебор входящих соединений
// Синхронизация местоположения
for (const _connection of connection.from.inputs) _connection.synchronize(connection.from);
for (const _connection of connection.from.outputs) _connection.synchronize(connection.from);
}
// Перемещение узла // Перемещение узла
node.move( node.move(
onmousemove.pageX - onmousemove.pageX -
@ -1434,6 +1441,9 @@ class graph {
document.onmousemove = null; document.onmousemove = null;
node.element.onmouseup = null; node.element.onmouseup = null;
// Разблокировка анимации
node.element.style.transition = null;
// Возвращение позиционирования // Возвращение позиционирования
node.element.style.zIndex = z; node.element.style.zIndex = z;
}; };