Re: Макрос на кнопку "Отключение слоя или группы слоев"

О великие!
В моем случае более целесообразно использовать
layer-filters-status-change, тк кнопок много(уже 6, а  будет больше ;)), а фильтры и слои одинаковы на разных чертежах!
Как сделать чтобы после ВКЛЮЧЕНИЯ слоев по фильтру этот фильтр применялся в существующем падающем меню "Слои"?
Кроме того нужна отдельная команда по включению фильтра (прежде всего All Used Layers)!
Данное сочетание, при частой смене фильтров, было бы просто идеальным и позволило бы практически не лазить в меню свойства слоев или искать нужный слой в списке из 30-40 слоев!

Re: Макрос на кнопку "Отключение слоя или группы слоев"

> iv
Честно говоря ничего не понял...Но от добра добра не ищут. С начала темы прошло много времени. Схема, предложенная VVA, показала себя с наилучшей стороны. Работаю по ней постоянно. Фильтр слоев "AT" давно уже прописался в шаблоне с которого я начинаю работать. Т.е на сегодняшний день он практически во всех моих чертежах....Так что огромнейшее спасибо VVA за идею и программу, Владимиру Громову за макрос и kpblc за участие и поддержку.

Re: Макрос на кнопку "Отключение слоя или группы слоев"

Совершенству нет предела!
После того как включена группа слоев среди них часто оказываются те которые необходимо временно скрыть, или если группа выключена нужно включить 1-2!
Конечно можно воспользоваться общим списком, но если будет применен этот фильтр блуждание по списку упростится. Особенно если слои фильтра идут не подряд в общем списке... Исторически...
Когда необходимо начать оперировать со слоями не входящими в фильтр достаточно нажать "Включение All Used Layers", без посещения менеджера.
Как говорится экономятся два клика, время на загрузку менеджера и потерянная во время этого мысль!

Re: Макрос на кнопку "Отключение слоя или группы слоев"

Как сделать чтобы после ВКЛЮЧЕНИЯ слоев по фильтру этот фильтр применялся в существующем падающем меню "Слои"?

Я пока на этот вопрос тоже не нашел ответа :(

Включение All Used Layers

И на этот тоже :((

тк кнопок много(уже 6, а будет больше ;))

Модифицировал ф-цию layer-filters-status-change, чтобы могла принимать список фильтров для изменения. Плюс добавилась команда LFSC для запроса фильтров в командной строке (если они короткие, чтобы не плодить кнопки.)
Действие ф-ции не изменилось: Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
Сам код

 ;|=====================================================================================
* Ф-ция layer-filters-status-change
* На основе  https://www.caduser.ru/forum/topic1194.html
* Для https://www.caduser.ru/forum/topic20414.html
* Arguments [Type]:
   lstnames = String — имя группового фильтра. Например "ONOFF"
                       Строка имен групповых фильтров, разделенных <,>
                       Например "ONOFF,AT" или "AT*"
  или
   lstnames = List of String - список имен групповых слоевю Например ("ONOFF" "AT")
* Возвращает [Type]:
   nil
* Принцип работы
* Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
=======================================================================================|;
(defun layer-filters-status-change
       (lstnames / vla:lrs vla:xdic vla:dic vla:spsc name datatype datavalue onoff sps)
  (defun massoc (key alist / x nlist)(foreach x alist
   (if (eq key (car x))(setq nlist (cons (cdr x) nlist))))(reverse nlist))
  (vl-load-com)(if (= (type lstnames) 'STR)(setq lstnames (list lstnames)))
  (if (= (type lstnames) 'LIST)(setq lstnames(apply 'strcat(mapcar '(lambda(x)(strcase(strcat x ","))) lstnames))))
  (setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
    ;; при наличии словаря требуется детальная проверка
    (progn (setq vla:xdic (vla-getextensiondictionary vla:lrs))
      (setq vla:dic nil)
      ;; поиск фильтров версии 2005
      (if (progn (vlax-for item   vla:xdic
         (if (= (vla-get-name item) "ACLYDICTIONARY")(setq vla:dic item))) ;_  vlax-for
       vla:dic) ;_  progn
   (progn (vlax-for vla:spsc vla:dic (if (progn (setq name (vla-get-name vla:spsc))
      (vla-getxrecorddata vla:spsc 'datatype 'datavalue)
      (wcmatch (strcase (vlax-variant-value (vlax-safearray-get-element datavalue
                 (vl-position 300 (vlax-safearray->list datatype)))))
              lstnames);_  wcmatch
      ) ;_  progn
      (progn (setq sps (entget(vlax-vla-object->ename vla:spsc))
            sps (massoc 330 (member (assoc 300 sps) sps))
            sps (vl-remove-if 'null (mapcar 'entget sps))
            sps (mapcar '(lambda (x)(cons (cdr(assoc 2 x))(cdr(assoc 62 x)))) sps))
      (if (vl-member-if '(lambda (x)(minusp (cdr x))) sps)(setq onoff :vlax-true) ;_Хотя бы один слой выключен
        (setq onoff :vlax-false))
       (setq sps (mapcar '(lambda (x)(vla-Item vla:lrs x)) (mapcar 'car sps)))
       (mapcar '(lambda (x)(vla-put-layeron x onoff)) sps)))) ;_  vlax-for
     (vlax-release-object vla:dic))) ;_ if
      (vlax-release-object vla:xdic))) ;_  if
  (vlax-release-object vla:lrs)(princ))
(defun C:LFSC ( / fname )
  (setq fname (getstring "\nИмена групповых фильтров, разделенных запятой(,) <выход>: "))
  (if (/= Fname "")(layer-filters-status-change fname))
  (princ))
;|Возможные макросы на кнопку
Если в чертеже есть групповые фильтры с именами AT и ONOFF
^C^C(layer-filters-status-change "AT,ONOFF")
^C^CLFSC;AT,ONOFF
^C^CLFSC;AT
С запросом в командной строке имени фильтра (фильтров)
^C^CLFSC;
|;

Пояснения.
1. Не рассматривается вопрос загрузки кода. Считается, что ф-ция layer-filters-status-change и команда C:LFSC Загружены.
2. Предположим в рисунке есть групповые фильтры с именами AT, AT1, AT2, ONOFF
3.
- Кнопка ^C^CLFSC;AT,ONOFF - изменит видимость слоев фильтров AT и ONOFF
- Кнопка ^C^CLFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2
4. Использование кнопки без ^C^C позволит применять команду прозрачно
- Кнопка 'LFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2 не прерывая текущую команду (например ваполнение команды отрезок)
- Кнопка 'LFSC; - приостановит действие текущей команды, запросит перечень фильтров, изменит видимость слоев, продолжит выполнение команды.

Re: Макрос на кнопку "Отключение слоя или группы слоев"

Может задать вопрос по применению фильтра без посещения свойств слоев в другом разделе? ObjectARX? Или они тоже не помогут? Темы там какие то мутноватые...

Re: Макрос на кнопку "Отключение слоя или группы слоев"

Применение фильтра предложил Александр Ривилис в ветке ObjectARX.
В 2005 функционирует 100%! Настоятельно рекомендую:
https://www.caduser.ru/forum/topic31806.html
Приходится применять 2 функции, однако кому то они могут понадобиться по отдельности :)

Re: Макрос на кнопку "Отключение слоя или группы слоев"

Прочитал не все, може такое предложение и было. Если у вас два фиксированных набора (или три,..) между которыми нужно переключаться, то проще запомнить эти наборы в менеджере слоев и сделать макросы на кнопки для вызова определенного состояния ^C^C_-LAYER;A;R;Состояние;^C^C.

(изменено: sukovykhap, 24 апреля 2024г. 14:26:39)

Re: Макрос на кнопку "Отключение слоя или группы слоев"

VVA пишет:

Как сделать чтобы после ВКЛЮЧЕНИЯ слоев по фильтру этот фильтр применялся в существующем падающем меню "Слои"?

Я пока на этот вопрос тоже не нашел ответа :(

Включение All Used Layers

И на этот тоже :((

тк кнопок много(уже 6, а будет больше ;))

Модифицировал ф-цию layer-filters-status-change, чтобы могла принимать список фильтров для изменения. Плюс добавилась команда LFSC для запроса фильтров в командной строке (если они короткие, чтобы не плодить кнопки.)
Действие ф-ции не изменилось: Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
Сам код

 ;|=====================================================================================
* Ф-ция layer-filters-status-change
* На основе  https://www.caduser.ru/forum/topic1194.html
* Для https://www.caduser.ru/forum/topic20414.html
* Arguments [Type]:
   lstnames = String — имя группового фильтра. Например "ONOFF"
                       Строка имен групповых фильтров, разделенных <,>
                       Например "ONOFF,AT" или "AT*"
  или
   lstnames = List of String - список имен групповых слоевю Например ("ONOFF" "AT")
* Возвращает [Type]:
   nil
* Принцип работы
* Если хотя бы один слой группового фильтра выключен, то слои фильтра (ов) включаются
=======================================================================================|;
(defun layer-filters-status-change
       (lstnames / vla:lrs vla:xdic vla:dic vla:spsc name datatype datavalue onoff sps)
  (defun massoc (key alist / x nlist)(foreach x alist
   (if (eq key (car x))(setq nlist (cons (cdr x) nlist))))(reverse nlist))
  (vl-load-com)(if (= (type lstnames) 'STR)(setq lstnames (list lstnames)))
  (if (= (type lstnames) 'LIST)(setq lstnames(apply 'strcat(mapcar '(lambda(x)(strcase(strcat x ","))) lstnames))))
  (setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
    ;; при наличии словаря требуется детальная проверка
    (progn (setq vla:xdic (vla-getextensiondictionary vla:lrs))
      (setq vla:dic nil)
      ;; поиск фильтров версии 2005
      (if (progn (vlax-for item   vla:xdic
         (if (= (vla-get-name item) "ACLYDICTIONARY")(setq vla:dic item))) ;_  vlax-for
       vla:dic) ;_  progn
   (progn (vlax-for vla:spsc vla:dic (if (progn (setq name (vla-get-name vla:spsc))
      (vla-getxrecorddata vla:spsc 'datatype 'datavalue)
      (wcmatch (strcase (vlax-variant-value (vlax-safearray-get-element datavalue
                 (vl-position 300 (vlax-safearray->list datatype)))))
              lstnames);_  wcmatch
      ) ;_  progn
      (progn (setq sps (entget(vlax-vla-object->ename vla:spsc))
            sps (massoc 330 (member (assoc 300 sps) sps))
            sps (vl-remove-if 'null (mapcar 'entget sps))
            sps (mapcar '(lambda (x)(cons (cdr(assoc 2 x))(cdr(assoc 62 x)))) sps))
      (if (vl-member-if '(lambda (x)(minusp (cdr x))) sps)(setq onoff :vlax-true) ;_Хотя бы один слой выключен
        (setq onoff :vlax-false))
       (setq sps (mapcar '(lambda (x)(vla-Item vla:lrs x)) (mapcar 'car sps)))
       (mapcar '(lambda (x)(vla-put-layeron x onoff)) sps)))) ;_  vlax-for
     (vlax-release-object vla:dic))) ;_ if
      (vlax-release-object vla:xdic))) ;_  if
  (vlax-release-object vla:lrs)(princ))
(defun C:LFSC ( / fname )
  (setq fname (getstring "\nИмена групповых фильтров, разделенных запятой(,) <выход>: "))
  (if (/= Fname "")(layer-filters-status-change fname))
  (princ))
;|Возможные макросы на кнопку
Если в чертеже есть групповые фильтры с именами AT и ONOFF
^C^C(layer-filters-status-change "AT,ONOFF")
^C^CLFSC;AT,ONOFF
^C^CLFSC;AT
С запросом в командной строке имени фильтра (фильтров)
^C^CLFSC;
|;

Пояснения.
1. Не рассматривается вопрос загрузки кода. Считается, что ф-ция layer-filters-status-change и команда C:LFSC Загружены.
2. Предположим в рисунке есть групповые фильтры с именами AT, AT1, AT2, ONOFF
3.
- Кнопка ^C^CLFSC;AT,ONOFF - изменит видимость слоев фильтров AT и ONOFF
- Кнопка ^C^CLFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2
4. Использование кнопки без ^C^C позволит применять команду прозрачно
- Кнопка 'LFSC;AT* - изменит видимость слоев фильтров AT AT1 AT2 не прерывая текущую команду (например ваполнение команды отрезок)
- Кнопка 'LFSC; - приостановит действие текущей команды, запросит перечень фильтров, изменит видимость слоев, продолжит выполнение команды.

Добрый день, подскажите, а если есть необходимость не "выключать" слои а "замораживать", как подправить код? Пытался сам разобраться при замене "vla-put-layeron x onoff" на "vla-put-freeze x onoff" команда корректно не заработала.