Тема: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?
Т.е. чтобы выполнялась команда _Pedit, но с указанием начального отрезка и конечного. Чтобы не приходилось выбирать все отрезки будущей полилинии.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Autodesk → AutoCAD → Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Т.е. чтобы выполнялась команда _Pedit, но с указанием начального отрезка и конечного. Чтобы не приходилось выбирать все отрезки будущей полилинии.
_.pedit _m ?
Так не удобно приходится указывать все отрезки. А если их порядка ста? Задача сделать выбор первого и последнего. Вот бьюсь над ее реализацией.
Встречные вопросы:
1. Что делать, если первый отрезок примитив "ОТРЕЗОК" (LINE), а второй - полилиния (LWPOLYLINE)?
2. Как учитывать дуговые сегменты?
3. Как учитывать возможные полилинии с различными ширинами сегментов?
4. Как учитывать возможное несовпадение вершин?
5. Как учитывать возможную разнонаправленность отрезков (один нарисован от точки 0,0 до 5,5; второй - от 10,10, до 5,5)?
Я понимаю, что ответ будет "Соединять". Но! Ты просто примерно прикинь количество вариантов, котрые надо предусматривать для корректной работы. Я - пас.
Например, для непрерывной последовательности отрезков, без всякого анализа:
^C^C_PEDIT;_m;_all;;_y;_j;;;
^C^C_PEDIT;_m;_w;\\;_y;_j;;;
> Владимир Громов
Я тож так хотел написать, правда, чуть-чуть по другому (то есть с анализом насчет дуг, отрезков и полилиний).
(defun c:plcreate (/ selset) (vl-load-com) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) (if (setq selset (ssget "_:L" '((0 . "LINE,ARC,LWPOLYLINE")))) (if (vl-remove-if-not '(lambda (x) (member (cdr (assoc 0 (entget x))) '("ARC" "LINE"))) (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))) ) ;_ end of vl-remove-if-not (command "_.pedit" "_m" selset "" "_y" "_j" 0 "") (command "_.pedit" "_m" selset "" "_j" 0 "") ) ;_ end of if ) ;_ end of if (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of defun
Но тут проблема не в том. Проблема именно в формировании набора примитивов, как я понимаю. Мои вопросы > kpblc (2006-07-18 14:36:03) задавались на полностью программное создание новой полилинии; применение _pedit частично вроде бы решает проблему.
Но! Что делать, если в 1 точку подходит 3 или более примитивов? :D
> kpblc
Ну, я в лоб написал, исходя из информации, данной в названии темы. Там упоминаются сегменты, поэтому я предположил, что отрезки отрисованы последовательно и непрерывно. Никаких данных о слоях, других примитивах и т.п не указано. Значит, имеем только непрерывную последовательность отрезков на одном слое и больше ничего. Ну, и пожалуйста, вот макросы. А на всякие другие условия я - пас.
Хех, пора делать подпись:
Будет ТЗ - будет решение.
А если только отрезки и вершины совпадают, то можно и так попробовать сделать (забыли про слои, не-отрезки, вариантов разных пространств и т.п. условий нормальной проги). На уровне идеи, без реализации - работы много:
(setq selset (ssget "_X" '((0 . "LINE")))
Выбрать отрезок с минимальными значениями х и у одной из вершин.
Начать (через entmake) рисовать полилинию
Последовательно добавлять в нее вершины как примитивы VERTEX по отдельному алгоритму.
Закончить формирование полилинии.
Удалить примитивы набора, попавшие в полилинию.
И все равно гарантированно работать нормально не будет - если в набор попадет отрезок, лежащий "бог знает где", то полилиния через него пройдет. Эффект будет явно не тот.
Спасибо за решение. Задача собственно и стояла соединить последовательно нарисованные отрезки. :) Еще раз спасибо. Протестирую в действии. Позже отпишусь. Весьма благодарен.
Уважаемый kpblc, подскажите пожалуйста как мне использовать ваш большой макрос. Я ни разу не писал макросы :) Работаю в группе поддержки пользователей, но поехал в командировку, а там сами знаете не разбираются кто ты, с компьютерами связан, значит и программу напишешь :). Расскажите пожалуйста что с ним дальше делать?
> Valpur
https://www.caduser.ru/oldlink/faq/?part=23
И там "Как сохранить программный код на своем компьютере?"
Мой код все равно не решает поставленной задачи, если честно - это просто оболочка для _.pedit и не больше. Для полного варианта надо делать проверку начальной и конечной вершин, запрашивать точность совпадения, игнорировать или нет слои и типы линий и т.п.
Сохранил в lsp файле, прописал путь. А теперь как его запустить? :)
plcreate с ком.строки, если lsp-файл загружен. Если нет, сначала загрузить.
Получилось, но к сожалению, эта функция не решает проблему :( т.к. опять же как и в команде pedit необходимо выбирать объекты, мне понравилась реализация Владимира Громова. Макрос сам проходит по чертежу и объединяет любые соединенные отрезки в полилинию. Как раз то, что мне и надо было. Спасибо Владимир.
> Valpur
Я рад, что простейшее решение попало в точку. Успехов.
Спасибо. Все гениальное - просто :).
Подскажите, как в 2009 автокаде создать макрос? я ни разу еще с ними не работал, на форуме искал но ни чего толком не смог найти... Везде пишется все коротко и для тех, кто уже много с макросами работал...
У меня такая же проблема. около 11000 полилиний было и пришлось их взорвать в простые линии и теперь надо обратно в полилинии превратить их.
Куда вставлять код ^C^C_PEDIT;_m;_all;;_y;_j;;;?!
Я открыл меню макросов "alt+F8", там у меня активны только:
"Закрыть"
"Справка"
"Диспетчер VBA"
"Опции"
тебе нужна книга В.Свет создание макрокоманд. вставлять надо сервис-адаптация-интерфейс- в нижней части указаны команды акада, там есть звездочка создать команду, нажимаешь ее создаеш команду выдиляешь ее. в проавом окне отображаются вверху иконки, во второй половине команда: имя команды, описание, макрос. вот в строчку макрос вставляешь код нажмаешь применить и команду перетаскивешь на панель и пользуешся!
и тему перенеси в "настроийка меню и Disel"
Еще не учтен вариант - замкнутый контур, т.е. первый и последний сегмент имеют общую вершину (первая и последняя) :)
Костя Шрайнер,
Мне когда то Кулик Алексей aka kpblc сделал макрос для объединнения линий и полилиний. Я им до сих пор пользуюсь.
^C^C(defun c:mypljoin( / selset _pedit) (if (setq selset (ssget "_:L" '((0^M;. "ARC,*LINE")))) (progn (setq _pedit (getvar "PEDITACCEPT")) (setvar^M;"PEDITACCEPT" 1) (command "_.pedit" "_m" selset "" "_j" 10.0 "") (setvar^M;"PEDITACCEPT" _pedit))));mypljoin;
ID_time_0 [&X-X_0]^C^C^G_time
Но выбирать нужго те линии которые обеденяешь. А так что бы первую и последю нет. Собсбвенно с этой идеей просто одну линию из набора.
И вот тут можно посмотреть.
https://www.caduser.ru/forum/topic29679.html
Всем спасибо:)
вот по этому лиспу от Крыса все отлично работает))) Запускаю лисп, выделяю все линии, которые надо объеденить и все везможные линии между собой объединяет.
(defun c:plcreate (/ selset)
(vl-load-com)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(if (setq selset (ssget "_:L" '((0 . "LINE,ARC,LWPOLYLINE"))))
(if (vl-remove-if-not
'(lambda (x) (member (cdr (assoc 0 (entget x))) '("ARC" "LINE")))
(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
) ;_ end of vl-remove-if-not
(command "_.pedit" "_m" selset "" "_y" "_j" 0 "")
(command "_.pedit" "_m" selset "" "_j" 0 "")
) ;_ end of if
) ;_ end of if
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
) ;_ end of defun
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Autodesk → AutoCAD → Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?
Форум работает на PunBB, при поддержке Informer Technologies, Inc