Тема: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Т.е. чтобы выполнялась команда _Pedit, но с указанием начального отрезка и конечного. Чтобы не приходилось выбирать все отрезки будущей полилинии.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

_.pedit _m ?

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Так не удобно приходится указывать все отрезки. А если их порядка ста? Задача сделать выбор первого и последнего. Вот бьюсь над ее реализацией.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Встречные вопросы:
1. Что делать, если первый отрезок примитив "ОТРЕЗОК" (LINE), а второй - полилиния (LWPOLYLINE)?
2. Как учитывать дуговые сегменты?
3. Как учитывать возможные полилинии с различными ширинами сегментов?
4. Как учитывать возможное несовпадение вершин?
5. Как учитывать возможную разнонаправленность отрезков (один нарисован от точки 0,0 до 5,5; второй - от 10,10, до 5,5)?
Я понимаю, что ответ будет "Соединять". Но! Ты просто примерно прикинь количество вариантов, котрые надо предусматривать для корректной работы. Я - пас.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Например, для непрерывной последовательности отрезков, без всякого анализа:

^C^C_PEDIT;_m;_all;;_y;_j;;;
^C^C_PEDIT;_m;_w;\\;_y;_j;;;

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

> Владимир Громов
Я тож так хотел написать, правда, чуть-чуть по другому (то есть с анализом насчет дуг, отрезков и полилиний).

(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

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

> kpblc
Ну, я в лоб написал, исходя из информации, данной в названии темы. Там упоминаются сегменты, поэтому я предположил, что отрезки отрисованы последовательно и непрерывно. Никаких данных о слоях, других примитивах и т.п не указано. Значит, имеем только непрерывную последовательность отрезков на одном слое и больше ничего. Ну, и пожалуйста, вот макросы. А на всякие другие условия я - пас.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Хех, пора делать подпись:
Будет ТЗ - будет решение.
А если только отрезки и вершины совпадают, то можно и так попробовать сделать (забыли про слои, не-отрезки, вариантов разных пространств и т.п. условий нормальной проги). На уровне идеи, без реализации - работы много:
(setq selset (ssget "_X" '((0 . "LINE")))
Выбрать отрезок с минимальными значениями х и у одной из вершин.
Начать (через entmake) рисовать полилинию
Последовательно добавлять в нее вершины как примитивы VERTEX по отдельному алгоритму.
Закончить формирование полилинии.
Удалить примитивы набора, попавшие в полилинию.
И все равно гарантированно работать нормально не будет - если в набор попадет отрезок, лежащий "бог знает где", то полилиния через него пройдет. Эффект будет явно не тот.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Спасибо за решение. Задача собственно и стояла соединить последовательно нарисованные отрезки. :) Еще раз спасибо. Протестирую в действии. Позже отпишусь. Весьма благодарен.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Уважаемый kpblc, подскажите пожалуйста как мне использовать ваш большой макрос. Я ни разу не писал макросы :) Работаю в группе поддержки пользователей, но поехал в командировку, а там сами знаете не разбираются кто ты, с компьютерами связан, значит и программу напишешь :). Расскажите пожалуйста что с ним дальше делать?

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

> Valpur
https://www.caduser.ru/oldlink/faq/?part=23
И там "Как сохранить программный код на своем компьютере?"
Мой код все равно не решает поставленной задачи, если честно - это просто оболочка для _.pedit и не больше. Для полного варианта надо делать проверку начальной и конечной вершин, запрашивать точность совпадения, игнорировать или нет слои и типы линий и т.п.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Сохранил в lsp файле, прописал путь. А теперь как его запустить? :)

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

plcreate с ком.строки, если lsp-файл загружен. Если нет, сначала загрузить.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Получилось, но к сожалению, эта функция не решает проблему :( т.к. опять же как и в команде pedit необходимо выбирать объекты, мне понравилась реализация Владимира Громова. Макрос сам проходит по чертежу и объединяет любые соединенные отрезки в полилинию. Как раз то, что мне и надо было. Спасибо Владимир.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

> Valpur
Я рад, что простейшее решение попало в точку. Успехов.

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Спасибо. Все гениальное - просто :).

(изменено: Костя Шрайнер, 1 июля 2010г. 08:58:45)

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Подскажите, как в 2009 автокаде создать макрос? я ни разу еще с ними не работал, на форуме искал но ни чего толком не смог найти... Везде пишется все коротко и для тех, кто уже много с макросами работал...

У меня такая же проблема. около 11000 полилиний было и пришлось их взорвать в простые линии и теперь надо обратно в полилинии превратить их.

Куда вставлять код ^C^C_PEDIT;_m;_all;;_y;_j;;;?!

Я открыл меню макросов "alt+F8", там у меня активны только:
"Закрыть"
"Справка"
"Диспетчер VBA"
"Опции"

(изменено: 1 1, 1 июля 2010г. 11:20:52)

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

тебе нужна книга В.Свет создание макрокоманд. вставлять надо сервис-адаптация-интерфейс- в нижней части указаны команды акада, там есть звездочка создать команду, нажимаешь ее создаеш команду выдиляешь ее. в  проавом окне отображаются вверху иконки, во второй половине команда: имя команды, описание, макрос. вот в строчку макрос вставляешь код нажмаешь применить и команду перетаскивешь на панель и пользуешся!
и тему перенеси  в "настроийка меню и Disel"

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Еще не учтен вариант - замкнутый контур, т.е. первый и последний сегмент имеют общую вершину (первая и последняя) :)

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Костя Шрайнер,
Мне когда то Кулик Алексей 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

Re: Как сделать преобразование отрезков в полилинию с указанием начального и конечного сегментов?

Всем спасибо:)
вот по этому лиспу от Крыса все отлично работает))) Запускаю лисп, выделяю все линии, которые надо объеденить и все везможные линии между собой объединяет.

(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