您的当前位置:首页正文

LISP编程语言在CAD绘图中的应用

2021-03-27 来源:易榕旅网
LISP编程语言在CAD绘图中的应用

江明明

【摘 要】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.

因篇幅问题不能全部显示,请点此查看更多更全内容