Re: AutoCAD 2004. Как сгруппировать объекты?

> Guslav
Запускать как (psw "+") или (psw "-") соответственно - именно так, в скобках.

Re: AutoCAD 2004. Как сгруппировать объекты?

2 kpbls
Спасибо, получилось.

Re: AutoCAD 2004. Как сгруппировать объекты?

Ну в общем вот что получилось:

;|=============================================================================
*    Функция группировки и разгруппировки.
*    Параметры вызова:
*    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

Re: AutoCAD 2004. Как сгруппировать объекты?

Старею, старею... Склероз, однако.
Благодарность за предоставленную информацию и код (https://www.caduser.ru/forum/topic20923.html) AY, {Smirnoff}, Александр Ривилис

Re: AutoCAD 2004. Как сгруппировать объекты?

> kpblc
Отлично работает kpblc, мой тебе respect.
Можно мои замечания?
Лично мне не удобно пользоваться такими громоздкими командами, как (kpblc-univ-grouping t), (kpblc-univ-grouping nil). Это кнопарь надо делать, а я отношу себя к лагерю "клавишников" При всем уважении к автору, можно их упростить, ну вбил пару символов, что поближе друг к другу и все. Там gg, q1,q2.... Плиз

Re: AutoCAD 2004. Как сгруппировать объекты?

Да бога ради. Либо заменить имя функции (которое идет после слова (defun), либо (второй вариант мне больше нравится) сделать такое:

(defun c:gr()
(kpblc-univ-grouping-quest)
)

Это для варианта "с запросом". Или

(defun c:grg()
(kpblc-univ-grouping t)
)

Для группировки и

(defun c:ung()
(kpblc-univ-grouping nil)
)

для 2 разных кнопок

Re: AutoCAD 2004. Как сгруппировать объекты?

> kpblc
Может, вставишь строки в программку, я не силен в програмировании.

Re: AutoCAD 2004. Как сгруппировать объекты?

Великолепно!!!!
Хотя есть один неприятный, на мой взгляд, момент - нет визуального подтверждения команды разгруппировать. Т.е. после выполнения команды группировать выделение с объектов группировки снимается, и мы видим, команда выполнена, при разгруппировке выделенная группа остается выделенной, и не понятно сработала команда или нет.  Приходится совершать лишние движения, чтобы убедится что сработала. :(

Re: AutoCAD 2004. Как сгруппировать объекты?

Великолепно!!!!
Хотя есть один неприятный, на мой взгляд, момент - нет визуального подтверждения команды разгруппировать. Т.е. после выполнения команды группировать выделение с объектов группировки снимается, и мы видим, команда выполнена, при разгруппировке выделенная группа остается выделенной, и не понятно сработала команда или нет.  Приходится совершать лишние движения, чтобы убедится что сработала. :(
  P.S.Может быть для полной ясности заменить в варианте с запросом Да Нет на Группировать (Group) Разгруппировать (UnGroup)

Re: AutoCAD 2004. Как сгруппировать объекты?

> kpblc
А говоришь, что не программист. Прибедняешься слегка.:)

Re: AutoCAD 2004. Как сгруппировать объекты?

kpblc Пожалуйста, помоги с кодом

Re: AutoCAD 2004. Как сгруппировать объекты?

> 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

Проверьте работоспособность.

Re: AutoCAD 2004. Как сгруппировать объекты?

> kpblc
Все отлично работает!! Вери биг санкс

Re: AutoCAD 2004. Как сгруппировать объекты?

Ещё одно спасибо, думаю, не будет лишним.

Re: AutoCAD 2004. Как сгруппировать объекты?

> ASYS

> Nino
Полный и окончательный код лежит на https://www.caduser.ru/forum/topic22819.html
Там несколько огрехов подправлено.