Автоматическая трассировка по существующему скелету для Autocad (оптимизируем код общими усилиями) - Страница 3
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматическая трассировка по существующему скелету для Autocad (оптимизируем код общими усилиями)

Автоматическая трассировка по существующему скелету для Autocad (оптимизируем код общими усилиями)

Ответ
Поиск в этой теме
Непрочитано 13.09.2010, 13:10
Автоматическая трассировка по существующему скелету для Autocad (оптимизируем код общими усилиями)
NEDIS
 
Инженер СКС
 
г. Домодедово МО
Регистрация: 21.08.2009
Сообщений: 72

Доброго времени суток коллеги.
Хочу поделиться наработками по программке.
Сразу хочу попросить сильно меня не пинать в плане грамотности написания кода, начал изучать LISP только с весны этого года, благодаря dwg.ru. Наверняка я наделал неподъемную кучу косяков, поэтому очень рад буду выслушать рекомендации по оптимизации и рад буду любой оказываемой помощи.
Хочу выразить благодарность всем чьи наработки я использовал в частности: Кулику Алексею (aka kpblc), VVA и hwd (и остальных участников форума, кого я забыл упомянуть в силу своей некомпетентности).

Алгоритм Флойда (Проба пера).
Немного о содержимом:
1. Два файла Lisp Команды и Функции
2. DWG файл с планировками и тестовыми закладными устройствами «скелетами» по которым выполняется трассировка полилиниями.
3. Команды:
a. NEDIS-input-system-for-tracing – Команда создает набор примитивов по которым будет выполняться трассировка, обрабатывает эти примитивы и выдает конечные матрицы для трассировки.
b. NEDIS-tracing-point-to-point - Трассировка точка-точка (выбор пользователя).
4. Функции:
a. NDS-start-finish-for-Floyd - Находит ближайший примитив, точку пересечения с ним и узлы для трассировки
b. NDS-manipulation-for-Floyd - Создает определенного вида списки для дальнейшей обработки функцией NDS-solution-matrix-Floyd (Работает только с LWPOLYLINE и LINE)
c. NDS-solution-matrix-Floyd - Создает и решает матрицу Флойда и матрицу маршрутов (алгоритм взят от сюда http://khpi-iip.mipk.kharkiv.edu/lib.../din_0124.html )
d. NDS-tracing - Выполняем трассировку (т.е. находим кротчайший путь по matrica-route-end, проверяя возможность такого пути по matrica-floyda-end (не должен рассматриваемый элемент быть равен "NO") получаем список узлов оптимального маршрута)
e. dwgru-geom-point-on-line - Проверяет принадлежность точки отрезку
f. pln - Создает полилинию по списку вершин lst, c - nil/T - разомкн/замкнт или '(с слой цвет)
5. Логику работы программ объяснять не буду, старался внутри все пояснять. По мере обсуждения буду «повествовать» почему делал так.
6. Основная проблема кроется в функции NDS-solution-matrix-Floyd шибко долго она решает Вариант 1 планировки. Вообщем-то это и понятно, так как чем больше точек для построения матрицы Флойда тем больше циклов оня будет проделовать (а их три и они все внутри друг друга). Над оптимизацией сам не работал, сильно загружен по работе.

Алгоритм Дейкстры (Проба пера-2).
Оказался наиболее шустрым.
Некоторые нюансы:
1. Иногда вылетает ошибка типа переменной (непосредственно уже при трассировке) – думаю где-то намутил с обработкой списков (не разбирался), надеюсь с помощью однофорумчан ее решить.
2. Полилиния не должна сама себя пересекать, функция не увидит такую точку пересечения и, как следствие, не будет создано корректное разрешение для этой точки
Отличая от предшественника:
1. Взамен NDS-manipulation-for-Floyd пришел NDS-manipulation-for-Dijkstra с соответствующими доработками, сильно его не менял – времени нету, но укоротить код можно прилично для быстродействия.
2. По замечаниям более опытных коллег убрал лишние setq.
3. NDS-solution-Dijkstra – создает разрешения для точек (от куда куда можно) все загоняет в одномерный массив (список).
4. NDS-tracing-all-in-one – функция определяет из 4-х вариантов трасс (1 – стартовая точка, ближайший узел справа от стартовой точки, … , ближайший узел справа от финишной точки, финишная точка; 2 - стартовая точка, ближайший узел слева от стартовой точки, … , ближайший узел справа от финишной точки, финишная точка; и т.д) наиболее короткую.

Ну вот такой винегрет получился .

Вложения
Тип файла: rar Проба пера.rar (373.5 Кб, 366 просмотров)
Тип файла: rar Проба пера - 2.rar (134.3 Кб, 330 просмотров)


Последний раз редактировалось NEDIS, 05.10.2010 в 10:45.
Просмотров: 23506
 
Непрочитано 11.11.2010, 20:23
#41
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Eddicordo,

если надо только линии (LINE) на определенном слое "!!SS_zakl_gofra_25" выделить рамкой, то вставь такой код:

Код:
[Выделить все]
(ssget "_:L" (list '(0 . "LINE")  '(8 . "!!SS_zakl_gofra_25")))
если и линии, и полилинии, то такой:

Код:
[Выделить все]
(ssget "_:L" (list '(-4 . "<OR") '(0 . "LINE") '(0 . "LWPOLYLINE") '(-4 . "OR>")  '(8 . "!!SS_zakl_gofra_25")))
Frigate вне форума  
 
Автор темы   Непрочитано 13.11.2010, 14:19
#42
NEDIS

Инженер СКС
 
Регистрация: 21.08.2009
г. Домодедово МО
Сообщений: 72


Цитата:
Сообщение от Eddicordo Посмотреть сообщение
Но чет странно при команде NEDIS-tracing-point-to-point путь находит вроде бы правильно. А вот поллинию налаживает со сдвигом. То есть не точно по указанному скелету.
Это у тебя как пример показаны отрезки ну очень огромные. Ты начерти отрезки по 10-100 мм. и увидишь не точности.
Это связано с округлением координат до 10E-6, при дальнейших монипуляциях конечная трасса будет отклоняться от скелета max +/- 0,5 ед. автокада. Дело в том, что когда писал все это одновременно и изкчал LISP и столкнулся с тем, что один и тот же список координат может прочитать по разному: т.е. х=0.12345679 а при следующей обработке я получал 0.12345680 т.е. появлялась ошибка, которую я решил округлением. Вообще я все функции и команды на НГ перебиру и постараюсь решить эту проблему.
Цитата:
Сообщение от Eddicordo Посмотреть сообщение
Да и при команде NEDIS-input-system-for-tracing наши отрезки должны быть именно в том слое !!SS_zakl_gofra_25.
Неудобство в том что при указании наших отрезков они уже должны быть в нужном слое.
Я создал свою панель закладных устройств гофра, лоток, уголки и т.д. при нажатии соответсвующей кнопки у меня создается/активируется необходимый слой, тип линии. Т.е. уже при начерталке у меня все в нужных слоях.

Цитата:
Сообщение от Eddicordo Посмотреть сообщение
Был бы неплохо что бы при указании нашего скелета из отрезков все что мы выделяем само переносилось в нужный нам слой.
Тут уже все зависит от потребностей каждого мне шаговое выделение неудобно. Но и предусмотреть еще один цикл набора примитивов тоже не проблема ... да и перенести выбранные примитивы на другой слой тоже не составляет труда. Вообщем если надо то сделаем

Цитата:
Сообщение от Eddicordo Посмотреть сообщение
Выделение рамкой скелета ну очень не удобно. А выделить ВСЕ, по моему никому и не нужно.
Тут не согласен: я связист (по сути) мне из точки А в точки в кучу точек надо кучу кабелей протащить (отчертить трассы), и если я буду каждый раз делать набор опорных примитивов для трассировки я с ума сойду . Про выделение ВСЕ: у меня есть блоки слаботочные розетки в них есть атрибуты (в том числе координата расположения) есть шкафы (тоже блоки с атрибутами). Настроив розетки (к какому шкафу принадлежит) и дав имена шкафам я выбираю все закладные, а дальше запускаю мою команду по трассировке розеток, т.е. идет считывание ее координаты, далее куда трассируем и вперед - для всех в цикле. Кучу времени экономлю (хотя откровенно бывают глюки, но это исправлю со временем).

P.S. Пока я пробую свою недоделку в проектах (выявляю зихеры), дальше: дороботка, изменения и отладка.

Последний раз редактировалось NEDIS, 13.11.2010 в 14:29.
NEDIS вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматическая трассировка по существующему скелету для Autocad (оптимизируем код общими усилиями)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание форм и шрифтов для AutoCAD Shoorup AutoCAD 6 25.01.2013 17:43
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59