浅谈LISP的二次开发在CAD中的应用

2016-11-16 07:49王佳卿祝启祥史晓忠
城市道桥与防洪 2016年10期
关键词:图幅二次开发程序设计

王佳卿,祝启祥,史晓忠

(无锡市政设计研究院有限公司,江苏无锡 214072)

浅谈LISP的二次开发在CAD中的应用

王佳卿,祝启祥,史晓忠

(无锡市政设计研究院有限公司,江苏无锡 214072)

主要介绍了通过利用Lisp语言开发程序,在AUTOCAD的工作环境中进行二次开发,以达到提高工作效率的目的。

LISP语言;CAD二次开发;函数语言;开发环境

1 概述

LISP语言(计算机程序设计语言)是一种通用的高级计算机程序设计语言,在人工智能领域内被广泛应用,甚至长期处于一个垄断地位。众所周知的,LISP是计算机领域第一个函数式的高级计算机程序设计语言,是为人工智能设计服务的语言,有别于B、C语言等命令式程序设计语言和Java、C++、C#等面向对象语言。

LISP语言是一种函数式程序设计语言,所以,对于LISP语言而言,在程序编写的过程中,函数所有运算都能以函数作用于参数的方式来实现。

有别于一般的命令式的语言程序,LISP语言几乎不用所谓的变量以及特定的赋值语句,通过对递归的函数的调用,来实现重复的过程,因此,在LISP语言的编写过程中很少使用到循环模式。

LISP是古老的函数语言,弱类型,动态推断,其代码本身就是各种列表。每一个表项均可以储存任何类型的数据,如数字、函数、符号或一个子表等,在编码时,可以随时操作以更新列表。

LISP核心的操作符只有7个操作符:quote、atom、eq、car、cdr、cons、cond。前三者quote、atom、eq用于符号的推断,car、cdr、cons操纵表格;cond负责分支判断。这种简洁定义,非常接近图灵机原型的纯函数式语言,是现代语言完全无法比拟的。

LISP语言最大的相对缺点就是运行效率低下。原始定义简洁的缺点使得大型开发工程变得困难,自底层到高层,自二维表查询到面向对象,使用者需要嵌入更多的函数来实现,致使LISP众多方言的衍生。

VISUAL LISP是AUTOCAD自身自带的一个集成的可视化autolisp开发环境[1],早期的AUTOLISP程序的编辑,是首先使用记事本等文本编辑工具进行编辑操作,然后在autocad的环境中进行加载和调试,过程比较繁琐,不是很人性化。但是,从autocad 2000的版本开始,就开始自带了集成的开发环境:VISUAL LISP。作为一个开发工具,Visual LISP具有一个完整的集成开发环境(IDE),其中包括了编译器、调试器和其他的必要的工具,可以实时进行调试AUTOLISP的命令。

2 工程实例

某市某地铁N号线一期工程整体呈西北-东南走向,线路全长约30 km,均为地下线。地形修测项目修测范围为线路中心线两侧各150 m,在测绘范围内进行1:500地形图测量,修测面积约15 km2。该项目最终完成1:500地形图451幅(50 cm×50 cm),分幅图的分幅原点坐标为(0,0),分幅图图名以东坐标和北坐标的千公里数命名,图名如3428.00-487.25、3428.00-487.50等。经业主验收后,交付设计单位做设计底图使用。在设计单位使用的过程中,设计单位提出:由图1接图表示意图可知,由于一共有451幅图纸,15 km2,而实际的使用过程中不需要全部图幅打开,全部图幅打开,占用计算机内存太大,能否实现即插即用,即需要哪几幅图纸就打开哪几幅图纸,不需要就删除。由于一共有451幅图纸,如果纯粹是人工在文件夹内寻找图幅一幅幅打开,十分浪费时间,且操作麻烦。为了解决这一问题,编写了如下程序:

(SETQ PT(GETPOINT" 请选择要插入标准图幅的位置:"))

(setq X0(atoi(rtos(cadr Pt)2 0)))

(setq Y0(atoi(rtos(car Pt)2 0)))

(setq old_cmd(getvar"cmdecho"))

(setq old_Unit(getvar"insunits"))

(setvar"insunits"0)

(setvar"cmdecho"0)

(VL-LOAD-COM)

(setqAcadObject(vlax-get-acad-object)

AcadDocument(vla-get-ActiveDocument Acadobject)

mSpace(vla-get-ModelSpace Acaddocument)

)

(setq MainPath(vla-get-Path AcadDocument))

(setq Path1500(strcat MainPath"\Mapxc\"))

(princ Path1500)

(setq X2(rtos(/(/X0 250)4)2 0))

(setq Y2(rtos(/(/Y0 250)4)2 0))

(princ"wjq")

(princ X2)

(setq X3(rtos(/(/X0 250)4.00)2 2))

(setq Y3(rtos(/(/Y0 250)4.00)2 2))

(setq X4(substr X3 6))

(setq Y4(substr Y3 5))

(setq Path1500(strcat Path1500 X2"."X4"-" Y2"."Y4".dwg"))

(princ Path1500)

(setq Check1(findfile Path1500))

(progn

(command

"Insert"path1500"0,0""1""1""0"

)

)

)

(if(=nil check1)

(progn

式(2)中的相互作用参数αij对于DPD模拟至关重要.根据著名的Flory-Huggins理论[30]可以表示为

(setvar"insunits"old_unit)

(setvar"cmdecho"old_cmd)

(alert"该区域目前尚没有标准图幅!")

(exit)

)

)

(setvar"insunits"old_unit)

(setvar"cmdecho"old_cmd)

)

该程序的整体思路是:首先,用GETPOINT获得鼠标当点位置的X、Y值,但是,用GETPOINT指令获得的数据是一个字符串,即含有X、Y坐标数值的字符串,要用rtos、cadr、car指令分别获得X坐标与Y坐标的百公里整数数值。然后,通过rtos、substr指令,分别求出当前鼠标所在位置应该所处的图幅号,最终的图幅号通过strcat指令,将多个字符串合并成一个字符串,然后,用findfile指令在分幅图所存放的文件夹内进行匹配,如果匹配成功,则插入匹配成功的对应的图幅,如果匹配失败,则说明当前点所在的位置没有标准图幅,则返回"该区域目前尚没有标准图幅!"

通过该程序,圆满解决了设计单位提出的问题,满足了设计单位对地形图即插即用的要求,得到了业主和设计单位的肯定。

图1 接图表示意图

3 结 语

当前,计算机程序语言的二次开发广泛应用,为工作生产提高了极大的便利[2]。在实际的工程生产中,利用VISUAL LISP在AUTOCAD的环境中进行二次开发,从而达到生产中高精度、高速度、高效率、低风险的目的,是完全切实可行的。现代的商业工程软件尽管功能完备,但大多价格不菲,且不一定能完全贴合自单位的生产需求。自行利用VISUAL LISP在 AUTOCAD的环境中进行二次开发,经济实惠,值得推广,也必将成为今后中小工程生产企业提高生产效率的首选方法。

[1]谢刚生,邹时林.数字化成图原理与实践[M].西安地图出版社, 2000.

[2]阎聚群.AUTOCAD2000 Visual Lisp开发[M].武汉:华中理工大学出版社,2000.

TP312

B

1009-7716(2016)10-0164-02

10.16799/j.cnki.csdqyfh.2016.10.052

2016-01-15

王佳卿(1982-),男,江苏无锡人,硕士,工程师,从事勘察测绘工作。

猜你喜欢
图幅二次开发程序设计
基于Visual Studio Code的C语言程序设计实践教学探索
浅谈基于Revit平台的二次开发
浅谈Mastercam后处理器的二次开发
从细节入手,谈PLC程序设计技巧
西门子Easy Screen对倒棱机床界面二次开发
基于Arcpy的地形图接图表快速生成方法
高职高专院校C语言程序设计教学改革探索
基于EXCEL的地形图图幅号转换查询方法
PLC梯形图程序设计技巧及应用
基于ArcMap的图幅接合表快速生成方法研究