О! Спасибо, совсем забыл - в самом начале, перед (if *kpblc-activedoc*... надо поставить (vl-load-com).
И вот еще - один момент пропустил: после :
(if (or (= pluslen nil) (<= pluslen 0))
(setq pluslen 2.5)
);_if
Надо поставить
(setq pluslen (* pluslen draw_scale))
===
Весь код:
;|=======================================================================================
* Удлиняет отрезок на заданную величину. Для масштаба читаются значения celtscale,
* ltscale, hpscale, hpspace, dimscale и выбирается максимальная из них. Для пространства
* листа принимается масштаб = 1 невзирая на значения этих переменных.
* Обрабатываются только отрезки, для остального программа завершается.
* Параметры :
* pluslen - величина увеличения отрезка. Для nil и <=0 принимается 2.5
* Примеры вызова:
(kpblc-extlen 3)
(kpblc-extlen nil)
=======================================================================================|;
(defun kpblc-extlen(pluslen
/
_cmdecho_
_osmode_
ent_line
draw_scale
ent_start_orig
ent_end_orig
)
(vl-load-com)
(if (not *kpblc-activedoc*)
(setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
);_if
(vla-startundomark *kpblc-activedoc*)
(setq _cmdecho_ (getvar "cmdecho")
_osmode_ (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 512)
(if (= (getvar "tilemode") 0)
(setq draw_scale 1) ;Для пространства листа
(setq draw_scale (max (getvar "dimscale")
(getvar "hpscale")
(getvar "ltscale")
(getvar "celtscale")
(getvar "hpspace")
);_max
);_setq - для пространства модели
);_if
(if (or (= pluslen nil) (<= pluslen 0))
(setq pluslen 2.5)
);_if
(setq pluslen (* pluslen draw_scale))
(setq ent_line (entsel "\nВыберите удлиняемый отрезок : "))
(if (/= (cdr (assoc 0 (entget(car ent_line)))) "LINE")
(alert "Обрабатываются только отрезки! Для остального мозгов не хватат.")
(progn
(setq ent_start_orig (cdr (assoc 10 (entget(car ent_line))))
ent_end_orig (cdr (assoc 11 (entget(car ent_line))))
);_setq
(command "_.Lengthen" "_Delta" pluslen ent_start_orig ent_end_orig "")
);_progn
);_if
(setvar "cmdecho" _cmdecho_)
(setvar "osmode" _osmode_)
(vla-endundomark *kpblc-activedoc*)
);_defun
===
А запускать как обычный лисп, тут ничего сверхъестественного нет. vla-функции используются только для организации меток отмены команды. Я настолько привык это делать, что уже и не замечаю ;)
Примеры вызовов указаны в начале.
*kpblc-activedoc* - глобальная переменная, указатель на текущий документ.
А что с мозгами? Отдых на рабочем месте - самое то! Еще и деньги платят ;)
На всякий случай попробую разобрать прогу по шагам - поскольку перед глазами есть пример.
Сначала идет все описание функции как таковой с указанием параметров и примеров вызова. (находится между ";|" и "|;")
Потом - собственно объявление фукнции. Для удобства чтения разделитель параметров вызова и внутренних переменных вынесен в отдельную строку (/).
(if (not *kpblc-activedoc*)
(setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
);_if
Проверка на наличие уже объявленного указателя на текущий документ. Если его нет (т.е. = Nil), то выполняется его "заполнение" - (vla-get-activedocument...)
Затем заполняются локальные переменные текущих значений cmdecho и osmode:
(setq _cmdecho_ (getvar "cmdecho")
_osmode_ (getvar "osmode"))
На самом деле здесь это не особо требуется - выделение все равно идет только отрезка и только одного.
Потом идет проверка текущего пространства:
(if (= (getvar "tilemode") 0) <...>
Если tilemode = 0, то работа выполняется в пространстве листа. Следовательно, масштаб устанавливается в 1. Для пространства модели масштаб читается из заявленных системных переменных. Если известно, что некоторые программы хранят масштабы в других местах, здесб надо будет менять строки
(setq draw_scale (max (getvar "dimscale")
(getvar "hpscale")
(getvar "ltscale")
(getvar "celtscale")
(getvar "hpspace")
);_max
на чтение масштаба из других мест.
А дальше все совсем просто - через (entsel) получаем объект, потом проверяем его тип через (assoc 0...) - он должен быть "LINE", т.к. для "LWPOLYLINE", например, алгоритм не так очевиден.
Затем для выбранного отрезка получаем начальную и конечную точки и для него выполняем команду "_.Lengthen" с указанием дельты (приращения), объекта (выбранного) и точек (начальной и конечной).
Потом возвращаем обратно значения системных переменных osmode и cmdecho.
Если не очень объяснил - напиши, попробую получше. Но не гарантирую.