通常,我们可以使用以下功能检索和修改(除非是只读的)任何VLA对象的ActiveX属性(无论是在AutoCAD对象模型内(AutoCAD应用程序对象的子对象[vlax get acad Object]),还是从另一个对象模型(如Excel应用程序)导出):
- (vlax-get-property <VLA-Object> <Property-Of-Object>)
和
有关AutoCAD对象模型以及这些函数之间的差异的更多信息,请参阅我在此之前的文章。
这些特性的ActiveX帮助文档(位于acadauto.chm本地帮助文件中,或在此处联机)将采用以下格式(图层特性用作以下示例):
在这里,object是ActiveX属性适用的VLA对象,即具有此特定ActiveX属性的对象。
.Layer是相关ActiveX属性的名称;由于AutoLISP不区分大小写,因此此属性名也不区分大小写,但是,在其他编程语言中,此类属性通常区分大小写。
因此,在上面的示例中,我们看到图层特性适用于所有图形对象,包括属性引用和组。
我们还看到,Layer属性的值具有字符串数据类型,并且该属性的值指示分配给对象的层的名称。
因此,在实践中,我们可以通过以下方式检索该属性的值:
- _$ (setq obj (vlax-ename->vla-object (car (entsel))))
- #<VLA-OBJECT IAcadLine 21c326bc>
- _$ (vla-get-layer obj)
- "0"
- _$ (vlax-get-property obj 'layer)
- "0"
- _$ (vlax-get-property obj "layer")
- "0"
- _$ (vlax-get obj "layer")
- "0"
我们可以用类似的方式修改该属性:
ActiveX方法
ActiveX方法也可用于操作VLA对象。虽然对象具有固有属性,每个属性都包含一个值,但ActiveX方法可能需要多个参数来对VLA对象执行操作。
与ActiveX属性类似,与AutoCAD对象模型中的方法相关的每个ActiveX方法也具有由AutoCAD类型库自动生成的“方便”功能,该功能采用以下格式:
同样,我们可以使用广义函数调用任何VLA对象(从任何对象模型导出)的方法:
如我在前面的链接中所述,还有未记录的函数vlax get/vlax put/vlax invoke,它将使用本机AutoLISP数据类型,而不是Visual LISP使用的Safearray和Variant数据类型;不过,为了避免离题,可以在此处找到有关这些函数的更多信息。
以移动方法为例,ActiveX方法的文档使用以下格式:
同样,object是ActiveX方法可以操作的VLA对象;在这种情况下,我们可以对所有图形对象(包括属性引用)调用move方法。
然后,点1和点2是该方法所需的输入参数(某些方法的参数可能是可选的-这将在参考中的参数旁边注明)。
从参考资料中可以看出,这些参数是移动向量的第一点和第二点,或者换句话说,是移动操作的基点和位移。
我们还可以看到,这些参数属于变量数据类型(有关安全阵列和变量的更多信息,请参阅开发人员文档);变量包含相对于世界坐标系(WCS)表示的三维点。
对于三维点变体,根据这些方法的要求,Visual LISP以vlax-3D-point函数的形式提供了另一个“方便”函数。该函数将接受两个或三个数值参数作为X、Y和Z坐标,或者坐标列表,并将返回一个变量,该变量包含包含三个坐标值的双精度一维安全数组。
因此,我们可以按以下方式调用move方法:
或者,使用vlax invoke method函数:
我希望这能澄清ActiveX和VBA参考的格式。