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

10/06/2013

Управление прозрачностью слоев с помощью LISP

Вопрос:

Почему не работает код? vla-get-transparency подсвечивается синим в VLIDE, но я получаю текст ошибки:

"Error: ActiveX Server returned the error: unknown name: Transparency"

 

Код - Auto/Visual LISP: [Выделить]
  1. (vl-load-com)
  2. (setq ent (entsel))
  3. (if ent
  4.   (progn
  5.     (setq vla_obj_name  (vlax-ename->vla-object (car ent))
  6.           vla_obj_layer (vla-get-layer vla_obj_name)
  7.           vla_act_doc   (vla-get-activedocument (vlax-get-acad-object))
  8.           layername     (vla-item (vla-get-layers vla_act_doc) vla_obj_layer)
  9.           ) ;_ end of setq
  10.     (if (>= (atof (substr (getvar "acadver") 1 4)) 18.1)
  11.       (setq proptran (vla-get-transparency layername))
  12.       ) ;_ end of if
  13.     ) ;_ end of progn
  14.   ) ;_ end of if
  15.  

 

Решение:

Свойства, к которым Вы получаете доступ через COM, базируются на API ActiveX.

Если посмотреть на свойство Transparency в справке по ActiveX, Вы увидите, что оно доступно только для примитивов класса AcadRasterImage и AcadWipeout.

Прозрачность примитивов (доступная для AutoCAD начиная с версии 2011) обеспечивается новыми интерфейсамм (IAcadEntity2) и называются как EntityTransparency. В случае со слоями, прямого доступа к прозрачности нет.

Но значение прозрачности можно вычислить, используя XData. Если такие данные не записаны, считается, что прозрачность равна 0%.

 

Код - Auto/Visual LISP: [Выделить]
  1. ;; gets transparency in percentage 
  2. (defun getlayertransparency (layername / layer transparency)
  3.   (setq layer (tblobjname "LAYER" layername))
  4.   ;; get the XData of AcCmTransparency    
  5.   (setq transparency
  6.          (cdr (assoc 1071
  7.                      (cdar (cdr (assoc -3
  8.                                        (entget layer '("AcCmTransparency"))
  9.                                        ) ;_ end of assoc
  10.                                 ) ;_ end of cdr
  11.                            ) ;_ end of cdar
  12.                      ) ;_ end of assoc
  13.               ) ;_ end of cdr
  14.         ) ;_ end of setq
  15.   (if (= transparency nil)
  16.     ;; if we did not get a value it must be the default 0% 
  17.     (setq transparency 0)
  18.     ;; if we got a value then calculate from it 
  19.     (progn
  20.       ;; get the lower byte of the value 0..255 
  21.       ;; (100%..0% in the AutoCAD user interface) 
  22.       (setq transparency (lsh (lsh transparency 24) -24))
  23.       ;; convert the value to a percentage 
  24.       (setq transparency (fix (- 100 (/ transparency 2.55))))
  25.       ) ;_ end of progn
  26.     ) ;_ end of if
  27.   ) ;_ end of defun
  28.  
  29. (defun c:testget (/ ent layername transparency)
  30.   (setq ent (car (entsel)))
  31.   (setq layername (cdr (assoc 8 (entget ent))))
  32.   (setq transparency (getlayertransparency layername))
  33.   (princ transparency)
  34.   (princ)
  35. ) ;_ end of defun

 

Установить прозрачность таким методом - устанавливая значения Xdata, - не представляется возможным. Но для этого можно использовать команду _.-layer:

 

Код - Auto/Visual LISP: [Выделить]
  1. (defun c:testset (/ ent layername transparency)
  2.   (setq ent (car (entsel)))
  3.   (setq transparency (getint "\nTransparency value"))
  4.   (setq layername (cdr (assoc 8 (entget ent))))
  5.   (command "_.-LAYER" "_TR" transparency layername "")
  6.   (princ)
  7. ) ;_ end of defun

 

Источник: http://adndevblog.typepad.com/autocad/2013/04/get-and-set-layer-and-entity-transparency-using-lisp.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=95.0

Опубликовано 10.06.2013