Как добавить точку на полилинии в автокаде
Перейти к содержимому

Как добавить точку на полилинии в автокаде

  • автор:

Создание точек в вершинах полилинии или горизонтали поверхности с использованием отметок поверхности

Создание точек на поверхности в вершинах полилиний или горизонталей поверхности.

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

Поскольку данная команда создает точки на основе отметок, считываемых с поверхности, то при выполнении этой команды настройки раздела «Запрашивать отметки» , заданные в параметрах «Создание точек» , не влияют на способ вывода запроса.

Параметры точек, стили, слои, группы точек и ключи-описатели — все это может повлиять на то, как создается точка, или на то, как она выглядит в чертеже. Дополнительные сведения приведены в разделе «Перед созданием точек» .

Чтобы создать точки в вершинах полилинии или горизонтали поверхности с использованием значений отметок поверхности:

  1. Выберите параметры и создайте стили, слои, группы точек и ключи-описатели. Для получения дополнительных сведений см. раздел До создания точек .
  2. Выберите вкладку «Главная» панель «Создать данные рельефа» меню «Точки» «Создать точки – Поверхность» «Вершины полилинии/горизонтали» .
  3. Выберите поверхность.
  4. Выберите полилинию или горизонталь поверхности. Точки будут размещены в вершинах полилинии или горизонтали поверхности.
  5. Для каждой точки по запросу введите имя точки и описание.

Примечание

На то, как точка отображается, оказывают влияние многие факторы. Для получения подробной информации см. раздел Управление внешним видом точек на чертеже .

Выберите вкладку «Главная» панель «Создать данные рельефа» меню «Точки» «Создать точки – Поверхность» «Вершины полилинии/горизонтали»

«Точки» «Создать точки» «Поверхность» «Вершины полилинии/горизонтали»

Контекстное меню «Область инструментов»

Вкладка «Навигатор» : щелкните правой кнопкой мыши коллекцию «Точки» «Создать»

Как добавить вершину в полилинию нажатием одной кнопки? (Страница 1 из 4)

Форумы CADUser → Программирование → LISP → Как добавить вершину в полилинию нажатием одной кнопки?

Страницы 1 2 3 4 Далее

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Сообщения с 1 по 25 из 86

#1 Тема от Azor 30 августа 2005г. 09:05:09

Тема: Как добавить вершину в полилинию нажатием одной кнопки?

Возможно ли добавлять вершину в полилинию путем нажатия одной кнопки, подобно Break at Point, только не разрывая линию? Путем редактирования полилинии (PEDIT-Edit Vertex-Insert) получается слишком муторно.

#2 Ответ от Владимир Громов 30 августа 2005г. 09:29:21

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Вот такая конструкция:

(vl-cmdf "_PEDIT" pause "_E" "_I" pause "_X" "")

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

#3 Ответ от Azor 30 августа 2005г. 09:46:09

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Так вот в этом и проблема.. а если вершин много? 20-30 например. Конкретная задача — трассировка нагорной канавы. Допустим мне нужно приблизить дно канавы к определенному уклону, для этого требуется изогнуть канаву в определенном месте рельефа. Добавляю вершину. Я нажимаю Break at Point, рву полилинию в нужном месте, потом склеиваю. Так быстрее получается, нежели до этой вершины скакать, а потом втыкать ее.

#4 Ответ от kpblc 30 августа 2005г. 10:53:43

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Можно попробовать лиспом:

;|============================================================================= * Функция разрыва полилинии и одновременной передвижки новой вершины. * Полилиния не меняет следующих свойств: цвет, слой, тип. * Ограничения: * 1. Не производится отлов ошибок ввода (никто не запрещает работать с арками и * окружностями) * 2. Не производится отлов нажатия Esc - не выполняется восстановление * системных переменных. Обработчик ошибок писать просто некогда. * 3. Не производится проверка usc, в которой работает пользователь. * 4. Неправильное указание точки (не принадлежащей объекту) может свалить * функцию в ноль. * 5. Не отслеживается "заморозка" слоя. * 6. Не отслеживается вариант, когда указывается пересечение двух объектов - * в таком случае работа непредсказуема. * Функция тестировалась на ADT 2005, usc = world. * * Функцию желательно сохранить в файл kpblc-stretch-pline.lsp. Файл должен * быть сохранен в путях поддержки AutoCAD. * Возможный макрос для вызова: ^C^C(if (not "c:kpblc-stretch-pline") (load "kpblc-stretch-pline.lsp"));c:kpblc-stretch-pline; =============================================================================|; (defun c:kpblc-stretch-pline ( / break_point _osmode_ selset_oper) (setq _osmode_ (getvar "osmode")) ;_ end of setq (setvar "osmode" 512) (setq break_point (getpoint "\nУкажите точку разрыва : ") selset_oper (ssget break_point) ) ;_ end of setq (command "_.break" selset_oper break_point break_point) (command "_.pedit" "_M" "_C" break_point break_point "" "_join" 0 "") (command "_.stretch" "_C" break_point break_point "") (setvar "osmode" 1) (while (/= (getvar "cmdactive") 0) (command pause) ) ;_ end of while (setvar "osmode" _osmode_) (princ) ) ;_ end of defun ;;; Конец файла kpblc-stretch-pline.lsp

Как вариант, не более. Для нормальной работы можно еще массу всего понаворотить.

#5 Ответ от Олег(jr.) 30 августа 2005г. 13:07:10

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> Azor
Попробуй такую фичу, указывать полилинию нужно
на том участке, где будет добавлена вершина
~’J’~

;; Вспомогательные функции ;; Группировка списка по числу элементов субсписка (defun group-by-num (lst num / ls ret) (if (= (rem (length lst) num ) 0) (progn (setq ls nil) (repeat (/ (length lst) num) (repeat num (setq ls (cons (car lst) ls) lst (cdr lst))) (setq ret (append ret (list (reverse ls))) ls nil))) ) ret ) ;; Голова списка по номеру: (defun head (lst num ) (if ( < 0 (1- num)) (cons (car lst) (head (cdr lst) (1- num))))) ;; Хвост списка по номеру: (defun tail (lst num / ) (if (>(length lst) (1- num )) (append (tail (reverse (cdr (reverse lst))) num) (list (last lst))))) ;; Добавление элемента в список по номеру позиции (defun add-elt (lst num elt) (if elt (append (head lst num) (cons elt (tail lst num))))) ;; Создание и заполнение безопасного массива точек (defun safe-points (lst / pt_list points) (setq pt_list (apply 'append lst)) (setq points (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length pt_list))) ) pt_list ) ) ) ;; Обработсик ошибок с пошаговым возвратом (defun div-error (msg) (if (vl-position msg '("console break" "Function cancelled" "quit / exit abort" ) ) (princ "Error!") (princ msg) ) (while (> (getvar "cmdactive") 0) (command)) (command "._undo" "_end") (command "._u") (setq *error* olderror) (princ) ) (vl-load-com) (prompt "\n *** Type ADV to execute *** \n") ;; ОСНОВНАЯ ПРОГРАММА ;; (defun C:adv (/ *error* acsp adoc appd coord div-error new_pl olderror pl pn pt pt_list seg_num util ) (or adoc (setq adoc (vla-get-activedocument (vlax-get-acad-object) ) ) ) (or appd (setq appd (vla-get-application adoc))) (or acsp (setq acsp (vla-get-block (vla-get-activelayout adoc) ) ) ) (or util (setq util (vla-get-utility adoc))) (command "._undo" "_end") (command "._undo" "_mark") (setq olderror *error*) (setq *error* div-error) (vla-getentity util 'pl 'pt "\nSelect polyline to add vertex: >>> \n" ) (if pl (progn (setq pn (trans (getpoint "\nSpecify new vertex location: >>> \n") 1 0)) (setq coord (vlax-get pl 'Coordinates) coord (cond ((eq (rem (length coord) 2) 0) (group-by-num coord 2) ) ((eq (rem (length coord) 3) 0) (group-by-num coord 3) ) (T nil) ) coord (mapcar (function (lambda (x) (trans x 1 0))) coord) ) (setq seg_num (+ (fix (vlax-curve-getparamatpoint pl (osnap (vlax-safearray->list pt) "_nea") ) ) 2 ) ) (setq coord (add-elt coord seg_num pn)) (setq pt_list (safe-points coord)) (setq new_pl (vla-addpolyline acsp pt_list)) (vla-delete pl) (mapcar (function (lambda (x) (if (not (vlax-object-released-p x)) (vlax-release-object x) ) ) ) (list pl new_pl) ) ) (princ "\nNothing selected try again\n") ) (vla-zoomextents appd) (vla-regen adoc acactiveviewport) (setq *error* olderror div-error nil ) (command "._undo" "_end") (princ) ) (C:adv) (princ)

#6 Ответ от Владимир Громов 30 августа 2005г. 13:41:08

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> Олег(jr.)
Интересная программа.
Вершины вставляются там, где надо, только замкнутая полилиния размыкается со стиранием замыкающего сегмента, а дуговые сегменты заменяются линейными.

#7 Ответ от Владимир Громов 30 августа 2005г. 13:46:39

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> kpblc
Непонятно, что делать после указания точки разрыва?

#8 Ответ от kpblc 30 августа 2005г. 14:38:35

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> Владимир Громов
Тащить новую вершину на нужное место. На ней (на вершине) просто надо дополнительно щелкнуть — не удалось мне слету указать ее для stretch’a.

#9 Ответ от kpblc 30 августа 2005г. 14:41:20

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Упустил из виду: если таскать сразу не требуется, надо будет закомментировать строки

(command "_.stretch" "_C" break_point break_point "") (setvar "osmode" 1) (while (/= (getvar "cmdactive") 0) (command pause) ) ;_ end of while

Т.е. перед ними поставить ;;

#10 Ответ от shishoq 30 августа 2005г. 17:27:59

Re: Как добавить вершину в полилинию нажатием одной кнопки?

В Toolpac-е есть такая функция:
указываешь курсором место новой вершины, потом — сегмент, который разрывается и дотягивается до неё. Там же есть и опция удаления ненужной вершины. Toolpac > Polyline > Vertex > . Только после этих операций ассоциативность этой плинии теряется, так что контуры штриховок я меняю по старинке, pedit-ом.

#11 Ответ от kpblc 30 августа 2005г. 17:35:10

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> shishoq
Ну на этот предмет не тестировал. Но и у меня тоже ассоциативность рушится. Надо по новой штриховать. За компанию: если полилиния служила обрамлением wipeout, его понадобится перестраивать.

#12 Ответ от shishoq 30 августа 2005г. 17:41:27

Re: Как добавить вершину в полилинию нажатием одной кнопки?

а нельзя ли написать фичу на основе PEDIT ,чтобы не портила ассоциативность?

#13 Ответ от kpblc 30 августа 2005г. 17:47:12

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Немного подправленный мой код (автоматически после указания точки разрыва идет требование указать новое положение точки):

;|============================================================================= * Функция разрыва полилинии и одновременной передвижки новой вершины. * Полилиния не меняет следующих свойств: цвет, слой, тип. * Ограничения: * 1. Не производится отлов ошибок ввода (никто не запрещает работать с арками и * окружностями) * 2. Не производится отлов нажатия Esc - не выполняется восстановление * системных переменных. Обработчик ошибок писать просто некогда. * 3. Не производится проверка usc, в которой работает пользователь. * 4. Неправильное указание точки (не принадлежащей объекту) может свалить * функцию в ноль. * 5. Не отслеживается "заморозка" слоя. * 6. Не отслеживается вариант, когда указывается пересечение двух объектов - * в таком случае работа непредсказуема. * Функция тестировалась на ADT 2005, usc = world. * * Функцию желательно сохранить в файл kpblc-stretch-pline.lsp. Файл должен * быть сохранен в путях поддержки AutoCAD. * Возможный макрос для вызова: ^C^C(if (not "c:pline-str") (load "kpblc-stretch-pline.lsp"));c:pline-str; =============================================================================|; (defun kpblc-stretch-pline (/ break_point _osmode_ selset_oper) (setq _osmode_ (getvar "osmode")) ;_ end of setq (setvar "osmode" 512) (setq break_point (getpoint "\nУкажите новую вершину : ") selset_oper (ssget break_point) ) ;_ end of setq (command "_.break" selset_oper break_point break_point) (command "_.pedit" "_M" "_C" break_point break_point "" "_join" 0 "") (command "_.stretch" "_C" break_point break_point "" break_point) ;;(command (list break_point) pause) ;|(while (/= (getvar "cmdactive") 0) (command pause) ) ;_ end of while |; (setvar "osmode" _osmode_)|; (princ) ) ;_ end of defun (defun c:pline-str() (kpblc-stretch-pline) ) ;_ end of defun ;;; Конец файла kpblc-stretch-pline.lsp

> shishoq : у меня не получилось. Может, у Олега (jr) выйдет?

#14 Ответ от kpblc 30 августа 2005г. 17:49:19

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Тьфу ты, там в коде надо снести закомментрованные строки (command (list. )) и (while. );_end of while.
Хотя с другой стороны они не мешают.

#15 Ответ от kpblc 30 августа 2005г. 17:52:36

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Так, все. 2 предыдущих поста можно сносить. Здес окончательный вариант:

;|=================================================================== * Функция разрыва полилинии и одновременной передвижки новой вершины. * Полилиния не меняет следующих свойств: цвет, слой, тип. * Ограничения: * 1. Не производится отлов ошибок ввода (никто не запрещает работать с арками и * окружностями) * 2. Не производится отлов нажатия Esc - не выполняется восстановление * системных переменных. Обработчик ошибок писать просто некогда. * 3. Не производится проверка usc, в которой работает пользователь. * 4. Неправильное указание точки (не принадлежащей объекту) может свалить * функцию в ноль. * 5. Не отслеживается "заморозка" слоя. * 6. Не отслеживается вариант, когда указывается пересечение двух объектов - * в таком случае работа непредсказуема. * Функция тестировалась на ADT 2005, usc = world. * * Функцию желательно сохранить в файл kpblc-stretch-pline.lsp. Файл должен * быть сохранен в путях поддержки AutoCAD. * Возможный макрос для вызова: ^C^C(if (not "c:pline-str") (load "kpblc-stretch-pline.lsp"));c:pline-str; ===================================================================|; (defun kpblc-stretch-pline (/ break_point _osmode_ selset_oper) (setq _osmode_ (getvar "osmode")) ;_ end of setq (setvar "osmode" 512) (setq break_point (getpoint "\nУкажите новую вершину : ") selset_oper (ssget break_point) ) ;_ end of setq (command "_.break" selset_oper break_point break_point) (command "_.pedit" "_M" "_C" break_point break_point "" "_join" 0 "") (command "_.stretch" "_C" break_point break_point "" break_point) (setvar "osmode" _osmode_) (princ) ) ;_ end of defun (defun c:pline-str() (kpblc-stretch-pline) )

Вроде сейчас все нормально.

#16 Ответ от Владимир Громов 30 августа 2005г. 20:57:43

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> kpblc
Вроде все нормально, только если в ответ на запрос:

Вторая точка перемещения или :

нажать правую кнопку мыши, то получается какая-то ерунда, IMHO.

#17 Ответ от kpblc 31 августа 2005г. 08:34:06

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> Владимир Громов
Я тоже на это внимание обратил, но как побороть, даже не представляю. Что самое интересное, если дать просто _.stretch (с ком.строки), то все работает предсказуемо.
С другой стороны, а смысл сделать просто дополнительную вершину полилинии? Ее же, по условиям > Azor (2005-08-30 09:46:09), надо сразу двигать (имхо). Можно, конечно, сделать дополнительный запрос на «двигать вершину или плюнуть?» перед _.stretch, но лишние телодвижения. Если надо, сделать не проблема — только сообщите 😉

#18 Ответ от Azor 2 сентября 2005г. 03:05:25

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Всем спасибо, благодарствую 🙂

#19 Ответ от Azor 2 сентября 2005г. 05:38:59

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> kpblc
весьма полезная программка, и именно со стретчем. не нарадуюсь 🙂

> Олег(jr.)
когда втыкаю одну вершину — все ок, а при попытке поставить вторую — получается абракадабра.

#20 Ответ от Владимир Громов 8 сентября 2005г. 09:26:33

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> kpblc
Товарищ kpblc. А что, если ты эту программу отправишь в раздел «Готовые программы»? Мне нравится, несмотря на бяку с нажатием правой кнопки мыши, моим коллегам-архитекторам тоже придется по душе. Им часто приходится менять планировку помещений, а площадь они определяют по моей программе (площадь замкнутого контура). Частенько приходится контур рисовать заново, потому что надо добавить углы помещения, а, следовательно, и вершины в контуре.

#21 Ответ от kpblc 8 сентября 2005г. 09:40:09

Re: Как добавить вершину в полилинию нажатием одной кнопки?

imho перед «готовностью программы» надо дополнительно, во-первых, сделать вариант на правую кнопку мыши (см. > kpblc (2005-08-31 08:34:06)), провести проверку на досрочный выход, обработку ошибок, провести обработку нештатной ситуации — попытка обработки отрезка, 3д-полилинии, окружности эллипса, полилинии в блоке / xref-e — тут же до дури всего можно придумать. Сейчас просто времени, к сожалению, нет — может, к вечеру поближе что-то и получится.
По поводу площади: можно сюда же засунуть дополнительно проверку на замкнутость полученной полилинии (dxf = 70), преобразовать ее в vlax-object и оттуда вытащить площадь, запросить точку вставки (кстати, тоже надо проверять ввод) и на этой точке сделать либо текст через entmake, либо вставить блок с текстовым атрибутом. Т.е. варианты есть — их только прорабатывать надо.

#22 Ответ от Владимир Громов 8 сентября 2005г. 10:03:36

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> kpblc
Ну, я вижу, ты точно хочешь придерживаться буквы закона: «Готовая программа» — значит готовая программа. Может, все-таки, с мнимальными доработками, а? И не сей секунд, конечно. Ведь хорошая программа, даже в таком виде. Потом, позже, программу можно усовершенствовать. А то эта тема (ведь чисто Лисп’овская) находится в таком разделе, который пополняется со страшнлй силой, и скоро она ушла бы уже во вторую сотню, если бы я ее не поднял.

#23 Ответ от kpblc 8 сентября 2005г. 10:52:07

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Ок, тогда надо определить объем этих минимальных доработок. Чего там сделать-то надобно?
Мои предложения:
1. дополнительные вершины можно вставлять либо для lwpolyline, либо для отрезков (кстати, вопрос — был отрезок, стал полилинией, обратно в отрезки делать или нет? Или запрос?) — для остального (circle, ellipse, spline, 3d-polyline, block, xref. ) вываливается (alert).
2. Досрочный выход не обрабатывается.
3. Площадь не выводится — тут помимо замкнутости надо еще дополнительно по идее обрабатывать варианты совпадения начальной и конечной вершин, а также вариант с самопересечением — _boundary лично мне что-то не очень — если lwpolyline нормальная, то команда создает дубль объекта, который для качественной функции надо сносить — лишние телодвижения.
4. Правая кнопка — что с ней делать? Т.е. для варианта отмены _.stretch чего творим?

#24 Ответ от Владимир Громов 8 сентября 2005г. 11:27:39

Re: Как добавить вершину в полилинию нажатием одной кнопки?

> kpblc
Я пока и сам не знаю. Знаю только, что я ее и в таком виде буду использовать. Не хотелось мне, чтобы тема утонула. Я бы ограничился просто таким названием: «Добавление вершины в полилинию» без площадей, отрезков и т.п. Эта программа может работать сама по себе, а на ее основе можно потом что-то дальше развивать. Универсальность мне не всегда нравится, начальная идея может раствориться в самой универсальности, IMHO.

#25 Ответ от kpblc 8 сентября 2005г. 12:35:30

Re: Как добавить вершину в полилинию нажатием одной кнопки?

Ну ладно. В общем, тут несколько моментов сделано:

;|============================================================================= * Функция разрыва полилинии и одновременной передвижки новой вершины. * Полилиния не меняет следующих свойств: цвет, слой, тип. * Ограничения: * 1. Не производится отлов ошибок ввода (никто не запрещает работать с арками и * окружностями) * 2. Не производится отлов нажатия Esc - не выполняется восстановление * системных переменных. Обработчик ошибок писать просто некогда. * 3. Не производится проверка usc, в которой работает пользователь. * 4. Неправильное указание точки (не принадлежащей объекту) может свалить * функцию в ноль. * 5. Не отслеживается "заморозка" слоя. * 6. Не отслеживается вариант, когда указывается пересечение двух объектов - * в таком случае работа непредсказуема. * Функция тестировалась на ADT 2005, usc = world. * * Функцию желательно сохранить в файл kpblc-stretch-pline.lsp. Файл должен * быть сохранен в путях поддержки AutoCAD. * Возможный макрос для вызова: ^C^C(if (not "c:pline-str") (load "kpblc-stretch-pline.lsp"));c:pline-str; =============================================================================|; (defun kpblc-stretch-pline (/ break_point _osmode_ selset_oper break_ent break_ent_type) ;; Определения локальных функций ;; Собственно разрыв и дополнительный одновременный _.stretch. ;; Параметры: ;; ent_pline - ссылка на разрываемый объект, аналог (entsel) ;; ent_type - тип объекта: nil -> lwpolyline; t -> line ;; объект обратно в LINE не разбивается (defun _kpblc-break-pline (ent-pline ent-type break-point) (command "_.break" ent_pline break-point break-point) (command "_.pedit" "_M" "_C" break-point break-point "") ;; Здесь определяем по ent_type - чего делать дальше (if ent-type (command "_yes") ) ;_ end of if (command "_join" 0 "") ;; вот этот кусок у меня что-то не получился по-человечески. ;; по идее тут надо делать попытку на получение точки, но у меня не вышло. ;; в результате надо два раза кликать мышой для задания второго положения ;; новой вершины. (if (vl-catch-all-error-p (command "_.stretch" "_C" break-point break-point "" break-point pause)) (command "_.stretch" "_C" break-point break-point "" break-point break-point) (command "_.stretch" "_C" break-point break-point "" break-point pause) ) ;| В принципе, его можно закомментировать, оставив только строку (command "_.stretch" "_C" break-point break-point "" break-point pause) - тогда получим старое поведение функции. |; ) ;_ end of defun ;; Конец определения локальных функций (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) (vla-endundomark *kpblc-activedoc*) (vla-startundomark *kpblc-activedoc*) (setq _osmode_ (getvar "osmode") ) ;_ end of setq (setvar "osmode" 512) (setq break_point (getpoint "\nУкажите точку разрыва : ") selset_oper (ssget break_point) ) ;_ end of setq ;; Теперь проверка на вшивость - в смысле, на правильность выбора ;; Вынесено специально в отдельный setq, а также введена дополнительная ;; локальная переменная определения типа разрываемого объекта (setq break_ent (ssname selset_oper 0) break_ent_type (cdr (assoc 0 (entget break_ent))) ) ;_ end of setq (cond ((= break_ent_type "LWPOLYLINE") (progn (_kpblc-break-pline break_ent nil break_point) ) ;_ end of progn ) ((= break_ent_type "LINE") (_kpblc-break-pline break_ent t break_point) ) (t (alert "Добавить вершину к выбранному примитиву невозможно!")) ) ;_ end of cond (setvar "osmode" _osmode_) (vla-endundomark *kpblc-activedoc*) (princ) ) ;_ end of defun (defun c:pline-str () (kpblc-stretch-pline) ) ;_ end of defun ;;; Конец файла kpblc-stretch-pline.lsp

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

Сообщения с 1 по 25 из 86

Тему читают: 1 гость

Страницы 1 2 3 4 Далее

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Форумы CADUser → Программирование → LISP → Как добавить вершину в полилинию нажатием одной кнопки?

Форум работает на PunBB , при поддержке Informer Technologies, Inc

Редактирование Полилинии

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

Редактирование полилиний выполняется с помощью команды Pedit, которой соответствуют кнопка Edit Polyline (Редактировать полилинию) в инструментальной группе Modify (Редактирование) вкладки Ноте (Главная).

После вызова Pedit в командной строке будет выведен первый запрос Select polyline or [Multiple], в ответ на который необходимо выделить полилинию и нажать Enter. Затем, если выделенный объект является полилинией, система выведет набор параметров, посредством которых выполняется ее редактирование:

Enter an option [Close/Open/Join/Width/Editvertex/Fit/Spline/ Decurve/Ltype gen/Undo]:

Параметры команды следующие:

Магазин курсов студии Vertex

  • Close – замыкает разомкнутую полилинию путем добавления нового сегмента (если последний сегмент полилинии был прямолинейным, то замыкание осуществляется добавлением прямолинейного участка, а если дуговым – для замыкания строится дуговой сегмент);
  • Open – размыкает замкнутую полилинию (если выделена разомкнутая полилиния, то опция меняется на Close);
  • Join – преобразует отрезок или дугу в односегментную полилинию или добавляет к полилинии новые смежные сегменты, которыми могут быть отрезки, дуги и другие двухмерные полилинии (параметр применяется только для разомкнутых полилиний);
  • Width – изменяет ширину всех сегментов полилинии на новое постоянное значение (новое значение толщины вводится с клавиатуры или путем указания двух точек на экране);
  • Edit vertex – переводит полилинию в режим редактирования ее вершин (перемещение, удаление ненужных, добавление новых и т.д.);
  • Fit – преобразует полилинию с помощью дуговых сегментов в кривую, проходящую через вершины полилинии;
  • Spline – аппроксимирует (сглаживает) полилинию в сплайн, который будет проходить только через начальную и конечную точки полилинии;
  • Decurve – отменяет результат, полученный с использованием параметров Fit и Spline;
  • Ltype gen – управляет построением типа линии (используется для сегментов по отдельности или для всей полилинии в целом);
  • Undo – отменяет последнюю операцию, выполненную командой Pedit.

Если вместо ввода имени параметра будет нажата клавиша Enter, команда завершит свою работу. Выбор одной из представленных опций позволяет выполнить одну из возможных операций редактирования. Заслуживающие внимания параметры будут подробно рассмотрены далее.

Содержание

Редактирование вершин полилинии

Опция Edit vertex позволяет редактировать вершины полилинии, а также соседние с ними сегменты. После выбора данной опции AutoCAD выделяет первую вершину полилинии, причем эта вершина обозначится маркером X (рис. 8.31). Порядок следования вершин идентичен той последовательности, в которой эти вершины создавались при построении полилинии. При этом в строке подсказки появляется новый набор параметров:

Enter a vertex editing option [Next/Previous/Break/ Insert/Move/Regen/ Straighten/Tangent/Width/eXit] :

i_454

Параметры команды следующие:

  • Next и Previous – перемещают маркер редактирования соответственно к последующей или к предыдущей вершине полилинии;
  • Break – разбивает полилинию на две части или отсекает одну ее часть путем задания одной или двух точек;
  • Insert – вставляет новую вершину после текущей;
  • Move – переносит текущую вершину на новое место;
  • Regen – перерисовывает (регенерирует) экран;
  • Straighten – выпрямляет сегмент полилинии, расположенный между двумя указанными вершинами (дуговые сегменты и отрезки, находящиеся между указанными точками, удаляются и заменяются одним прямолинейным сегментом);
  • Tangent – задает направление касательной к текущей вершине для выполнения операции Fit;
  • Width – задает ширину полилинии на участке, начинающемся в текущей вершине;
  • eXit – выход из режима редактирования вершин.

Для разбиения полилинии параметром Break указываются одна или две ее вершины. В последнем случае удаляются все сегменты, расположенные между указанными точками. При этом первая вершина задается до ввода параметра Break, а вторая – после. Для выбора второй точки в ответ на вопрос Enter an option [Next/Previous/Go/eXit] необходимо указать параметр Next или Previous такое количество раз, чтобы достичь необходимой вершины. После того как обе точки будут выбраны, в последней строке подсказки вводится параметр Go. Если полилинию необходимо разбить в одной вершине, эту опцию нужно задать сразу после ввода параметра Break. Если же ввести параметр eXit, то выполнение команды прервется.

Для добавления новой вершины используется параметр Insert. Перед тем как перейти к этой опции, нужно переместиться к точке, после которой добавляется новая вершина, и только затем указать Insert. Положение новой вершины задается при помощи мыши или непосредственным вводом координат на вопрос системы Specify location for new vertex.
Если требуется удалить какие-то вершины полилинии, воспользуйтесь параметром Straighten. Запрос, отображаемый после ввода этой опции, аналогичен запросу, следуемому за выбором параметра Break: (Enter an option [Next/Previous/ Go/eXit] ). Опция Straighten выпрямляет полилинию на участке, начиная с текущей вершины и заканчивая той вершиной, в которую можно перейти, перемещаясь по полилинии с помощью параметров Next и Previous. В свою очередь, параметр Go завершает операцию выпрямления.

С помощью параметра Tangent можно определить касательное направление в помеченной маркером редактирования вершине. Указанное направление в дальнейшем будет использоваться при сглаживании кривых. После выбора опции Tangent следует запрос Specify direction of vertex tangent, на который необходимо ввести значение угла или координаты точки, определяющие направление касательной. После того как направление определено, в текущей вершине появляется стрелка (рис. 8.32). Направление будет использовано только в случае последующего вызова операции сглаживания полилинии с помощью параметра Fit.

i_455

Параметр Width позволяет ввести начальную и конечную толщину сегмента полилинии, следующего за выделенной маркером редактирования вершиной. По умолчанию конечная толщина сегмента равна начальной. Для построения сегмента неравномерной толщины следует на вопрос Specify starting (ending) width for next segment ввести ее начальное и конечное значения (рис. 8.33).

Для автоматического построения типа линий используется параметр Ltype gen, позволяющий вычерчивать непрерывную (опция включена) или прерывистую (штрихпунктирную) линию.

Работает эта опция как переключатель системной переменной PLINEGEN (рис. 8.33). Если сегмент полилинии имеет переменную толщину (рис. 8.34), то параметр применить нельзя.

i_456

Сглаживание полилиний кривой

Для сглаживания полилиний предназначены два параметра – Fit и Spline. Параметр Fit строит кривую, которая состоит из дуг окружностей и проходит через все вершины полилинии (рис. 8.35). В свою очередь, параметр Spline также позволяет сгладить прямолинейные сегменты полилинии, но кривая будет при этом проходить только через первую и последнюю ее вершины.

Отметим, что иногда использование параметра Fit не дает желаемого результата. В таком случае можно попробовать ввести дополнительные точки или указать касательное направление в некоторых вершинах посредством параметра Tangent. После обработки полилинии параметром Tangent на ней появляются дополнительные вершины, которые также можно будет использовать для достижения нужного результата.

i_457

При сглаживании параметром Spline кривая лишь вытягивается в направлении вершин полилинии, но не проходит через них (рис. 8.36).

Следует отметить, что для сглаживания можно использовать два вида сплайна: квадратичный или кубический (рис. 8.37), причем кубический сплайн дает наилучшие результаты.

i_458

При сглаживании тип сплайна определяется значениями системных переменных SPLYNETYPE и SURFTYPE. В том случае если SPLYNETYPE=5, тогда формируется квадратичный сплайн; значение SPLYNETYPE=6 использует при сглаживании кубический сплайн. Вместе с тем переменная SURFTYPE определяет поверхность сглаживания. Для построения поверхности Безье этой переменной следует присвоить значение 8. Значение SURFTYPE=5 определяет тип поверхности сглаживания в виде квадратичного сплайна, a SURFTYPE=6 – кубического сплайна.

i_459

Спрямление полилинии

Для спрямления полилинии, предварительно сглаженной параметрами Fit и Spline, используется опция Decurve (рис. 8.38). При этом добавляемые при сглаживании новые вершины удаляются, однако касательные направления, созданные параметром Tangent, сохраняются с целью их повторного использования. Более того, параметр Decurve можно применять для спрямления любой кривой, построенной при помощи параметра Arc команды Pline. Параметр нельзя применить только в том случае, если кривая предварительно была разбита параметром Break.

Глава 3. Редактирование геометрии

Специальное редактирование двумерных полилиний выполняется с помощью команды PEDIT (ПОЛРЕД), которой соответствуют кнопка , входящая в панель инструментов Modify II (Редактирование-2) (рис. 3.43), и пункт падающего меню Modify | Object | Polyline (Редакт Объекты | Полилиния). Мы уже рассматривали эту команду в разд. 2.10 для выполнения операции объединения в полилинию отрезков и дуг.

Рис. 3.43. Панель инструментов Modify II

Рассмотрим другие возможности команды PEDIT (ПОЛРЕД). После выбора полилинии в ответ на запрос Select polyline or [Multiple] : (Укажите полилинию или [Несколько]:) система AutoCAD выдает следующий перечень опций:
Enter an option [Close/Join/Width/Edit vertex/Fit/Spline/Decurve/Ltype gen/Undo]:
(Задайте опцию [Замкнуть/Добавить/Ширина/ Вершина/СГладить/СПлайн/ Убрать сглаживание/Типлин/Отменить]:)
Перечислим опции команды с кратким их описанием:

  • Close (Замкнуть) — замыкает разомкнутую (открытую) полилинию; если же была отмечена замкнутая полилиния, то опция изменится на Open (Разомкнуть);
  • Join (Добавить) — добавляет новые сегменты к полилинии;
  • Width (Ширина) — изменяет ширину всех сегментов полилинии на новое постоянное значение;
  • Edit vertex (Вершина) — переходит в режим редактирования вершин полилинии (перемещение вершин, удаление вершин, добавление вершин, изменение ширины отдельных сегментов и т. д.);
  • Fit (СГладить) — сглаживает полилинию с помощью дуговых сегментов;
  • Spline (СПлайн) — проводит сплайн по специальному уравнению, проходящий через начальную и конечную точки полилинии;
  • Decurve (Убрать сглаживание) — убирает сглаживание, выполненное опциями Fit (СГладить) и Spline (СПлайн);
  • Ltype gen (Типлин) — управляет построением типа линии (для сегментов по отдельности или для всей полилинии в целом);
  • Undo (Отменить) — отменяет последнюю операцию, выполненную в данной команде PEDIT (ПОЛРЕД).

Кроме того, нажатие клавиши (вместо выбора опции) завершает команду PEDIT (ПОЛРЕД).
Опция Close (Замкнуть) замыкает разомкнутую полилинию, добавляя сегмент, идущий из конечной точки в начальную. Если последний сегмент полилинии был прямолинейным, то замыкание выполняется добавлением прямолинейного участка. Если последний сегмент был дуговым, то для замыкания строится дуговой сегмент, касающийся последнего сегмента. На рис. 3.44 приведены примеры замыкания двух полилиний, отличие которых только в типе последнего сегмента: у первой полилинии он прямолинейный, у второй — дуговой. Точками 1 и 2 отмечены участки, добавляемые системой с помощью опции Close (Замкнуть). Для наглядности эти участки выделены штриховой линией.

Рис. 3.44. Варианты замыкания полилинии

Опция Open (Разомкнуть) действует очевидным образом: удаляет последний участок полилинии.
Опция Join (Добавить) преобразует отрезок или дугу в односегментную полилинию или добавляет к полилинии новые смежные сегменты, которыми могут быть отрезки, дуги и другие двумерные полилинии. Разумеется, при этом не должен нарушаться основной принцип полилинии: начальная точка каждого последующего сегмента должна совпадать с конечной точкой предыдущего.
Опция Width (Ширина) изменяет ширину всех сегментов полилинии на новое постоянное значение, которое запрашивается системой. Значения ширины всех сегментов до операции, даже если они были разными, утрачиваются.
Опция Fit (СГладить) сглаживает полилинию с помощью дуговых сегментов, которые касаются друг друга. На рис. 3.45 приведен пример полилинии до сглаживания (состоит из прямолинейных сегментов) и после сглаживания (состоит из дуговых сегментов). Исходные вершины полилинии остаются на старых местах, но к ним могут быть добавлены промежуточные, которые исчезают после ликвидации сглаживания (см. описание опции Decurve (Убрать сглаживание)).

Рис. 3.45. Сглаживание полилинии с помощью опции Fit

На рис. 3.46 приведена та же полилиния, но сглаженная с помощью опции Spline (СПлайн). Видно, что промежуточные вершины новой полилинии не совпадают с вершинами старой полилинии.
Опция Decurve (Убрать сглаживание) убирает сглаживание, выполненное опциями Fit (СГладить) или Spline (СПлайн). Результирующая полилиния состоит только из прямолинейных сегментов. Для несглаженных полилиний данная опция заменяет дуговые сегменты на прямолинейные, сохраняя вершины на старых местах.
Как было уже сказано в разд. 3.1, полилиния может быть представлена в информационном окне команды LIST (СПИСОК) с двумя наименованиями: LWPOLYLINE — компактная полилиния, и POLYLINE — подробная полилиния. Легкая полилиния превратится в подробную, если к ней применить операцию сглаживания с помощью опций Fit (СГладить) и Spline (СПлайн). Подробная полилиния может иметь дополнительные вершины, вычисленные системой AutoCAD, а компактная — не может. При отключении сглаживания подробные полилинии преобразуются в компактные полилинии.

Рис. 3.46. Сглаживание полилинии с помощью опции

Spline Опция Ltype gen (Типлин) управляет отрисовкой полилинии в случае, когда тип линии выбран отличным от сплошной (в AutoCAD этот тип линии называется CONTINUOUS). Опция выдает следующий запрос:
Enter polyline linetype generation option [ON/OFF] : (Генерация типа линии по всей полилинии [Вкл/Откл] 🙂
В этот момент можно включить режим генерации типа линии по всей полилинии (по умолчанию он выключен, что ускоряет расчет). На рис. 3.47 приведен пример полилинии с типом линии DASHED (штриховая) при Ltype gen=OFF (Типлин=Откл), а на рис. 3.48 — при Ltype gen=ON (Типлин=Вкл).
На рис. 3.48 Ltype gen=OFF (Типлин=Откл) и тип линии, состоящий из штрихов и пропусков заданных размеров, применен к каждому сегменту отдельно. Поэтому при недостаточной длине (не хватает длины, чтобы начать второй штрих после пропуска) на сегменте вообще не образуются штрихи, как произошло со вторым, третьим и восьмым сегментами. При Ltype gen=ON (Типлин=Вкл), как на рис. 3.48, длины штрихов откладываются, начиная с самой первой вершины полилинии, по всей полилинии в целом, поэтому штрихи присутствуют на всех сегментах. Недостатком второго режима является то, что пропуск между штрихами может попасть на вершину.

Рис. 3.47. Полилиния при Ltype gen=OFF

Самая сложная опция — Edit vertex (Вершина), которая вызывает режим работы с вершинами полилинии, что дает возможность изменять положение вершин, удалять их, добавлять, а также менять ширину конкретного сегмента и разрывать полилинию на части. После выбора данной опции система AutoCAD выдает запрос:
Enter a vertex editing option [Next/Previous/Break/ lnsert/Move/Regen/Straighten/Tangent/Width/eXit] :
Задайте опцию редактирования вершины
След/Пред/РАзорвать/ВСтавитъ/ПЕренести/ РЕген/ВЫпрямитъ/Касателъная/ Шкрина/выХод] 🙂
При этом в первой вершине полилинии появляется знак х (рис. 3.49), что означает отметку текущей вершины, к которой будут относиться последующие операции редактирования. Порядок следования вершин идентичен той последовательности, с которой эти вершины создавались при построении полилинии.

Рис. 3.48. Полилиния при Ltype gen=ON

Рис. 3.49. Режим редактирования вершин полилинии

В данном режиме доступны такие опции:

  • Next (След) — перейти на следующую вершину;
  • Previous (Пред) — перейти на предыдущую вершину;
  • Break (РАзорвать) — разорвать полилинию, начиная с текущей вершины;
  • Insert (ВСтавить) — вставить новую вершину после текущей;
  • Move (ПЕренести) — перенести текущую вершину на новое место;
  • Regen (РЕген) — регенерировать (перерисовать) полилинию с текущими установками;
  • Straighten (ВЫпрямить) — выпрямить полилинию на участке, начиная с текущей вершины (удаление соседних вершин);
  • Tangent (Касательная) — задать направление касательной к текущей вершине для будущей операции Fit (СГладить);
  • Width (Ширина) — задать ширину полилинии на участке, начинающемся в текущей вершине;
  • eXit (выХод) — выход из режима редактирования вершин и возврат к запросу: Enter an option [Close/Join/Width/Edil vertex/Fit/Spline/Decurve/Ltype gen/Undo]: (Задайте опцию [Замкнуть/Добавить/Ширина/Вершина/СГладить/СПлайн/ Убрать сглаживание/Типлин/Отменить]:).

Опции Next (След) и Previous (Пред) дают возможность перемещаться между вершинами полилинии, чтобы добраться до той вершины, которую надо редактировать.
Опция Break (РАзорвать) предназначена для разрыва полилинии. Начало разрыва — в текущей вершине, а окончание разрыва нужно указать в ответ на запрос:
Enter an option [Next/Previous/Go/eXit] : (Задайте опцию [След/Пред/Выполнить/выХод] 🙂
Если разрыв нужно выполнить в текущей вершине (после этого полилиния разделится на две полилинии, имеющие общую точку в месте разрыва), то следует воспользоваться опцией Go (Выполнить). При этом все сегменты исходной полилинии сохраняются, оказываясь в составе одной из двух новых полилиний.
Если разрыв нужно начать в текущей вершине, а закончить в другой, расположенной дальше или ближе текущей (и тем самым в результате разрыва удалить участки между текущей и другой вершиной), то необходимо в режиме Break (Разорвать) сначала с помощью опций Next (След) и Previous (Пред) перейти на ту вершину, в которой разрыв будет закончен, и затем только воспользоваться опцией Go (Выполнить). Если режим редактирования вершин больше не нужен, то выйти из него с помощью опции eXit (выХод).
На рис. 3.50 в левой части изображена полилиния до разрыва, а в правой части — после разрыва, с удалением одного сегмента.

Рис. 3.50. Разрыв полилинии

Для добавления в полилинию новой вершины нужно воспользоваться опцией Insert (ВСтавить). Перед тем как перейти к этой опции, нужно переместиться к вершине, после которой добавляется новая вершина. Затем с помощью клавиатуры ввести опцию Insert (ВСтавить). Система AutoCAD запрашивает:
Specify location for new vertex: (Положение новой вершины:)
Вы указываете положение новой вершины, вставляемой после текущей. На рис. 3.51 слева показан момент указания положения новой вершины, вставляемой между четвертой и пятой вершинами, а справа — результат операции вставки.
Нельзя с помощью этой опции вставить вершину перед первой вершиной полилинии.
Опция Move (ПЕренести) используется, когда текущую вершину нужно перенести на новое место. При использовании опции выдается запрос:
Specify new location for marked vertex: (Новое положение помеченной вершины:)
Вы указываете новое положение текущей вершины (рис. 3.52). Справа на рисунке показан результат переноса вершины на новое место.

Рис. 3.51. Добавление новой вершины в полилинию

Рис. 3.52. Перенос вершины полилинии

Опция Regen (РЕген) позволяет, не выходя из команды PEDIT (ПОЛРЕД), перечертить (регенерировать) полилинию с текущими изменениями.
Если надо удалить какие-то вершины из полилинии, то следует воспользоваться опцией Straighten (ВЫпрямить). Запрос, выдаваемый этой опцией, аналогичен запросу опции Break (РАзорвать): Enter an option [Next/Previous/Go/eXit] : (Задайте опцию [След/Пред/Выполнить/выХод] :). Опция выпрямляет полилинию на участке, начиная с текущей вершины и заканчивая вершиной, в которую можно перейти, перемещаясь по полилинии с помощью опции Next (След) и Previous (Пред). Опция Go (Выполнить) завершает операцию выпрямления. На рис. 3.53 в левой части изображена полилиния до выпрямления, а в правой части — после выпрямления, с удалением четырех вершин.

Рис. 3.53. Выпрямление полилинии

Опция Tangent (Касательная) дает возможность задать направление касательной на вершинах полилинии для будущей операции Fit (СГладить), что позволяет воздействовать на форму линии, получаемой после сглаживания. После выбора опции Tangent (Касательная) следует запрос:
Specify direction of vertex tangent: (Направление касательной в вершине:)
Направление задается углом в градусах или точкой. После задания на текущей вершине появляется стрелка с указанным направлением (см. вершину полилинии в левой части рис. 3.54). Направление будет использовано только тогда, когда вы в дальнейшем выполните операцию сглаживания полилинии с помощью опции Fit (СГладить). В правой нижней части рис. 3.54 показан результат сглаживания, выполненного с учетом направления касательной в указанной ранее вершине. Для сравнения в правой верхней части рисунка приведена аналогичная полилиния, которая была сглажена без задания направления касательной.

Рис. 3.54. Направление касательной в вершине полилинии

Опция Width (Ширина) управляет шириной полилинии на участке, начинающемся в текущей вершине. Первый запрос:
Specify starting width for next segment: (Начальная ширина следующего сегмента:)
Нужно задать начальную ширину (обычно вводом с клавиатуры). Если вы в этот момент мышью укажете точку, то AutoCAD запросит вторую точку, а расстояние между точками возьмет в качестве значения ширины (если указание мышью произошло по недоразумению, то это может привести к непредсказуемому изменению ширины полилинии). Далее:
Specify ending width for next segment : (Конечная ширина следующего сегмента 🙂
В угловых скобках по умолчанию предлагается значение, выбранное в качестве начальной ширины сегмента (в нашем примере — 0.0000). После ввода второй ширины регенерируется текущий сегмент полилинии с новой шириной.
Опция eXit (выХод) завершает режим редактирования вершин и возвращает запрос Enter an option [Next/’Previous/’Go/’eXitJ : (Задайте опцию [СледУ Пред/’Выполнить/’выХод] :).
Опция Multiple (Несколько), которая появилась еще в системе AutoCAD 20001, доступна пользователю в самом первом запросе о выборе редактируемой полилинии и дает возможность выбрать сразу несколько полилиний для того, чтобы над ними выполнить однотипные операции (например, замкнуть или изменить глобальную ширину). Следует иметь в виду, что при таком выборе полилиний недоступна опция Edit vertex (Вершина).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *