利用AutoLISP语言批量修改CASS下高程点的高程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本科毕业论文(设计)
题目: 利用AutoLISP语言批量修改
CASS下高程点高程
学院:
班级:
姓名:
指导教师:职称:
完成日期:年月日
山西大同大学
本科生毕业设计
中文题目:利用AutoLISP语言批量修改CASS下高程点高程英文题目:Using AutoLISP language to modify the elevation of
elevation point in batch CASS
学院:煤炭工程学院
姓名:学号:
专业:班级:
指导教师:职称:
完成日期:年月日
大同大学本科毕业论文(设计)原创性声明作者声明:我所呈交的毕业论文(设计)是在指导教师指导下独立进行研究工作所取得的成果。

除文中已经标明引用的内容外,本论文不包含其他个人或集体已经公开发表的研究成果。

本声明的法律结果由本人承担。

毕业论文(设计)作者签名:
签字日期:年月日
指导教师声明:该生所呈交的毕业论文(设计)是在本人指导下独立完成的,相关的检测报告已审阅。

除文中已经标明引用的内容外,本论文不包含其他个人或集体已经公开发表的研究成果。

指导教师签名:
签字日期:年月日
山西大同大学2016届本科毕业论文(设计)开题报告书
大同大学本科毕业论文(设计)中期检查记录表
(指导教师、学生用表)
山西大同大学2016届本科毕业论文(设计)指导教师评分表
(指导教师用表)
山西大同大学2016届本科毕业论文(设计)评阅人评分表
(评阅人用表)
山西大同大学2016届本科毕业生论文(设计)答辩记录表
(答辩组用表)
山西大同大学2016届本科毕业论文(设计)答辩评分表
(答辩组用表)
摘要
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)
1绪论
高程是地形图的地形要素之一,是图形的立体表述,由高程点及高程注记组成。

在基于CASS导入的数字化地形图中,高程点一般是由具有三维坐标的图块表示,X、Y值表示高程点的平面位置,Z值表示高程点高程数值。

高程注记是高程Z值的图面表述,不仅应标注在高程点附近,而且还应该与高程点Z值相等。

地形图用于制图时,一般使用注记表达相应点高程即可,而当利用数字地形图进行三维立体展示、土石方计算、建立高程模型等工作时,就需要利用高程点的高程值来实现。

但在实际工作中,经常会发生高程点高程值和高程注记不一致的情况。

在CASS中可以通过高程点修改命令对高程点Z值进行修改,但局限性太高,只能做到单个点修改或者对整个图面高程加减一个定值,无法做到局部或者指定一些点来进行修改,也不能完成对图面高程点Z值的正确性进行检验。

这时,基于这些问题的出现及实际工作中的要求,寻找合适简便的解决方法便势在必行。

AutoCAD开放的结构为不同的使用者留出了非常广的发挥空间,提供了多种二次开发工具,Auto LISP是其中应用最多功能也最强的一个。

本次设计也是利用Auto LISP语言来对此进行程序编辑,更好的理解和使用该语言能帮助我们更加方便快捷的进行绘图。

2CASS软件及AutoCAD的二次开发介绍
2.1CASS软件简介
CASS软件是广州南方测绘仪器有限公司开发的一款在CAD平台上运行的集地形、地籍、绘图处理、建立空间数据库、工程应用及计算土石方等功能于一体的软件系统。

CASS软件是广大测绘人熟悉的软件,无论是做平面还是三维图形,CASS内部的许多绘图功能使得成图方式变得更为容易。

具体的功能由于太多,不能一一叙述,在此,就讲述一下CASS软件与本次设计的关系。

对高程点进行修改,首先要做的是导入高程点数据,将全站仪或RTK获得的坐标数据导出到文件,按CASS展点要求修改数据的排列方式后即可将数据在CASS中呈现出来,呈现的点便是我的设计对象,可以说CASS软件是一个数据导入平台,虽然操作平台是在AutoCAD上,但最终的结果还是要回归到CASS上进行应用。

同时,CASS软件与AutoCAD软件之间可以进行自由转换更是方便我们进行图形处理。

2.2AutoCAD二次开发
2.2.1二次开发的目的
AutoCAD是目前在Windows和MAC系统中应用最为广泛、使用人数最多的CAD 软件。

但它只给我们提供了基础的CAD功能,如果我们想完成具体项目设计,就必须根据数据一笔笔绘制出图形,这样一旦在设计完成之后,要更改局部图形则需要重复原来的全部内容。

造成了大量工作量的浪费。

如果使用AutoCAD的开发系统,我们就可以将以上的过程用程序编制出来,在工程设计需要时,利用命令语句调入程序就可以运行这个程序,自动完成绘图过程。

显然,这不仅大大提高了设计效率,而且,还可以通过定制来完成某些专业化的模块,甚至大型设计软件。

本次设计就是用到了CAD的二次开发功能,将图形修改功能从复杂变为只需一个命令,大大提高了绘图效率。

因此,要提高绘图效率,让图形处理变得简便容易,不做过多的重复性操作,就必不可少要用到AutoCAD的二次开发功能。

2.2.2二次开发的工具
从AutoCAD2.18开始推出Auto LISP开始到现在,我们所能使用的开发工具主要有:Auto LISP、VisualLISP、VBA、COM外部接口、ObjectARX、 等开发方式。

下面主要对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)面向用户对象,让用户能够根据自己的需要来编写相关的程序,进行二次开
发。

在本章节中,从利用CASS软件导入高程数据进行展点到利用AutoCAD的二次开发功能进行绘图工具编辑,可以发现在本次设计,二者的结合必不可少,缺一不可。

3Auto LISP语言概述
3.1Auto 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语言没有语句
概念或者其他的语法结构。

执行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 数据类型与代码
数据类型代码
整型数(INT)
实型数(REAL)
符号(SYM)
字符串(STR)
表(及用户定义的函数)(LIST)
文件描述符(FILE)
Auto LISP的内部函数(SUBR)
AutoCAD的选择集(PICKSET)
AutoCAD的实体名(ENAME)
函数分页表(PAGETB)
在本次设计中,用到很多语句函数,将其中比较重要和比较难掌握的在这里讲解一下。

3.3.1表处理函数
(1)(LIST <表达式>……)
该函数将任意数目的表达式的值按顺序串联在一起,并返回由他们组成的表。

(list‘a‘b‘c) 返回(A B C)
(list‘a‘(b c)‘d) 返回(A (B C) D)
(list3.69.7) 返回(3.69.7)
重要应用:给点赋值
(setq x4.5y9.0);给x,y赋值
(setq pt (list x y))等效于(setq pt‘(4.59.0))返回(4.59.0);赋值给pt 命令:!pt显示(4.59.0)
(2) (ASSOC <关键字> <关联表>)
关联表又称A一表,它是以点对或子表为元素组成的表,子表中的第一个元素为“关键字”。

ASSOC函数搜索<关联表>,以找到此表中<关键字>,提取包含<关键字>的一个元素,并返回该子表,若未找到<关键字>,则返回NIL。

例如:
(SETQ L ((0 . “CIRCLE”) (8 . “MYLAYER”)
(105.07.00.0) (40 . 1.0)));给L赋值,一个集合

(ASSOC0L) 返回(0 . “CIRCLE”)
(ASSOC40L) 返回(40 . 1.0)
(ASSOC10L) 返回(105.07.00.0)
例如:
(SETQ m‘((name box)(width3)(size4.2)(depth5.1)));命令一个图框则
(ASSOC‘size m) 返回(size4.2)
(ASSOC‘width m) 返回(width3)
例如:
(SETQ A‘((d . 30)(L . 60)(R . 4)));赋值A

(ASSOC‘R A) 返回(R . 4)
(ASSOC‘H A) 返回NIL
(SETQ F‘(Q W E T567))

(ASSOC‘E F) ;错误:关联列表错误:(Q W E T567)
(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,函数
不返回任何值。

相当于BASIC语言中的“if…then…else”或“if…then”语句。

例如:(if (< x0) (setq a (+ a b)) (setq a (- a b)))──如果关系函数x<0满足,返回T,则执行表达式1:a=a+b;如果条件不满足则返回nil,执行表达式2:a=a-b.
(if(< dx0) (setq Azm (+ Azm Pi) (if(< dy0) (setq Azm (+ Azm Pi Pi)))))──条件判断函数的“分层嵌套结构”。

外层的条件表达式的条件dx<0如果满足,则执行Azm=Azm+π;否则执行内层的条件判断函数,内层的条件表达式的条件dy<0如果满足,则执行Azm=Azm+2π。

(if (and (< x0) (< y0)) (setq a (+ a c)))──通过逻辑和函数将两个关系函数组成复合条件:x<0且y<0,如果条件满足返回T,则执行表达式1:a=a+c;否则返回nil,不执行任何运算。

(if (or (< x0) (< y0)) (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 i0n10);给I,n赋值
(while (<= i5) (setq i (+ 1i)) (setq n (* n i)));在i<5时,进入循环
(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”‘(2050) ‘(3060))) ──选中以平面坐标(20,50)和(30,60)为角点的窗口中所包含的图形对象,并将它赋值给变量ssl。

3.3.4AutoCAD函数
(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)“输出函数”的功能为向屏幕或指定的的文件输出字符和数值,函数有下列三种格式:
(prinl表达式 [文件描述符])
(princ表达式 [文件描述符])
(print表达式 [文件描述符])
函数中的表达式为输出的内容(字符、数值或表达式返回的值),“文件描述符”为可选参数,如果输出至指定的文件则需要文件描述符,在屏幕提示区输出则不需要。

以上三种输出格式有较小的差别,对于在屏幕提示区的输出,例如:(setq a123b“ABC”c“Happy \n New Year”)
(prinl a)──不换行输出数字123,后面不留空格;
(print a)──换行后输出数字123,后面加空格;
(princ a)──不换行输出数字123,后面不留空格。

3.4Auto LISP语言的使用案例
3.4.1直线画圆
直线画圆案例:
(defun c:hy()
(setvar "cmdecho" 0) ;指令执行过程不响应
(setq en (entsel "选择一条直线:")) ;要求碰选一条线
(setq en_data (entget (car en))) ;取得元体资料串行
(setq pts (assoc10en_data)) ;取得群码10的子串行
(setq pt1 (cdr pts)) ;取得起点pt1坐标
(setq px1 (car pt1)) ;取得pt1坐标的x值
(setq py1 (cadr pt1)) ;取得pt1坐标的y值
(setq pta (assoc11en_data)) ;取得群码11的子串行
(setq pt2 (cdr pta)) ;取得终点pt2坐标
(setq px2 (car pt2)) ;取得pt2坐标的x值
(setq py2 (cadr pt2)) ;取得pt2坐标的y值
(setq nx (/ (+ px1px2) 2)) ;求得中点X值
(setq ny (/ (+ py1py2) 2)) ;求得中点Y值
(setq npt (list nx ny)) ;结合mx & my成mpt点
(setq nr (getdist npt "输入半径:"));要求输入半径值
(command "circle" npt nr) ;完成直线中点画圆
(prin1)
)
在上述案例中,算法步骤如下:
首先,选取需要的直线,获得直线端点坐标,其次,利用端点坐标求得直线中点坐标,求得的该点坐标可以是圆心也可能是圆上一点(具体看画圆时取点方向),最后输入圆半径值,也可以在图上指定一点为圆半径,完成直线画圆。

其中,hy为该程序的调用命令,entsel函数用点选择的方式选择单个实体,并返回一个表。

(assoc10en_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 (assoc40en_data));取得半径子串行
(setq old_rr (cdr old_rad_list)) ;取得旧有半径
(princ“\n圆旧半径=”)(princ old_rr) ;显示该旧圆半径值于指令区
(setq cenpt (cdr (assoc10en_data))) ;取得圆之圆心
(setq new_rr (getdist cenpt "输入一新半径值:"));输入一半径值
(setq new_rad_list (cons40new_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语言的掌握使用也会更加容易。

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_number0);对选中的实体排序
(repeat (sslength ent);重复操作
(setq ent_name (ssname ent ent_number));取出选中实体的像素名称
(setq ssdata (entget ent_name));取出数据串行
(setq tix (assoc1ssdata));找出数据中的文字数据
(setq tex (cdr tix));得到注记数值
像这样,不需要事先排查,因为图面上具有文字信息的只有注记,所以得到的数值只可能是注记的,因此,对注记的修改就是对注记数值的修改。

相关文档
最新文档