|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Динамический блок с разными параметрами.
__________________
Сообщество программистов 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 группы и одну принудительно отправить по первой трассе, вторую по второй. Для этого сначала надо составлять наборы кабелей. В общем случае, когда идет одна общая трасса, потом она ветвится такие группы сделать будет сложнее. Второй вариант - это составить две матрицы смежности, и поочередно использовать то одну, то вторую. Сильно приблизительный вариант раскладки получится, но как один из вариантов решения - почему бы и нет. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Возможно ли выцепить текст у таблиц? Как это можно реализовать на 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 |