Тема: LISP. Новая полилиния на основе нескольких замкнутых зон

На основе команды "bpoly", но может создать полилинию, объединяющую несколько замкнутых зон. Мышкой указываете внутри каждой замкнутой зоны.

(defun C:union_poly ()
  (setvar "hpbound" 0)
  (setq osn (getvar "osmode"))
  (setvar "osmode" 0)
  (setq r (getpoint "\n Укажите первую точку внутри зоны:"))
  (command "boundary" r "")
  (setq l (entlast))
  (setq nlayer (cdr (assoc 8 (entget l))))
  (setq cc (ssadd l))
  (setq i 0)
  (setq cc (sslength cc))
  (setq p 0)
  (while (/= p "Finish")
    (initget 32 "Finish")
    (setq p (getpoint "\nУкажите точку внутри добавляемой зоны или [Finish]:"))
    (if  (= p "Finish")
      (progn;;;1
       (setq vv (entlast))
       (setvar "osmode" osn)
      );;;конец progn1
      (progn;;;2
       (command "boundary" p "")
       (setq ll (entlast))
       (command "union" l ll "")
       (setq i (1+ i))
       (setq cc (1+ cc))
      );;;конец progn2
    );;;if
  );;;while
);;;defun

Завершить можно буквой "F".
Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:union_poly) (load "union_poly")) union_poly

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Сразу отмечу, что надо добавать префикс "_" перед командой boundary, а то в русских версиях программа работать не будет.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Не сразу заметил, но то же надо сделать и с командой union.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Ну, и конечный результат - "region" ("область").

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> Владимир Громов
Совершенно верно, собирал прогу года два назад, теперь особо не проверил, виноват. Конечный результат - REGION.
>den-si, просьба изменить тему на "Region на основе нескольких замкнутых зон".
Исправленный код (добавлены "_" в трех командах):

defun C:union_poly ()
  (setvar "hpbound" 0)
  (setq osn (getvar "osmode"))
  (setvar "osmode" 0)
  (setq r (getpoint "\n Укажите первую точку внутри зоны:"))
  (command "_boundary" r "")
  (setq l (entlast))
  (setq nlayer (cdr (assoc 8 (entget l))))
  (setq cc (ssadd l))
  (setq i 0)
  (setq cc (sslength cc))
  (setq p 0)
  (while (/= p "Finish")
    (initget 32 "Finish")
    (setq p (getpoint "\nУкажите точку внутри добавляемой зоны или [Finish]:"))
    (if  (= p "Finish")
      (progn;;;1
       (setq vv (entlast))
       (setvar "osmode" osn)
      );;;конец progn1
      (progn;;;2
       (command "_boundary" p "")
       (setq ll (entlast))
       (command "_union" l ll "")
       (setq i (1+ i))
       (setq cc (1+ cc))
      );;;конец progn2
    );;;if
  );;;while
);;;defun

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

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

(defun C:union_poly (/ osn r l ll i p vv )
  (setvar "hpbound" 0)
  (setq osn (getvar "osmode"))
  (setvar "osmode" 0)
  (setq r (getpoint "\n Укажите первую точку внутри зоны:"))
  (vl-cmdf "_bpoly" r "")
  (setq l (entlast))
  (setq i 0)
  (setq p 0)
  (while (/= p "Finish")
    (initget 32 "Finish")
    (setq p (getpoint "\nУкажите точку внутри добавляемой зоны или [Finish]:"))
    (if  (= p "Finish")
      (progn;;;1
       (setq vv (entlast))
       (setvar "hpbound" 1)
       (command "_bpoly" "a" "b" "n" vv "" "" r "")
       (entdel vv)
       (setvar "osmode" osn)
      );;;конец progn1
      (progn;;;2
       (vl-cmdf "_bpoly" p "")
       (setq ll (entlast))
       (vl-cmdf "_union" l ll "")
       (setq i (1+ i))
      );;;конец progn2
    );;;if
  );;;while
);;;defun

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> che
Что-то я не совсем понял. Вроде для "_bpoly" ("кполи")нет интерфейса командной строки (не срабатывает "_-bpoly"), да и в справке такой команды нет почему-то. Все-таки, пришлось напихать "_" в опции "a" "b" "n".
Но что получилось. Нарисовал два пересекающихся прямоугольника, применил к ним union_poly и стал смотреть и двигать. Оказалось 3 (три!) наложенные друг на друга объединенные области, а под ними еще и 3 полилинии (два исходных прямоугольника и один с вырезом). AutoCAD 2005 РУС.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> Владимир Громов
Справку не читал, но когда нет "_-...", просто набираю в комстроке (command "_bpoly") и смотрю чего он "хочет". У меня acad 2005 en, работает нормально, трудно сказать где подвох.
Может есть другие прогрессивные способы преобразования REGION в LWPOLYlINE?

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Пробовал и в acad 2002 eng, тоже нормально. Неправильно работает с несмежными зонами, оставляет первый замкнутый контур. Наверное, проблема с "a" "b" "n" при работе с русской версией.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> che
А, так это получается аналог "_-boundary" ("-контур") - те же опции, что и при вводе (command "_bpoly"). Я понял, какие это опции, но попробуй выделить получившуюся область и перетащить ее правой кнопкой мыши. А "_", конечно, нужны для русских версий.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> Владимир Громов
Когда перетаскиваю правой кнопкой, появлятся контекстное меню move/copy/paste as block/cancel, в остальном все то же (получается один объект - LWPOLYLINE).

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> che
Так, вроде разобрался. Рисую два пересекающихся прямоугольника, по запросу union_poly указываю точку в одном, потом в другом и еще в зону пересечения. Теперь перетаскиваю и вижу объединенную полилинию. Раньше я не тыкал в зону пересечения и получалась какя-то фигня. Однако исходные прямоугольники остались.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> Владимир Громов
Исходные прямоугольники, линии, полилинии остаются, новая полилиния рисуется на их основе, удаляются только вспомогательные region'ы, созданные в процессе работы программы.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Можно делать так: исходные объекты на одном слое, а для новой полилинии устанавливаем текущим другой слой. Тогда исходные объекты можно будет удалить.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

> Владимир Громов
Да, конечно. Но с другой это могут быть нужные объекты, стены, перегородки, оси и пр. Думаю, программа может послужить основой, а дальше можно "привинчивать" разные опции.

(изменено: Александр, 27 января 2011г. 02:29:39)

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

che пишет:

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

Можно чуть-чуть подправить программу, чтобы при Esc тоже получалась общая полилиния, а не только после ввода "F"? Сейчас остается регион. Было бы гораздо удобнее, быстрее, когда нужно посшивать много полигонов.
И чтобы - после создания контура - сообщала "контур создан"?

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Вообще-то, Esc служит для отмены или аварийного завершения какой-либо команды. Очень редко эту клавишу используют, скажем, для завершения цикла...
А вот che что-то давно не видно.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Если контур уже создан, то Esc бы прекратил новые запросы.
Сейчас после указания первой и второй точки, после Esc программа прекращает работу, но создается регион.
Т.е. ни то (выход без результата), ни се (создание полилинии). А жать "F", а потом Enter - неудобно.
Кстати, у Автокада Esc для базовых действий означает (в отличие от других программ) как раз не отказ от результата, а выход с исполнением. (Чертим полилинию, Esc - полилиния создается).

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Тогда попробуй укажи первую точку и нажми Esc.

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

С этим кто ж поспорит? Если после первой точки нажать Esc, то общее действие (указание двух точек) не завершено, и будет выход без результата. И это нормално. Если же были указаны обе точки, то контур сразу строится, и программа ожидает или выхода или нового начала. И Esc будет означать завершение с результатом.
Сейчас же после Esc результат имеется, но в виде региона, а не полилинии.
Опять таки - по аналогии с черчением полилинией. Если ввести первую точку и Esc, то полилиния не начертится. Если успеть ввести вторую, то Esc завершит (а не отменит) черчеие полилинии. Кстати, появится именно полилиния, а не отрезок или что-то еще другое.

(изменено: Владимир Громов, 27 января 2011г. 14:55:53)

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Ничего оно не будет означать. Это будет прерывание выполнения команды пользователем. Недаром в AutoLisp'е уделяется много внимания именно обходу случайного или злонамеренного нажатия Esc во время выполнения программы. Вспомним также, что многократное нажатие Esc убирает ручки и выделение объектов.

(изменено: Александр, 27 января 2011г. 15:29:17)

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Можно подправить всего лишь так, чтобы при Esc (после указания любого числа точек добавляемых зон)  программа сохраняла не общий регион, а полилинию? Как если бы была нажата "F"?
А также, сразу после успешного создания общего контура, сообщалось, что "общая полилиния создана"?

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

прикольно. Есть пару моментов:
; Aliases for commands discontinued in AutoCAD 2004:
BPOLY,              *BOUNDARY
то есть для версий выше 2004 корректно указывать "_.BOUNDARY"

Лучше выход сделать не по "F" и не по Esc а по Enter, имхо.

Подчеркивания нужны и в опциях, се ля ви:
(command "_bpoly" "_a" "_b" "_n" vv "" "" r "")

Вместо
(setq osn (getvar "osmode"))
(setvar "osmode" 0)
я бы лучше использовал связку из опции указания точки "_none" и самой точки. Тогда настройки не будут слетать при неправильном выходе из команды.
например: (vl-cmdf "_bpoly" "_none" r "")

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

Я совсем не программист.
Наверняка напортачу. С подчеркиваниями и я бы, наверное, справился, но я даже не знаю, почему в опциях перед w и r они не нужны.
Не в лом было бы сразу текст с изменениями? :)

(изменено: runa, 11 февраля 2011г. 11:28:30)

Re: LISP. Новая полилиния на основе нескольких замкнутых зон

vv и r не опции а переменные, если добавить перед ними подчеркивание возникнет ошибка.
Как работает эта прога для меня загадка. Когда пойму тогда и смогу что-нибудь наваять)

Разобрался но придумать как сделать хотя бы с проверкой пока не могу. Про команды region, union знаю слишком мало и в хелпе мало написано.