本科毕业论文(设计)
题目: 利用AutoLISP语言批量修改
CASS下高程点高程
学院:
班级:
姓名:
指导教师: 职称:
完成日期: 年 月 日
山西大同大学 本科生毕业设计
中文题目:利用AutoLISP语言批量修改CASS下高程点高程 英文题目:Using AutoLISP language to modify the elevation of
elevation point in batch CASS 学 院: 煤炭工程学院 姓 名: 学 号: 专 业: 班 级:
指导教师: 职 称: 完成日期: 年 月 日
大同大学本科毕业论文(设计)原创性声明
作者声明:我所呈交的毕业论文(设计)是在指导教师指导下独立进行研究工作所取得的成果。除文中已经标明引用的内容外,本论文不包含其他个人或集体已经公开发表的研究成果。本声明的法律结果由本人承担。
毕业论文(设计)作者签名:
签字日期: 年 月 日
指导教师声明:该生所呈交的毕业论文(设计)是在本人指导下独立完成的,相关的检测报告已审阅。除文中已经标明引用的内容外,本论文不包含其他个人或集体已经公开发表的研究成果。
指导教师签名:
签字日期: 年 月 日
山西大同大学 2016 届本科毕业论文(设计)开题报告书
学院: 系别: 专业(专业方向): 论文题目 论文类型 利用Auto LISP语言批量修改CASS下高程点高程 A理论研究;B应用研究;C应用理论研究;D产品设计;E工程技术开发;F软件开发与应用;G其它。 A理论研究;B实验;C实习或实践;D工程实践;E社会调查;F毕业展演;G其它。 职称 学生姓名 学号 完成方式 指导教师 一、研究目的(选题的意义和预期应用价值) 南方CASS是基于CAD平台,进行二次开发专门为测绘成图而设置的专业成图系统。利用CASS软件进行软件成图时,有时会出现高程点出错的情况,在多次编辑不便重新成图的情况下,修正高程值则是一个必须的过程,南方CASS对于高程修改有一个专门的命令“changed”,但一次只能修改一个点高程,当修改的高程点较多时,则比较不方便。这时,通常做法是将点位坐标高程导出到Excel,在Excel上进行修改再导入CASS,进行展绘。但这种办法也不方便,在数据量大的情况下,工作量也很大。而运用Auto LISP语言即AutoCAD的二次开发功能则能很好的解决这一问题。 AutoCAD的二次开发功能特别强大。AutoCAD 软件二次开发是在现有软件基础上, 为提高和完善软件功能, 使之更符合用户需求而对软件所做的开发工作 ,目的是提高设计质量和效率及充分发挥通用 AutoCAD 软件价值。二次开发将应用对象的设计规范、构造描述 、设计方法等以约束关系形式集成到通用 AutoCAD 平台中去, 使应用对象设计智能化、集成化,也是将 AutoCAD 环境客户化的基本手段 。Auto LISP( List Processing Language) 是一种内嵌于 AutoCAD 中表处理高级程序设计语言, 能够直接在AutoCAD 内部运行 ,是迄今人工智能领域中应用最广泛的程序设计语言之一 . Auto LISP 既具备一般高级语言的基本结构和功能 ,又具有一般高级语言所没有的强大图形处理功能; Auto LISP 可直接调用几乎全部的AutoCAD 命令,它语法简洁 ,表达能力强, 函数种类多 ,程序控制结构灵活 ;是进行 AutoCAD 二次开发的理想工具。 运用Auto LISP语言进行CASS高程的批量修改简单,快捷,不仅使得工作效率提高,而且可以更好的了解该语言,对AutoCAD的二次开发功能能够更好的利用。
二、利用现状 1、 AutoCAD及Auto LISP语言在规划建筑红线放线测量中的应用(李玉洁 2012) 在CAD软件上对建筑进行方向,距离的几何定位后,需要为外业的放线工作提供几何(坐标)资料,以及为施工建设单位提供桩位图。利用CAD可以对放线点逐一查询坐标值,进行标记,抄录。但这种方法需要耗费大量的精力与时间去做重复的工作,且容易出错。而利用Auto LISP语言编程则可以解决这些问题,可以利用程序绘制坐标点,进行放样点位标注,方便,简洁。很大程度上提高作业效率。 设计思路: (1)放样点标记,标记相应的点号,放在点号层,用模板指定的颜色标记; (2)将放样点坐标用线条引出,标记在选取点附近,将线条与坐标文字放在坐标层,使用指定颜色; (3)为配合坐标放样,将所有选取的点位以点号的格式形成一个坐标文件,设置文件名,与图形文件放在同一目录下,方便查询管理。 2、如何在AutoCAD环境下利用Auto LISP语言建立符号库 (孔令壮 邓玉柳 2013)
目前,南方CASS软件都附带了标准的地籍图符号库,符号库的应用不仅可以减轻工作量,而且在很大程度上提高了工作效率,成为业内制图必不可少的工具。但符号库只罗列了常用符号,一些地域性,专业性强的符号只能手工绘制。本文介绍如何在AutoCAD环境下利用Auto LISP语言建立符号库。 设计原则:依据国家测绘总局和总参谋部测绘局颁布的《地形图图式》保证附后一体,属性关联,应用方便,切实提高工作效率。 设计思路:(1)设计符号库(点,线,面状符号); (2)建立图式符号库,赋予代码,便于调用。 不仅于此,Auto LISP在绘图中的应用在很多领域都发挥了极大作用,例如建筑,公路,铁路,煤矿开采等等。
三、可行性研究及成果预计 在CAD中利用Auto LISP语言进行二次开发已经有很多成功的例子,在批量操作上也有很多实例值得借鉴,例如: 批量修改多义线宽 如在需大量修改多义线宽的图形中 ,用 petit 命令 ,一根一根地改线宽非常慢, 笔者用 Auto LISP 语言编一个函数程序, 完成一次性选定修改. 程序如下: ( defun C : wpline( ); 统一修改线宽 ( setq s( ssget) w( getreal “w idth : ”) ) ( setq n( sslength s) n(- n 1) ) ( while(>= n 0); 循环 ( setq n1( ssname s) ); 取当前目标名称 ( if( k ( cdr( assoc 0( entget n1) ) )“polyline”) ( command “pedit”( cdr( assoc -1( entget n1) ) )“w”“w”“ x”) ) ( setq n(- n 1) ); 目标个数减“1” ) ) 所以对于利用Auto LISP语言批量修改CASS高程完全是可行的。 利用Auto LISP语言编程修改高程,首先得了解该语言,Auto LISP 之所以能功能如此强大,都有赖功能函数,其成员共约200个: 1、一般性函数170个 2、ADS 定义特殊函数9个 3、配合 DCL 交谈框设计函数 22个 那么掌握这些函数,了解语法则是必不可少的。因为是内置语言,所以在CAD上加载该语言是很方便的,对于本课题,要达到修改高程注记,合理分配位置的效果。 对于本次设计,要达到的成果不仅仅是对高程点的批量修改操作,还应达到根据注记值来修改高程点的效果,这样,这次设计才能算完成。
四、课题研究的主要方法、策略和步骤 设计主要思路: (1)确定需要达到的效果,功能; (2)确定编程的进行思路; (3)选择编程需要的代码语句; (4)将程序功能分解,分步完成各个功能,最后进行整合; (5)对程序进行改进,完善。 主要方法: (1)查找相关资料,整理资料; (2)依据设计要求和指导老师的提示选择合适的代码语句进行构建; (3)将整个程序分解后一个一个进行制作修改,在编译器上做调试; (4)最主要的是了解Auto LISP语言的语法结构及代码 五、参考文献 [1] 唐争气, 胡润希. 基于Auto Lisp的局部高程点批量检查与修改技术[J]. 电脑编程技巧与维护, 2013(2):76-77. [2] 龚子桢, 花向红, 尹相宝,等. 基于Auto LISP的高程点批量修改算法设计与实现[J]. 测绘通报, 2011(4):41-43. [3] 郭秀娟, 范晓鸥. 基于Auto LISP的AutoCAD二次开发研究[J]. 吉林建筑工程学院学报, 2008, 25(4):82-84. [4] 张广伟. Excel、Word与CASS(AutoCAD)在测量绘图中的应用[J]. 北京测绘, 2006(2):8-12. [5] 祁宇明, 曹巨江, 高文华. 基于Autolisp的二次开发参数化设计[J]. 陕西科技大学学报:自然科学版, 2006, 24(1):76-79. [6] 高红岩. 南方CASS7.0软件中关于批量修改高程注记的几种方法[J]. 环球人文地理, 2015(4) [7] Autolisp基础教程[EB/OL] 六、指导教师意见 指导教师签字: 年 月 日
大同大学本科毕业论文(设计)中期检查记录表
(指导教师、学生用表)
学院: 专业(专业方向): 毕业年度: 论文(设计)题目:利用Auto LISP语言批量修改CASS下高程点高程 学生姓名 指导教师 学号 职称 学位 综述学生在论文(设计)完成过程中的研究态度、与指导教师分时段的联系情况及对存在问题的解决情况。 学生签字: 指导教师签字: 年 月 日 年 月 日
山西大同大学2016届本科毕业论文(设计)指导教师评分表
(指导教师用表)
学院: 专业(专业方向): 毕业年度: 论文(设计)题目:利用Auto LISP语言批量修改CASS下高程点高程 学生姓名 指导教师 指导教师评语: 指导教师签字: 年 月 日 评 价 项 目 写作过程 01 02 03 选题质量 04 05 06 论文质量 07 08 指导教师评定成绩 写作过程中的认真程度 写作过程中,进度掌握情况 选题与专业培养目标相符情况 选题体现专业特点情况 选题体现三基的要求情况 知识综合运用能力 结构、方案设计、应用价值 写作规范情况 A B C D E 学号 职称 学位 优秀 良好 中等 及格 不及格 毕业论文(设计)分工情况:(多人合作时填写,包括本人研究的内容及其在课题中所占比例) 评定成绩参考:优秀为7项A,另一项为B;良好为6项B或A,其它至少为B;中等为5项B或A,其它至少为C;及格为4项B或A,其它至少为D;不及格为4项为E。
山西大同大学2016届本科毕业论文(设计)评阅人评分表
(评阅人用表)
学院: 煤炭工程学院 专业(专业方向):测绘工程 毕业年度:2016 论文(设计)题目:利用Auto LISP语言批量修改CASS下高程点高程 学生姓名 指导教师 评 阅 人 学 号 职 称 职 称 评阅人评鉴 评审项目 指 标 01 选题与专业培养目标相符情况 选题质量 02 选题体现专业特点情况 03 综合运用知识能力 能力水平 04 运用资料文献能力 05 研究方案设计能力 06 论点论据、语言表达 论文水平 07 整体结构、应用价值 08 写作规范情况 评阅人评定成绩 评定成绩参考: 优秀为7项A,另一项为B; 良好为6项B或A,其它至少为B; 中等为5项B或A,其它至少为C; 及格为4项B或A,其它至少为D; 不及格为4项为E。
A B C D E 优秀 良好 中等 及格 不及格
山西大同大学2016届本科毕业生论文(设计)答辩记录表
(答辩组用表)
学院: 专业(专业方向): 姓名: 学号: 论文题目 利用Auto LISP语言批量修改CASS下高程点高程 答辩委员会 答辩委员会 职称 主任(或组长) 秘 书 答辩委员会 成 员 答辩记录(包含答辩委员提出的问题,学生回答情况等) 记录人签字: 答辩委员会主任(答辩小组组长)(签字): 年 月 日 年 月 日
山西大同大学2016届本科毕业论文(设计)答辩评分表
(答辩组用表)
学院: 专业(专业方向): 毕业年度: 论文(设计)题目:利用Auto LISP语言批量修改CASS下高程点高程 学生姓名 指导教师 姓 名 学 号 职 称 性 别 男 男 女 职 称 指导教师评分 评阅人评分 学 位 答辩小组职务 答辩委员会/答辩小组名单 答辩委员会(答辩小组)评鉴 评审项目 01 02 03 论文评价 04 05 06 07 08 答辩表现 09 10 指标 选题与专业培养目标相符情况 选题体现专业特点情况 综合运用知识能力 运用资料文献能力 研究方案设计能力 论点论据、语言表达 整体结构、应用价值 写作规范情况 自述情况 答辩过程 A B C D E 答辩委员会(答辩小组) 评定成绩 优秀 良好 中等 及格 不及格 毕业论文(设计)最终得分 答辩委员会主任(答辩小组组长)签字: 年 月 日 评定成绩参考: 优秀为9项A,另一项为B;良好为8项B或A,其它至少为B;中等为7项B或A,其它至少为C;及格为6项B或A,其它至少为D;不及格为5项为E。
摘 要
CASS软件是基于CAD平台开发的一套集地形、地籍、空间数据建库、工程应用、土石方算量等功能为一体的软件系统。本次设计所用到的Auto LISP语言工具是在CAD平台上加载运行的,所以批量修改CASS下高程数据就要涉及到AutoCAD的二次开发。
针对AutoCAD的二次开发,Auto LISP语言一直是一个强有力的工具。利用Auto LISP语言编写的一些小程序可以与Auto CAD很好的结合起来,从而有效的提高Auto CAD的图形处理功能。本文针对 CASS下地形图高程数据存在的一些高程缺陷、注记与高程点Z值不符、显示或范围内批量修改问题,设计了多边形内匹配高程点和注记以及角度匹配高程点与注记且批量修改 CASS 地图形中高程值局部错误的算法, 利用Auto LISP语言编写该算法,并在AutoCAD中实现该算法以解决CASS下导入高程点错误的情况。
关键词: CASS;Auto LISP;批量修改;AutoCAD二次开发;匹配
ABSTRACT
CASS software is based on CAD platform for the development of a set of terrain, cadastral spatial database building, engineering applications, count the amount of earthwork and other functions into one software system. The Auto LISP language design tool used is loaded on CAD platforms, so the bulk edits under CASS elevation data would relate to AutoCAD secondary development.
For the secondary development of AutoCAD, Auto LISP language has always been a powerful tool. Use Auto LISP language written small programs with Auto CAD can be a good combination, so as to effectively improve Auto CAD graphics capabilities. In this paper topographic map elevation data exists under CASS some elevation flaws, note discrepancies credited with elevation point Z value, display or bulk modifications within the scope of the problem, design a polygon matching elevation points, and annotation and angle to match the elevation point annotation and bulk editing CASS value of the local ground elevation drawing the wrong algorithm, using Auto LISP language of the algorithm, and implementation of the algorithm in AutoCAD to solve the case of CASS import elevation points wrong.
Keywords: CASS; autolisp; bulk edits;autocad secondary development; match
目 录
1 绪论 ......................................................................... 1 2 CASS软件及AutoCAD的二次开发介绍 ............................................. 2 2.1 CASS软件简介 .............................................................. 2 2.2 AutoCAD二次开发 ........................................................... 2 2.2.1 二次开发的目的 ......................................................... 2 2.2.2 二次开发的工具 ......................................................... 3 2.2.3 二次开发的主要内容 ..................................................... 3 3 Auto LISP语言概述 ............................................................ 5 3.1 Auto LISP语言简介 ......................................................... 5 3.2 Auto LISP语言的特点 ....................................................... 5 3.3 本次设计的主要Auto LISP函数介绍 ........................................... 6 3.3.1 表处理函数 ............................................................. 7 3.3.2 判断函数 ............................................................... 8 3.3.3 选择集创建 ............................................................ 10 3.3.4 AutoCAD函数 .......................................................... 11 3.4 Auto LISP语言的使用案例 .................................................. 12 3.4.1 直线画圆 .............................................................. 12 3.4.2 修改圆半径 ............................................................ 13 4 程序算法及程序的编写 ......................................................... 15 4.1 文字注记的批量操作 ........................................................ 15 4.1.1 修改注记的算法 ........................................................ 15 4.1.2 修改注记的程序实现 .................................................... 16 4.2 高程点Z值的修改 .......................................................... 18 4.2.1 高程点Z值的修改算法 .................................................. 18 4.2.2 修改高程点Z值的程序实现 .............................................. 19 4.3 范围内高程点与注记匹配 .................................................... 21 4.3.1 角度匹配 .............................................................. 21 4.3.2 距离自动匹配与人工干预进行匹配 ........................................ 22 4.4 颜色转变 .................................................................. 24 4.5 程序演示及讲解 ............................................................ 27 4.5.1 对高程点与注记进行角度匹配的批量修改 .................................. 27
4.5.2 对高程点与注记进行距离匹配的批量修改 .................................... 29 5 结论与展望 .................................................................. 34 参考文献 ...................................................................... 35 致谢 .......................................................................... 36
山西大同大学煤炭工程学院2016届本科生毕业设计
1 绪论
高程是地形图的地形要素之一,是图形的立体表述,由高程点及高程注记组成。在基于CASS导入的数字化地形图中,高程点一般是由具有三维坐标的图块表示,X、Y值表示高程点的平面位置,Z值表示高程点高程数值。高程注记是高程Z值的图面表述,不仅应标注在高程点附近,而且还应该与高程点Z值相等。地形图用于制图时,一般使用注记表达相应点高程即可,而当利用数字地形图进行三维立体展示、土石方计算、建立高程模型等工作时,就需要利用高程点的高程值来实现。但在实际工作中,经常会发生高程点高程值和高程注记不一致的情况。
在CASS中可以通过高程点修改命令对高程点Z值进行修改,但局限性太高,只能做到单个点修改或者对整个图面高程加减一个定值,无法做到局部或者指定一些点来进行修改,也不能完成对图面高程点Z值的正确性进行检验。这时,基于这些问题的出现及实际工作中的要求,寻找合适简便的解决方法便势在必行。
AutoCAD开放的结构为不同的使用者留出了非常广的发挥空间,提供了多种二次开发工具,Auto LISP是其中应用最多功能也最强的一个。本次设计也是利用Auto LISP语言来对此进行程序编辑,更好的理解和使用该语言能帮助我们更加方便快捷的进行绘图。
1
山西大同大学煤炭工程学院2016届本科生毕业设计
2 CASS软件及AutoCAD的二次开发介绍
2.1 CASS软件简介
CASS软件是广州南方测绘仪器有限公司开发的一款在CAD平台上运行的集地形、地籍、绘图处理、建立空间数据库、工程应用及计算土石方等功能于一体的软件系统。
CASS软件是广大测绘人熟悉的软件,无论是做平面还是三维图形,CASS内部的许多绘图功能使得成图方式变得更为容易。具体的功能由于太多,不能一一叙述,在此,就讲述一下CASS软件与本次设计的关系。对高程点进行修改,首先要做的是导入高程点数据,将全站仪或RTK获得的坐标数据导出到文件,按CASS展点要求修改数据的排列方式后即可将数据在CASS中呈现出来,呈现的点便是我的设计对象,可以说CASS软件是一个数据导入平台,虽然操作平台是在AutoCAD上,但最终的结果还是要回归到CASS上进行应用。同时,CASS软件与AutoCAD软件之间可以进行自由转换更是方便我们进行图形处理。
2.2 AutoCAD二次开发
2.2.1 二次开发的目的
AutoCAD是目前在Windows和MAC系统中应用最为广泛、使用人数最多的CAD软件。但它只给我们提供了基础的CAD功能,如果我们想完成具体项目设计,就必须根据数据一笔笔绘制出图形,这样一旦在设计完成之后,要更改局部图形则需要重复原来的全部内容。造成了大量工作量的浪费。
如果使用AutoCAD的开发系统,我们就可以将以上的过程用程序编制出来,在工程设计需要时,利用命令语句调入程序就可以运行这个程序,自动完成绘图过程。显然,这不仅大大提高了设计效率,而且,还可以通过定制来完成某些专业化的模块,甚至大型设计软件。本次设计就是用到了CAD的二次开发功能,将图形修改功能从复杂变为只需一个命令,大大提高了绘图效率。
2
山西大同大学煤炭工程学院2016届本科生毕业设计
因此,要提高绘图效率,让图形处理变得简便容易,不做过多的重复性操作,就必不可少要用到AutoCAD的二次开发功能。 2.2.2 二次开发的工具
从AutoCAD 2.18开始推出Auto LISP开始到现在,我们所能使用的开发工具主要有:Auto LISP、VisualLISP、VBA、COM外部接口、ObjectARX、ObjectARX.NET等开发方式。下面主要对VisualLISP进行简要介绍,Auto LISP将会在下一章进行介绍:
在AutoCAD R14.01中,Autodesk公司首次提供了一种新的LISP编程工具:Visual LISP,它是一种面向对象的开发环境,是Auto LISP的扩展和延伸。在AutoCAD中,Visual LISP被集成到了AutoCAD环境之中。作为开发工具,Visual LISP提供了一个完整的集成开发环境(IDE),包括编译器、调试器和其他工具,可以实时调试Auto LISP命令。Visual LISP是一种半编译的API。由于它的可编译性所以大大提高了它的运行效率和安全性。同时它又与Auto LISP完全兼容,提供了Auto LISP的所有功能,同时它又能够访问AutoCAD的多文档环境,以及对COM/ActiveX技术的支持和反应器等。
2.2.3 二次开发的主要内容
(1)编写用户自定义的各种函数,形成若干LISP、ARX、VLX或ADS文件,以及一些DCL文件。
(2)建立一个符合用户要求的菜单文件,一般可在AutoCAD原菜单文件内添加用户定义的内容。
(3)在系统的.LSP以及类似文件中加入某些自定义内容以便进行各种初始化操作,如在启动时就装入一些文件等。
(4)通过系统对话框设置某些操作路径。这些操作在程序开发成功后向其它AutoCAD系统上安装应用,特别是需要大批安装时,需要进行很多文件输入、内容增删、子目录创建、文件拷贝、系统设置等繁琐工作,如能令上述工作全部自动进行,使整个二次开发程序在无人干预的情况下嵌入系统,将大大提高工作效率
(5)面向用户对象,让用户能够根据自己的需要来编写相关的程序,进行二次开
3
山西大同大学煤炭工程学院2016届本科生毕业设计
发。
在本章节中,从利用CASS软件导入高程数据进行展点到利用AutoCAD的二次开发功能进行绘图工具编辑,可以发现在本次设计,二者的结合必不可少,缺一不可。
4
山西大同大学煤炭工程学院2016届本科生毕业设计
3 Auto LISP语言概述
3.1 Auto LISP语言简介
LISP(List Processing Language)是一种基于计算机的表处理语言,是在人工智能领域广泛应用的程序设计语言。Auto LISP语言是嵌套在AutoCAD内部的一种计算机语言,是AutoCAD开放式体系结构的具体体现,同时也是LISP语言和AutoCAD有机结合的产物。使用Auto LISP语言可直接调用几乎全部的AutoCAD命令。Auto LISP语言既具备一般高级语言的基本结构和功能,又具有一般高级语言所没有的强大图形处理功能,是当今世界CAD软件中被广泛应用的语言之一。
美国AutoDesk公司在AutoCAD内部嵌入Auto LISP语言的目的是让用户充分利用AutoCAD进行二次开发,来实现直接增加和修改CAD命令,以扩大图形编辑功能,建立图形库和数据库,并能对当前图形进行直接的访问和修改,开发CAD软件包等。在AutoCAD为用户提供的Auto LISP、VBA等开发工具中,Auto LISP语言是一种简便易学的解释性语言,具有很强的数据表处理功能,是一种开发AutoCAD的重要手段。
Auto LISP语言能够利用PDB函数驱动DCL(Dialog Control Language)文件来创建自己的对话框。
Auto LISP语言的嵌入,使得仅作为交互式图形编辑软件的AutoCAD软件变成能进行计算机辅助设计、绘图的CAD软件。鉴于LISP语言的灵活多样且便于学习和使用,使得AutoCAD成为功能很强的绘图工具软件。
3.2 Auto LISP语言的特点
Auto LISP具有以下特点:
(1)Auto LISP表达式的形式为前缀式表达式;
(2)Auto LISP中的一切成分都是以函数的形式给出的,Auto LISP语言没有语句
5
山西大同大学煤炭工程学院2016届本科生毕业设计
概念或者其他的语法结构。执行Auto LISP程序就是来执行一些函数,再去调用其他函数;
(3)Auto LISP把数据和程序统一起来表达为表结构,即S-表达式,因此可把程序当作数据处理,也可把数据当作程序执行;Auto LISP是在普通LISP语言基础之上,在扩充了许多适用于AutoCAD应用的特殊功能之后而形成的一种计算机语言,是一种只能以解释方式在AutoCAD内部运行的程序设计语言;
(4)Auto LISP中的程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能;
(5)Auto LISP比较典型的程序结构就是递归方式,递归方式的使用,使得程序设计简便易懂。
3.3 本次设计的主要Auto LISP函数介绍
Auto LISP语言主要用到如下数据类型:
表3-1 数据类型与代码
数据类型 整型数 实型数 符号 字符串
表(及用户定义的函数)
文件描述符 Auto LISP的内部函数 AutoCAD的选择集 AutoCAD的实体名
函数分页表
代码 (INT) (REAL) (SYM) (STR) (LIST) (FILE) (SUBR) (PICKSET) (ENAME) (PAGETB)
在本次设计中,用到很多语句函数,将其中比较重要和比较难掌握的在这里讲解一下。
6
山西大同大学煤炭工程学院2016届本科生毕业设计
3.3.1 表处理函数
(1)(LIST <表达式>……)
该函数将任意数目的表达式的值按顺序串联在一起,并返回由他们组成的表。 (list ‘a ‘b ‘c) 返回(A B C) (list‘a‘(b c)‘d) 返回(A (B C) D) (list 3.6 9.7) 返回(3.6 9.7) 重要应用:给点赋值
(setq x 4.5 y 9.0);给x,y赋值
(setq pt (list x y))等效于(setq pt ‘(4.5 9.0))返回(4.5 9.0);赋值给pt 命令:!pt 显示(4.5 9.0) (2) (ASSOC <关键字> <关联表>)
关联表又称A一表,它是以点对或子表为元素组成的表,子表中的第一个元素为“关键字”。
ASSOC函数搜索<关联表>,以找到此表中<关键字>,提取包含<关键字>的一个元素,并返回该子表,若未找到<关键字>,则返回NIL。
例如:
(SETQ L ((0 . “CIRCLE”) (8 . “MYLAYER”)
(10 5.0 7.0 0.0) (40 . 1.0)));给L赋值,一个集合 则
(ASSOC 0 L) 返回(0 . “CIRCLE”) (ASSOC 40 L) 返回(40 . 1.0) (ASSOC 10 L) 返回(10 5.0 7.0 0.0) 例如:
(SETQ m ‘((name box)(width 3)(size 4.2)(depth 5.1)));命令一个图框 则
(ASSOC ‘size m) 返回(size 4.2) (ASSOC ‘width m) 返回(width 3)
7
山西大同大学煤炭工程学院2016届本科生毕业设计
例如:
(SETQ A ‘((d . 30)(L . 60)(R . 4)));赋值A 则
(ASSOC‘R A) 返回(R . 4) (ASSOC‘H A) 返回NIL (SETQ F ‘(Q W E T 5 6 7)) 则
(ASSOC ‘E F) ;错误:关联列表错误:(Q W E T 5 6 7)
(3) (SUBST <新项> <旧项> <表>)
该函数从<表>中搜索<旧项>,将<表>中的每一个<旧项>用<新项>替换,并返回替换后的表;如果<表>中没找到<旧项>,则该函数返回没有更改的表。
例如:
(SETQ sample ‘(a b (c d) b)) 则
(SUBST ‘qq ‘b sample) 返回(A QQ(C D)QQ) (SUBST ‘qq ‘(c d) sample) 返回(A B QQ B) (SUBST ‘(qq rr) ‘z sample) 返回(A B(C D)B)
注意:SUBST函数常常与ASSOC函数一起使用,方便地替换与关联表中的关键字相对应的值。 3.3.2 判断函数
(1)“条件判断函数”的格式为: (if 条件判断 表达式1 [表达式2])
函数用于程序的分支结构。函数中的“条件判断”由关系运算函数和逻辑运算函数组成,根据数学关系进行判断。函数的功能为根据判断结果,在程序流程中形成分支,即如果条件表达式返回判断结果为T(真),则执行“表达式1”;如果判断结果为nil(假),则执行“表达式2”;如果缺少表达式2,则表示不执行表达式1,函数
8
山西大同大学煤炭工程学院2016届本科生毕业设计
不返回任何值。相当于BASIC语言中的“if…then…else”或“if…then”语句。例如:
(if (< x 0) (setq a (+ a b)) (setq a (- a b)))──如果关系函数x<0满足,返回T,则执行表达式1:a=a+b;如果条件不满足则返回nil,执行表达式2:a=a-b.
(if (< dx 0) (setq Azm (+ Azm Pi) (if (< dy 0) (setq Azm (+ Azm Pi Pi)))))──条件判断函数的“分层嵌套结构”。外层的条件表达式的条件dx<0如果满足,则执行Azm=Azm+π;否则执行内层的条件判断函数,内层的条件表达式的条件dy<0如果满足,则执行Azm=Azm+2π。
(if (and (< x 0) (< y 0)) (setq a (+ a c)))──通过逻辑和函数将两个关系函数组成复合条件:x<0且y<0,如果条件满足返回T,则执行表达式1:a=a+c;否则返回nil,不执行任何运算。
(if (or (< x 0) (< y 0)) (setq a (+ a c)) (setq a (-a c)))──通过逻辑或函数将两个关系函数组成复合条件:x<0或y<0,即只要满足其中一个条件,则返回T,执行表达式1:a=a+c;如果两个条件都不满足,则返回nil,执行表达式2:a=a-c。
(2)“持续函数”的格式为: (prong 表达式 表达式 [表达式] …)
函数的功能为将任意多个表达式组合起来成为一个表达式,在程序的流程控制中需要持续执行,其作用相当于C语言中的一个大括号,在Auto LISP语言中一般配合条件判断函数使用。例如:
(if (= x y) (prong (setq a (+ a b)) (print a)))──如果关系函数x=y的条件满足,返回T,则执行由progn函数所组合的两个需持续执行的表达式:赋值a=a+b,并且由屏幕输出a。
(3)“条件循环函数”的格式为: (while 条件表达式 表达式 [表达式] …)
函数用于程序中的循环运算,循环的次数取决于函数中的“条件表达式”,该式返回T,则执行循环体的运算,包含在函数括号内的“表达式”的个数不限。例如:
(setq i 0 n 10);给I,n赋值
(while (<= i 5) (setq i (+ 1 i)) (setq n (* n i)));在i<5时,进入循环
9
山西大同大学煤炭工程学院2016届本科生毕业设计
(print n);输出n
运算结束时,输出函数使屏幕显示n的值为7200。 3.3.3 选择集创建
“选择集创建函数”的格式为:
(ssget [选择方法] [点1 [点2]] [点表] [过滤表])
函数的功能为用各种方法创建选择集,所有参数均为可选参数。其中“选择方法”的代码和内涵如下:
C(Crossing)──与“点1”、“点2”确定的窗口相交的图形对象被选中; CP(CPolygon) ──与“点表”确定的多边形相交的图形对象被选中; F(Fence) ──与“点表”确定的折线相交的图形对象被选中; I(Implied) ──处于夹取状态的图形对象被选中; L(Last) ──最后绘制的图形对象被选中; P(Previous) ──上一次创建的选择集被选中;
W(Window) ──在“点1”、“点2”确定的窗口内的图形对象被选中; WP(WPolygon) ──在“点表”确定的多边形内的图形对象被选中。 可选参数“过滤表”的作用为根据其描述条件对所选图形对象进行筛选,只保留满足条件的对象。过滤表描述的条件为entget函数返回的图元表的子表。例如:
(0 . “circle”) ──图元种类为“圆”; (8 . “0”) ──图层为“0”层。
当在选择集函数中不提供参数时(ssget),表示以交互方式建立选择集。执行此函数后系统自动切换到AutoCAD图形窗口,提示区出现“Select object:”。用户可用各种方法在屏幕选择图元,直至用空回车(不输入任何参数的回车)结束选择。
选择集函数最常用的为“窗口”(“W”)选择方法,例如:
(setq ssl (ssget “w” ‘(20 50) ‘(30 60))) ──选中以平面坐标(20,50)和(30,60)为角点的窗口中所包含的图形对象,并将它赋值给变量ssl。
10
山西大同大学煤炭工程学院2016届本科生毕业设计
3.3.4 AutoCAD函数
(1)AutoCAD的所有绘图命令都可以作为Auto LISP的函数,使Auto LISP程序的运算和AutoCAD的绘图功能完全结合起来,使设计、计算和绘图融为一体。
“AutoCAD命令函数”的格式为:
(command “AutoCAD命令” 命令所需要的参数 “”)
在学习Auto LISP之前,一般对于AutoCAD命令屏幕操作的各种菜单、图标快捷键和参数提供的中文提示已应有所掌握。但是对于Auto LISP编程,CAD绘图命令函数中的“AutoCAD命令”均用英文表示,也没有“命令所需要的参数”的提示(按何种次序提供何种参数)。因此,在Auto LISP编程中应用CAD命令函数时,可以先在AutoCAD绘图屏幕用相应的绘图菜单(包括子菜单)或图标快捷键演示一次,可以在屏幕提示区获得英文的AutoCAD命令以及命令所需参数的提供方法和次序。参数中代表各种意义的规定字符串应包括在引号内,代表变量的标识符则不用引号,函数中最后的空引号代表“回车”。由于AutoCAD的各种版本(例如AutoCAD2004,2006,2008)的若干绘图命令中参数的提供存在微小的差别,因此在写Auto LISP程序的绘图函数时应顾及所用AutoCAD的版本。
AutoCAD命令函数十分丰富,下面只介绍本次设计中所用到的一些: “建立图层函数”的格式为:
(command “layer” “m” “图层名” “” “” “”)
函数的功能为建立并设定为当前层。函数中的字符“m”表示建立图层,并设定为当前图层,“图层名”为字符串。例如:
(command “layer” “m” “road” “” “” “”);建立命名为road的图层。
“全局视图函数”的格式为: (command “zoom” “e”)
函数的功能为将模型空间所画的图形对象在屏幕上以最大的视图全部显示。 (2)“输出函数”的功能为向屏幕或指定的的文件输出字符和数值,函数有下列三种格式:
11
山西大同大学煤炭工程学院2016届本科生毕业设计
(prinl 表达式 [文件描述符]) (princ 表达式 [文件描述符]) (print 表达式 [文件描述符])
函数中的表达式为输出的内容(字符、数值或表达式返回的值),“文件描述符”为可选参数,如果输出至指定的文件则需要文件描述符,在屏幕提示区输出则不需要。以上三种输出格式有较小的差别,对于在屏幕提示区的输出,例如:
(setq a 123 b “ABC” c “Happy \\n New Year”) (prinl a)──不换行输出数字123,后面不留空格; (print a)──换行后输出数字123,后面加空格; (princ a)──不换行输出数字123,后面不留空格。
3.4 Auto LISP语言的使用案例
3.4.1 直线画圆 直线画圆案例:
(defun c:hy()
(setvar \"cmdecho\" 0) ;指令执行过程不响应
(setq en (entsel \"选择一条直线:\")) ;要求碰选一条线 (setq en_data (entget (car en))) ;取得元体资料串行 (setq pts (assoc 10 en_data)) ;取得群码10的子串行 (setq pt1 (cdr pts)) ;取得起点pt1坐标 (setq px1 (car pt1)) ;取得pt1坐标的x值 (setq py1 (cadr pt1)) ;取得pt1坐标的y值
(setq pta (assoc 11 en_data)) ;取得群码11的子串行 (setq pt2 (cdr pta)) ;取得终点pt2坐标 (setq px2 (car pt2)) ;取得pt2坐标的x值 (setq py2 (cadr pt2)) ;取得pt2坐标的y值 (setq nx (/ (+ px1 px2) 2)) ;求得中点X值
12
山西大同大学煤炭工程学院2016届本科生毕业设计
(setq ny (/ (+ py1 py2) 2)) ;求得中点Y值 (setq npt (list nx ny)) ;结合mx & my成mpt点 (setq nr (getdist npt \"输入半径:\"));要求输入半径值
(command \"circle\" npt nr) ;完成直线中点画圆 (prin1) )
在上述案例中,算法步骤如下:
首先,选取需要的直线,获得直线端点坐标,其次,利用端点坐标求得直线中点坐标,求得的该点坐标可以是圆心也可能是圆上一点(具体看画圆时取点方向),最后输入圆半径值,也可以在图上指定一点为圆半径,完成直线画圆。
其中,hy为该程序的调用命令,entsel函数用点选择的方式选择单个实体,并返回一个表。(assoc 10 en_data)该语句中,10是一个组码,11也同样,代表数据的三维坐标,该语句就是取出数据串行中坐标值。其后的语句便很好理解了。
实现过程:在AutoCAD中,打开“工具”选项,在下拉菜单中选择“Auto LISP” 然后“加载应运程序”,打开该程序所在的文件夹,加载该程序,在AutoCAD命令行会显示“***.lsp文件已成功加载”。在AutoCAD命令行输入“mcir”,命令行便会提示“选择一条直线:”,根据提示在图面上选择所要的直线,选择完成后,点右键或按enter键完成选择,之后系统会自动完成坐标点的计算,命令行会提示“输入半径:”,键入一个实数或在图面上直接点击一点成为半径,圆便自动生成,完成该程序。 3.4.2 修改圆半径
圆半径修改案例: (defun c:chgrad()
(setvar \"cmdecho\" 0) ;指令执行过程不响应
(setq en (entsel \"选取图面一圆:\")) ;要求碰选一个圆 (setq en_data (entget (car en))) ;取得元体资料串行 (setq old_rad_list (assoc 40 en_data));取得半径子串行
13
山西大同大学煤炭工程学院2016届本科生毕业设计
(setq old_rr (cdr old_rad_list)) ;取得旧有半径
(princ “\\n圆旧半径=”)(princ old_rr) ;显示该旧圆半径值于指令区 (setq cenpt (cdr (assoc 10 en_data))) ;取得圆之圆心
(setq new_rr (getdist cenpt \"输入一新半径值:\"));输入一半径值 (setq new_rad_list (cons 40 new_rr)) ;产生新的半径子串行 (setq en_data (subst new_rad_list old_rad_list en_data)) ;新旧替换 (entmod en_data) ;依新像素资料更新图面上圆半径 (prin1) )
(prompt \"*************** << C:CHGRAD >> *****************\")) (prin1) 算法步骤如下:
选取需要修改的圆,获得该圆的半径,修改圆原来的数据串行,输入一个新的半径值,得到一个新圆。
实现过程:程序导入同上,在命令行键入“chgrad”,提示“选取图面一圆”,命令行便显示“圆旧半径=”,得到旧半径值,接下来提示“输入一新半径值:”,输入一个实数,图面便会应新半径值绘制一个新圆。
注意:在上述程序中,加了最后两行命令语句:
(prompt \"*************** << C:CHGRAD >> *****************\")) (prin1)
目的是使读者们养成加入最后两行的习惯,以免未来程序越来越大,在加载程序后,根本不知道该如何执行此 LISP 程序,因为程序内可能有好几个 C:XX 指令函数,可能有很多子程序。
在本章节中,对本次设计所用到的Auto LISP函数及使用做了一个初步介绍,对于更好的理解本次设计有很大帮助,对Auto LISP语言的掌握使用也会更加容易。
14
山西大同大学煤炭工程学院2016届本科生毕业设计
4 程序算法及程序的编写
本次设计研究的是对高程点的批量操作,所以要涉及到注记及高程点的属性操作、注记与高程点的匹配、范围的选择以及为了显示修改效果所进行的颜色改变等等。下面将会介绍这些内容的具体实现。
4.1 文字注记的批量操作
4.1.1 修改注记的算法
要实现对注记的批量操作,首先要对注记属性有一个了解,选出图面上的文字; “(ssget \"X\" '((8 . \"gcd\")(0 . \"text\")))”
上面这个语句便能够选出图面上所有的文字注记。其中,“ssget”是一个选择集操作函数,而“X”便是它的选择方式,代表整个数据库,“((8 . \"gcd\")(0 . \"text\"))”是“X”的选择方法,意思是选出“gcd”图层上的所有“text”实体。
但在实际的工作中,我们不一定要对全图的注记作修改,只需改动几个或局部范围内的注记,所以只需对选中的文字注记进行属性修改即可,例如下面的语句:
(setq ent (ssget));选择图面实体 (setq ent_number 0);对选中的实体排序 (repeat (sslength ent);重复操作
(setq ent_name (ssname ent ent_number));取出选中实体的像素名称 (setq ssdata (entget ent_name));取出数据串行 (setq tix (assoc 1 ssdata));找出数据中的文字数据 (setq tex (cdr tix));得到注记数值
像这样,不需要事先排查,因为图面上具有文字信息的只有注记,所以得到的数值只可能是注记的,因此,对注记的修改就是对注记数值的修改。
15
山西大同大学煤炭工程学院2016届本科生毕业设计
4.1.2 修改注记的程序实现
下面列出具体的程序及实现的具体操作: (defun C:gcdjc()
(setq sz (getreal \"\\n 输入增(+)减(-)高程值:\")) (princ \" 请选择范围:\")
(setq ent (ssget));选择屏幕实体建立选择集 (setq ent_number 0);设置序号
(repeat (sslength ent);计算选择集内元素个数
(setq ent_name (ssname ent ent_number));根据序号依次提取选择集内像素名称
(setq ssdata (entget ent_name));提取数据串行 (if ent ;进入循环 (progn
(setq tix (assoc 1 ssdata));提取主文字值 (setq tex (cdr tix))
(setq tox (+ sz (atof tex))) ;修改注记数值 (setq new_data (cons 1 (rtos tox 2 2)));整合 (setq ssdata (subst new_data tix ssdata));新旧替换 (entmod ssdata) ;更新屏幕上的实体 ) )
(setq ent_number (1+ ent_number));设置序号进入循环 )
(princ);结束 )
程序导入AutoCAD的方法便不再赘述了,下面进行该程序讲解及演示: 如图4-1命令输入窗口,在命令行输入“gcdjc”命令语句,按“Enter”,开始运
16
山西大同大学煤炭工程学院2016届本科生毕业设计
行此程序;
图4-1 命令输入
命令行会出现提示,输入增减高程值,如图4-2命令提示窗口:
图4-2 命令提示
输入一个实数,例如“100”,“Enter”确定,命令行便提示选择对象,如图4-3选择范围:
图4-3 选择范围
选择后,点右键或“Enter”键,完成选择并修改,如图4-4范围修改:
17
山西大同大学煤炭工程学院2016届本科生毕业设计
图 4-4 范围修改
很明显,被选中的注记数值都已经加了100,完成该算法。
在上述程序的实现过程中,在范围选择时,我们可以根据需要,选择某些需要修改的的特定点,而不是只是选择范围,完成对注记的批量操作。
4.2 高程点Z值的修改
4.2.1 高程点Z值的修改算法
在注记与高程点的高程作比较后,如果发现高程值与注记不符,一般情况下,会以高程注记为依据修改高程值。同样的,要修改点位高程,还是要先把点位选出来: “(ssget \"X\" '((8 . \"gcd\")(2 . \"gc200\")))”,点位属性一般是图块,在Auto LISP语言中以“gc200”来代表图块,所以上句便是选出该图层的所有图块,即高程点。同文字注记的修改相似,先吧高程点Z值挑出来,在这个基础上做修改: (setq enl (assoc 10 ssdata));找出高程点的坐标数据
(setq old_zz(cdr enl));提取三维坐标(X,Y,Z)值 (setq Z (caddr old_zz));得到Z值
在得到Z值进行修改之后,要把修改后的数据整合回去,重新在屏幕上呈现: (setq endata (list 10 X Y m));整合坐标 (setq ssdata (subst endata enl ssdata));新旧替换
18
山西大同大学煤炭工程学院2016届本科生毕业设计
(entmod ssdata);更新屏幕实体 4.2.2 修改高程点Z值的程序实现
将上述想法及程序进行整合,列出完整的Z值修改算法: (defun C:sxh()
(princ \"\\n 选取要修改的高程点:\") (setq ss(ssget));获取屏幕实体
(setq zz(getreal\"\\n 输入增(+)减(-)高程值:\"));输入修改值 (setq n 0);设置序号
(repeat (sslength ss);计算选择集内元素个数 (setq ssn (ssname ss n));依次提取元素的像素名称 (setq ssdata (entget ssn));提取元素的数据串行 (if ss ;进入循环 (progn
(setq enl (assoc 10 ssdata));提取三维坐标 (setq old_zz(cdr enl)),提取坐标数值 (setq X (car old_zz));点x坐标 (setq Y (cadr old_zz));点y坐标 (setq Z (caddr old_zz));点z坐标 (setq m (+ Z zz));修改z值
(setq endata (list 10 X Y m));整合新坐标
(setq ssdata (subst endata enl ssdata));新旧坐标替换 (entmod ssdata);更新屏幕上实体 ) )
(setq n (1+ n));带入循环 )
19
山西大同大学煤炭工程学院2016届本科生毕业设计
(prin1);结束 )
在这里,还是像文字注记修改一般,单纯的对Z值进行一个批量的修改,不需要对Z值属性事先做一个定义选择,只需在后面的修改过程做文章,因为文字属性与点属性虽然是不同的,但同时修改注记与高程点Z值是不会有影响的,在某种程度上来说,注记的坐标Z值是与高程点Z值同步的。
下面对该程序进行演示:
如图4-5命令提示,在命令行输入程序调入指令“sxh”后,按“Enter”键,
图4-5 命令提示
选取要修改的高程点后,点右键或按“Enter”键,如图4-6进行选点:
图4-6 选点
在这里,我只选取一个点做修改,更直观的展示效果,当然,范围选择完全是可以的。输入修改值,在这里我还是输入“100”,如图4-7效果展示,可以看出在命令行下方显示的高程点Z值坐标与注记差值是100,达到修改效果。
20
山西大同大学煤炭工程学院2016届本科生毕业设计
图4-7 效果展示
4.3 范围内高程点与注记匹配
4.3.1 角度匹配
在AutoCAD里面的高程注记与点位之间的距离和方位虽然随着比例尺不同可能会发生变化,但是在同一图幅内,点和注记之间的方位角度应该都是相同的,不会发生变化,所以根据角度值可以找到与注记对应的点,如图4-8标注角度值:
图4-8 角度标注
可以看出注记左下角点与高程点之间所做的点位夹角是固定的,都是40°,所以据此可以进行匹配,列出如下条件程序:
21
山西大同大学煤炭工程学院2016届本科生毕业设计
“(- (/ (abs (- py Y)) (abs (- px X))) (/ (SIN(* pi (/ 2 9.000))) (COS(* pi (/ 2 9.000)))))”
其中,px,py为高程点平面坐标,X,Y为注记左下角点平面坐标,该公式就是求那个夹角是否是那个固定值,对于符合该条件的点位进行下一步操作。 4.3.2 距离自动匹配与人工干预进行匹配
上一小节已经提到过高程点与注记左下角点之间是有一个距离值的,所以根据距离值也同样可以将高程点与注记进行匹配。具体思路就是设定一个距离范围值,以注记的左下角点为依据,更形象的说是相当于一个圆心,以圆心为准,距离就是半径,在这个圆内的高程点就是注记的匹配点位,但只局限于圆内有且只有一个点,多余一个点位时的情况在下面进行说明。
这样就可以开始进行设计,首先进行距离选择: (setq P (cdr (assoc 10 ssdata))) (setq pl (polar P (* 1.25 Pi) 1.6)) (setq pr (polar P (* 0.25 Pi) 1.6)) (ssget \"W\" pl pr)
在这里,我用的是极坐标法进行距离划定,上述语句中,“P”代表注记左下角点三维坐标,“pl,pr”分别是根据左下角点用极坐标法求得的点位坐标。“W”代表选择方式,一种窗口选择方式,该语句思路就是以“pl,pr”为对角点所构成的窗口内是否存在高程点,还有值得注意的一点是选择的是高程点,即块,所以对选择属性也要做一个要求,所以在选择方式语句上做一下调整,上面语句的最后一句可以改成下面 这句:
(ssget \"W\" pl pr '((2 . \"gc200\") (8 . \"gcd\"))) 意思就是在这个窗口内是否存在高程点这个图块。
上面我也说到如果计算机根据距离进行自动匹配,这种情况只能出现在所选范围内只有一个高程点时才适用,因为范围内多余一个点后,根据距离远近判断点与注记是否匹配具有局限性,如果认定与注记左下角点距离最近的点就是与注记匹配的点,
22
山西大同大学煤炭工程学院2016届本科生毕业设计
这个说法不是很准确,因为有些特殊点位就不能按这种方式判断,例如图4-9距离展示,很明显,当一些点位距离很近时,在计算机根据距离进行匹配时,就会将图面上下方那个点与上方注记进行匹配,但我们可以看出,位于上方那个点位才是与上方注记匹配的点,这时就需要我们人为的进行一下干预,具体算法在下面给出,这里我们就说一下怎么判定只有一个高程点:
(setq ent_P (ssget \"W\" pl pr '((2 . \"gc200\") (8 . \"gcd\")))) (= (sslength ent_P) 1)
“sslength”是计算选择集内的像素个数的语句。
图4-9 距离比较
下面就讨论另一种情况,范围内多余一个点时,我们就需要逐一排查,选择条件合适的那个,即“(> (sslength ent_P) 1)”,当满足这个条件时,进入“while”语句循环:
(while (and(> (sslength ent_P) 1)(< m (1- gs))) (setq m (1+ m))
(setq p_date (entget (ssname ent_P m))) (setq tx (assoc 10 p_date)) (setq old_z (cdr tx)) (setq gcdzz (caddr old_z))
23
山西大同大学煤炭工程学院2016届本科生毕业设计
(setq che (- gcdzz (atof tex))))
在上述语句中,“m”是序号,从0开始,“gs”代表选择集内的元素个数,“(atof tex)”是将文字注记字符串转换成实数。具体思路是将选择集内的高程点Z值与注记数值一一进行比较,看是否存在有与注记匹配的。
将这两种情况结合起来使用,达到匹配效果,完成选择。
无论是角度匹配还是这种进行人为干预的距离匹配都能达到同等效果,角度匹配完全自动化,如果数据量比较大,可能耗费的时间较大,如果运用距离匹配,虽然是需要人为干预,但更主观,耗时少。
4.4 颜色转变
在对高程点Z值进行修改或者对高程注记进行修改后,我们希望对修改后的点进行一下颜色变化,以便知道哪些点进行过变化,更直观的感受程序的运行效果,这里我介绍一下程序中用到的颜色修改语句。
先讲一下具体思路,要进行颜色修改,首先要做的是找到要转变颜色的实体属性,再者是注意实体的现有颜色以及图幅上其他实体的颜色,选择合适的转变后颜色,以免与其他实体混淆,在这里,我介绍一下一些颜色对应的代号:
表4-1 颜色与代号
颜色 red yellow green cyan
代号 1 2 3 4
颜色 blue magenta white(black) (灰色)
代号 5 6 7 8
其中,1-7为标准色,可以直接用颜色名或者代号,非标准色只能用代号,例如: (command “layer” “c” “red” “” “”);设定图层颜色为红色 (command “layer” “m” “road” “c” 8 “” “”);建立图层road并设定图层颜色为灰色
24
山西大同大学煤炭工程学院2016届本科生毕业设计
在本次设计中,改变的颜色实体是注记,所以先对注记属性做一个选择,再根据属性做修改。列出如下语句:
(setq obj (vlax-ename->vla-object ent_name)) (vla-put-color obj “colar”)
第一句选择注记的像素名称,第二句设置像素的颜色,即注记颜色。完整程序如下:
(defun C:gcdjj() (vl-load-com) (princ \" 请选择点:\") (setq ent (ssget));选取对象 (setq ent_number 0);设置序号
(repeat (sslength ent);计算选择集元素个数
(setq ent_name (ssname ent ent_number));提取元素像素名称 (if ent (progn
(setq obj (vlax-ename->vla-object ent_name)); (vla-put-color obj 3);将选中注记变为绿色 ))
(setq ent_number (1+ ent_number));继续进行循环 )
(princ);结束 )
运行程序,如图4-10命令输入:在命令行输入程序调入命令“gcdjj”,确定,开始运行;
25
山西大同大学煤炭工程学院2016届本科生毕业设计
图4-10 程序运行
命令行显示“请选择点”,选取改变范围,如图4-11选择范围:
图4-11 框选
按图示选取范围后,点右键确认,如图4-12所示所选范围变为绿色,完成运行。
图4-12 程序结果
26
山西大同大学煤炭工程学院2016届本科生毕业设计
4.5 程序演示及讲解
4.5.1 对高程点与注记进行角度匹配的批量修改
该程序如下:
(defun C:gcdcd();定义程序名 (vl-load-com);加载语言
(princ \"\\n 欢迎使用高程点修改程序!\");
(setq ent (ssget \"X\" '((8 . \"gcd\")(0 . \"text\"))));选取图面文字注记
(setq ent_number 0);设置序号
(repeat (sslength ent);计算选择集内元素个数
(setq ent_name (ssname ent ent_number));取出选择集中的像素名称 (setq ssdata (entget ent_name));取出像素名称的数据串行 (if ent (progn
(command \"zoom\" \"e\");将视图放到全局 (command \"layer\" \"m\" \"gcd\" \"\");设置当前图层 (setq ch (assoc 1 ssdata));取出注记的主文字值 (setq tex (cdr (assoc 1 ssdata)));得到注记的数值 (setq P (cdr (assoc 10 ssdata)));提取注记的三维坐标 (setq px (car P));提取注记坐标x (setq py (cadr P));提取注记坐标y
(setq pl (polar P (* 1.25 Pi) 1.6));用极坐标法设置范围点 (setq pr (polar P (* 0.25 Pi) 1.6))
(setq ent_P (ssget \"W\" pl pr '((2 . \"gc200\") (8 . \"gcd\"))));划范围求得选择集的高程点
(if ent_P ;进入循环
27
山西大同大学煤炭工程学院2016届本科生毕业设计
(progn
(setq p_data (entget (ssname ent_P 0)));取得高程点的像素名称 (setq tix (assoc 10 p_data));取得高程点的三维坐标值 (setq old_zz (cdr tix))
(setq X (car old_zz));得到高程点坐标x (setq Y (cadr old_zz));得到高程点坐标y
(setq wc (- (/ (abs (- py Y)) (abs (- px X))) (/ (SIN(* pi (/ 2 9.000))) (COS(* pi (/ 2 9.000))))));角度确定
(if (<= (abs wc) 0.01);观察高程点与注记是否匹配 (progn
(setq gcdz (caddr old_zz));得到高程点Z值
(setq cha (- gcdz (atof tex)));得到注记与Z值的差值 (if (> (abs cha) 0.01);比较注记与Z值是否相等 (progn
(setq Z (atof tex));将注记数值赋给高程点Z (setq endata (list 10 X Y Z));整合修改后的坐标 (setq p_data (subst endata tix p_data));新旧坐标替换 (entmod p_data);更新屏幕上实体
(setq obj (vlax-ename->vla-object ent_name)) (vla-put-color obj 3);将修改后的注记颜色变为绿色 ))))))))
(setq ent_number (1+ ent_number));持续循环 )
(princ \"谢谢使用!\");结束 )
下面进行程序的演示:
输入程序命令“gcdcd”,程序便会自动运行,对图面高程进行匹配修改,如图
28
山西大同大学煤炭工程学院2016届本科生毕业设计
4-13成果展示:
图4-13 成果展示
可以看出图面上变为绿色的点即是修改过的点。
值得注意的是,随着比例尺不同或标注样式的不同,匹配角度都会发生改变,要根据实际情况制定合适角度匹配条件。
4.5.2 对高程点与注记进行距离匹配的批量修改
该程序如下:
(defun C:gcdcc();定义程序名 (vl-load-com);加载语言
(princ \"\\n 欢迎使用高程点修改程序!\")
(setq ent (ssget \"X\" '((8 . \"gcd\")(0 . \"text\"))));选择图面文字注记 (setq ent_number 0);设置序号
(repeat (sslength ent);计算选择集内元素个数
(setq ent_name (ssname ent ent_number));取出注记的像素名称 (setq ssdata (entget ent_name));获取像素的数据串行 (if ent (progn
29
山西大同大学煤炭工程学院2016届本科生毕业设计
(command \"zoom\" \"e\");将图面设置为全局 (command \"layer\" \"m\" \"gcd\" \"\");设置当前图层 (setq ch (assoc 1 ssdata));取出注记的主文字值 (setq tex (cdr (assoc 1 ssdata)));得到注记的数值 (setq P (cdr (assoc 10 ssdata)));得到注记三维坐标 (setq pl (polar P (* 1.25 Pi) 1.6));设置范围对角点 (setq pr (polar P (* 0.25 Pi) 1.6))
(setq ent_P (ssget \"W\" pl pr '((2 . \"gc200\") (8 . \"gcd\"))));设范围取得高程点
(if (= (sslength ent_P) 1);范围内高程点只有一个 (progn (setq n 0)
(setq p_data (entget (ssname ent_P n)));取得高程点的像素名称 (setq tix (assoc 10 p_data));取得高程点的三维坐标 (setq old_zz (cdr tix))
(setq gcdz (caddr old_zz));得到高程点Z值 (setq cha (- gcdz (atof tex)));得到注记与Z值之差 (if (> (abs cha) 0.01);注记与高程点Z值不符 (progn
(setq X (car old_zz));得到高程点x坐标 (setq Y (cadr old_zz));得到高程点y坐标 (setq Z (atof tex));将注记数值赋给高程点Z (setq endata (list 10 X Y Z));整合新坐标
(setq p_data (subst endata tix p_data));新旧坐标替换 (entmod p_data);更新屏幕实体
(setq obj (vlax-ename->vla-object ent_name))
(vla-put-color obj 3);将修改后的高程点注记修改为绿色
30
山西大同大学煤炭工程学院2016届本科生毕业设计
))))
(if (> (sslength ent_P) 1) ;范围内多余一个高程点 (progn
(setq gs (sslength ent_P));计算范围内高程点个数 (setq m 0)
(setq p_date (entget (ssname ent_P m)));得到高程点像素名称 (setq tx (assoc 10 p_date));得到高程点三维坐标 (setq old_z (cdr tx));
(setq gcdzz (caddr old_z));得到高程点Z值
(setq che (- gcdzz (atof tex)));得到注记与高程点Z值之差 (while (and(> (abs che) 0.01)(< m (1- gs)));循环条件 (setq m (1+ m))
(setq p_date (entget (ssname ent_P m)));获取数据串行 (setq tx (assoc 10 p_date)) (setq old_z (cdr tx)) (setq gcdzz (caddr old_z)) (setq che (- gcdzz (atof tex)))) (if (> (abs che) 0.01) (progn
(command \"zoom\" pl pr);当前窗口 (setq obj (vlax-ename->vla-object ent_name))
(vla-put-color obj 2);需要人为选择的点注记变为黄色 (princ \"\\n 请选择需要修改的点:\") (setq pt (ssget));选择点 (setq ptn (entget (ssname pt 0))) (setq pts (assoc 10 ptn)) (setq x (car(cdr pts)))
31
山西大同大学煤炭工程学院2016届本科生毕业设计
(setq y (cadr (cdr pts))) (setq z (atof tex))
(setq new_zh (list 10 x y z)) (setq ptn (subst new_zh pts ptn) ) (entmod ptn) )))) ))
(setq ent_number (1+ ent_number)) )
(princ \"谢谢使用!\") )
下面演示该程序:
输入命令语句“gcdcc”,开始运行该程序,范围内只有一个点的修改后会直接变为绿色,多余一个高程点需要修改的便会变为黄色,如图4-14图面显示:
图4-14 图面提示
在图面选择对应的高程点,一一选择后,点右键或“Enter”键,完成选择,程序会继续执行,直到全部修改完,如图4-15效果图:
32
山西大同大学煤炭工程学院2016届本科生毕业设计
图4-15 运行结束
两种方法的演示虽然结果相同,但在Auto LISP函数的使用上却有很大差别,对设计思路也会有大的要求。这两种方法很好的解决了高程点与注记值不符的情况,对于我们的日常工作相信会有大的帮助,提高工作效率。
33
山西大同大学煤炭工程学院2016届本科生毕业设计
5 结论与展望
本次设计主要是基于在AutoCAD及CASS绘图时高程点与注记存在不符情况下或者应需要对高程点做修改的前提下而进行的开发。利用Auto LISP语言对AutoCAD的绘图命令做一个完善,使得对于高程点的修改更加方便快捷。同时,利用Auto LISP语言进行程序设计要根据一定思路来进行程序的编写:
(1)确定需要达到的效果,功能; (2)确定编程的进行思路; (3)选择编程需要的代码语句;
(4)将程序功能分解,分步完成各个功能,最后进行整合; (5)对程序进行调试完善。
这次设计也展示了Auto LISP语言的强大功能,无论是调用AutoCAD功能还设 置CAD新命令语句,Auto LISP都能很好的达到预期效果,完善了CAD的功能,使得AutoCAD真正成为绘图的有力工具。
通过本次设计,不仅是解决了高程点批量修改的这个问题,更主要的是对AutoCAD的二次开发工具Auto LISP语言有了更好的认识与了解,对CASS地形图的高程点修改有了更为深入的研究,对于以后开展此类工作有很好的途径和方法去解决。
Auto LISP语言不仅在测量领域,凡是能借助AutoCAD完成绘图的,都能够利用Auto LISP语言来编写CAD命令语句,在机械制图,图形设计,化工制图等领域都应用广泛。
34
山西大同大学煤炭工程学院2016届本科生毕业设计
参考文献
[1] 郭秀娟, 范晓鸥. 基于Auto LISP的AutoCAD二次开发研究[J]. 吉林建筑工程学院学报,
2008, 25(4):82-84.
[2] 钱业宏.一种自动检查并修改高程点Z值的方法 [J]. 城市勘测,2006, (04):58-59. [3] 龚子桢,等. 基于 Auto LISP 的高程点批量修改算法设计与实现 [J] . 测绘通报,2011,
(04):41-43.
[4] 张明星.利用 AutoCAD LISP 语言修改地形图高程数据[J]. 科技信息,2011, (07):59-63. [5] 蔡伟明. 一种基于 Auto CAD 平台高程值检查功能的开发[J].矿山测量,2010(3):26-28. [6] 赵景亮,李志刚.Auto CAD 2004 与 Auto LISP 二次开发技术[M].北京:清华大学出版社,
2004.
[7] 吴铭杰. CASS环境下高程点检查修改算法与实现[J]. 地理空间信息, 2012(5):129-130. [8] 唐争气, 胡润希. 基于Auto Lisp的局部高程点批量检查与修改技术[J]. 电脑编程技巧与维
护, 2013(2):76-77.
[9] 赵卫常, 赵军波. 批量修改CASS图形中的高程[J]. 测绘与空间地理信息, 2011,
34(5):225-226.
[10] 高红岩. 南方CASS7.0软件中关于批量修改高程注记的几种方法[J]. 环球人文地理,
2015(4).
[11] 郭秀娟 于全通 范小鸥. AUTOLISP语言程序设计[M]. 化学工业出版社, 2008. [12] 程效军, 顾孝烈, 顾振雄. 工程测量LISP程序设计[M]. 同济大学出版社, 2012.
[13] 黄恺, 李雷. AutoCAD二次开发程序的自动安装[J]. Cad/cam与制造业信息化,
2000(10):20-21.
[14] 张锋, 陈爱萍. AutoCAD二次开发环境的探讨[J]. 机械设计与制造, 2005(9):125-127.
35
山西大同大学煤炭工程学院2016届本科生毕业设计
致 谢
在毕业设计即将完成之际,我谨对给予我无私帮助的指导老师杨莉老师诚挚的敬意和感谢。本文在杨老师的悉心指导和亲切关怀下历时两个多月,得以完成。在毕业设计及论文写作期间,我的导师杨老师在各方面给予了我颇多的帮助,从开题报告到课题设计,一直到后期论文的写作方面都倾注了大量心血。杨老师在专业方面的指导工作深刻而严谨,他的严格要求以及严密思维让我折服。这次设计还得到了王俊秀、梁佳丽、郝兆全、项小伟等多位同学的帮助,在此也对他们表示真挚的谢意。
时光飞逝,光阴荏苒,转眼已是和大家说离别的时候。我人生的大学阶段即将走过,能够在这段时间内完成毕业设计,对我的人生也是一种特殊的经历。这不仅是一次检验我大学的所学和再一次系统学习的过程,也是与老师、同学共同努力,齐心合作的一次难忘的体验。感谢大学给了我这样的一个机会,让我成长、进步,大学经历将是我人生中一笔宝贵的财富。
最后,向所有关心我的亲人、师长和朋友们表示深深的谢意。
36
因篇幅问题不能全部显示,请点此查看更多更全内容