明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2364|回复: 13

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

[复制链接]
发表于 2020-10-3 17:41:53 来自手机 | 显示全部楼层 |阅读模式
(setq obj (vlax-ename->vla-object en))
请问:哪些vlax函数不需要以上转换,直接根据en执行
发表于 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).了解一下,挺有意思的.



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
pxt2001 + 1 很给力!

查看全部评分

发表于 2020-10-4 09:35:28 | 显示全部楼层
应该是两套系统,一个是lisp语言,一个是autolisp语言。就像C语言和C++差不多吧。en转换object ,操作就用autolisp中的vl vla vlax vlr之类的操作,不转换就是常规CAD命令和ent* ss* 之类的操作。
发表于 2023-11-3 15:42:00 | 显示全部楼层
vl-系列都是为了对接activeX对象,从VBA应用方法转过来的,就需要这么个函数vlax-ename->vla-object,vl-方法在文字写法上太冗长,不如autolisp简洁,不知道速度差异上是怎么样的
发表于 2020-10-4 00:03:10 来自手机 | 显示全部楼层
是lisp对象转vlisp对象才需要
 楼主| 发表于 2020-10-4 09:02:45 来自手机 | 显示全部楼层
比如说,(vlax-curve-getClosestPointTo (car (entsel)) pt )可以运行,对象的图元名(car (entsel))不需要用 vlax-ename->vla-object转换,还有哪些函数不需要转换?
发表于 2020-10-5 10:20:58 | 显示全部楼层
不用去计较了,带vl* 的函数我也是需要才碎片化的知道点点,有些确实可以用en,一般直接转obj行了,又不麻烦
发表于 2020-10-5 17:29:07 | 显示全部楼层
自己写清楚这个类型转换不好吗?

最好还是自己非常明确每个变量的类型,而不是依赖于所调用的函数是否支持这样的多态。
 楼主| 发表于 2020-10-6 16:33:57 | 显示全部楼层
wyl219 发表于 2020-10-5 05:06
Alisp是lisp的一个方言,本质上和lisp是一样的语言,都是面向过程的仅仅是增加了几个函数,Vlisp其实也是lisp ...

发表于 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一下,经常回来看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 08:42 , Processed in 0.188080 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表