Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Anatoly от 18-05-2021, 17:34:08

Название: Как выключить и включить слой?
Отправлено: Anatoly от 18-05-2021, 17:34:08
Есть имя слоя, надо выключить, потом включить.
Аналогично заморозить/разморозить.
В чертеже, не в видовом экране.
Название: Re: Как выключить и включить слой?
Отправлено: Алексей Кулик от 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
Название: Re: Как выключить и включить слой?
Отправлено: Anatoly от 18-05-2021, 22:13:31
Спасибо.
Сложность в том, что пишу на VBA, а Lisp использую как дополнение, поэтому не знаток.
А можно про вкл/выкл слой?
Название: Re: Как выключить и включить слой?
Отправлено: Алексей Кулик от 18-05-2021, 22:17:16
Все то же самое, только заменить vla-put-layerlock на vla-put-layeron.
P.S. Если основной язык VBA, то зачем использовать lisp? И не пора ли переходить на сторону .NET? :)
Название: Re: Как выключить и включить слой?
Отправлено: Anatoly от 18-05-2021, 22:56:39
Связка Lisp-VBA и наоборот довольно эффективна, у каждого языка свои преимущества.
На VBA быстрее писать и проще отладка (сразу при выполнении) не надо компилировать как на NET.
Если хватает функционала, то самое то.
Если не хватает, то добавляю LISP.
Впрочем дело вкуса.
Спасибо.
Название: Re: Как выключить и включить слой?
Отправлено: Александр Ривилис от 19-05-2021, 00:15:18
Ну, не каждый слой можно разморозить - текущий-то точно не получится.
Заморозить не каждый, а разморозить - каждый.
Название: Re: Как выключить и включить слой?
Отправлено: Александр Ривилис от 19-05-2021, 00:16:06
Anatoly,
Никто не отменял и командные методы, которые доступны и в Lisp и в VBA.
Название: Re: Как выключить и включить слой?
Отправлено: Алексей Кулик от 19-05-2021, 00:24:35
Ну, не каждый слой можно разморозить - текущий-то точно не получится.
Заморозить не каждый, а разморозить - каждый.

Насколько я помню (сейчас ACAD на выключенной машине), смена статуса Frozen для активного слоя в лиспе гарантированно вызывала ошибку. Даже если его попытаться разморозить.
Могу ошибаться.
--
Поправка: вообще вызов vla-put-frozen для активного слоя, и неважно, какое значение там передается.
Название: Re: Как выключить и включить слой?
Отправлено: Александр Ривилис от 19-05-2021, 00:25:57
Могу ошибаться.
Можешь. :)
Название: Re: Как выключить и включить слой?
Отправлено: Алексей Кулик от 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$
Название: Re: Как выключить и включить слой?
Отправлено: Александр Ривилис от 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$
Это явный баг.
Название: Re: Как выключить и включить слой?
Отправлено: Алексей Кулик от 19-05-2021, 10:30:02
Это ACAD 2020x64Eng, со всеми установленными обновлениями. Насколько я помню, в более старых версиях поведение было аналогичное.
Да и вручную заморозить текущий слой невозможно :)
Название: Re: Как выключить и включить слой?
Отправлено: Александр Ривилис от 19-05-2021, 10:42:51
Это ACAD 2020x64Eng, со всеми установленными обновлениями. Насколько я помню, в более старых версиях поведение было аналогичное.
Да и вручную заморозить текущий слой невозможно :)
(https://live.staticflickr.com/65535/51189932055_883df6d20d_o.png)

Т.е. документация говорит о невозможности заморозить текущий слой, но ничего не говорит об ошибке, которая возникает при попытке разморозить текущий слой. И это при том, что замороженным он быть не может... Впрочем при нормальной предварительной проверке на "замороженность" перед разморозкой этой ошибки можно избежать.
Название: Re: Как выключить и включить слой?
Отправлено: Алексей Кулик от 19-05-2021, 10:45:56
Я просто оборачиваю в vl-catch-all-apply любые попытки играться с заморозкой слоя. В нетекущем документе, открытом через ObjectDBX, получить активный слой мне не удавалось - отсюда и соответствующие танцы ;)