Ну ладно. В общем, тут несколько моментов сделано:
;|=============================================================================
* Функция разрыва полилинии и одновременной передвижки новой вершины.
* Полилиния не меняет следующих свойств: цвет, слой, тип.
* Ограничения:
* 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
Обратите внимание, что сейчас если не указывать вторую точку новой вершины, то все нормально. А вот если указывать, то надо два раза щелкать мышой. Сделал на всякий случай и так, как получилось. Если у кого-то выйдет лучше, будет совсем замечательно.