Re: AutoCAD 2004. Как сгруппировать объекты?
> Guslav
Запускать как (psw "+") или (psw "-") соответственно - именно так, в скобках.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Autodesk → AutoCAD → AutoCAD 2004. Как сгруппировать объекты?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
> Guslav
Запускать как (psw "+") или (psw "-") соответственно - именно так, в скобках.
2 kpbls
Спасибо, получилось.
Ну в общем вот что получилось:
;|============================================================================= * Функция группировки и разгруппировки. * Параметры вызова: * grouping nil -> разгруппировать. t -> группировать * Примеры вызова: (kpblc-univ-grouping t) ;группировать выбранные объекты в безымянную группу (kpblc-univ-grouping nil) ;разгруппировать объекты. Удалить запись о группе =============================================================================|; (defun kpblc-univ-grouping (grouping / selset _cmdecho_ _nomutt_ done error_catch item counter group sub_item ) (defun error_catch (msg) (if _cmdecho_ (setvar "cmdecho" _cmdecho_) ) ;_ end of if (if _nomutt_ (setvar "nomutt" _nomutt_) ) ;_ end of if (vla-EndUndoMark *KPBLC-ACTIVEDOC*) (princ msg) ) ;_ end of defun (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-startundomark *kpblc-activedoc*) (setq *error* error_catch counter 0 _cmdecho_ (getvar "cmdecho") _nomutt_ (getvar "nomutt") ) ;_ end of setq (mapcar 'setvar '("cmdecho" "nomutt") '(0 1)) (princ "\nУкажите объекты") (if (not (setq selset (ssget "_I"))) (setq selset (ssget)) ) ;_ end of if (while (and selset (setq item (ssname selset counter))) (setq counter (1+ counter)) (if (and (assoc 330 (entget item)) (setq group (cdr (assoc 330 (entget item)))) (eq (cdr (assoc 0 (entget group))) "GROUP") ) ;_ end of and (progn ;; Засовываем в selset объекты, принадлежащие группе (setq group (vlax-ename->vla-object group)) (vlax-for sub_item (vla-item (vla-get-groups *kpblc-activedoc*) (vla-get-name group) ) ;_ end of vla-item (ssadd (vlax-vla-object->ename sub_item) selset) ) ;_ end of vlax-for (entdel (vlax-vla-object->ename group)) ;Удаление записи о группе ) ;_ end of progn ) ;_ end of if ) ;_ end of while ;; Теперь собственно [раз]группировка выбранных объектов. (if grouping (if (vl-cmdf "_.-group" "_create" "*" "" selset "") (princ "\nОбъекты успешно добавлены в группу") (princ "\nОшибка добавления объектов") ) ;_ end of if ) ;_ end of if (mapcar 'setvar '("cmdecho" "nomutt") (list _cmdecho_ _nomutt_)) (princ) ) ;_ end of defun
Проверено на AutoCAD 2005 Eng, ADT 2005 Eng, пространство модели, мировая система координат. Если что - сообщайте. Вариант с запросом:
;|============================================================================= * Функция группировки и разгруппировки. * Параметры вызова: * grouping nil -> разгруппировать. t -> группировать * Примеры вызова: (kpblc-univ-grouping-quest) =============================================================================|; (defun kpblc-univ-grouping-quest ( / selset _cmdecho_ _nomutt_ done error_catch item counter group sub_item _answer_ ) (defun error_catch (msg) (if _cmdecho_ (setvar "cmdecho" _cmdecho_) ) ;_ end of if (if _nomutt_ (setvar "nomutt" _nomutt_) ) ;_ end of if (vla-EndUndoMark *KPBLC-ACTIVEDOC*) (princ msg) ) ;_ end of defun (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-startundomark *kpblc-activedoc*) (setq *error* error_catch counter 0 _cmdecho_ (getvar "cmdecho") _nomutt_ (getvar "nomutt") ) ;_ end of setq ;;(mapcar 'setvar '("cmdecho" "nomutt") '(0 1)) (princ "\nУкажите объекты") (if (not (setq selset (ssget "_I"))) (setq selset (ssget)) ) ;_ end of if (while (and selset (setq item (ssname selset counter))) (setq counter (1+ counter)) (if (and (assoc 330 (entget item)) (setq group (cdr (assoc 330 (entget item)))) (eq (cdr (assoc 0 (entget group))) "GROUP") ) ;_ end of and (progn ;; Засовываем в selset объекты, принадлежащие группе (setq group (vlax-ename->vla-object group)) (vlax-for sub_item (vla-item (vla-get-groups *kpblc-activedoc*) (vla-get-name group) ) ;_ end of vla-item (ssadd (vlax-vla-object->ename sub_item) selset) ) ;_ end of vlax-for (entdel (vlax-vla-object->ename group)) ;Удаление записи о группе ) ;_ end of progn ) ;_ end of if ) ;_ end of while ;; Теперь собственно [раз]группировка выбранных объектов. (initget "Да Нет Yes No _ Yes No Yes No") (setq _answer_ (getkword "\nВыполнять группировку объектов [Да/Нет] <Да> : ")) (if (not _answer_) (setq _answer_ "Yes")) (if (= (strcase (substr _answer_ 1 1) t) "y") (if (vl-cmdf "_.-group" "_create" "*" "" selset "") (princ "\nОбъекты успешно добавлены в группу") (princ "\nОшибка добавления объектов") ) ;_ end of if ) ;_ end of if ;;(mapcar 'setvar '("cmdecho" "nomutt") (list _cmdecho_ _nomutt_)) (princ) ) ;_ end of defun
Старею, старею... Склероз, однако.
Благодарность за предоставленную информацию и код (https://www.caduser.ru/forum/topic20923.html) AY, {Smirnoff}, Александр Ривилис
> kpblc
Отлично работает kpblc, мой тебе respect.
Можно мои замечания?
Лично мне не удобно пользоваться такими громоздкими командами, как (kpblc-univ-grouping t), (kpblc-univ-grouping nil). Это кнопарь надо делать, а я отношу себя к лагерю "клавишников" При всем уважении к автору, можно их упростить, ну вбил пару символов, что поближе друг к другу и все. Там gg, q1,q2.... Плиз
Да бога ради. Либо заменить имя функции (которое идет после слова (defun), либо (второй вариант мне больше нравится) сделать такое:
(defun c:gr() (kpblc-univ-grouping-quest) )
Это для варианта "с запросом". Или
(defun c:grg() (kpblc-univ-grouping t) )
Для группировки и
(defun c:ung() (kpblc-univ-grouping nil) )
для 2 разных кнопок
> kpblc
Может, вставишь строки в программку, я не силен в програмировании.
Великолепно!!!!
Хотя есть один неприятный, на мой взгляд, момент - нет визуального подтверждения команды разгруппировать. Т.е. после выполнения команды группировать выделение с объектов группировки снимается, и мы видим, команда выполнена, при разгруппировке выделенная группа остается выделенной, и не понятно сработала команда или нет. Приходится совершать лишние движения, чтобы убедится что сработала. :(
Великолепно!!!!
Хотя есть один неприятный, на мой взгляд, момент - нет визуального подтверждения команды разгруппировать. Т.е. после выполнения команды группировать выделение с объектов группировки снимается, и мы видим, команда выполнена, при разгруппировке выделенная группа остается выделенной, и не понятно сработала команда или нет. Приходится совершать лишние движения, чтобы убедится что сработала. :(
P.S.Может быть для полной ясности заменить в варианте с запросом Да Нет на Группировать (Group) Разгруппировать (UnGroup)
> kpblc
А говоришь, что не программист. Прибедняешься слегка.:)
kpblc Пожалуйста, помоги с кодом
> ASYS
Черт, про тему совсем забыл :( Сорри, посыпаю голову пеплом. По ходу дела несколько поменял код - снес неиспользуемые переменные и поставил метку отмены.
Вариант с запросом в ком.строке / выпадающем меню
;|============================================================================= * Функция группировки и разгруппировки. * Параметры вызова: * нет * Примеры вызова: (kpblc-univ-grouping-quest) =============================================================================|; (defun kpblc-univ-grouping-quest (/ selset error_catch item counter group sub_item _answer_ ) ;; Локальные функции (defun error_catch (msg) (vla-endundomark *kpblc-activedoc*) (princ msg) ) ;_ end of defun ;; Конец локальных функций (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-startundomark *kpblc-activedoc*) (setq *error* error_catch counter 0 _cmdecho_ (getvar "cmdecho") _nomutt_ (getvar "nomutt") ) ;_ end of setq (princ "\nУкажите объекты") (if (not (setq selset (ssget "_I"))) (setq selset (ssget)) ) ;_ end of if (while (and selset (setq item (ssname selset counter))) (setq counter (1+ counter)) (if (and (assoc 330 (entget item)) (setq group (cdr (assoc 330 (entget item)))) (eq (cdr (assoc 0 (entget group))) "GROUP") ) ;_ end of and (progn ;; Засовываем в selset объекты, принадлежащие группе (setq group (vlax-ename->vla-object group)) (vlax-for sub_item (vla-item (vla-get-groups *kpblc-activedoc*) (vla-get-name group) ) ;_ end of vla-item (ssadd (vlax-vla-object->ename sub_item) selset) ) ;_ end of vlax-for (entdel (vlax-vla-object->ename group)) ;Удаление записи о группе ) ;_ end of progn ) ;_ end of if ) ;_ end of while ;; Теперь собственно [раз]группировка выбранных объектов. (initget "Да Нет Yes No _ Yes No Yes No") (setq _answer_ (getkword "\nВыполнять группировку объектов [Да/Нет] <Да> : ")) (if (not _answer_) (setq _answer_ "Yes") ) ;_ end of if (if (= (strcase (substr _answer_ 1 1) t) "y") (if (vl-cmdf "_.-group" "_create" "*" "" selset "") (princ "\nОбъекты успешно добавлены в группу") (princ "\nОшибка добавления объектов") ) ;_ end of if ) ;_ end of if (sssetfirst nil nil) (vla-endundomark *kpblc-activedoc*) (princ) ) ;_ end of defun ;|============================================================================= * Сервисная функция. Служит для вызова основной функции с командной строки. * Параметры вызова: * нет и быть не может * Примеры вызова: (c:gr) ; из lisp-функций gr ; с командной строки =============================================================================|; (defun c:gr () (kpblc-univ-grouping-quest) ) ;_ end of defun
И вариант для 2 разных кнопок:
;|============================================================================= * Функция группировки и разгруппировки. * Параметры вызова: * grouping nil -> разгруппировать. t -> группировать * Примеры вызова: (kpblc-univ-grouping t) ;группировать выбранные объекты в безымянную группу (kpblc-univ-grouping nil) ;разгруппировать объекты. Удалить запись о группе =============================================================================|; (defun kpblc-univ-grouping (grouping / selset error_catch item counter group sub_item ) ;; Локальные функции (defun error_catch (msg) (vla-endundomark *kpblc-activedoc*) (princ msg) ) ;_ end of defun ;; Конец локальных функций (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-startundomark *kpblc-activedoc*) (setq *error* error_catch counter 0 ) ;_ end of setq (princ "\nУкажите объекты") (if (not (setq selset (ssget "_I"))) (setq selset (ssget)) ) ;_ end of if (while (and selset (setq item (ssname selset counter))) (setq counter (1+ counter)) (if (and (assoc 330 (entget item)) (setq group (cdr (assoc 330 (entget item)))) (eq (cdr (assoc 0 (entget group))) "GROUP") ) ;_ end of and (progn ;; Засовываем в selset объекты, принадлежащие группе (setq group (vlax-ename->vla-object group)) (vlax-for sub_item (vla-item (vla-get-groups *kpblc-activedoc*) (vla-get-name group) ) ;_ end of vla-item (ssadd (vlax-vla-object->ename sub_item) selset) ) ;_ end of vlax-for (entdel (vlax-vla-object->ename group)) ;Удаление записи о группе ) ;_ end of progn ) ;_ end of if ) ;_ end of while ;; Теперь собственно [раз]группировка выбранных объектов. (if grouping (if (vl-cmdf "_.-group" "_create" "*" "" selset "") (princ "\nОбъекты успешно добавлены в группу") (princ "\nОшибка добавления объектов") ) ;_ end of if ) ;_ end of if (sssetfirst nil nil) (vla-endundomark *kpblc-activedoc*) (princ) ) ;_ end of defun ;|============================================================================= * Сервисная функция. Служит для вызова основной функции с командной строки. * Выполняет группировку объектов. Лично у меня именно этот вариант большей * популярностью пользуется. * Параметры вызова: * нет и быть не может * Примеры вызова: (c:grp) ; из lisp-функций grp ; с командной строки =============================================================================|; (defun c:grp () (kpblc-univ-grouping t) ) ;_ end of defun ;|============================================================================= * Сервисная функция. Служит для вызова основной функции с командной строки. * Выполняет группировку объектов. Лично у меня именно этот вариант большей * популярностью пользуется. * Параметры вызова: * нет и быть не может * Примеры вызова: (c:ung) ; из lisp-функций ung ; с командной строки =============================================================================|; (defun c:ung () (kpblc-univ-grouping nil) ) ;_ end of defun
Проверьте работоспособность.
> kpblc
Все отлично работает!! Вери биг санкс
Ещё одно спасибо, думаю, не будет лишним.
> ASYS
> Nino
Полный и окончательный код лежит на https://www.caduser.ru/forum/topic22819.html
Там несколько огрехов подправлено.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Autodesk → AutoCAD → AutoCAD 2004. Как сгруппировать объекты?
Форум работает на PunBB, при поддержке Informer Technologies, Inc