一开始是怎么学习Autolisp的呢

2382人阅读
AutoCAD二次开发(1)
最近发现,做CAD二次开发的,要么是计算机相关专业的,没有CAD基础;要么是工程制图出身,不会编程。所以写了这篇博客,AutoLisp学习笔记,根据我的学习经验,旨在给没有基础的你指明学习的方向,让读者少走弯路。
AutoLISP语言是开发AutoCAD的主要工具,是LISP语言和AutoCAD有机结合的产物,在AutoCAD的发展及壮大过程中起到了重要的作用。CAD二次开发可以使用、和语言,均为各种方式开发了平台。之所以使用,是因为经过多年的累积,已经有很多的基础代码,方便程序的开发。
掌握开发,需要准备如下知识:、语言&基础&函数&进阶。
一.&语言相关知识
跟我们学过的语言有很大的不同,语言是解释性语言,只有两个基本单位:原子()和列表()。这里推荐如下两个博客,前者是一个常用的语言的开发环境,后者是语法学习,配合使用快速学习。这样,半天的时间可以对语言有初步的概念。递归是的精髓,如果看懂链接博客中的所有示例,那么可以进行下一步了。
【Lisp语言在下搭建环境】
【Lisp入门】
AutoCAD博大精深,对于我们这些开发人员,只需了解些基本操作和概念就足够了。个人认为如下几个概念比较重要,部分可以在术语帮助中找到。
CAD的操作几乎都可以用命令描述,如创建一个以原点为圆心,半径为的圆,可用如下几种命令形式完成。中不区分大小写。
(1)CAD命令&
在命令栏里键入,然后就可以用鼠标在绘图窗口中操作指定圆心和半径。
(2)&AutoLisp命令
_$ (setq center ‘(0 0 0))
_$ (command “circle” center 100)
(注:是控制台的前置符,启动的命令是,在控制台和命令栏均可使用命令及方法。在命令栏查看变量前面加感叹号!)
学习过前面语言后,应该可以理解,命令其实是函数,即提供给开发人员的函数。前者为变量设置值,后者是与的接口,可以向命令行直接发送命令和参数。其中列表&‘(0&0&0)和原子&分别为圆心和半径的参数。如上命令括号不能省略,表示其为函数。
(3)Active&X方法
_$ (vl-load-com)
_$ (setq acad_obj (vlax-get-acad-object))
_$ (setq acad_document (vla-get-activedocument acad_obj))
_$ (setq m_space (vla-get-modelspace acad_document))
_$ (vla-addcircle m_space (vlax-3d-point ‘(0 0 0)) 100)
Active&X技术通过将的对象显示在外部使用户以各种编程的方式访问对象。函数&提供了访问对象的各种方法。这里只是引入,说明了命令,命令和方法均能对进行操作。
&2、图层。
& & 一组具有一定逻辑关系的数据,类似于覆盖在图形上的透明硫酸纸。可以单独查看每个图层,也可以同时查看多个图层。与中图层的概念一样,一个绘图可由多个叠加的图层组成,不同的图元可以选择绘制在哪个图层上。通过命令(命令)可以生成或者选择图层。
&3、选择集。
& & 顾名思义,选择集就是选择的集合,在绘图窗口中,点击鼠标左键拖动鼠标,所选择的图元构成选择集。在中可以用&函数对选择进行处理和过滤,得到自己想要到集合。
4.&图元对象属性及组代码
图元,顾名思义,就是中最小的操作单位,如上面画的一个圆,还可以是插入的块。在中,每个图元其实就是一个对象,它们具有各种属性,比如前面画的属性包括实体名,实体类型,辅助实体名,所在图层名,圆心坐标,半径等。这些属性都是用组代码的形式写入的。组代码使用语言的点对结构表示图元对象的属性,类似于中结构。可用函数查看。
_$ (command “circle” ‘(10 286.611 50.)
_$ (setq ent1 (entlast))
_$ (entget ent1)其中,函数返回最后的图元,上述返回结果如下:
((-1 . &图元名: 7ffff705c20&)
(0 . &CIRCLE&)
(330 . &图元名: 7ffff7039f0&)
;辅助实体名
(5 . &23A&)
(100 . &AcDbEntity&)
;实体子类说明
;空间类型说明
(410 . &Model&)
(100 . &AcDbCircle&)
(10 286.611 50.)
(210 0.0 0.0 1.0))
;3D延伸方向
更多关于可参考的帮助。如果想得到该图元的圆心坐标,使用如下代码。
_$ (cdr (assoc 10 (entget ent1)))
(286.611 50.)※拓展:也可以用的方法进行访问。
_$ (setq myobject (vlax-ename-&vla-object (entlast)))
#&VLA-OBJECT IAcadCircle be66f8&
_$ (vlax-safearray-&list (vlax-variant-value (vlax-get-property myobject 'center)))
(286.611 50.)这里涉及到方法和函数,看不懂可先跳过,有概念即可。
表示结合起来以创建单一对象的一个或多个对象。常用于块定义或块参照。在块编辑窗口中可增加其属性,在中使用遍历属性。
6.AutoCAD的自定义配置
AutoCAD强大的平台可以使用户自定义工作区间,包括菜单,面板,双击动作等等,还能定义新的命令,可以说,的灵活和个性化是软件的精髓,是公司屹立不倒的根基。
敲击命令:,或者【工具】【自定义】【界面】
这里可以自定义用户界面,比如想添加一个查看图元属性的菜单选项,可以按如下步骤:
(1)创建自定义命令&点击命令列表中的五角星,这里使用默认名称“命令”
(2)编辑自定义命令的宏,其中表示连按两下,保证退出其他命令。键入命令:
^C^C(entget (SSNAME (SSGET) 0))&/span& (3)打开菜单栏,在文件菜单中,将命令列表的“命令”拖动进去。点击确定退出。
图表&1&CAD自定义界面
(4)单击选中窗口中任一图元,然后再文件菜单中点击“命令”,发现命令栏里返回图元的属性信息。
7.AutoCAD支持文件配置
&类似于Java的环境配置,是程序寻找文件的目录列表。
三.AutoLisp函数
参考任一一本关于AutoLisp的书均可。推荐下《AutoCAD&2008&Visual&LISP二次开发入门到精通》,现已绝版(⊙﹏⊙b汗)。AutoLisp函数是二次开发的基础,基本函数不多,是Lisp语言在AutoCAD环境下的扩展,容易掌握。
四.Visual&Lisp集成开发环境
CAD命令栏键入 VLIDE 命令弹出VisualLisp开发环境,包括编译器,调试器和其他工具,提高编程效率。控制台窗口可以像AutoCAD命令行那样输入AutoLisp命令,还可以输入Visual LISP命令。
五.AutoLisp进阶
&1.使用ActiveX对象
我们可以把整个AutoCAD理解为一个对象的模型,包括样式设置对象,组织结构对象,图形显示对象,图元对象,AutoCAD本身也是一个对象。这些对象根据包含关系组成了层次结构,称为对象模型。既然为对象,那么就有属性值和方法。下面我们根据一个例子讲下ActiveX对象的使用方法。我们将使用三种方法完成。
例:画直线,根据图元名称获得其对象,并得到直线的两个端点。并将直线向x轴负方向挪动1000。
1.1&ActiveX对象属性的操作
(1) 选择直线工具,在绘图窗口中绘制一条直线
(2)打开,在控制台窗口键入如下代码:
(vl-load-com)
(setq line-object (vlax-ename-&vla-object (entlast)))
#&VLA-OBJECT IAcadLine 4d58&
若要用访问指定的图形对象,则可以先找到对象的图元名,再将这个名称转化为对象,之后就可以按照访问对象的方法访问了。通过上面两行代码,我们就得到了刚刚画的直线的对象,并保存在变量中。
& & 右键变量,选择【检验】。弹出【检验】窗口,这里我们可以看到这个变量的多个属性。其中和便是线段的起点和终点。这里我们看到值为,这是一种型的数据类型,术语“变体”。变体是应用在对象操作中使用的数据类型,可以通过内置的函数与中的数据相互转化,下面我们将看到应用。双击,弹出子窗口,我们可以看到该变体的值是一个元素类型为的,安全数组也是一种数据类型。双击,弹出子窗口我们终于看到终点坐标。
图表&2&ActiveX对象检验
接下来我们使用代码完成读取工作
_$ (setq endp (vla-get-endpoint line-object))
#&variant 8197 ...&
_$ (setq endp2 (vlax-variant-value endp))
#&safearray...&
_$ (setq endp3 (vlax-safearray-&list endp2))
(0.77 0.0)
其中,,是函数。同样如法炮制得到起点的坐标值:
_$(setq startp3 (vlax-safearray-&list (vlax-variant-value (vla-get-startpoint (vlax-ename-&vla-object (entlast))))))
(234.156 .0)
接下来设置新的坐标
_$ (setq newEndP (list (- (nth 0 endp3) 1000) (nth 1 endp3) (nth 2 endp3)))
_$ (setq newStartP (list (- (nth 0 startp3) 1000) (nth 1 startp3) (nth 2 startp3)))
(-765.844 .0)
接下来将新的坐标写入该对象写入函数要求写入参数应当为变体类型,所以我们创建了两个安全数组,。
_$ (setq NewEndP2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))
#&safearray...&
_$ (vlax-safearray-fill NewEndP2 NewEndP)
#&safearray...&
_$ (setq NewStartP2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))
#&safearray...&
(vlax-safearray-fill NewStartP2 NewStartP)
#&safearray...&
_$ (vla-put-startpoint line-object NewStartP2)
_$ (vla-put-endpoint line-object NewEndP2)
同样地,我们可以不用,而是采用内部命令来完成上述工作。
_$(setq ent1 (entget (entlast)))
_$(setq oldEndp (assoc 11 ent1)) ;终点坐标DXF组码值为11
_$ (setq oldStartp (assoc 10 ent1)) ;起点坐标DXF组码值为10
_$ (setq newEndp (list 10 (- (nth 1 oldEndp) 1000) (nth 2 oldEndp) (nth 3 oldEndp)))
_$ (setq newStartp (list 10 (- (nth 1 oldStartp) 1000) (nth 2 oldStartp) (nth 3 oldStartp)))
_$ (setq ENT1 (subst newEndp oldEndp ENT1))
_$ (setq ENT1 (subst newStartp oldStartp ENT1))
_$ (entmod ENT1)
可能这时你就有疑问了,既然两种办法都可改变图元的属性,那还用干嘛。其实相比于其他环境,接口技术速度快,效率高,随安装,便于使用。另外的对象交互技术使得可与外界应用程序交互,拓宽了开发的应用范围。
1.2&ActiveX对象属性的操作
Visual&Lisp提供了Vlax-invoke-method函数来调用ActiveX的方法。使用的时候要注意将参数转化为ActiveX型,除非参数的默认分配类型(见将数据类型转换为ActiveX型)正好为所需的类型。对于上面的,我们如何知道该对象所支持的方法呢,下面提供个人经验。首先使用函数列出所支持的方法。
_$ (vlax-dump-object line-object t)
; IAcadLine: AutoCAD Line 接口
Angle (RO) = 0.620333
Application (RO) = #&VLA-OBJECT IAcadApplication 3318&
Delta (RO) = (.338 0.0)
Document (RO) = #&VLA-OBJECT IAcadDocument fb96bc8&
EndPoint = (1.22 0.0)
EntityTransparency = &ByLayer&
Handle (RO) = &236&
HasExtensionDictionary (RO) = 0
Hyperlinks (RO) = #&VLA-OBJECT IAcadHyperlinks a12ad8&
Layer = &0&
Length (RO) = 1672.68
Linetype = &ByLayer&
LinetypeScale = 1.0
Lineweight = -1
Material = &ByLayer&
Normal = (0.0 0.0 1.0)
ObjectID (RO) = 42
ObjectID32 (RO) = 42
ObjectName (RO) = &AcDbLine&
OwnerID (RO) = 43
OwnerID32 (RO) = 43
PlotStyleName = &ByLayer&
StartPoint = (97.8 0.0)
Thickness = 0.0
TrueColor = #&VLA-OBJECT IAcadAcCmColor a12890&
Visible = -1
;支持的方法:
ArrayPolar (3)
ArrayRectangular (6)
GetBoundingBox (2)
GetExtensionDictionary ()
GetXData (3)
Highlight (1)
IntersectWith (2)
Mirror (2)
Mirror3D (3)
&span style=&color:#ff0000;&&Move (2)&/span&
Offset (1)
Rotate (2)
Rotate3D (3)
ScaleEntity (2)
SetXData (2)
TransformBy (1)
这里我们看到有个名字为的方法,猜想其可以完成图元的移动,是否如此呢,查看帮助中的“”部分,查找,确实是我们预想的那样。接下来我们使用这个函数同样完成将直线向轴负方向挪动的工作。方法接受两个参数,,分别表示移动向量的起点和终点。显然这里的坐标分别为和&。参数类型要求为,我们先构造两个类型的,然后转化为变体类型。(转化为变体类型这一步并非必须,因为会被强制转化为)最后作为实参代入函数,看能否同样完成前面的工作。
图表&3&Move方法帮助
(setq Point1 (vlax-make-safearray vlax-vbDouble '(0 . 2)))
#&safearray...&
(setq Point2 (vlax-make-safearray vlax-vbDouble '(0 . 2)))
#&safearray...&
(vlax-safearray-fill Point1 (list 0 0 0))
#&safearray...&
(vlax-safearray-fill Point2 (list -))
#&safearray...&
_$ (setq Point1 (vlax-make-variant Point1))
;;转换为变体类型,非必须
#&variant 8197 ...&
_$ (setq Point2 (vlax-make-variant Point2))
#&variant 8197 ...&
_$ (vlax-invoke-method line-object &Move& Point1 Point2)
然后将窗口切换到绘图窗口,直线确实按照我们预想的一样,又往轴负方向移动了单位。
总结:对于某一对象,使用函数可以列出该对象的属性值和适用的方法。对属性值的操作,可以采用和为前缀的函数。方法就比较复杂,若要查找相应的操作函数的使用方法,可以参考帮助中的“”部分。并应用方法调用对象的方法。版本以后,开发不再随软件安装,所以帮助部分也不容易找到了。网站可供参考使用。
&2.ActiveX对象交互
在Visual&Lisp环境中,也可以使用其他应用程序的ActiveX对象。笔者在开发的时候,遇到XML和CAD信息交互的问题,上网搜索,发现没有解析XML的LISP库,如果自己写XML解析,势必大大影响项目进展。终于在ActiveX对象中找到灵感,下载了一个XML的ActiveX控件,加载到自己的程序里完成项目开发。(见我的另一篇博客,)
【欢迎转载,请注明出处】
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
AutoLISP培训教程(doc+64)
下载积分:0
内容提示:AutoLISP培训教程(doc+64)
文档格式:DOC|
浏览次数:1|
上传日期: 13:23:05|
文档星级:
该用户还上传了这些文档
AutoLISP培训教程(doc+64)
官方公共微信建筑结构分区
查看: 777|回复: 3
听众数收听数最后登录注册时间主题精华0积分25帖子
技术员, 积分 25, 距离下一级还需 25 积分
一本很实用的AutoLISP_DCL教材
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 7
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 6
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
976.56 KB, 下载次数: 5
09:36 上传
点击文件名下载附件
716.01 KB, 下载次数: 5
听众数收听数自我介绍不错的论坛,奇奇怪论坛
最后登录注册时间主题精华0积分192帖子
三星助理工程师, 积分 192, 距离下一级还需 8 积分
我靠,一次能上传完的,分这么多压缩包上传,这不明摆着要我们的命吗?
听众数收听数最后登录注册时间主题精华0积分25帖子
技术员, 积分 25, 距离下一级还需 25 积分
老兄 您就辛苦点喽!这样比较快嘛!
听众数收听数最后登录注册时间主题精华0积分41帖子
技术员, 积分 41, 距离下一级还需 9 积分
有恶意赚“币”的嫌疑呢。一次就能上传完毕嘛
8-1(商易宝)
8-2(英才网)
8-3(媒体广告)
(资料专属客服)}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信