Как выключить и включить слой?

Автор Тема: Как выключить и включить слой?  (Прочитано 2299 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AnatolyАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 3
  • Skype: ant_nkh
Есть имя слоя, надо выключить, потом включить.
Аналогично заморозить/разморозить.
В чертеже, не в видовом экране.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Как выключить и включить слой?
« Ответ #1 : 18-05-2021, 21:35:13 »
Ну, не каждый слой можно разморозить - текущий-то точно не получится. А так в чем сложность?
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (defun change-layer-lock (doc name status / layer)
  4.   ;|
  5. doc - документ, в котором выполняется работа. nil -> текущий
  6. name - имя слоя
  7. status - заблокировать (t) или разблокировать (nil)
  8. *    Примеры вызова:
  9. (change-layer-lock nil "SomeLayer" t)
  10. (change-layer-lock nil "SomeLayer" nil)
  11. |;
  12.   (if (not doc)
  13.     (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  14.   ) ;_ end of if
  15.   (if (= (type (setq layer (vl-catch-all-apply (function (lambda () (vla-item (vla-get-layers doc) name))))))
  16.          'vla-object
  17.       ) ;_ end of =
  18.     (vla-put-lock
  19.       layer
  20.       (if status
  21.         :vlax-true
  22.         :vlax-false
  23.       ) ;_ end of if
  24.     ) ;_ end of vla-put-lock
  25.   ) ;_ end of if
  26. ) ;_ end of defun
  27.  
  28. (defun change-layer-freeze (doc name status / layer)
  29.   ;|
  30. doc - документ, в котором выполняется работа. nil -> текущий
  31. name - имя слоя
  32. status - заблокировать (t) или разблокировать (nil)
  33. *    Примеры вызова:
  34. (change-layer-freeze nil "SomeLayer" t)
  35. (change-layer-freeze nil "SomeLayer" nil)
  36. |;
  37.   (if (not doc)
  38.     (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  39.   ) ;_ end of if
  40.   (if (= (type (setq layer (vl-catch-all-apply (function (lambda () (vla-item (vla-get-layers doc) name))))))
  41.          'vla-object
  42.       ) ;_ end of =
  43.     (vl-catch-all-apply
  44.       (function (lambda ()
  45.                   (vla-put-freeze
  46.                     layer
  47.                     (if status
  48.                       :vlax-true
  49.                       :vlax-false
  50.                     ) ;_ end of if
  51.                   ) ;_ end of vla-put-freeze
  52.                 ) ;_ end of lambda
  53.       ) ;_ end of function
  54.     ) ;_ end of vl-catch-all-apply
  55.   ) ;_ end of if
  56. ) ;_ end of defun
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн AnatolyАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 3
  • Skype: ant_nkh
Re: Как выключить и включить слой?
« Ответ #2 : 18-05-2021, 22:13:31 »
Спасибо.
Сложность в том, что пишу на VBA, а Lisp использую как дополнение, поэтому не знаток.
А можно про вкл/выкл слой?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Как выключить и включить слой?
« Ответ #3 : 18-05-2021, 22:17:16 »
Все то же самое, только заменить vla-put-layerlock на vla-put-layeron.
P.S. Если основной язык VBA, то зачем использовать lisp? И не пора ли переходить на сторону .NET? :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн AnatolyАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 3
  • Skype: ant_nkh
Re: Как выключить и включить слой?
« Ответ #4 : 18-05-2021, 22:56:39 »
Связка Lisp-VBA и наоборот довольно эффективна, у каждого языка свои преимущества.
На VBA быстрее писать и проще отладка (сразу при выполнении) не надо компилировать как на NET.
Если хватает функционала, то самое то.
Если не хватает, то добавляю LISP.
Впрочем дело вкуса.
Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13193
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выключить и включить слой?
« Ответ #5 : 19-05-2021, 00:15:18 »
Ну, не каждый слой можно разморозить - текущий-то точно не получится.
Заморозить не каждый, а разморозить - каждый.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13193
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выключить и включить слой?
« Ответ #6 : 19-05-2021, 00:16:06 »
Anatoly,
Никто не отменял и командные методы, которые доступны и в Lisp и в VBA.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Как выключить и включить слой?
« Ответ #7 : 19-05-2021, 00:24:35 »
Ну, не каждый слой можно разморозить - текущий-то точно не получится.
Заморозить не каждый, а разморозить - каждый.

Насколько я помню (сейчас ACAD на выключенной машине), смена статуса Frozen для активного слоя в лиспе гарантированно вызывала ошибку. Даже если его попытаться разморозить.
Могу ошибаться.
--
Поправка: вообще вызов vla-put-frozen для активного слоя, и неважно, какое значение там передается.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13193
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выключить и включить слой?
« Ответ #8 : 19-05-2021, 00:25:57 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Как выключить и включить слой?
« Ответ #9 : 19-05-2021, 08:28:35 »
И тем не менее:
Код - Auto/Visual Lisp [Выбрать]
  1. _$ (getvar "clayer")
  2. "0"
  3. _$ (vla-put-Freeze (vla-item (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))) "0") :vlax-false)
  4. ; error: Automation Error. Invalid layer
  5. _1$
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13193
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выключить и включить слой?
« Ответ #10 : 19-05-2021, 10:15:34 »
И тем не менее:
Код - Auto/Visual Lisp [Выбрать]
  1. _$ (getvar "clayer")
  2. "0"
  3. _$ (vla-put-Freeze (vla-item (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))) "0") :vlax-false)
  4. ; error: Automation Error. Invalid layer
  5. _1$
Это явный баг.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Как выключить и включить слой?
« Ответ #11 : 19-05-2021, 10:30:02 »
Это ACAD 2020x64Eng, со всеми установленными обновлениями. Насколько я помню, в более старых версиях поведение было аналогичное.
Да и вручную заморозить текущий слой невозможно :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13193
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как выключить и включить слой?
« Ответ #12 : 19-05-2021, 10:42:51 »
Это ACAD 2020x64Eng, со всеми установленными обновлениями. Насколько я помню, в более старых версиях поведение было аналогичное.
Да и вручную заморозить текущий слой невозможно :)


Т.е. документация говорит о невозможности заморозить текущий слой, но ничего не говорит об ошибке, которая возникает при попытке разморозить текущий слой. И это при том, что замороженным он быть не может... Впрочем при нормальной предварительной проверке на "замороженность" перед разморозкой этой ошибки можно избежать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: Как выключить и включить слой?
« Ответ #13 : 19-05-2021, 10:45:56 »
Я просто оборачиваю в vl-catch-all-apply любые попытки играться с заморозкой слоя. В нетекущем документе, открытом через ObjectDBX, получить активный слой мне не удавалось - отсюда и соответствующие танцы ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!