Разрез участка и слияние узлов

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

Где найти
редактор сети: кнопка «Редактировать топологию сети» (значок ломаной с карандашом) в строке режимов над картой: правый щелчок по участку → «Врезать узел здесь…»; слияние — инструмент «Слияние» (M) или правый щелчок по узлу → «Слить другой узел в этот…».
Права
разрез — право перемещать участки и создавать узлы; слияние — право удалять узлы вида сливаемого узла и перемещать целевой.
Функция показана в сквозном сценарии:Правка сети с проверкой и откатом
Читаю как

Возможности

  • Разрез участка в любой точке: новый узел и вторая половина участка, паспорт трубы копируется на обе половины.
  • Оборудование участка, у которого есть узел установки или положение на участке, переходит на свою половину само. Для остального окно просит выбрать половину («Все на первую», «Все на вторую» или по одному).
  • Слияние двух узлов: участки и ссылки сливаемого узла переходят на целевой, участки между ними снимаются, концы встают в точку целевого узла.
  • Предпросмотр обоих действий до записи: что переносится, что снимается, что заблокирует операцию.

Как это работает

Разрез. Правый щелчок по участку → «Врезать узел здесь…» открывает предпросмотр: сервер выполняет разрез с признаком dry_run и откатывает его. «Разрезать» записывает одной операцией журнала («Разрезание участка»): новый узел в nodes во фрагменте участка, вторая половина в linesobj с копией паспорта в heatpipesections, геометрия делится в точке щелчка, длины половин пересчитываются по местной системе координат. Выбор половины для «неопределённого» оборудования уходит на сервер в review_to_new.

Слияние. Сначала щелчок по целевому узлу (он останется), затем по сливаемому. Сервер в одной транзакции переносит все ссылки сливаемого узла — участки, карточки, заданный напор, подпитку, записи в других таблицах с номером узла — на целевой узел; участки, соединявшие два узла, снимаются; сливаемый узел помечается снятым (removed = 1). Слияние запрещено, если узлы в разных фрагментах или внутренних схемах, у целевого нет геометрии, на соединяющем участке стоит оборудование, или одна и та же ссылка есть у обоих узлов — окно перечисляет причины, кнопка «Объединить» неактивна. Результаты прошлых расчётов не переносятся: они устареют до следующего расчёта.

Обе операции сверяют версии объектов (оптимистичная блокировка) и отменяются Ctrl+Z.

Что нужно для работы

  • Разрез — право перемещать участки и создавать узлы.
  • Слияние — право удалять узлы вида сливаемого узла и перемещать целевой узел.
  • Флаги API MUTATIONS_ENABLED и TOPOLOGY_MUTATIONS_ENABLED; предпросмотр работает и без них.

Шаги

  1. В режиме «Выбор» (V) щёлкните правой кнопкой по участку в месте, где нужен узел, и выберите «Врезать узел здесь…».

    Разрез участка и слияние узлов: шаг 1

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

    Разрез участка и слияние узлов: шаг 2

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

    Разрез участка и слияние узлов: шаг 3

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

    Разрез участка и слияние узлов: шаг 4

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

    Разрез участка и слияние узлов: шаг 5

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

    Разрез участка и слияние узлов: шаг 6

Примеры

На копии базы Алматы, фрагмент 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, API tests/test_topology_undo.py, tests/test_topology_line_identity.py; e2e — тесты разреза и слияния в e2e/functions/network-editor.spec.ts.
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо