Ответ на пост «Задолбался считать провода линейкой — заставил нейросеть написать мне для этого программу»1
Расскажу про свой алгоритм для прокладки электропроводки без перехлестов.
Существует множество рисовалок планов помещений. Многие из них так или иначе позволяют рисовать и коммуникации.
Недостатка в планах, короче, нет. Ярчайший пример тому RemPlanner для сам-себе дизайнеров. Ну и дизайнеры по гороскопу планы тоже умеют чертить и размеры помещений плюс-минус снять способны.
Меня давно беспокоил другой вопрос: как всё это использовать непосредственно в электромонтаже?
Не перенести размеры из проекта на стены. А заранее продумать сам концепт: что, где, как и куда пойдёт, чтобы потом не колхозить и не импровизировать уже на объекте.
Самое время посмотреть, как делают в интернете.
Тлетворное влияние Инстаграма взрастило целый культ «идеальной» проводки, где линии на потолке или в стяжке не должны пересекаться вообще.
Одни сидят днями и ночами в попытках придумать, как сделать кабели без перехлёстов. Выдумывают крепление на потолок парапетных кабель-каналов, батареи распределительных коробок и многоэтажные ковры из гофры.
Другие отчаянно пытаются что-нибудь выстрадать в Visio, SketchUp, возможно даже MS Paint или тяжёлых САПР-системах, вручную вычерчивая идеальные параллельные трассы, чтобы ни один кабель случайно не лёг поверх другого.
Только вдумайтесь: челики целыми днями перетаскивают линии по монитору, чтобы добиться того, чего в общем случае добиться нельзя. Очень, наверное, устают.
Пересечения можно уменьшить. Иногда убрать совсем. Но обычно их можно только замаскировать, отправив кабель каким-нибудь невероятным окольным путём.
Зачем тратить на это столько времени, если большую часть этой работы можно автоматизировать?
С этой мыслью я и засел за создание «Кабелизатора» — браузерного PWA, которое пытается самостоятельно построить реалистичные кабельные трассы по плану объекта. Между прочим, умеет работать и офлайн.
Ниже немного о том, как это выглядит для пользователя и какая математика занимается всем неблагодарным трудом внутри.
Что делает пользователь
Подход строится вокруг минимального количества действий.
Загружаем план объекта. Подойдёт и скан, главное, чтобы сохранялись пропорции.
Обозначаем помещения. Их можно обвести вручную либо согласиться с машинным зрением вовремя нажав Enter.
Ставим распределительный щит. Это база.
Расставляем розетки, выключатели, светильники, выводы и другие точки.
При необходимости рисуем несколько предпочтительных трасс, например основную магистраль по коридору. Для мест где электропроводка нежелательна предусмотрены «запретные зоны»
Нажимаем «Рассчитать».
Всё.
Дальше Кабелизатор пытается самостоятельно решить, какие точки объединить, где разумно поставить распределительную коробку и как провести кабели так, чтобы линии одного направления собирались в общие магистрали. Никакого рисования не требуется.
Как устроен Кабелизатор
Чтобы картинка с планом превратилась в маршрутную модель, внутри последовательно отрабатывает несколько совершенно разных механизмов.
Распознавание стен и помещений
Кабелизатор умеет анализировать растровую подложку.
Изображение переводится в яркостное представление, после чего используется метод Оцу. Это алгоритм автоматического выбора порога изображения, предложенный ещё в 1979 году.
Грубо говоря, он помогает отделить тёмные линии чертежа от светлого фона.
После клика внутри помещения применяется заливка области, flood-fill, которая ищет доступное пространство до обнаруженных препятствий. Получившийся растровый участок затем преобразуется в редактируемый векторный контур.
Из-за визуального шума работает не на любом рисунке, разумеется, поэтому помещение всегда можно обвести руками.
Маршрутная сетка и поиск пути
По контурам помещений строится невидимый навигационный граф.
Если масштаб проекта известен, предпочтительные автоматические трассы проходят примерно в 35 см от внутренних граней стен.
Дальше для поиска маршрутов используется алгоритм на базе Дейкстры.
Но классического поиска кратчайшего пути здесь недостаточно.
Для обычного графа из двух углов и лесенки со множеством ступеней пути могут оказаться практически равноценными по длине.
Второй вариант нам никак не подходит.
Поэтому стоимость маршрута в Кабелизаторе состоит не только из его длины, а полагается на принцип кнута и пряника.
Динамические веса и «магнитные» трассы
Во время расчёта веса графа меняются.
Здесь работают несколько принципов.
Магнетизм.
Если по участку уже прошёл кабель, его стоимость для следующих линий уменьшается. Поэтому следующей группе становится выгоднее немного отклониться и присоединиться к существующей магистрали, чем прокладывать ещё одну почти параллельную трассу рядом.
Чем больше кабелей уже используют участок, тем привлекательнее он становится.
В результате вместо нескольких линий проложенных произвольно в одном направлении получается целая трасса из линий.
Штраф за вензеля.
Поиск помнит направление предыдущего участка.
Если линия только что повернула и сразу пытается повернуть ещё раз, такой вариант получает дополнительный штраф. Чем меньше прямой участок между соседними поворотами, тем менее выгоден маршрут.
Так убирается значительная часть бессмысленных лесенок.
Технические хвосты.
Короткие участки непосредственно к щиту или конечной точке рассматриваются отдельно и не портят стоимость основного маршрута лишним поворотом.
Это позволяет общей магистрали оставаться прямой, а розеткам, светильникам и другим точкам подключаться к ней короткими ответвлениями.
Помещения тоже участвуют в расчёте
Помещение для Кабелизатора не просто цветной многоугольник с названием.
Маршрутизатор знает, внутри какого помещения находится точка, и старается вести её ветвь внутри этого помещения.
Есть и помещения, через которые чужие линии проводить нежелательно или запрещено: например, санузлы, лоджии и некоторые другие зоны.
Коридор, наоборот, может иметь повышенный приоритет как естественное место общей магистрали.
То есть маршрут ищется не просто по геометрии:
короче = лучше.
Скорее:
короче + прямее + ближе к общей трассе + логичнее = лучше.
Распределительные коробки
Для разветвлённых групп после построения основной магистрали выбираются места ответвлений.
Алгоритм старается не плодить коробки без необходимости, объединять близкие ответвления и выстраивать их в логичном порядке вдоль трассы.
Например, несколько розеток одного помещения могут получить последовательную магистраль с коробками и короткими ответвлениями вместо пачки независимых проводов прямо от щита.
Libavoid, WebAssembly и собственная раскладка
Даже после этого остаётся проблема.
Если десять кабелей используют один и тот же участок графа и нарисовать их по одинаковым координатам, на экране мы увидим одну линию.
Для дополнительной ортогональной обработки в Кабелизаторе используется libavoid — C++-движок маршрутизации, работающий в браузере через WebAssembly.
Но на этом обработка не заканчивается.
После расчёта Кабелизатор отдельно анализирует совпадающие участки, определяет порядок линий и раздвигает соседние кабели с небольшим фиксированным шагом.
При этом важно сохранить единый поток, а не превратить его обратно в несколько независимых трасс. И вот с этой частью пришлось повозиться.
А что с перехлёстами?
Кабелизатор старается их уменьшать.
Особенно внимательно анализируются пересечения возле щита и внутри общих магистралей. В некоторых случаях достаточно поменять порядок кабелей внутри пучка, не изменяя сам маршрут.
Есть также отдельный аудит, который после основного расчёта пытается улучшить расположение линий.
Но принципиальная позиция простая:
пересечение допустимо, если его устранение делает всю остальную проводку хуже.
Что получается в итоге
Через несколько секунд или минут, в зависимости от размера объекта, получаем:
план кабельных трасс;
отдельные электрические линии;
распределительные коробки;
длину каждой линии;
общий метраж;
количество конечных точек;
статистику по проекту.
Есть ещё инструмент «Срез».
Проводишь поперёк магистрали черту, а Кабелизатор показывает, сколько именно кабелей проходит в этом месте и какие это линии.
Полезно, когда надо заранее понять, что там получится физически: пять кабелей или пятнадцать.
Короче
Вместо многочасового бессмысленного рисования каждой линии врукопашную я пытаюсь свести первоначальную раскладку примерно к следующему:
загрузил план → расставил точки → нажал кнопку → получил результат.
Разумеется, алгоритм не проектировщик, мысли читать не умеет и предусмотреть всего не может. Где-то маршрут захочется поправить руками, поэтому можно вручную перестроить отдельную линию, передвинуть её участки или перерисовать самостоятельно.
Кабелизатор бесплатный, но требуется авторизация. Есть сохранение проектов локально и в облако.
Пользуйтесь на здоровье https://npekpacho.ru/kabelizator/







