|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как можно реализовать автоматическую прокладку кабеля по заданным трассам?
Регистрация: 16.10.2013
Сообщений: 395
|
||
Просмотров: 3773
|
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,172
|
Когда-то видел научные статьи лохматых годов на эту тему, надеюсь, их еще можно найти. Там все было серьезно, с графами, оценками оптимальности, и т.п.
А вы для себ какую задачу ставите? Просто прокладывать кабели хоть как-нибудь, или с учетом всяких ограничений, заполняемости трасс, минимизации длины и т.п.? Готовые проги типа CS Кабельное хозяйство не рассматриваете? Последний раз редактировалось kp+, 16.12.2024 в 12:23. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
чтобы что-то проложить автоматически - сначала надо будет задать кучу параметров-ограничений... по сути создать информационную модель. Это мечта менеджеров - нажал кнопку и все само до сдачи заказчику. Реально в "одно лицо" (насколько понимаю) можно создать ассистентов-помощников, которые будут считать, проверять, маркировать и т.д. Но прокладку самих трасс оставьте живым людям)
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
кабели не просто так раскидываются - а к оборудованию (и между оборудованием). И далеко не всегда все оборудование известно сразу (пока из смежников "вытрясешь" ТЗ), не говоря уже об постоянных правках-корректировках. А потом еще корректировки во время монтажа - а автораскладка (если как-то не "заморозить" уже сделанное) взяла и переложила кабели - как ей показалось оптимальнее на данный момент. Поэтому не существует каких-то общепризнанных лидеров среди ПО в области полностью автоматического проектирования - хотя крупные разработчики ПО явно могут себе позволить всех нужных специалистов для реализации.
|
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,172
|
Цитата:
Возможно, стоит скачать демы уже разработанных комплексов вроде вышеупомянутого, чтобы понять, что они могут, что нет, и как это подходит именно вам. И чего не хватает именно вам. Чтоб если изобретать велосипед, то хотя бы не самый уродливый... PS а пользоваться программой будете вы один или как? Потому что если коллеги скажут "нам этого не надо, и указаний от начальства не было", а начальству надо и того меньше - то нет повести печальнее на свете ... PPS на форуме уже есть один стартап по прокладке кабелей. Смотрели? https://forum.dwg.ru/showthread.php?...E1%E5%EB%E5%E9 Последний раз редактировалось kp+, 16.12.2024 в 14:54. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Существующие проги, в частности CS Кабельное хозяйство, довольно громоздкие. Там реализован функционал оценки заполняемости лотка при выборе трассы, взаиморезервирование кабелей и прочие тонкие моменты. Для реализации моих целей получается из пушки по воробьям. У меня (пока) все проще: есть пара десятков кабелей, есть штук шесть-семь ветвящихся трасс (иногда с кольцом). Надо автоматизировать процесс раскидывания этих кабелей.
PS пользоваться буду я, соответственно все ограничения, накладываемые на программу, буду держать в голове. Скорее всего потом программа будет разрастаться, но надо хоть от чего-то оттолкнуться, пока с этим засада. |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,172
|
Цитата:
Цитата:
https://forum.dwg.ru/showthread.php?...E1%E5%EB%E5%E9 |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
смотрел, есть еще похожая тема
https://forum.dwg.ru/showthread.php?t=57484 но в ней автор давно пропал в первой теме автоматической раскладки вроде бы нет, во второй теме есть какое-то начальное описание алгоритма в хэлпе, но пока не сильно понятнее становится. вот ищу поддержки тут. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
обычно автоматизация разрабатывается с совершенно противоположной целью - держать не всю информацию в голове, а только текущие оперативные данные в краткосрочной памяти (и общее понимание - что вообще нужно сделать по объекту, естественно).
|
|||
![]() |
|
||||
Регистрация: 18.11.2019
Сообщений: 1,705
|
Насколько я понимаю, тут нужно обратиться к расчету строительных сетевых графиков, только вместо продолжительности работ тут будет длина участка трассы.
Через расчет можно найти критический путь, который и будет требуемым маршрутом прокладки кабеля. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ну и возможный ассистент - рисуется полилиния-кабель от оконечного оборудования до групповой прокладки кабелей (ГПК), затем дается команда типа "по существующему кабелю" и выбирается эта ГПК. Если кабелей в ГПК несколько - диалог выбора нужного кабеля и по трассе выбранного кабеля автоматически создается кабель до нужного щита (так как построение нового кабеля идет просто поверх выбранного кабеля в ГП, то пройдет и по тем же стоякам). Ну и при этом фиксировать информацию о соединениях для последующего построения КЖ. Это в реализации гораздо проще автораскладки)
|
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Поиск в интернете и советы форумчан навели на тему графов, поэтому пока работаю в эту сторону. Есть непонятки с построением графа.
Думаю, отдельную тему создавать не стоит, спрошу здесь. Народ, подскажите алгоритм или логику, чтобы граф из прилагаемой картинки представить в виде матрицы или двумерного массива, где по вертикали и по горизонтали отложены вершины от 1 до 5 соответственно, а на пересечении вершин вставлены длины между этими точками, если между точками связи нет, нужно проставить ноль. матрица будет такая: ...1 2 3 4 5 1 010 0 0 0 210 0 7 5 0 3 0 7 0 0 9 4 0 5 0 0 0 5 0 0 9 0 0 на картинке соответственно в кружке показан номер узла, он соответствует вертикальным и горизонтальным столбцам матрицы, зеленым - длина ребра, проставляется в матрицу на пересечении соответствующих узлов, синим показано наличие ребер между узлами. Список отрезков, соответствующих ребрам, я получу, координаты вершин тоже получу, а вот как передать это все в массив - не представлю. Расскажите логику или алгоритм. Нумерация вершин не принципиальна, привел просто для наглядности. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Для вашего частного случая алгоритм:
1. Помещаем любой (например, №4) из узлов с одиночным ребром в стек и в список посещенных. 2. Извлекаем узел №4 со стека. Ищем все узлы, связанные ребрами с узлом №4 и которые при этом нет в списке посещенных - это будет узел №2. 3. Заносим узел №2 в стек и в список посещенных. 4. Извлекаем узел №2 со стека, ищем по ребрам еще не посещенные узлы - это будут №1 и №3. Заносим эти узлы в стек и в список посещенных. 5. Извлекаем узел №1 из стека - а у него в соседях по ребрам нет не посещённых узлов. Поэтому на этом шаге в стек ничего не уходит. 6. Извлекаем узел №3 из стека - у него в соседях остался только узел №5, который и отправиться в стек и список посещенных. 7. Извлекаем узел №5 из стека - и опять него в соседях по ребрам нет не посещённых узлов. Поэтому на этом шаге в стек ничего не уходит. 8. Стек пуст - все узлы графа пройдены. При этом в списке посещенных будет 4-2-1-3-5. 9. Анализируем узлы графа - кто имеет только одно ребро: №4, №1 и №5. Теперь берем полученную ранее последовательность: 4-2-1-3-5 первая ветка 4-2-1 вторая ветка 4-2-(1 пропускаем, так как одно ребро)-3-5 ну а посчитать длины этих веток уже не проблема. это не тема, это на целый раздел тянет минимум, имхо ![]() |
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,172
|
Вы на каком языке будете писать? Если на лиспе, то вот хороший пример работы с матрицами:
https://www.lee-mac.com/matrixtransf...functions.html |
|||
![]() |
|
||||
Регистрация: 11.10.2011
Сообщений: 27
|
Это вариации на тему алгоритма Дейкстры. Поиск кратчайшего пути в графе. Задаются точки и ребра с весами (длинами) между ними. Строится оптимальный путь от и до. Даже для вба есть реализация этого алгоритма на сайтах посвященных экселю. Задача сводится к формированию массива ребер из объектов акада. И оптимизации вызовов алгоритма, не для каждой пары точек, а, скажем, для одного родительского узла и всех дочерних. Ну и рисования трасс в конце по результатам работы
|
|||
![]() |
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,172
|
Цитата:
https://github.com/tsao100/Shortest-Path |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Почему-то не приходили уведомления на почту, а я сам ушел с головой в ВБА, и сообщения не сразу увидел. Спасибо всем отписавшимся.
Именно алгоритм Дейкстры прикручиваю к своей задаче. На форуме по экселю подсказали и реализацию при переводе графа в программный вид. Сейчас проблема возникла такая (хотя, наверное, это уже отдельная тема должна быть): написал код создания и вставки блока. Если имя не менять, но менять содержимое блока, то в модели появляются разные блоки с одинаковыми именами. Как такое может вообще быть? Нашел обрывочное полу-объяснение, что это какая-то ошибка автокада, и она вроде даже не критическая. Расскажите подробнее, почему вставляются два разных блока с одинаковыми именами? (написать код с проверкой наличия блоков с одинаковыми именами перед вставкой не прошу, мне просто непонятно, как так получается) ПС код приводить скорее всего смысла особого нет, дело точно не в коде, но на всякий случай: Код:
Последний раз редактировалось posetitel, 25.12.2024 в 16:38. |
|||
![]() |
|
||||
Динамический блок с разными параметрами.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Коллеги, сейчас баг из прошлого сообщения воспроизвести не могу. Запускаю код, блоки в чертеж вставляются, но в списке блоков имя указано единожды, дублирования имен нет.
Вроде с одной стороны и хорошо, понимание принципов работы с блоками в автокаде восстановилось. Зря побеспокоил, получается. Но с другой стороны появился если можно так назвать незавершенный гештальт, я же точно помню, что у меня в процессе обкатки кода в списке блоков для вставки появлялось большое количество имен "Test", имя точно было одинаковое без дописок (1), (2) или (копия) или подобных. Может быть пока обкатывал код намудрил с переменными какими, может как-то криво вставлял блоки, не знаю. Ну и ладно, уже получается не актуально. Если вдруг проблема всплывет, обязательно файл сохраню. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Появилась новая проблема, задачка, так сказать, со звездочкой.
В самом простом случае раскладка реализовывается с помощью поиска кратчайшего пути по алгоритму Дейкстры. Тут в части логики понятно. Однако в реальности кабель часто раскидывают по свободным трассам, которые не являются кратчайшими. Проиллюстрирую картинкой, на которой Шк1, Шк2, Шк3, Шк4 - это шкафы, соединяемые кабелями, синие линии - это основная трасса (например, верхний лоток), зеленые линии - резервная трасса (например, нижний лоток). Синяя трасса от Шк1 до Шк2 при реализации алгоритма Дейкстры будет самая загруженная, через нее программа все кабели будет прокладывать. Кабели до Шк4 пойдут тоже по синей трассе через Шк3. Разобью задачу на две части: 1) Как можно предусмотреть возможность распределения кабелей по трассам (основная и резервная, на картинке - синяя и зеленая) с учетом заполненности лотка? 2) Как можно реализовать прокладку кабеля от Шк2 до Шк4 минуя Шк3, по своей отдельной трассе? Наверняка есть какие-то алгоритмы, которыми пользуются навигаторы, они еще выбор предлагают побыстрее но подлиньше ехать или помедленней по пробкам, но покороче. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
Цитата:
И во вторых: |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Аппетит пришел во время еды
![]() Поначалу хотел простенькое на коленке накидать, а вот сейчас хочется все больше и больше. Из каких соображений исхожу. До момента начала написания не понимал с какой стороны вообще подойти, даже не подозревал, что есть уже давно разработанный алгоритм нахождения кратчайшего пути. Может быть похожие алгоритмы есть и для моих задач, которые можно реализовать на ВБА. Ну, например, усовершенствованный алгоритм Дейкстры (название придумано). Наверняка же направление графов в математике развивалось и появлялись стандартные решения для большинства задач, в том числе и моих, которые просто надо положить на код. Понятно, что в навигаторах, в схемах разводки печатных плат все гораздо сложнее, со встроенными библиотеками и т.д. и т.п., но там и интерфейс соответствующий, а основа работы может давно известна и не так сложна. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
а это уже как реализуете внутреннее представление дополнительной информации. Чтобы кабель "понимал" - где он на лотке, где в гофре и т.д. Здесь на форуме человек уже лет 25 потихоньку делает свою САПР на языке программирования Lazarus - это для понимания масштабов работ. В VBA смело умножайте сроки в два-три раза - так как язык программирования "немножко" устарел.
|
|||
![]() |
|
||||
Регистрация: 11.10.2011
Сообщений: 27
|
Цитата:
1)Выбор быстрого пути основан на весах ребер (у вас это длины) и значит надо сделать так, чтобы короткий путь не был коротким. Значит за всеми обьектами надо крепить данные, в которых, скажем, будет дополнительная длина на конкретном участке, и алгоритм будет стараться его обойти. Это решение в лоб. Наброс запаса к чистой длине - общее место при таких расчетах. 2)снабдить ребра и кабели свойствами/типами и просчитывать разные графы для разных типов систем последовательно. Т е поделить систему, скажем, на 220В, 24В и ОБЩУЮ и выставить свойства ребер, по которым что можно пускать. Ну и у кабелей выставить те же свойства. Тогда последовательно вызвать алгоритм Дейкстры для двух систем. Понятно, что ваш общий алгоритм должен быть многопроходным/инкрементальным. Теперь общее замечание алгоритм Дейкстры можно представить как фронт распространяющейся из одного центра волны. В электрике это обычно шкафы/коробки. Т е для сложных иерархических систем надо последовательно вызвать алгоритм для каждого родительского узла. По известному графу, или даже разным графам с учетом систем (п.2 выше). Ну все таки количество родительских узлов обычно меньше чем количество конечных. И за один проход мы получаем результат для 90% всех кабелей. за второй - 90% оставшихся. и тд. Но если запрещать/разрешать отдельные кабели, то это не сделать никак кроме как считать каждый кабель индивидуально, с проверкой условий прохождения по каждому ребру. Это конкретно напряжет счетную систему. Есть и хорошие новости. Сам Дейкстра считает быстро. Все время занимает общение с API CADa. Рекомендую писать в логи время работы по участкам кода, чтобы в будущем понять где возникают траблы. вба не такой уж и медленный. В свое время я делал эту же задачу на вба, и потом перевел часть кода на VB.Net. И оказалось, что вба считает всего в 2-3 раза дольше. А вовсе не на порядок, как можно было ожидать. Т е, повторю, Дейкстра быстрый, и компы современные считают быстро. Проблемы со скоростью обмена с API када. Вот с теми свойствами ребер/узлов о которых я писал выше. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
а потом еще подумать о проверке: а то монтажники слегка "удивятся" - если какие-то одиночные кабели резко пойдут по другим трассам, потому-что алгоритм решил - что там свободнее/оптимальнее. Этот алгоритм автотрассировки еще долгое время придется отлаживать на реальных задачах.
|
|||
![]() |
|
||||
Проектировщик электрических сетей Регистрация: 17.01.2014
Пенза
Сообщений: 178
|
Цитата:
Я предлагал posetitel присоединится, он отказался. Сказал ему, если решил все таки писать, то пиши на C#. Он упрямится, руку набивает. Цитата:
Цитата:
То что я на кодил, тоже себя не однозначно ведет, когда есть закольцованность трасс. Когда проектирую, закольцованность стараюсь избегать. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
просто надо понимать - что с попытками реализовать автопрокладку сначала придется делать тройную работу, как минимум: сгенерировал раскладку, проверил результат, если есть "косяки" - вносить изменения в алгоритм (и возможно, в "опорную" систему исходных данных), и по новой.
Offtop: когда устанет заниматься реализацией костылей вместо самих задач...) |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Offtop: Небольшое отвлечение про язык написания. Уважаемый, veb86, просто на данном этапе пока не вижу принципиальной разницы на чем писать с точки зрения реализации своих идей: если нет понимания как построить логику работы программы, то и нет отличий в незнании как писать на VBA или в незнании как писать на С#. VBA интегрирован в акад, не надо ставить отдельные IDE, как пришла идея, так вызвал встроенный, опробовал, получилось - хорошо, нет - думаю дальше. Я не спорю, что на С# больше библиотек и возможностей, но если не знать, как работать, без разницы какие у тебя в сумке лежат инструменты. Поэтому пока VBA. Опять же, это не значит, что я прям ярый фанат, что только так и никак иначе.
По поводу не делать кольцевых схем совет не подходит. У меня будут кольцевые схемы в работе, поэтому специально привел упрощенный пример с ними. Если человек понимает, как с приведенным примером работать, значит можно научить и программу. Совет с добавлением в вес ребра длины в зависимости от заполненности лотка надо побольше обдумать, как его реализовать. Т.е. рассмотрим, получается, случай 1) из моего сообщения #27. С точки зрения монтажника и проектировщика зеленая и синяя трасса от Шк1 до Шк2 и Шк3 идентичны, а вот с точки зрения программы зеленая трасса длиннее. Как вариант, думаю, может имеет смысл в программе сначала сгруппировать кабели, которые должны быть проложены по этим трассам, потом просто принудительно разделить эти кабели на 2 группы и одну принудительно отправить по первой трассе, вторую по второй. Для этого сначала надо составлять наборы кабелей. В общем случае, когда идет одна общая трасса, потом она ветвится такие группы сделать будет сложнее. Второй вариант - это составить две матрицы смежности, и поочередно использовать то одну, то вторую. Сильно приблизительный вариант раскладки получится, но как один из вариантов решения - почему бы и нет. |
|||
![]() |
|
||||
Проектировщик электрических сетей Регистрация: 17.01.2014
Пенза
Сообщений: 178
|
Цитата:
1. Идти во все готовое, подобные САПРы есть. 2. Если готов что то написать, то точно 100% писать. Жаль конечно что на VBA. (Я пока нисколько не жалею что потратил время на написание того что написал. У меня сейчас студентка на обучении, уже пользы много приносит, освещение расчитавыет в спец софте, светильники потом расставляет, параметры забивает, с трассами слегка помогаю. А дальше эксель все за нее рассчитает, начинаешь себя чувствовать полноценным главспецом, который занимается в основном проверками) ----- добавлено через ~14 мин. ----- Цитата:
Цитата:
Но в целом если сразу работать с большим граффом трассой, тогда можно добавлять вес к ребрам, при каждом последующем прохождением кабеля по этому ребру. Тем самым попробовать решить задачу наполняемости лотков))). Но я ее себе не ставил |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Заблуждаетесь. С 2010 акада (если не ошибаюсь) VBA единственный вид языка разработки - который нужно отдельно ставить не только для того, чтобы писать код. Без установленной среды разработки VBA даже готовая надстройка не запустится в акаде.
|
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Возможно ли выцепить текст у таблиц? Как это можно реализовать на AutoLISP? | lexluther | LISP | 15 | 19.03.2018 21:38 |
Можно ли моделировать Основания и Фундаменты в Лире САПР? | Алексей_rus | Лира / Лира-САПР | 2 | 09.12.2014 12:48 |
Можно ли к ПГ подключить автоматическую систему пожаротушения? | dextron3 | Инженерные сети | 3 | 17.04.2010 18:30 |
Можно ли такое реализовать в AutoCAD 2010? | Shoorup | Программирование | 7 | 03.05.2009 23:33 |