- 积分
- 3466
- 明经币
- 个
- 注册时间
- 2010-9-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 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
评分
-
查看全部评分
|