pxt2001 发表于 2020-10-3 17:41:53

关于 vlax-ename->vla-object函数的疑问

(setq obj (vlax-ename->vla-object en))
请问:哪些vlax函数不需要以上转换,直接根据en执行

wyl219 发表于 2020-10-5 05:06:28

本帖最后由 wyl219 于 2020-10-5 05:10 编辑

Alisp是lisp的一个方言,本质上和lisp是一样的语言,都是面向过程的仅仅是增加了几个函数,Vlisp其实也是lisp的一个方言,不过增加了更多的函数.Vlisp最大的优势是利用面向过程的lisp语言实现了面向对象理念.
举个简单的例子,获取一个直线的长度,用Alisp来写就是:
(setq en (car (entsel))) ;获取图元名(对象的标识)
(setq ed (entget en)) ;在图形的符号表里通过对象的标识获取对象的信息
(setq pt1 (cdr (assoc 10 ed))) ;获取对象信息表里的起点
(setq pt2 (cdr (assoc 11 ed))) ;获取对象信息表里的终点
(distance pt1 pt2) ; 计算起点到终点的距离
可以看到其中一步一步的过程被你安排的明明白白,你面向的是计算直线长度的这个过程.

而用Vlisp的话,是这么写的.
(setq en (car (entsel))) ;获取图元名(对象的标识)
(setq obj (vlax-ename->vla-object en)) ;通过对象的标识获取对象
(vlax-get obj 'Length) ;获取对象的长度
可以看到,除了获取对象这部分需要你来考虑过程之外,获取长度的过程是怎么实现的,你完全不知道,因此可以说,以上步骤,其实我们是面向对象的.

面向对象最大的优势就是适应性更强.对于Alisp的那段来说,如果对象变成了多段线,那么得到的结果是错误的,想要适应多段线和直线,就需要先判断对象的类型,然后采用不同的分支,不同的过程.而面向对象则不然,只要要处理的对象有长度这个属性,就可以用一样的过程来解决.
因此你看Vlisp函数的介绍,都会有一个支持的对象的列表.


其实对于Vlisp来说,完全可以提供一个直接获取Obj的函数,或将ename转换成obj的过程封装到每个函数中,为什么不这么做我也不清楚:$

因此,vlax所有函数其实都是对vla对象生效的,例如题主提到的vlax-curve-getClosestPointTo函数,传入vla对象也完全没问题.能接受ename对象,应该是因为函数内部做了转换,从名字猜测,curve是创造的意思,可能就是创造一个vla对象并处理.

测试了几个函数,函数名为vlax-curve-*的函数均能接收图元名或vla对象,部分vlax-*函数也能支持图元名,例如vlax-write-enabled-p等.而Vlax-get,Vlax-put,Vla-get-*,Vla-put-*系列函数,以及对vla特有对象处理的函数则不支持图元名.

其实也可以这么理解,对于实体对象处理的vla和vlax函数,除了vlax-ename->vla-object等少量函数,均支持vla对象,因此随手转一下应该没错.
以上测试针对AutoCAD2012,更低版本可能结果不同.
一点题外话,lisp其实是一个很有意思的语言,虽然几乎是最古老(第二个)的高级语言,缺少很多常见语言的功能,比如for循环,但是又有一些常见的高级语言不支持的特性,比如foreach.可以说是最不友好的格式(全是小括号),但是依旧有一批死忠(不是指Alisp).了解一下,挺有意思的.



G〆h 发表于 2020-10-4 09:35:28

应该是两套系统,一个是lisp语言,一个是autolisp语言。就像C语言和C++差不多吧。en转换object ,操作就用autolisp中的vl vla vlax vlr之类的操作,不转换就是常规CAD命令和ent* ss* 之类的操作。

我爱lisp 发表于 2023-11-3 15:42:00

vl-系列都是为了对接activeX对象,从VBA应用方法转过来的,就需要这么个函数vlax-ename->vla-object,vl-方法在文字写法上太冗长,不如autolisp简洁,不知道速度差异上是怎么样的

czww26 发表于 2020-10-4 00:03:10

是lisp对象转vlisp对象才需要

pxt2001 发表于 2020-10-4 09:02:45

比如说,(vlax-curve-getClosestPointTo (car (entsel)) pt )可以运行,对象的图元名(car (entsel))不需要用 vlax-ename->vla-object转换,还有哪些函数不需要转换?

wzg356 发表于 2020-10-5 10:20:58

不用去计较了,带vl* 的函数我也是需要才碎片化的知道点点,有些确实可以用en,一般直接转obj行了,又不麻烦

e2002 发表于 2020-10-5 17:29:07

自己写清楚这个类型转换不好吗?

最好还是自己非常明确每个变量的类型,而不是依赖于所调用的函数是否支持这样的多态。

pxt2001 发表于 2020-10-6 16:33:57

wyl219 发表于 2020-10-5 05:06
Alisp是lisp的一个方言,本质上和lisp是一样的语言,都是面向过程的仅仅是增加了几个函数,Vlisp其实也是lisp ...

20060510412 发表于 2021-2-24 23:17:15

wyl219 发表于 2020-10-5 05:06
Alisp是lisp的一个方言,本质上和lisp是一样的语言,都是面向过程的仅仅是增加了几个函数,Vlisp其实也是lisp ...

写得真好,mark一下,经常回来看看

趣意人生 发表于 2021-9-28 22:11:56

wyl219 发表于 2020-10-5 05:06
Alisp是lisp的一个方言,本质上和lisp是一样的语言,都是面向过程的仅仅是增加了几个函数,Vlisp其实也是lisp ...

写得真好,mark一下,经常回来看看
页: [1] 2
查看完整版本: 关于 vlax-ename->vla-object函数的疑问