LISP在三维管线的长度统计方法中的应用

2016-05-05 01:27朱镇波王佳卿
城市道桥与防洪 2016年5期
关键词:多义二次开发程序设计

朱镇波,王佳卿,滕 松

(1.无锡市测绘院有限责任公司,江苏 无锡 214000;2.无锡市政设计研究院有限公司,江苏 无锡 214000)

LISP在三维管线的长度统计方法中的应用

朱镇波1,王佳卿2,滕 松1

(1.无锡市测绘院有限责任公司,江苏 无锡 214000;2.无锡市政设计研究院有限公司,江苏 无锡 214000)

主要介绍了通过利用Lisp语言开发程序,在AUTOCAD的工作环境中对三维管线的电子图中的数据进行统计计算,精确计算三维管线的长度数据,有关经验可供相关专业人员参考。

LISP语言;CAD二次开发;三维管线

1 概 述[1,2]

现代城市地下综合管线信息,是现代城市空间基础地理信息的一个重要的组成部分,是现代城市进行规划建设和管理所需要的重要基础地理信息。现代城市地下综合管线信息化建设,是现代城市信息化、数字化建设工作的重要组成部分。在现代化大都市建设的过程中,地下综合管线信息的调查越来越受到相关领导部门的重视。积极推进城市地下综合管线信息化的建设,是当前时代的需要,是城市现代化、信息化、数字化建设的需要,也是构建和谐社会的需要。

传统的综合管线图的成图方法为野外数据采集后室内计算机成图,当成图完成后,一般要对综合管线的长度进行统计计算。在综合管线图中,管线一般是以多义线(PLINE)来表示的。很多的商业管线软件,自带有统计计算的功能,但商业管线软件需要购买,很多单位未必会购买。

在CAD中自带有两个指令,一个为DIST指令,一个为LIST指令。

DIST指令为测量两点之间的平面距离,而我在上面的文章中说到,管线一般是用多义线(PLINE)来表示的,是三维的、空间的,如果用DIST指令来测量管线的长度,那得出的是管线投影在平面上的长度,并不是真实的长度,因此,在管线长度的统计工作中,使用DIST指令来统计管线的长度是不正确的。

LIST指令的作用是对于一个或多个对象,返回一个关于一个或多个对象相关属性的表。在实际操作中我们可以发现,当对PLINE线进行LIST指令操作时,返回的是一张包含多种属性的表,其中就包含了三维长度。但是,LIST指令只具备了以表的形式显示属性的功能,而在管线图中,对于任意一条管线,它并不是一条完整的多义线(PLINE),而LIST指令不具备统计求和的功能。如果采用LIST指令+人工统计求和的方法,不仅容易出错,而且还浪费时间和精力,如果去购买商业管线软件的话,又是一笔不小的开支。因此,笔者决定利用CAD二次开发的方法,来提高工作效率和准确率。

2 LISP语言与CAD的二次开发

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众多方言的衍生。

3 具体的实例

图1为某项目的综合管线图。该项目位于苏南丘陵区域,该项目区域位置靠山,地势略有起伏。该综合管线图内含有多种地埋管线和架空管线,管线用PLINE线进行表示,架空管线随着地势的起伏行走,高差变化较大。因此,DIST指令在该工程中是不建议使用的,如果采用LIST指令+人工统计求和的方法,不仅容易出错,而且还浪费时间和精力,这是相当的不可取的,笔者决定用LISP语言对CAD进行二次开发。

图1 某项目综合管线图

下面就是具体的执行程序执行语言及其说明:

(setq ObjATrigon(ssget));

获取所有图元

(setq lngNum(sslength ObjATrigon));

取得图元的数目

(setq LngCycle 0)(setq sngAPline 0.00)(While(< LngCy cle lngNum)(setq objSTrigon(ssname ObjATrigon LngCycle));

获取单个图元

(setq AcadObject(vlax-get-acad-object)Acad Document(vla-get-ActiveDocumentAcadobject)mSpace(vla-get-ModelSpace Acaddocument));

初始化系统

(setqvlaSTrigon(vlax-ename->vla-objectobjSTrigon);

将转化成VLA对象

(setq sngSPline(vla-get-Length vlastrigon))

(setq sngAPline(+sngAPline sngSPline))

(setq LngCycle(+LngCycle 1)))

(princ" 所有线段总长")(princ sngAPline);

显示统计管线的总长

这个程式第一步完成对选择范围内的多义线的数量进行统计,第二步完成对提取每条多义线的三维长度,第三步完成对累加选择范围内的多义线的长度。这样就利用LISP自编的程序高效、高精度的完成了本工程的内业工作量的统计计算的问题。

4 结语

当前,计算机程序语言的二次开发的广泛应用,为工作生产提高了极大的便利。因此,利用上述方法统计综合管线图的管线长度是一种高精度、高速度、高效率、低风险的方法。在不购买商业管线软件的前提下,该方法完全可以取代其他统计综合管线图的管线长度的方法,经济实惠,值得推广,也必将成为今后中小管线测绘单位统计综合管线图的管线长度的首选方法!

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

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

TB22

B

1009-7716(2016)05-0234-02

10.16799/j.cnki.csdqyfh.2016.05.065

2016-01-14

朱镇波(1980-),男,江苏无锡人,工程师,从事工程测量工作。

猜你喜欢
多义二次开发程序设计
基于Visual Studio Code的C语言程序设计实践教学探索
浅谈基于Revit平台的二次开发
浅谈Mastercam后处理器的二次开发
从细节入手,谈PLC程序设计技巧
西门子Easy Screen对倒棱机床界面二次开发
高职高专院校C语言程序设计教学改革探索
维吾尔语动词“t∫iqmap”多义范畴的语义延伸机制
PLC梯形图程序设计技巧及应用
《锦瑟》赏析
ANSYS Workbench二次开发在汽车稳定杆CAE分析中的应用