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

Мне часто приходится включать или выключать слой "10-Support" или группу слоев:
"10-Support"; "95-Marker"; "99-Error".
Подскажите пожалуйста, макрос на кнопку для выключения имеющегоя слоя или группы слоев.

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

В "Express Tools" полно средств управления слоями.

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

> Владимир Громов
В "Express Tools" еще надо добраться. А мне нужно одним кликом. Я так думаю Вы не представляете черчение машиностроителей. Это без всякой иронии.

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

> Forma
Дело не в том, что я не представляю себе работу машиностроителей, а в том, что я не представляю себе такую работу в AutoCAD, что даже функциональные клавиши приходится заменять кнопками с макросами. Это недоступно для моего разумения, а пытаясь понять логику ваших задач, я чувствую себя или обманутым или ослом.

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

> Владимир Громов
Владимир, это концепция AutoCAD такая. И это скорей хорошо, чем плохо. AutoCAD в отличие от других векторных редакторов поддается достаточно глубокой настройке. Между прочим, это одна из составляющих его популярности. И если есть такая возможность, почему бы ей не пользоваться.

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

Раз уж так хочется:

;|=============================================================================
*    Отключение слоя выбранного объекта. Не проверялось на работоспособность
* с блоками и внешними ссылками
*    имя сохранения: kpblc-layer-off.lsp. Файл должен быть по пути поддержки
* AutoCAD
*    Параметры:
*    Нет
*    Примеры вызова:
kpblc-layer-off
* в lisp:
c:kpblc-layer-off
* в макросах DIESEL:
^C^C(if (not "c:kpblc-layer-off") (load "kpblc-layer-off.lsp"));kpblc-layer-off;
* по-моему, так.
=============================================================================|;
(defun c:kpblc-layer-off (/ selset layer_name)
  (setq selset (entget (car (entsel))))
  (setq layer_name (cdr (assoc 8 selset)))
  (command "_.Layer" "_Off" layer_name "")
  ) ;_ end of defun

Интересно было бы посмотреть на вид экрана када.
Вообще-то в "Готовых программах" был загрузчик лиспов, им пользоваться и потом не надо проверять загрузку lisp-файла

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

> kpblc
В выражении (not "c:kpblc-layer-off") не нужны кавычки, IMHO.
А вообще-то, тут надо вместо layer_name записать действительное имя слоя. И потом, Forma ведь хочет то включать слой, то выключать, следовательно нужна проверка состояния слоя.

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

> kpblc
Да, и при вызове программы из Lisp'а нужны скобки:

(c:kpblc-layer-off)

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

Чувствую, дело движется в правильном направлении. Только, пожалуйста, оформите это это все в понятном виде. Я в LISP ничего не понимаю.

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

> Владимир Громов
Ну не люблю я однократной загрузки, соответственно и не знаю ее - загрузчик сделал и гружу все лиспы одномоментно, так что тут как повезет.

> Владимир Громов
Не спорю, но не сложились у меня нормальные взаимоотношения с функциями с:* - я обычно работаю через (defun kpblc-*()) - там-то проще будет, и параметры опять же передать можно.
---
По поводу обратного включения: можно, конечно, попытаться записать состояние слоев на момент отключения, потом его прочитать, еще чего-то выдумывать - мне неохота этим заниматься. Контрол слоев не отменен и нормально работает. А если запрашивать имя слоя, то алиас la тоже не исчез опять-таки, и делать кнопку ради одной команды _.-layer я не вижу смысла, если честно.
> Forma : FAQ, там все описано

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

> Sailor : Лови

(defun c:layoffbysel (/ adoc ent)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (while
    (setq ent (entsel "\nУкажите объект \"отключаемого\" слоя <Выход> : "))
     (vla-put-layeron
       (vla-item (vla-get-layers adoc) (cdr (assoc 8 (entget (car ent)))))
       :vlax-false
       ) ;_ end of vla-put-layeron
     ) ;_ end of while
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
;; На случай отсутствия Express Tools
(defun c:layon (/ adoc)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (vlax-for item (vla-get-layers adoc)
    (vla-put-layeron item :vlax-true)
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ "\nСлои включены, но не разблокированы и не разморожены")
  (princ)
  ) ;_ end of defun

Все остальное - учи матчасть :)

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

> kpblc
Программа работает хорошо. Но исчезла "изюминка" работы кнопок на экране. Т.е. когда пользователь не думая, быстро, во время работы, на уровне спиномозговых рефлексов может выключить какие вспомогательные слои. Или тут же их включить. Это происходит часто во время проектирования. Незнаю, насколько я сумел обьяснить. В данном конкретном случае не важно что работает: Diesel, макрос или программа на кнопке. Главное, чтобы было "OFF/ON". И все. Более никаких телодвижений с стороны конструктора.

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

> kpblc
Да вот еще что:
Во первых -  надо читать: не "...не важно что работает: Diesel, макрос или программа на кнопке." , а "не важно что работает: Diesel, макрос или программа на LISP или VBA."
И второе - В Вашей программе можно удобно выключить "паутину" вспомогательных линий, что бы не мешали. Но, не факт, что они находятся на вспогательных слояв. Реально, пользователь ориентируется в основном по цвету. Если он , конечно, не дальтоник. Позиция у меня тоже спорная. Но на мой взгляд более примитивная, чем использовать прием ""\nУкажите объект \"отключаемого\" слоя <Выход> : "))". Наверное, не понятно ничего, что я понаписал? :):):)

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

Блин, знал, что ни одно доброе дело не остается безнаказанным :)

> Screw
Надо разделять видимость объекта (примитива) и видимость слоя. Если надо скрывать объекты, но на основе https://www.caduser.ru/forum/topic22428.html можно и не такое наваять. Так что надо? Это к вопросу, что изначально шел разговор именно о состоянии слоев.

> Sailor
Выключить-то запросто, а как опознавать, какие слои включать? Я такого придумать (точнее, предусмотреть все варианты) не могу. Опять же, фильтры слоев, статусы слоев... Это более гибкое решение, и вдобавок встроенное в кад.

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

> kpblc
Мне нравится гибкость AutoCAD, но в практической работе пользователю, наверное все таки надо придерживаться, если не жестких стандартов, то хотя бы каких нибудь правил. Как пишет Forma  "...Мне часто приходится включать или выключать слой "10-Support" или группу слоев:
"10-Support"; "95-Marker"; "99-Error".

Т.е. у него уже есть какая то схема работы. А зачем проверять слои на "замороженность" или "блокировку"? Макрос написанный Владимир Громов отрабатывается четко функцию выключения группы слоев. Собственно, больше и не требуется. Добавить только и включение той же кнопкой. И все. А уж макросом это выполнить или LISP в контексте этой задачи по моему мнению не столь важно.

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

kpblc пишет:

...а как опознавать, какие слои включать?...

Т.е. какие слои выключил, те и включил. По крайней мере, в моей практике так. И больше, кажется, и не требовалось.

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

> Sailor
А как я узнаю, какие у кого правила? И кто будет гарантировать их незыблемость? Вот в чем вопрос. Собственно программку написать не проблема. Надо только полное ТЗ, и вот тогда можно будет под это конкретное ТЗ писать программульку. Шаг вправо, шаг влево, прыжок на месте - далее по тексту.

> Sailor
Отлично. Отключили слои Слой1, Слой2, Слой_для_балок_и_ферм. Сохранили файл. Закрыли кад. открываем файл. Откуда прочитать "исходное состояние слоев", т.е. те, которые надо открывать? Не, можно, конечно, массу всякого наворотить, один только вопрос - почему не используются фильтры слоев или статусы слоев? Вопрос-то задаю не просто так (и не первый раз, кстати).

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

btw, пост > Владимир Громов (2005-09-05 06:32:37) силы тоже не утратил :)

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

> kpblc
Мне трудно это обьяснить. Но попробую. В общем, когда конструктор проектирует, то его мысли заняты на работе и отвлекаться на команды с вводом параметром это ... ну как бы раздражающий фактор, который мешает работе. Сбивает с мысли. Допускаю, что это только у меня. Наверное я слабый конструктор. Но факт тот, что я пользуюсь именно кнопками с специфическим набором команд, расположения на экране которых я даже не помню. За меня "помнит моя рука". Моя реплика об "изюминке" была как раз попыткой этот момент обьяснить.

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

Рабочая заготовка выключения/включения 3-х слоев по выбору
нажатием одной кнопки.

(defun C:LOFFON ( / L123 L1LIST L2LIST L3LIST COLOR1 COLOR2 COLOR3)
(if (not (or L1 L2 L3))
    (progn
    (setq L1 (getstring T "\n Имя 1 слоя: "))
    (setq L2 (getstring T "\n Имя 2 слоя: "))
    (setq L3 (getstring T "\n Имя 3 слоя: "))
    ) ; progn
) ; if
(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)
)

Предполагается, что слои существуют, не заморожены и не заблокированы.
В начале сеанса работы с AutoCAD'ом надо будет ввести имена слоев.
После этого до конца сеанса запроса имен не будет.
Если код будет сохранен в файле loffon.lsp, возможный макрос для
кнопки или пункта меню может быть таким:

^C^C^P(if (not C:LOFFON) (load "loffon")) LOFFON

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

kpblc пишет:

Откуда прочитать "исходное состояние слоев", т.е. те, которые надо открывать?

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

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

> Владимир Громов
Решение с запоминанием выключаемых слоев замечательно. Но увы "затирается" негативными явлениями. Такими как действует эта программ только для одного открытого чертежа. А у меня их за день набирается десятки. Установлена даже специальная панель с закладками. Кстати, невероятно удобная. Рекомендую. Но этот вопрос можно решить созданием какого либо ini файла. Но тут всплывает еще один фактор. Точнее два. Первый- это то, что программа выключает слои, включать не умеет. И второе- это то, что работает из командной строки, чем рушит всю концепцию работы с кнопок.
p.s. Кстати Ваша программа корректно выключает замороженные и заблокированные слои. Один из моих вспомогательных слоев (Типа разметочной сетки)заблокирован.

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

> Sailor
Поправка:

И второе- это то, что работает из командной строки, чем рушит всю концепцию работы с кнопок.

Тут я поспешил. И не прав. Работает и с кнопки. Прошу прощения и снимаю этот пункт с повестки дня :):):).

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

> Sailor
Ох, ёклмн... Говорил же, что не все так просто под луной. Не слушаете, вот и получаете не то, что хотите. еще раз говорю - Express Tools или фильтры слоев или сохранение статуса слоев - вот что требуется! Эти данные хранятся внутри файла, и ни от чего стороннего не зависят. Там все проще получается, настроить только всего один раз понадобится.
Насчет панели... Можно, кстати, переключаться и по Ctrl+Tab, ну да ладно. Теперь насчет ini.
Примерная структура ini, как я ее вижу:
[Имя файла]
<Имя слоя1>=On|Off
<Имя слоя2>=On|Off
<Имя слоя3>=On|Off
Переименовали файл. И все, секция накрылась медным тазом. Восстанавливаем? И как это сделать программно? Где хранить такой ini, разбуший до невероятных размеров? И кто будет отслеживать актуальность? А если файл dwg попал к соседу, он чего-то там наваял (на "закрытых" слоях), и это надо посмотреть? И как включать слои - по выбору? Все слои?
---
ИМХО - вопросов более чем достаточно, чтобы задуматься о возможности вообще написания подобного приложения.

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

> kpblc
ВОТ! Именно. Можно такого наворотить. Поэтому я исповедую аскетичность в плане прикладного программирования. Поэтому предлагаю взять за основу макрос Владимира

 ^C^C^P(if (or (= (getvar "CLAYER") "L1") (= (getvar "CLAYER") "L2") (= (getvar "CLAYER") "L3"))(command "_-LAYER" "_off" "L1,L2,L3" "_y" "") (command "_-LAYER" "_off" "L1,L2,L3" ""))(princ)

, но добавить и функцию включения. Если это морочно сделать средствами Diesel, выполнить на LISP. И усе. Зачем усложнять. Пользователь, который способен установить макрос на кнопу, по моему разумению, способен и ввести в него имена оригинальных слоев.