Разрез участка и слияние узлов
Разрез участка — новый узел в точке щелчка, участок делится на два, паспорт и оборудование переходят на половины. Слияние — один узел сливается в другой: участки и все ссылки переходят на целевой узел, сливаемый узел снимается.
Возможности
- Разрез участка в любой точке: новый узел и вторая половина участка, паспорт трубы копируется на обе половины.
- Оборудование участка, у которого есть узел установки или положение на участке, переходит на свою половину само. Для остального окно просит выбрать половину («Все на первую», «Все на вторую» или по одному).
- Слияние двух узлов: участки и ссылки сливаемого узла переходят на целевой, участки между ними снимаются, концы встают в точку целевого узла.
- Предпросмотр обоих действий до записи: что переносится, что снимается, что заблокирует операцию.
Как это работает
Разрез. Правый щелчок по участку → «Врезать узел здесь…» открывает предпросмотр: сервер выполняет разрез с признаком dry_run и откатывает его. «Разрезать» записывает одной операцией журнала («Разрезание участка»): новый узел в nodes во фрагменте участка, вторая половина в linesobj с копией паспорта в heatpipesections, геометрия делится в точке щелчка, длины половин пересчитываются по местной системе координат. Выбор половины для «неопределённого» оборудования уходит на сервер в review_to_new.
Слияние. Сначала щелчок по целевому узлу (он останется), затем по сливаемому. Сервер в одной транзакции переносит все ссылки сливаемого узла — участки, карточки, заданный напор, подпитку, записи в других таблицах с номером узла — на целевой узел; участки, соединявшие два узла, снимаются; сливаемый узел помечается снятым (removed = 1). Слияние запрещено, если узлы в разных фрагментах или внутренних схемах, у целевого нет геометрии, на соединяющем участке стоит оборудование, или одна и та же ссылка есть у обоих узлов — окно перечисляет причины, кнопка «Объединить» неактивна. Результаты прошлых расчётов не переносятся: они устареют до следующего расчёта.
Обе операции сверяют версии объектов (оптимистичная блокировка) и отменяются Ctrl+Z.
Что нужно для работы
- Разрез — право перемещать участки и создавать узлы.
- Слияние — право удалять узлы вида сливаемого узла и перемещать целевой узел.
- Флаги API
MUTATIONS_ENABLEDиTOPOLOGY_MUTATIONS_ENABLED; предпросмотр работает и без них.
Шаги
В режиме «Выбор» (V) щёлкните правой кнопкой по участку в месте, где нужен узел, и выберите «Врезать узел здесь…».

Окно разрезания показывает, где встанет узел, длины двух половин и что будет с паспортом и оборудованием участка. Нажмите «Разрезать».

Уведомление: участок разрезан, номера нового узла и новой половины.

Слияние: нажмите M и щёлкните целевой узел — тот, что останется. Строка состояния подтверждает выбор и просит щёлкнуть узел, который слить.

Щёлкните сливаемый узел. Окно слияния показывает расстояние между узлами, какие участки перепривяжутся и сколько ссылок перенесётся. Нажмите «Объединить».

Уведомление: узел слит, сколько участков перепривязано и ссылок перенесено. Концы участков встали в точку целевого узла.

Примеры
На копии базы Алматы, фрагмент 74:
- Участок 244,44 м разрезан на четверти длины: половины 62,34 и 182,10 м, в сумме те же 244,44 м.
- Новый узел, поставленный клавишей N в 69 м от конца трассы, слит в её конечный узел. Окно показало расстояние между узлами 68,94 м, после слияния новый узел снят (запрос его типа отвечает «не найден»), целевой остался на месте.
Если не получается
- Пункт меню серый с подсказкой «Нет права: …» — не хватает права на этот вид объектов.
- «Объединить» недоступна, окно перечисляет причины — узлы в разных фрагментах или внутренних схемах, у целевого узла нет геометрии, на соединяющем участке есть оборудование или ссылки узлов конфликтуют.
- Узлы далеко друг от друга — проверьте, те ли узлы выбраны: концы участков переедут в целевой узел.
- «Выберите половину» и кнопка «Разрезать» неактивна — у оборудования нет узла установки и положения: укажите половину для каждого объекта.
- «После слияния появятся параллельные участки к узлам: …» — у обоих узлов были участки к одному и тому же соседу. Слияние разрешено, но потом проверьте дубли в «Проверке после правки».
- Перепутали целевой и сливаемый узел — Ctrl+Z, затем снова M: первым щелчком — тот, что должен остаться.
Для разработчика
POST /api/v1/topology/split-line {line_id, lng, lat, dry_run, review_to_new, expected_version}→ новый узел, новая половина,operation_id.POST /api/v1/topology/merge-nodes {target_node_id, source_node_id, dry_run, target_version, source_version}→ перепривязанные и снятые участки, перенесённые ссылки,blockersв предпросмотре.- Сервер:
database/topology.py(split_line,merge_nodes). - Веб:
components/SplitPreviewDialog.vue,components/MergePreviewDialog.vue, пункт меню —components/EditorContextMenu.vue, инструмент «Слияние» —composables/useTopologyEditor.ts. - Тесты:
tests/components/SplitPreviewDialog.spec.ts,tests/components/MergePreviewDialog.spec.ts, APItests/test_topology_undo.py,tests/test_topology_line_identity.py; e2e — тесты разреза и слияния вe2e/functions/network-editor.spec.ts.
