江明明
【摘 要】CAD因为其完善的功能和简便的操作已经在被广泛的应用,做为一种二次开发工具,LISP依据其语法简单,编写程序便捷、灵活、数据类型丰富等特点也得到了许多技术人员的学习和研究.它也可以在应用程序中使用对话框语言、控制菜单,还能够提示用户输入、直接访问内置AutoCAD命令,以及修改或创建图形数据库中的对象,向AutoCAD添加专用命令等.
【期刊名称】《北京测绘》
【年(卷),期】2016(000)001
【总页数】3页(P113-115)
【关键词】LISP;编程;CAD
【作 者】江明明
【作者单位】天津市勘察院,天津300191
【正文语种】中 文
【中图分类】P208
1 引言
AutoCAD的主要二次开发语言有Auto LISP、VBA和Object ARX。
在这三种开发工具中,Object ARX拥有对AutoCAD最深入的控制能力,能够提供最多类型的窗体。使用ARX可以像AutoCAD注册自己的命令,用户运行拟的程序时无需了解关于AutoCAD更多的知识。这种便利的代价就是编制ARX程序比VBA和LISP程序需要花费更多的时间,因此用来编制简单的绘图工具有点浪费了。
VBA,这种工具对初学者来说非常友好,Visual Basic的代码阅读起来非常容易,很多初学者仅读了函数的名称就能理解一个问题。无论如何创建或者执行LISP命令来扩充拟的访问手段,这种开发工具没有ARX和LISP那么多对AutoCAD访问的方式。但是对VBA来说,最大的遗憾就是不能向AutoCAD注册命令,必须先用各种加载应用程序的方法将其对应的dvb文件加载,然后通过“工具/宏/宏“菜单执行。
LISP,首先简单描述一下Auto LISP。Auto LISP兼备快速开发工具的特点和COBOL语言的灵活性,LISP是快速编写应用程序的最初的开发工具,大量的LISP程序库存在于世界各地。
结合我们平时的工作,如果是做些大型的二次开发,或者对窗口,对话框的要求比较高的话,那么前两种方法是必选。如果是基于命令行,对图形进行文字、图块处理,LISP
语言比较合适。
2 LISP基础知识
AUTOLISP是由Autodesk公司开发的一种LISP程序语言。第一篇关于LISP的参考文献是由John McCarthy在1960年4月的《ACM通讯》中发表的。除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生存下来,并且已经成为人工智能的首选程序语言。
3 lisp编程思想解决方案
日常工作中经常会遇到的情况有:1.勘测定界图要求更改地类。2.地籍图对汉字楼层数的处理。3.勘界点号或地籍点号在排列过程中,统一加上某个字母。
3.1 lisp对图块的处理
图块是用一个图块名命名的一组图形实体的总称。可以像对待其他普通的对象一样。在CASS中种植的地类全部为块,并且它们是以图块名不同进行区别的。不同的图块名代表着不同的地类。所以只要更改图块名,就能更改其地类符号。对于工作中遇到更改地类的情况,就很适合用LISP语言编程进行批量处理。
3.1.1 获取更改后的图块名
(while(=A0 NIL) (prompt\\n选取来源图 块:) (setq A0 (ssget “:
S” ‘((0,”INSERT”)))))
用一个循环语句提示用户选择来源图块,并且只能选择图块,否则无效。
(setq BN (cdr (assoc 2 (entget (ssname A0 0)))))
获取图块名。图块名存在于组码2中,用assoc检索实体数据表。Cdr返回在表中的第二个元素,即为图块名。
3.1.2 选择要处理的图块
对于选择集,提供了三种方法:窗选、依据多边形选择、全部选择。这三种选择方法可以分情况处理。
如果要处理的图块较少、容易选择,且知道它的分布情况,可以使用窗选。如果图块分布的比较杂乱,不容易选择,则可以使用多边形选择。如果要对整张图形的图块替换,则可以使用第三种方法。
3.1.3 利用subst函数替换数据表
用entmod函数更新数据表,即可完成图块的替换。
3.2 依据多边形选择的实现原理
LISP语言提供选择函数(ssget[mode][pt1[pt2]][pt-list][filter-list]),pt1和pt2参数是代表点的表。所以要实现多边形选择,就必须获得多边形的顶点坐标表。
4 程序应用
LISP编程语言对地形图中的楼层注记处理
在绘制宗地图的过程中,宗地图中的楼层注记为汉字,这给绘图带来很大的麻烦。因为基础地形图中的楼层注记为阿拉伯数字。所以这个转换过程是很费时费力的。用LISP编程语言有两种方法可以处理。
4.1 建立一个汉字数字和阿拉伯数字一一对应的库
比如,“一”对应“1”,“十一”对应“11”,“九十九”对应“99”。当然这方法比较麻烦,但是处理方法比较简单,适合实际工作的需要,因为大部分的楼层数不会超过50层。所以可以利用(cond(test1 result1…)…)语句,进行判断,建立50个判断语句,进行文字替换。
比如,一位数,进行一一对应。“一”对应“1”,一直到“九”就应“9”。两位数,分为两个一位数,中间加一个字“十”。“21”分为“2”和“1”,然后对应为“二十一”。同理三位数,分为三个一位数。
代码举例
(defun sb(ent)
(setq e1(entget ent))
(setq e1 (subst(cons 8"楼层数")(assoc 8 e1)e1))
(entmod e1)
(setq x (- (cadr(assoc 10 e1)) 2))
(setq y(caddr(assoc 10 e1)))
(setq jd(list x y 0.0))
(cond
((= (cdr (assoc 1 e1)) "Z")(command "_insert""dj1" jd "1" "1""0"))
((= (cdr (assoc 1 e1)) "z")(command "_insert" "dj1" jd "1" "1""0"))
((= (cdr (assoc 1 e1)) "Z2")(command "_insert" "dj2" jd "1"1" "0"))
"((= (cdr (assoc 1 e1)) "Z3")(command "_insert" "dj3" jd "1" "1""0"))
……
)
)
4.2 LISP编程语言对字符串处理
在勘测定界、核定用地、地籍测量的时候要注记点号。点号的格式不一致,有J1,J2,J3……,或者H1,H2,H3……。利用CASS软件成图,能得到的点号仅为1,2,3……。要在上面统一加上字母显然比较费劲。利用lisp语言即可统一批量的对字符串进行处理。
第一步(setq text(cdr(assoc 1 (entget(ssname A0 0)))))获取要添加的字符。组码1表示字符串的内容。
第二步(strcat srting[string2]…),此函数将用来连接string1、string2等字符串,并返回最后得到的字符串。用此语句可以对点号进行字符串的处理,在其前或者后添加字母。
第三步 更新数据表。
4.3 LISP语言进行统计运算
工作中,我们会经常处理一些线性工程。这些线性工程的长度就需要统计。以下代码是对CAD中多个线段的长度进行统计求和。
(defun C:cd(/CURVE TLEN SS N SUMLEN)
(vl-load-com)
(setq SUMLEN 0)
(setq SS (ssget'((0 ."CIRCLE,LINE,*POLYLINE"))))
(setq N 0)
(repeat(sslength SS)
(setq CURVE(vlax-ename->vlaobject(ssname SS N)))
(setq TLEN (vlax-curve-getdistatparam
CURVE
(vlax-curve-getendparam CURVE)
)
)
(setq SUMLEN (+ SUMLEN TLEN))
(setq N (1+ N))
)
(print(strcat"总长度:"(rtos SUMLEN 2 5)))
(princ)
)
5 总结
本文只是介绍了lisp语言的一些简单的应用。当然用lisp可以解决的问题远不止这些。以上的编程可以用命令行实现,也可以利用菜单实现。可以把自己的命令放在CASS系统的菜单文件里,也可以建立自定义的后缀为mnu菜单文件。
在实际工作中,情况错综复杂,需要对程序不断的修改,来满足不断变化的情况,正所谓兵无常形,水无定式。LISP语言对解决实际工作中的小问题是很有帮助,但是如果
要建立大型的开发系统,这种语言毕竟有其局限性。如果我们能够用好它,把各种小问题给解决了,也是能极大的提高作业效率的。
参考文献
【相关文献】
[1]李灶强.用LISP语言实现分幅图的自动提取[J].城市勘测,2015,(3):76-78.
[2]任航科.LISP语言在测绘作业中的应用[J].城市勘测,2011,(1):110-112.
[3]张炜,周斌麟.Visual LISP和CASS相结合实现断面图的自动绘制[J].测绘与空间地理信息,2011,(4):253-254.
[4]黄太山.Auto Lisp在CASS图形要素规范化中的应用[J].北京测绘,2013,(5):68-69.
[5]王军锋;刘文清;王大勇.等高线等间距高程自动标注的方法实现 [J].测绘科学,2014,(5):152-154.
[6]郭秀娟.Auto LISP语言程序设计[M].北京:化学工业出版社,2008.
因篇幅问题不能全部显示,请点此查看更多更全内容