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

> Sailor
Я же говорю, что это заготовка. Проверял я ее на слоях с именами, состоящими из одного слова, не замороженных и  не блокированных.
AutoCAD 2005 РУС. В этом случае все включалось и выключалось. Сейчас проверил
cлучай, когда все три слоя заморожены и блокированы. Программа исправно
включает и выключает слои хоть и с такими сообщениями (а это даже к лучшему):

Команда: LOFFON
 Слои оси,стены,текст выключены.
Команда: LOFFON
ВНИМАНИЕ! Слой "Оси" заморожен. Не будет виден до размораживания.
ВНИМАНИЕ! Слой "Стены" заморожен. Не будет виден до размораживания.
ВНИМАНИЕ! Слой "Текст" заморожен. Не будет виден до размораживания.
 Слои оси,стены,текст включены.

Попробую еще с пробелами в именах слоев. Сам я обычно ни в каких именах пробелы не ставлю,
а ставлю подчерк (_) между словами. А какие имена слоев у вас?

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

> Sailor
Ну хорошо, раз так уж хочется с макросом...
Выключение:

^C^C^P(foreach item [b]'("Layer1" "Layer2" "Layer3")[/b] (if (tblobjname "layer" item) (vla-put-layeron (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) item) :vlax-false)));(princ);

Включение:

^C^C^P(foreach item [b]'("Layer1" "Layer2" "Layer3")[/b] (if (tblobjname "layer" item) (vla-put-layeron (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) item) :vlax-true)));(princ);

Где полужирное - внести свои списки имен слоев. Регистр не играет роли. Если слоя нет, ничего страшного не будет.
Вообще-то это чистой воды лисп, только вбитый в макрос.

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

> Владимир Громов
"18-Сетка"; "20-Поддержка"; "22-Резюме".
p.s. У меня, правда,  есть опаска, а возможно ли это вообще сделать средствами Diesel или LISP? Вот на ARX точно есть. Есть даже пример OFF/ON на этом форуме.

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

> kpblc
Не...не... Сыр- бор разгорелся из- за одной кнопки. Хотя вариант, который Вы предложили обязательно пройдет, если не будет решения для одной кнопки.

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

> Sailor
Варианта не будет. Только если включать ВСЕ слои и использовать USERR5, к примеру. Устроит?

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

Все работает даже со слоями, в именах которых
есть пробелы. Вот такое наблюдение:
Если какого-то из названных слоев нет, то
выключение выполняется. А вот включение
завершается аварийно. Из этого я делаю вывод,
что имя какого-то слоя было введено неправильно
или слой с таким именем отсутствует.
Если у вас всегда в выключаются одни и те же слои,
то проблем не будет, их можно явно записать в код, да и все.

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

> Владимир Громов
Наверное, я чего то не так сделал. Выключились слои у меня номально. Хм...но не включаются.

> kpblc
Честно говоря, я никогда явно не пользовался переменными USER. Не хотелось бы так усложнять для задачи OFF/ON слоев, т.к. она не решает каких то уж обьемных задач. Т.е. наверное, не стоит запускать "тяжелую артиллерию" :):)

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

> Владимир Громов
А что количество слоев в три- это критично? Я экспериментировал только с одним. Сейчас попробую еще раз.

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

> Sailor
Да, количество слоев критично.
Попробуйте такой код:
(

defun C:LOFFON ( / L1 L2 L3 L123 L1LIST L2LIST L3LIST COLOR1 COLOR2 COLOR3)
(setq L1 "18-Сетка")
(setq L2 "20-Поддержка")
(setq L3 "22-Резюме")
(setq L123 (strcat L1 "," L2 "," L3))
(setq L1LIST (tblsearch "layer" L1))
(setq L2LIST (tblsearch "layer" L2))
(setq L3LIST (tblsearch "layer" L3))
(setq COLOR1 (cdr (assoc 62 L1LIST)))
(setq COLOR2 (cdr (assoc 62 L2LIST)))
(setq COLOR3 (cdr (assoc 62 L3LIST)))
(if (and (minusp COLOR1) (minusp COLOR2) (minusp COLOR3))
    (progn
    (command "_-LAYER" "_ON" L123 "")
    (princ " Слои ") (Princ L123) (princ " включены.")
    ) ; progn
    (progn
         (if (or (= (getvar "CLAYER") L1)
                 (= (getvar "CLAYER") L2)
                 (= (getvar "CLAYER") L3))
             (command "_-LAYER" "_off" L123 "_y" "")
             (command "_-LAYER" "_off" L123 "")
         ) ; if
    (princ " Слои ") (Princ L123) (princ " выключены.")
    ) ; progn
) ; if
(princ)
)

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

Но вы же сами писали о 3 слоях. Если нужно произвольное количество слоев, то задача сильно усложняется. Хотя можно сделать несколько кнопок - для одного слоя, для двух, ну, и т.д.:)

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

> Владимир Громов
Вот добавил три слоя. И действительно срабатывают функции OFF/ON.

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

> Владимир Громов
Ну это был только пример. Такая кнопка была бы эффективна даже и для одного слоя. Представьте себе часто выключаемый-включаемый слой среди 20- 30 других штатными средствами AutoCAD.

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

> Владимир Громов
Я не знаю LISP, но знаком с операторами цикла других языков. Например, того же BASIC. Так там можно корректно выйти из цикла. Я это пишу к тому, что количество слоев может разным.

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

Если количество и имена слоев непредсказуемы,
то я и не буду думать на эту тему. Слишком
много времени уходит на поиск несуществующих
ошибок. Вот и здесь, я ведь отметил, что слои
должны существовать и вводить их по запросу
надо было кооректно, а вы...
Я на работе выхожу в Интернет подпольно, с
помощью собстенного модема через мини-АТС, в
которой задействовано всего 4 городских номера
на 60 человек, так что каждая секунда
промедления чревата скандалом. Писать
приходится в блокноте, а потом быстренько
входить, отправлять и сразу выходить. Это дома
у меня неограниченный доступ, а тут вот такая
ерунда.

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

> Sailor

> kpblc
уже не катит :?:
Это раз. Два.

> Sailor
если слоя 3, то количество возможных сочетаний состояния on/off равно 8. для 4 - 26 и так далее (для х - х! + 2, т.е. для 10 слоев, если я не ошибаюсь, 362882 кнопочки. Намек прозрачен?

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

> kpblc
Ну ладно, ладно. Первый макрос на OFF я еще вчера установил. И даже геройски иконку нарисовал. А сейчас вторую сделаю по совету kpblc на ON. Много места не зайдет. Так что вопрос функциональности решен в любом случае положительно. :) А вот вопрос о сложности написания макросов, синтаксис которых сродни программированию контроллеров, в той ветке, откуда мы ломанулись сюда, остается открытым. Но пусть его закрывают другие. У меня тоже нет лишнего времени на это. Поэтому, всем большое спасибо за участие, интересный разговор и полезный макрос. С уважением Sailor.

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

> Владимир Громов
Этот мой пост относится, конечно, и к Вам конечно. И в первую очередь. Еще раз всем спасибо.

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

Извиняюсь, что поздно обнаружил данную тему.
Мы у себя вопрос решили следующим образом. Автокад 2005 и выше. Создаем групповой слой и именем ONOFF, туда запихиваем интересующие нас слои. Вешаем на кнопку лисп

^C^C(layer-filters-status-change "ONOFF")

И сам лисп

  ;|=======================================================================================
* Ф-ция layer-filters-status-change
* На основе  https://www.caduser.ru/forum/topic1194.html
* Arguments [Type]:
   lstnames = String - имя группового фильтра "ONOFF"
* Возвращает [Type]:
   nil
* Если хотя бы один слой группового фильтра выключен, то слои фильтра включаются
=======================================================================================|;
(defun layer-filters-status-change
       (lstnames / vla:lrs vla:xdic vla:dic vla:spsc name datatype datavalue onoff sps)
  (setq lstnames (list lstnames))
  ;;; Utility function to get multiple group code CDRs
(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)
  (setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
    ;; при наличии словаря требуется детальная проверка
    (progn
      (setq lstnames (mapcar 'strcase lstnames))
      (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)
           ) ;_  if
         ) ;_  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)
      (member (strcase (vlax-variant-value
               (vlax-safearray-get-element
                 datavalue
                 (vl-position 300 (vlax-safearray->list datatype))
                 ) ;_  vlax-safearray-get-element
               ) ;_  vlax-variant-value
                  ) ;_  strcase
              lstnames
              ) ;_  member
      ) ;_  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)
    
       ) ;_  progn
          ) ;_  if
       ) ;_  vlax-for
     (vlax-release-object vla:dic)
     )
   ) ;_ if
      (vlax-release-object vla:xdic)
      ) ;_  progn
    ) ;_  if
  (vlax-release-object vla:lrs)
  (princ)
  )

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

> VVA
Хм... Век живи- век учись... Не могли бы Вы в нескольких словах дать понятие "групповой слой". А то я дальше не могу двинуться.

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

Там опечатка, "групповой слой" читать как "групповой фильтр". Команда _layer Новый групповой фильтр (New group filter). Вторая кнопка сверху слева, там где рука накрывает стопку листов

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

> VVA
Да эти опции работы с фильтрами интересны. Я создал свою группу слоев под именем предположим "АТ". Но программа запускается и заканчивает работу не производя никаких видимых действий и ничего не пишет в ком. строке. Что должна сделать эта программа?

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

Тогда твоя кнопка

(layer-filters-status-change "AT")

Если слои группового фильтра АТ включены, то она выключит их и наоборот.

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

Кстати в приведенном выше варианте

(layer-filters-status-change "AT")

код работает в прозрачном режиме (не прерывая команы)

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

Еще хочу уточнить, что помимо создания группового фильтра туда нужно драг-энд-дропом запихнуть слои, т.е если слева выделить фильтр, то срава должны быть имена слоев, а не пусто

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

VVA пишет:

...нужно драг-энд-дропом запихнуть слои...

Так я и сделал. Сейчас попробую последний макрос на кнопку.