Re: Автоматизация группового изменения масштаба
Макрос, поставленный на Tool Palettes, позволяет изменить себя за секунду-другую. И меня много подобных макросов с оперативным вмешательством
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Приемы работы → Общие вопросы проектирования → Автоматизация группового изменения масштаба
Макрос, поставленный на Tool Palettes, позволяет изменить себя за секунду-другую. И меня много подобных макросов с оперативным вмешательством
У нас Tool Palettes вообще не пользуются
В 2004 доступ к макросу для редактирования столь-же легок и быстр, как в новых автокадах в палеты. Хочу получить от тебя ответ типа НЕ ХОЧУ МАКРОС, ХОЧУ ЛИСП. Иначе твое упрямство не понятно
> Vova
А с самого начала не понятно было, да?
Лень - великий двигатель прогресса!
Не хочу лазить в кишках макроса за каждым изменением одной цифИри, это всё лишние телодвижения.
А упрямство - это у вас, мужиков, особенно у шефов, а у блондинок - настойчивость, непонятливый Вы наш.
Развели бодягу на 30 постов вместо чтоб накатать пять строчек кода.
(Ффууу, выговорилась, вылила на мужиков все, что думаю, полегче стало... Чем же заняться? Подкрашу-ка ногти, а то настроение ниже плинтуса...)
:)
А упрямство — это у вас, мужиков
Это я упрямо хочу приучить тебя к хорошему. Имей в виду, лисп надо загружать, если операции не частые, то подгружать при необходимости если частые-навсегда. И все равно в ком строке писать коэф. Потом щелкать правой кнопкой. Для такого пустяка макрос разумней
Да я бы рада щелкать правой кнопкой! Да только ком строка все равно каждый раз требует ручного ввода коэффициента: Specify scale factor or [Reference]:
А "не часто" или "навсегда", так я это и делаю с разными лиспами.
> Малявка
Может здесь что-нибудь подойдет
Нужен ЛИСП по масштабированию
> VVA
Ой, это еще более неудобно. Мне надо-то всего - нажать кнопочку, указать коэффициент, а потом выделять примитивы рамками или перекрестием и указывать базу масштабирования. Выделять и указывать, выделять и указывать...
Выделять и указывать, выделять и указывать...
Вот такая программулька получилась (defun C:MSCALE ( / ss msht pt ) (initget 7) (setq msht (getdist "\nУкажите масштабный коэффициент: ")) (princ "\nДля выхода нажмите ESC") (while t (if (and (setq ss (ssget "_:S")) (not (initget 1)) (setq pt (getpoint "\nБазовая точка для масштабирования: ")) ) (command "_.SCALE" ss "" "_non" pt msht) ) (princ "\nДля выхода нажмите ESC") ) )
Текст
Вот такая программулька получилась
Попал в код случайно. Его копировать не нужно
Еще один вариант:
(defun c:mscale (/ *error* adoc selset _kpblc-conv-selset-to-ename lst-getboundingbox scale center lst ) (defun *error* (msg) (vla-endundomark adoc) (princ msg) (princ) ) ;_ end of defun (defun _kpblc-conv-selset-to-ename (selset) ;| * Функция преобразования набора, полученного через (ssget), в список * ename-примитивов. * Параметры вызова: * selset набор примитивов * Примеры вызова: (_kpblc-conv-selset-to-ename (ssget)) |; (if selset (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))) ) ;_ end of if ) ;_ end of defun ;; https://www.caduser.ru/forum/topic22552.html (defun lst-getboundingbox (lst) (vl-load-com) (if (and lst (listp lst)) ((lambda (x) (list (apply (function mapcar) (cons (function min) (mapcar (function car) x)) ) ;_ apply (apply (function mapcar) (cons (function max) (mapcar (function cadr) x)) ) ;_ apply ) ;_ list ) ;_ lambda (vl-remove-if (function null) (mapcar (function (lambda (x / minp maxp) (if (not (vl-catch-all-error-p (vl-catch-all-apply (function vla-getboundingbox) (list x 'minp 'maxp) ) ;_ vl-catch-all-apply ) ;_ vl-catch-all-error-p ) ;_ not (list (vlax-safearray->list minp) (vlax-safearray->list maxp) ) ;_ list ) ;_ if ) ;_ lambda ) ;_ function lst ) ;_ mapcar ) ;_ vl-remove-if ) ) ;_ if ) ;_ end of defun (if (= (type (setq scale (vl-catch-all-apply '(lambda () (cond ((getdist (strcat "\nМасштабный коэффициент <" (vl-princ-to-string (cond (*scale*) (t 1.) ) ;_ end of cond ) ;_ end of vl-princ-to-string "> : " ) ;_ end of strcat ) ;_ end of getdist ) (t (cond (*scale*) (t 1.) ) ;_ end of cond ) ) ;_ end of cond ) ;_ end of lambda ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'real ) ;_ end of = (progn (setq *scale* scale adoc (vla-get-activedocument (vlax-get-acad-object)) ) ;_ end of setq (while (setq selset (ssget "_:L")) (vla-startundomark adoc) (setq lst (lst-getboundingbox (setq selset (mapcar 'vlax-ename->vla-object (_kpblc-conv-selset-to-ename selset) ) ;_ end of mapcar ) ;_ end of setq ) ;_ end of lst-getboundingbox center (mapcar '(lambda (a b) (* (+ a b) 0.5) ) ;_ end of lambda (car lst) (last lst) ) ;_ end of mapcar ) ;_ end of setq (foreach sub selset (vla-scaleentity sub (vlax-3d-point center) scale) ) ;_ end of foreach (vla-endundomark adoc) ) ;_ end of while ) ;_ end of progn ) ;_ end of if ) ;_ end of defun
Черт, форматирование слетело. Попробуем еще раз:
(defun c:mscale (/ *error* adoc selset _kpblc-conv-selset-to-ename lst-getboundingbox scale center lst ) (defun *error* (msg) (vla-endundomark adoc) (princ msg) (princ) ) ;_ end of defun (defun _kpblc-conv-selset-to-ename (selset) ;| * Функция преобразования набора, полученного через (ssget), в список * ename-примитивов. * Параметры вызова: * selset набор примитивов * Примеры вызова: (_kpblc-conv-selset-to-ename (ssget)) |; (if selset (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))) ) ;_ end of if ) ;_ end of defun ;; https://www.caduser.ru/forum/topic22552.html (defun lst-getboundingbox (lst) (vl-load-com) (if (and lst (listp lst)) ((lambda (x) (list (apply (function mapcar) (cons (function min) (mapcar (function car) x)) ) ;_ apply (apply (function mapcar) (cons (function max) (mapcar (function cadr) x)) ) ;_ apply ) ;_ list ) ;_ lambda (vl-remove-if (function null) (mapcar (function (lambda (x / minp maxp) (if (not (vl-catch-all-error-p (vl-catch-all-apply (function vla-getboundingbox) (list x 'minp 'maxp) ) ;_ vl-catch-all-apply ) ;_ vl-catch-all-error-p ) ;_ not (list (vlax-safearray->list minp) (vlax-safearray->list maxp) ) ;_ list ) ;_ if ) ;_ lambda ) ;_ function lst ) ;_ mapcar ) ;_ vl-remove-if ) ) ;_ if ) ;_ end of defun (if (= (type (setq scale (vl-catch-all-apply '(lambda () (cond ((getdist (strcat "\nМасштабный коэффициент <" (vl-princ-to-string (cond (*scale*) (t 1.) ) ;_ end of cond ) ;_ end of vl-princ-to-string "> : " ) ;_ end of strcat ) ;_ end of getdist ) (t (cond (*scale*) (t 1.) ) ;_ end of cond ) ) ;_ end of cond ) ;_ end of lambda ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'real ) ;_ end of = (progn (setq *scale* scale adoc (vla-get-activedocument (vlax-get-acad-object)) ) ;_ end of setq (while (setq selset (ssget "_:L")) (vla-startundomark adoc) (setq lst (lst-getboundingbox (setq selset (mapcar 'vlax-ename->vla-object (_kpblc-conv-selset-to-ename selset) ) ;_ end of mapcar ) ;_ end of setq ) ;_ end of lst-getboundingbox center (mapcar '(lambda (a b) (* (+ a b) 0.5) ) ;_ end of lambda (car lst) (last lst) ) ;_ end of mapcar ) ;_ end of setq (foreach sub selset (vla-scaleentity sub (vlax-3d-point center) scale) ) ;_ end of foreach (vla-endundomark adoc) ) ;_ end of while ) ;_ end of progn ) ;_ end of if ) ;_ end of defun
Черт, совсем забыл. В самом начале надо добавить (vl-load-com)...
Это сгодится? *^C^C_Scale;\\;\2 увеличивает в 2 раза. На что заменишь двойку, таков будет новый коэффициент.
А мона так? *^C^C_Scale;\\;\(getvar "USERR1")
Тока за 2-ой кнопкой закрепить^C^CUSERR1
Можно. Масштаб хочешь установить на Userr1? Программисты поругивают применение User.. так как его может изменить другая прога, также его применяющая
> Vova
Не поругивают, а не рекомендуют :)
Следовательно, только очень старые проги могут применить User... Можно идти по второму кругу и опять его использовать
или так
*^C^C_Scale;\\;\MyScale
а за 2-ой кнопкой закрепить^C^C(setq MyScale (getreal "\nШо? Опять? Ну давай, давай : "))
В общем, ясно. Код писался зря.
А что ты хочешь изменять Scalе-ом (брунетка (2008-07-09 15:38:22), какие объекты масштабировать?
> Vova
А что ты хочешь изменять Scalе-ом
Все, что плохо читается в перенасыщеном чертеже (чтоб уменьшить и не налазило друг на друга)
А user, то есть я, буду пользоваться етим средством.
Форумы CADUser → Приемы работы → Общие вопросы проектирования → Автоматизация группового изменения масштаба
Форум работает на PunBB, при поддержке Informer Technologies, Inc