AutoLISP在CASS绘图软件中的应用_第1页
AutoLISP在CASS绘图软件中的应用_第2页
AutoLISP在CASS绘图软件中的应用_第3页
AutoLISP在CASS绘图软件中的应用_第4页
AutoLISP在CASS绘图软件中的应用_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AutoLISP在CASS绘图软件中的应用摘要随着科学技术的开展,计算机的应用越来越被广泛的应用到各行各业,而对于测绘专业,大量的数据处理时是其根本特征,处理数据是一项繁琐的工作,如假设使用计算机编程语言编写程序来处理测绘专业的大量的数据,不仅能够节省大量的时间和人力物力,同时也可以有效的防止处理数据时由于数据过多造成不必要的错误。本文主要是使用计算机语言AutoLISP——一款内置于AutoCAD中的编程语言,通过编写程序,用来研究AutoLISP在CASS软件中的应用,由于CASS主要是基于AutoCAD平台用来绘制图形的软件,所以本设计主要是研究关于AutoLISP在CASS中的计算方面的应用。论文中主要是研究了用AutoLISP语言编写程序用于测边交会计算、测角交会计算、城市坐标系与建筑坐标系计算及地物绘制。关键词:AutoLISP语言,测角交会计算,测边交会计算,建筑坐标系和城市坐标系转换,地物绘制TheapplicationsofAutoLISPinCASSdrawingsoftwareABSTRCATWiththedevelopmentofscienceandtechnology,theapplicationsofthecomputeraremoreandmorewidelyappliedtoallwalksoflife.Andforthesurveyingandmapping,largeamountsofdataprocessing,itsbasiccharacteristics,thatdataprocessingisatediouswork,shoulduseacomputerprogramminglanguagetowriteaprogramtohandlelargeamountsofdata.Usingit,notonlycansavealotoftimeandmanpowerandmaterialresources,butalsocaneffectivelyavoidtoomuchdatatocauseunnecessaryerrorswhenprocessingdata.Inthispaper,thecomputerlanguageofAutoLISP-abuilt-inAutoCADprogramminglanguage,throughthepreparationprocess,isusedtostudytheapplicationofAutoCADintheCASSsoftware.CASSismainlybasedonAutoCADsoftwareusedtodrawgraphics,sothispaperistostudyonthecalculationofAutoLISPinCASS.Paperistostudyforthesideoftheintersectioncalculation,themeasuredangleofintersectioncalculations,thecitysystemandthebuildingcoordinatesystemconversations,andsurfacefeaturesdrawingwiththeAutoLISPprogramming.Keywords:AutoLISPprogramming,thesideintersectioncalculation,measuredangleoftheintersectioncalculation,thecitysystemandthebuildingcoordinatesystemconversations,andsurfacefeaturesdrawing目录1绪论11.1AutoCAD的简介11.2AutoCAD的二次开发的开展与现状12AutoLISP语言32.1AutoLISP语言的简介及特点32.2AutoLISP的运行环境与内存分配32.3AutoLISP的数据类型42.3.1原子52.3.2表和点对52.4AutoLISP程序的执行62.4.1AutoLISP文件的加载62.4.2运行AutoLISP程序73AutoLISP的函数83.1数值函数83.2逻辑运算函数93.3三角函数103.4字符串处理函数113.5条件与循环函数124AutoLISP与CASS之间的联系134.1AutoCAD与CASS之间的联系134.2AutoLISP与CASS之间的关系145AutoLISP在CASS中的应用175.1编写AutoLISP程序进行测边交会的计算175.2编写AutoLISP程序进行测角交会的计算215.3关于角度化成十进制并输出255.4坐标换算265.5地物绘制316结论与展望366.1结论366.2展望36致谢38参考文献391绪论随着计算机技术的飞速开展,以计算机为根底的智能绘图和设计软件日益成为相关专业不可或缺的一局部,而这些绘图和设计软件以其人机交互、功能强大、易学易懂的功能受到人们的亲睐。AutoCAD就是其中一种,它是美国Autodesk公司推出的一款计算机辅助绘图和设计软件,它以自己强大的功能已广泛应用于机械专业、土木专业以及测绘测量的相关领域。AutoCAD通过其强大的功能以及开放式的功能结构,大大的改变了传统绘图和设计的工作方法,工作过程和工作方式,它不仅大大改善了传统绘图的很多弊病,同时也以其强大的优点使得当代的绘图和设计工作能够更有效更高质量的得到完成。1.1AutoCAD的简介AutoCAD系列软件是由美国的Autodesk公司研制开发出的,一种为满足用户进行绘图设计工作的需求的,以计算机辅助图形的绘制和设计的软件,这个软件的英文全名是AtuoComputerAidedDesign,即计算机辅助设计。AutoCAD计算机绘图软件有丰富的界面工具和功能,此外,随着AutoCAD系列的软件的开展,AutoCAD可以用来绘制出复杂而精确的图形。另外,随着不同行业的需求,AutoCAD也为相关的专业、行业开展出与之相匹配的软件,为这些专业的应用设计与开展提供效劳,如在测绘测量行业,基于AutoCAD平台而开发出来的南方CASS成图系统软件备受广阔的测量专业人士的喜爱,当然南方CASS成图系统软件最适用于测绘专业的是它强大的测绘专业要求的自动绘成图的功能。1.2AutoCAD的二次开发的开展与现状AutoCAD软件凭借其强大的而又丰富的功能,越来越广泛的渗入各个行业的各个领域。随着不同专业的客户对AutoCAD在自己专业应用的需求的增长,客户对各自需求的AutoCAD的二次开发的功能的要求也愈发强烈。所以,不同的专业开发出不同的功能、举一反三、触类旁通,这些AutoCAD的二次开发功能的优点越发的得到专业人士喜爱。通过AutoCAD的二次开发语言进行编程,用来实现大量数据的整体更改;用二次开发的程序进行复杂的大量的曲线的自动绘制;用二次开发的程序进行相关专业的大量数据的统计与计算;用二次开发的程序进行绘制设计图纸的自动的标注等等,二次开发的程序的应用越来越多的被用来解决许多复杂的、重复的工作,其方便的快捷的使用过程开辟了AutoCAD的二次开发的新天地。当今社会,各个专业的各个人士,一提到绘图与设计软件,AutoCAD这个词语立即就会脱口而出,AutoCAD已经不仅只是一个简单软件了,它已经完全成为了现时下各行业人士最为熟悉与认可的一个工程绘图设计软件了。说道绘图制图,AutoCAD一定会被人们提及,形成这种的局面的原因除了Atuodesk公司的大幅度的宣传之外,恐怕所有的功能都要归功于这个软件的强大的绘图与编辑功能,以及它强大的二次开发功能的运用。如今的AutoCAD的开展已经深深的渗入了各个专业的各个领域与环节了,它不仅适用于某些专业的二维平面图形的绘制和设计,更是可以满足一些行业对三维立体工作的要求,这说明了AutoCAD的功能已经不仅局限于二维平面图形的绘制,它对于三维建模也同样可以拥有其巨大的能量。如果这样说来,AutoCAD的功能已经足够强大了,那么二次开发的开展是不是就不太需要了呢?恰恰相反,AutoCAD的二次开发不但不是多余之举,反而是更是大大加强了AutoCAD的各种功能。比方测绘行业,因为测绘行业所进行的相关领域的工作都是大范围的测量与地形图的绘制,为完成这些工作就得进行大量的数据处理和大量的公式运算以及通过野外测得许多数据点进行地形绘制。在使用这些点进行地物绘制时,如果单纯使用AutoCAD的自带选项功能进行处理就会十分繁琐与麻烦,但是如果假设通过AutoCAD的二次开发功能够开发出一系列的程序,用来处理测量中的这些数据的处理和其公式的运算并进行等高线的绘制,它不仅在很大程度上省下人力物力、方便该专业的相关工作的进行,而在另一个角度上,它也推动了该专业在该领域的开展与进步。2AutoLISP语言2.1AutoLISP语言的简介及特点AutoLISP是〔ListProcessingLanguage〕是一种计算机的表处理语言,是在人工智能学科领域广泛应用的一种计算机程序设计开发语言。AutoLISP语言嵌套在AutoCAD的内部,是LISP语言和AutoCAD有机结合的产物。在1987年6月份,AutoCAD添加了三维模式绘图的功能,并且研发出了二次开发的汇编语言——AutoLISP。用户可以运用这种汇编语言,在AutoCAD的开发平台进行AutoCAD的二次开放,这种二次开发的功能突破赋予了AutoCAD注入了新的血液。用户不但可以进行相关功能的二次开发,也可以继续扩充AutoCAD的功能,为AutoCAD占领整个绘图专业的相关领域提供了巨大的能量。AutoLISP是开发AutoCAD的重要工具之一。它可以直接调用AutoCAD的命令,它不但具备一般高级语言的根本结构和功能,又具有一些高级语言所不能完成的强大的图形处理功能,是当今世界用于AutoCAD二次开发中的最广泛使用的编程语言之一。美国AutoDesk公司把AutoLISP内嵌于AutoCAD,就是为了使广阔用户更加方便的利用AutoLISP进行二次开发:实现直接增加和修改AutoCAD的命令,随意更改图形编辑的功能,开发CAD相关的功能软件等等。AutoLISP语言最显著的功能就是参数化绘图的程序设计过程,实现图形的自动绘制以及进行图形的自行修改等功能。AutoLISP语言一个最大的优点就是可以采用递归方式处理问题,这样一来,不仅可以节省大量的时间,也使得程序简单明了。2.2AutoLISP的运行环境与内存分配AutoLISP对于运行环境有一定的要求,主要是对处理器、存储器以及输入、输出设备的要求:1.对处理器的要求:(1)至少应为386型计算机,计算机应配有协处理器,即CPU386+387;(2)最好CPU为486或者是586。2.对存储器的要求(1)内存:AutoLISPR2.6~R10,有1MB以上的内存即可;AutoLISPR11以上版本,有4MB以上的内存即可,最好8MB内存。(2)硬盘:AutoLISPR2.6~R10,有10MB以上的空闲硬盘空间即可;AutoLISPR11以上版本,至少要35MB的空闲硬盘空间。3.对输入、输出设备的要求(1)应配有鼠标或数字化仪,以便于输入;(2)应配有打印机或绘图仪,以便于图形的输出;(3)彩色的显示器,分辨率在640×400像素以上;(4)应配有高密软驱,以用于软件的安装。AutoLISPDE内存分配主要是为其变量、用户定义函数和系统函数提供计算机的存储空间。当运行AtuoLISP程序时,它需要两个很大的内存区域。(1)heap〔堆区域〕,它存储所有的函数和变量,因此,程序使用的函数和变量越多,或者函数越为的复杂,那么他的堆区域占用的空间也就越多。(2)stack〔栈区域〕,它存储的函数的变量和局部结果,因此“嵌套〞的函数越为的复杂与丰富,或者函数的执行的递归次数越多,那么所用的栈空间内存也就越多。AutoLISP默认的堆空间和栈空间的大小为:Heap为25000B,Stack为20000B在AutoCAD下运行AutoLISP不能扩展它的堆和栈空间,如果用户定义的函数和变量太多太复杂,以致占用了所有的堆空间,AutoLISP将会显示以下信息:Insufficientnodespace,并且会终止正在执行的函数的运行,如果在执行AutoCAD时,没有足够的内存装入AutoLISP,那么显示以下信息:Insuffcientmemory-AutoLISPdisabled,直到有足够的内存后AutoCAD重新启动时,AutoLISP所需要的堆栈区域占有内存量。2.3AutoLISP的数据类型AutoLISP语言的数据类型和其他的高级编程语言十分的相似,但是它又有自己的特殊的数据类型,它主要包括:符号〔SYM〕、字符串〔STR〕、表〔及用户定义的函数〕〔LIST〕、文件描述符〔FILE〕、AutoLISP的内部函数〔SUBR〕、AutoCAD的选择集〔PICKSET〕、AutoCAD的实体名〔ENAME〕和函数分页表〔PAGETB〕。AutoLISP的前五种数据类型,前四种被成为原子〔ATOM〕,它主要包括数字原子、符号原子和串原子。而AutoLISP语言最根本的数据类型是原子和表。原子原子主要包括整数、实型数、符号和字符串。整数是由0、1、2……9、+、-等字符组成。实型数用双精度浮点数表示,并且至少有14的精度,即是整数后面的小数点的个数。实型数的范围是-1.797693×10308~1.797693×10308,从这个范围来看,它的范围十分的庞大,几乎不会超界。符号〔symbol〕包括除“〔〞、“〕〞、“、〞、“.〞、“;〞之外的所有打印字符,它的长度没有任何限制,但是用户使用时最好控制在6个以内,以免因占用多余的内存,而造成运行速度的降低,另外,在AutoLISP中,字符的大小写是不区分的,如:AubVTx-8-u@fx都是合法的。在AutoLISP中,所有字符都是有值的,所以每一个符号都是要赋予一定的值,一般用赋值函数来完成这个工作。字符串是指在一对双引号中所包含的所有字符,如:“ABC〞“135”“blancebeam〞“〞字符串包括任何可打印的字符,当然,在字符串中的字母的大小写以及空格的个数都是具有一定的意义的。此外,字符串对于长度有一定的限制,一般来说最多不能超过100个字符,超出这个界限,超出的字符都是无效的。如果字符串中没有任何字符,那么作为空串处理,即“〞。表和点对1.表在autollisp语言中,表有两种类型,即标准表和引用表。标准表:它是AutoLISP语言中的根本的构成形式,AutoLISP程序就是由标准表构成的。它可以用来处理函数的调用,其中第一个元素应是系统定义的内部函数或者是用户定义的函数,而其他的元素那么为该函数的参数,引用表:这种表区别于标准表的不同就是它不作为函数调用,而是用来处理数据的,很容易想象的出,用它处理关于坐标方面的数据十分简单。2.点对点对也是一种表,这个表中有且仅有两个元素,它的书写格式要求十分严格,即两个元素的中间为一个圆点“·〞,且圆点与元素中间必须用空格分开,如〔A·B〕就是一个点对的例子,这个点对中A、B与圆点均有空格隔开,其中第一个元素A为这个点对的左元素,理所当然,第二个B即为其右元素。点对可以任意嵌套,只要嵌套时注意它的书写要求,那么不会出现错误。点对常被用来构造连接表。2.4AutoLISP程序的执行有些AutoLISP程序十分简短,仅仅只有几句语言组成,那么它就可以使用defun函数定义简单的用户函数进行运算,同样也可以在AutoCAD环境中的command:提示符下直接输入命令即可,运算的结果那么会直接在文本屏幕中显示。对于AutoLISP程序,需要先在文本编辑器上进行语言程序的编写,编辑器可以任意选取,但是最好是使用AutoLISP自带的编辑器进行编写,因为它自带的编辑器对函数和变量会有不同的显示颜色,方便检查错误。AutoLISP文件的加载一般说来,通过AutoLISP语言编辑的LISP文件,需要经过加载才能够进行使用。加载AutoLISP文件有以下三种方法:1.命令行输入加载方式当回到AutoCAD环境下,用load函数进行装载就可以执行。如果程序中没有defun函数,系统就会边装载边运行,假设有,装载后只需在command:提示符下键入defun的函数即可运行相对应的函数。加载文件的格式为:Command:(load“驱动器:\\路径\\文件名〞)加载文件的格式为:Command:(load“驱动器:\\路径\\文件名〞)2.用对话框的方式加载首先在“工具〞栏的下拉菜单找到“AutoLISP〞选项,然后在子菜单中选择“加载〞选项,对话框如图2.2所示。图2.2“加载/卸载应用程序〞对话框然后选取需要加载的LISP文件,选择加载。命令行可以看到如以下图2-3所示的成功加载信息,如以下图2.3所示。3.自动加载方式在AutoCAD的工作目录下有一个ACAD.LSP文件,它是当系统启动时、新建文件、翻开文件时自动装载的AutoLISP程序,用户可以通过它实现程序自动的加载。在使用时,如果程序出现错误,那么剩余的文件不会被继续加载,并提示错误,假设有局部函数调用成功,那么返回加载文件的最后那个表达式的值。运行AutoLISP程序装载完成后,我们就可以在命令行command:键入函数名即可执行这个程序段,系统将执行程序,运行出结果。概括来说AutoLISP的运行过程为:首先,用户编写相关语言程序,在此时,系统会为用户使用的变量和内存分配内存,当用户编写完程序之后,加载程序,如果程序正确,那么返回表达式的值,如果运行错误,那么停止程序的加载。装载完后,用户就可以使用AutoLISP语言中defun定义的函数了。3AutoLISP的函数AutoLISP函数就是在进行AutoLISP语言编写时,所用来计算问题所需要的算法。AutoLISP的函数十分丰富,接下来介绍一些常用的函数。3.1数值函数计算函数中,最常用的包括加函数、减函数、乘函数、除函数、平方根函数和正负判断函数。1.加函数+(+<num1><num2>……)即(+<数1><数2>……)本函数计算之后所返回的值就是所有的<数>的和。其中的数可以是整型数和实型数。如果所有的数都是整型数,那么它的返回值也是一个整型数;如果有其中的一个数是实型,那么它的返回值那么是一个实型数;如果只提供一个数,系统将会默认是与0相加,返回与0相加的结果;如果没有提供一个数,那么系统返回值为0。例如:命令:(+123.0)6.02.减函数–(-<num1><num2>……)即(-<数1><数2>……)此函数是用第一个数减去以后所有数的和,并返回所求值的结果。假设只给一个数目那么是返回0减去这个数的结果;假设不提供任何数目,那么返回0;此函数对函数中数的类型的规那么与加函数是相同的。例如:命令:(-531.0)1.03.乘函数*(*<num1><num2>……)即(*<数1><数2>……)本函数返回所有<数>的乘积,其返回值同样取决于这些数值的类型,如果函数只提供了一个数,那么不同加减函数的是,函数返回值是这个数乘以1所得到的值,假设不提供数,那么是返回0.例如:命令:(*1234.0)24.04.除函数/(/<num1><num2>……)即(/<数1><数2>……)本函数返回值那么是第一个数除以第二个数,依次除以第三……的数的值,如果只提供一个数,那么是返回除以1所得到的值,如果没有提供任何数目,那么返回0。这个函数返回值的类型同样取决于各个数的类型,如果其中一个数是实型,那么它的返回值那么也是实型。例如:命令:(/9(/2.03))13.55.平方根函数sqrt(sqrt<num>)该函数返回的值是<num>的平方根,其数据类型总为实型数值,函数的使用中,要注意这个数的取值范围。例如:命令:(sqrt(/42.0))1.414213.2逻辑运算函数逻辑运算函数,是用来进行逻辑关系的运算,它主要包括逻辑与、逻辑或和逻辑非的运算。1.逻辑与AND(and<expr>……)这个函数的返回值是表达式逻辑与的运算结果,如果这个函数运算每一个的表达式的结果都是nil,那么这个函数将停止运算,并返回nil,否那么返回T。例如:命令:(setqa103bnilc“string〞)命令:(and1.4ab)nil2.逻辑或OR(or<expr>……)这个函数所返回的运算结果值是返回表达式逻辑或〔OR〕的运算结果,or函数运算表达式是从左往右一次运算,找到一个非nil的表达式,一旦找到,就会停止运算,并返回T,如果表达式中没有一个非nil的表达式,那么函数会返回or。例如:命令:(ornilT)T3.逻辑非NOT(not<expr>……)这个函数的是对表达式进行逻辑非(NOT)的运算,如果表达式的值为nil,那么返回值为T;否那么,那么返回nil。3.3三角函数三角函数主要是用来计算数学中角度的问题,AutoLISP中的三角函数主要有正弦函数、余弦函数和反正切函数。1.正弦函数sin(sin<angle>)该函数运行的结果返回值是为<angle>的正切值,其中<angle>是用弧度制表示的角度。例如:命令:(sin1.0)0.814712.余弦函数cos(cos<angle>)这个函数的返回值是<angle>的余弦值,其中<angle>为弧度制。例如:命令:(cos1)0.5403023.反正切函数atan(atan[<num1>][<num2>])该函数返回值是一个数的反正切值,且是以弧度制表示,<num1>和<num2>也可以作为坐标系内的坐标值,从而判断取值,所返回的角度范围是-pi至+pi之间的弧度。例如:命令:(atan3.02.0)0.9827943.4字符串处理函数在工程绘图中,文字注记十分重要。在处理大量的文本数字注记时,如果单纯使用AutoCAD自身的编辑功能,就会十分繁琐。因此在AutoLISP中,系统提供相关的字符串处理函数,其中最常用的几个字符串处理函数是求字符串长度函数和字符串连接函数等。1.求字符串长度函数strlen(stringlength)(strlen[(string)]……)这个函数是用来求一个字符串的长度,也就是求字符的个数,并把这个值作为函数值返回。例如:命令:(stelen“surveying〞“and〞“mapping〞)192.字符串连接函数strcat(stringcatenation)(strcat<string1>[<string2>]……)这个函数首先是把多个变元所提供的字符串连接在一起,然后把连接而成的新的字符串作为函数返回值返回。例如:命令:(strcat“Auto〞“LISP〞)“AutoLISP〞3.5条件与循环函数为简化程序,循环结构必不可少,而对于逻辑判断,条件运算又是必备手段。所以程序结构中分支结构和循环结构尤为重要,那么条件函数和循环函数的地位就更是不言而喻了。1.条件函数条件函数通常用来测试表达式的值,然后根据测试的结果进行相应的运算,AutoLISP的条件函数是if和cond。1.单一条件的两分支结构if(if<testexpr><thenexpr>[<elsexpr>])首先函数先对<testexpr>进行判断,如果求值为非空,那么对<thenexpr>进行求值并返回,否那么,那么是对<elsexpr>进行求值。例如:命令:(if(=2(+11))“YES!〞“no.〞)“YES!〞2.多分支结构cond(cond(<test1><result1>……)……)这个函数是AutoLISP语言的一个重要的条件函数,cond函数的求值是由上至下,逐个测试每个分支,如果测试的结果是一个非nil的值,那么运算测试语句后面的结果语句,那么其他的分支不在执行和运算。2.循环函数循环结构在AutoLISP语言中应用十分广泛,它的运算思路就是测试—求值—测试,直到满足条件终止循环为止。在AutoLISP语言中运用最广泛的循环函数是while函数。while函数(while<testexpr><expr>…)While函数对一个测试表达式进行求值,如果它的值是非nil,那么计算其他表达式,并重复这个计算过程,直到它的值是非nil。4AutoLISP与CASS之间的联系CASS软件是现行测量测绘专业使用最多的一个软件之一,它是由南方测绘仪器出产的,它是以AutoCAD为平台根底进行二次开发而出的,效劳于测绘专业的地形地籍数字化成图的专业软件,使用CASS时不仅可以使用AutoCAD各种指令功能,同时它又发挥着自己独特的专业效劳功能。4.1AutoCAD与CASS之间的联系CASS软件是基于AutoCAD软件的二次开发的专业软件,所以在安装CASS之前,必须安装AutoCAD2002后才能进行。在平安安装AutoCAD软件后,能够正常使用,这时才可以继续安装CASS。从这点就可以看出AutoCAD与CASS的之间的联系是多么的紧密。CASS是运用AutoCAD软件的技术进行研发而出的数字化成图软件,因此AutoCAD的功能在CASS中同样能够得到使用,AutoCAD的菜单和工具条的依旧可以继续使用,这一点就为CASS这个数字化成图软件,实现数字化成图功能提供了强大的绘图根底。虽然CASS出自于AutoCAD,但是它同样具有其独特的特色,所谓“青出于蓝而胜于蓝〞,在CASS与AutoCAD中得到充分的表达。CASS是专门为测绘专业开发的软件,它适用于测绘专业的各种成图绘图的要求,比方,测绘专业的坐标系统和普通的坐标系统不同,在使用CASS绘制地形图之前,首先要进行坐标系的转换。测绘专业很多绘制地形图地籍图的工作都是首先到实地进行野外采集点位的坐标数据,然后根据这些点位的三维坐标进行地形图的绘制,绘制出等高线图,这一点和普通的AutoCAD绘制平面图不同,因为它参加的高程,它要求是在三维坐标的根底上,绘制等高线。此外,由于地物的种类繁多,而相应的表示符合也是多种多样的,如果单纯用AutoCAD添加这些标注,那将是一个十分繁琐而冗长的工作。而CASS那么恰恰实现了这些功能,它包含大量的测绘专业要求的专业表示符号,用来注记相关的地物,使得绘制地形图注记这个工作变得简单。此外,CASS同样在AutoCAD的绘图根底上,更加完善绘制专业地物的绘图功能,这样不仅可以实现测绘专业的绘图功能,同时为实现专业地物的绘制提供了方便。4.2AutoLISP与CASS之间的关系上节说到AutoCAD与CASS之间的联系,后者是在前者之上开发出来的软件。而AutoLISP与AutoCAD之间的关系与他们二者的关系有些相同之处,又有不同之点。首先AutoLISP是AutoCAD用来进行二次开发的工具,换言之,可以使用AutoLISP进行AutoCAD的二次开发,而CASS是基于AutoCAD平台进行的二次开发。所以从这一点上来说是相同的,也就是二者都是基于AutoCAD平台的,不同之处就在于AutoLISP是用来进行二次开发的,而CASS那么是开发出来的成果软件,所以二者的相同点是都是基于AutoCAD平台,不同就是AutoLISP是用来进行二次开发的,而CASS那么是已经开发出来的软件。既然二者都是都是基于AutoCAD平台的,那么是否可以使用AutoLISP开发出关于CASS软件相关应用的功能呢?原理上,可以使用AutoLISP开发出基于AutoCAD平台的关于绘图和计算的功能,是否可以考虑把这些开发功能应用于CASS软件中,即与CASS软件息息相关的测绘专业的相关专业应用上,比方进行一些复杂的运算,又或者进行图像的绘制。就着这个问题,我们首先看几个关于AutoLISP程序的例题。【例4-1】编一个程序,在一个文件中写入四个点的坐标,并用这些点位左边绘制一个四边形。;用户自己定于一个函数:(defunc:四边形();新建一个储存数据的文件:(setqfi(getstring"\n输入文件的名字:"));翻开这个文件,用于操作:(setqfile(openfi"w"));提示输入点数据:(prompt"在文件里输入四个点:");在这个文件中,写入数据点位:(setqa(getpoint"\n输入第一个点坐标:"))(princafile)(setqb(getpoint"\n输入第二个点坐标:"))(princbfile)(setqc(getpoint"\n输入第三个点坐标:"))(princcfile)(setqd(getpoint"\n输入第四个点坐标:"))(princdfile);关闭这个数据文件:(closefile);把这个点用直线连接起来:(command"line"abcd"c"))加载程序,运行结果如以下图4.1:图4.1运行过程和运行结果从这个例子可以看出用AutoLISP编程在AutoCAD平台实现图形的绘制是可行的,由这个启发,我们可以尝试通过AutoLISP编程进行CASS软件要求的进行一些地物的绘制,在下一章将进行这方面的尝试。【例4-2】编程求方程ycos2x+x/sin(x-2)+xyz的解,其中x=2,y=6,z=8(defunc:复杂计算(/xyzs)(setqx4)(setqy6)(setqz8)(setqs(+(*y(cos(*x2)))(/x(sin(-x2)))(*xyz)))(princs)(princ))加载程序,运行结果如以下图4.2:图4.2复杂计算的运行结果从这个例题中可以看出,使用AutoLISP编程可以进行一些复杂运算的求解。大家都知道,在测绘专业,有很多复杂的公式求解运算,如果把这些公式用程序编出来,配合CASS软件的使用,可以使一些工作的计算得到简化,大大的节省了人力和物力。在下一章节,将会以这个问题为主线,编写一些复杂公式的计算程序进行相关运算,从而去研究AutoLISP在CASS中的应用。5AutoLISP在CASS中的应用在上一章中,从一些简单的例子中,我们看到了AutoLISP编程绘制图形和进行复杂计算的强大能力,在这一章中,通过一些例子,我们再次深入的探讨AutoLISP在CASS中的应用。5.1编写AutoLISP程序进行测边交会的计算从待定点P向两个点A和B测量边长AP(b)和BP(a),如以下图5.1,然后计算P点的坐标,称为侧边交会,又称为距离交会。具体的解题思路如下:图5.1侧边交会首先从P点作AB边垂线,交于D点,得辅助线段AD〔e〕,PD〔f〕,那么:,(5-1-1)并计算辅助线段长度:;(5-1-2)然后计算AP、AD、DP点间的坐标增量关系:;(5-1-3);(5-1-4);(5-1-5)因此,A点到P点的坐标增量:;(5-1-6)直接计算待定点P的坐标公式为:;(5-1-7)求得P点的坐标,可以用以下公式进行检核:;(5-1-8)编写程序代码如下:;用户定义函数和变量:(defunc:cb(/dxdyxayaxbybabcefd1d2d3xpypxapyapxbpybpxd1xd2p1p2p3);系统变量,用来显示绘制图形的屏幕:(graphscr);从命令行输入数据:(setqxa(getreal"\n输入A点的x坐标:"))(setqya(getreal"\n输入A点的y坐标:"))(setqxb(getreal"\n输入B点的x坐标:"))(setqyb(getreal"\n输入B点的y坐标:"))(setqd2(getreal"\n输入A到P的距离:"))(setqd1(getreal"\n输入B到P的距离:"));编写语言进行公式的运算求解:(setqdx(-xbxa))(setqdy(-ybya))(setqd3(sqrt(+(*dxdx)(*dydy))))(setqc(atandydx))(setqa(sinc))(setqb(cosc))(setqe(/(-(+(*d2d2)(*d3d3))(*d1d1))(*2d3)))(setqf(sqrt(-(*d2d2)(*ee))))(setqxp(+xa(+(*eb)(*fa))))(setqyp(+ya(-(*ea)(*fb))))(setqxap(-xpxa))(setqyap(-ypya))(setqxbp(-xpxb))(setqybp(-ypyb))(setqxd1(sqrt(+(*xapxap)(*yapyap))))(setqxd2(sqrt(+(*xbpxbp)(*ybpybp))));根据得到的数据坐标点进行图形的绘制:(setqp1(listyaxa))(setqp2(listybxb))(setqp3(listypxp))(command"line"p1p2p3"c")(command"text""m"p1150"A")(command"text"p2150"B")(command"text"P3150"P");输出每项的计算的结果:(setqc(angtosc04))(princ"AB边的坐标方位角:α=")(princc)(princ(strcat"\n辅助线段:e="(rtose)))(princ(strcat";f="(rtosf)))(princ(strcat"\nA点至P的坐标增量:ΔxAP="(rtosxap)))(princ(strcat";ΔyAP="(rtosyap)))(princ(strcat"\nB点至P的坐标增量:ΔxBP="(rtosxbp)))(princ(strcat";ΔyBP="(rtosybp)))(princ(strcat"\n待定点P的坐标:xp="(rtosxp)))(princ(strcat";yp="(rtosyp)))(princ(strcat"\n检核计算:a="(rtosxd1)))(princ(strcat";b="(rtosxd2)))(princ))程序加载及运行结果如以下图5.2:图5.2程序运行过程、输出结果和图形绘制这个程序用于计算测边交会,十分方便,只需要输入需要的数据内容,程序便可计算出相应的结果,并且可以输出计算过程中的每一项的计算结果,在最后,同样也输出了检核计算的内容。5.2编写AutoLISP程序进行测角交会的计算测角交会就是从相邻的两个点A、B向待定点P观测水平角α和β,如以下图5.3,然后计算待定点P的坐标。具体的解题思路如下,图5.3测角交会首先进行坐标反算,根据点的坐标,反算两点边长c和方位角αAB:;(5-2-1)然后,用三角正弦定律计算点到待定点的边长a,b:;(5-2-2)按下式计算待定边的方位角:;(5-2-3)最后根据点至待定点的边长和方位角,按坐标正算,分别从A、B计算待定点P的坐标,两次算的坐标应该相等,可以作为检核:;(5-2-4);(5-2-5)如果将上面的按测角交会法计算待定点坐标的一系列公式,经过化算,可得到直接计算待定点坐标的一种公式:(5-2-6)编写程序代码如下:;用户定义函数和变量:(defunc:cj(/x1y1x2y2a1a(graphscr);暂停程序,使用户从命令行输入数据:(setqx1(getreal"\n输入第A点的x坐标:"))(setqy1(getreal"\n输入第A点的y坐标:"))(setqx2(getreal"\n输入第B点的x坐标:"))(setqy2(getreal"\n输入第B点的y坐标:"))(setqa1(getorient"\n输入点A向待定点P观测角度α:"))(setqa2(getorient"\n输入点A向待定点P观测角度β:"));相关公式计算:(setqa1(/(sina1)(cosa1)))(setqa2(/(sina2)(cosa2)))(setqa3(+a1a2))(setqa4(*a1a2))(setqxp(/(+(+(*x1a1)(*x2a2))(*(-y2y1)a4))a3))(setqyp(/(+(+(*y1a1)(*y2a2))(*(-x1x2)a4))a3));根据计算坐标进行图形的绘制:(setqp1(listy1x1))(setqp2(listy2x2))(setqp3(listypxp))(command"line"p1p2p3"c")(command"text""m"p1150"A")(command"text"p2150"B")(command"text"P3150"P");输出运算的结果 (princ(strcat"tanα×tanβ="(rtosa4)))(princ(strcat"\ntanα+tanβ="(rtosa3))) (princ(strcat"\n待求点p的坐标:\nxp="(rtosxp))) (princ(strcat",yp="(rtosyp))) (princ))程序运行过程及加载结果和图形输入如以下图5.4:图5.4程序运行过程及加载结果和图形输出这个程序可以用来计算测角交会,可是在计算过程中角度的输入和使用十分的不方便,因为测绘专业要求的角度需要精确到秒的单位,在下一节中,将详细介绍如何处理度分秒制的角度。5.3关于角度化成十进制并输出在测绘专业中,角度的使用十分频繁。为使精度到达一定的要求,角度会用秒的单位,所以在测绘专业的各种计算中,在有角度的相关计算时,度分秒的表示的角度会一直存在,而在AutoCAD中,无法输入度分秒表示的角度,并且经过一定的三角函数运算后,角度会化成弧度。如果我们使用AutoLISP编程计算相关的公式时,输出的运算结果是弧度制,而我们希望看到的是十进制表示或者度分秒表示。下面我们就以一个例子说明如何用程序进行角度化成十进制用于计算,而在输出时又如何化成度分秒或者十进制输出。【例】编一个程序把15°36′18″化成十进制用于计算它的余弦值并输出。具体的编程思路:1.通过度分秒数分别输入进行化算成十进制,2.转换成弧度制用来计算,3.输出结果具体的编写程序代码如下:;用户定义函数变量:(defunc:jdhs(/abc);分别输入角度的度分秒:(setqa(getreal"角度的秒数:"))(setqb(getreal"角度的分数:"))(setqc(getreal"角度的度数:"));把角度的度分秒制换算成十进制:(setqa(/a3600))(setqb(/b60))(setqa(+c(+ab)));把角度转换成弧度制(setqa(*pi(/a180)));计算它的余弦值:(setqz(cosa));根据要求,用angtos函数将角度转换成相应单位表示的角度:(setqx(angtosa04))(setqy(angtosa14));输出结果:(princ(strcat"十进制的角度:a="x))(princ(strcat"\n度分秒制的角度:a="y))(princ(strcat"\n余弦值cosα="(rtosz)))(princ))程序加载及运行结果如以下图5.5所示:图5.5程序运行过程和加载结果这个程序用于角度换算弧度十分简便,如果下次再进行相关的运算时,只需要调用这个结果,即可得到结果,不需要每次都要进行编写,在下一章节的例子中,将会调用这个函数中换算弧度的那段代码函数。5.4坐标换算在测绘专业中,地面上的同一个点的在不同的坐标系统中的值也不相同,但是在这些坐标系统中,它们是可以根据相应的数学关系进行换算的。接下来,以城市坐标系与建筑坐标系之间的转换关系为例,使用AutoLISP进行编写程序完成二者之间的相互转换关系。【例1】建筑坐标系下的原点O′在城市坐标系中的坐标为:xO=528.456m,yO=496.332m,建筑坐标系x′在城市坐标系中的方位角α=19°56′18″,将A(600.000,200.000),C(600.000,800.000),D(600.000,1300.000)转换成城市坐标,如以下图5.6所示:图5.6城市坐标系与建筑坐标系换算解题思路:建筑坐标系的原点在城市坐标系下的坐标值(xO,yO),,和建筑坐标系的纵轴在城市坐标系下的方位角α,设P点的建筑坐标系为〔x′P,y′P〕,那么可以根据下面的公式进行换算城市坐标〔xP,yP〕:;程序代码如下:;定义角度换算至十分制的调用函数(defuncc(abc/d)(setqa(getreal"角度的秒数:"))(setqb(getreal"角度的分数:"))(setqc(getreal"角度的度数:"))(setqa(/a3600))(setqb(/b60))(setqd(+c(+ab))));定义函数变量(defunc:建筑坐标系转换城市坐标系(/xyzabxpypijx0y0);调用角度换算函数:(setqz(ccxyz));输入要转换的坐标个数:(setqi(getreal"\n输入要转换坐标点的个数:"));输入数据:(setqx0(getreal"\n输入建筑坐标系原点0'x坐标:"))(setqy0(getreal"\n输入建筑坐标系原点0'y坐标:"))(setqj0);进行相关的角度计算:(setqz(*pi(/z180)));把相关角度的运算值赋值,以为接下来的计算使用,同时方便后来的结果输出:(setqa(cosz))(setqb(sinz));使用循环计算每个点的换算坐标:(while(<ji);输入要转换坐标的建筑坐标:(setqx1(getreal"输入建筑坐标的x坐标:"))(setqy1(getreal"输入建筑坐标的y坐标:"));进行相关的计算:(setqxp(+x0(-(*x1a)(*y1b))))(setqyp(+y0(+(*x1b)(*y1a))));输出转换后的城市坐标数据:(princ(strcat"\n转换后的城市坐标系坐标:x="(rtosxp)))(princ(strcat";y="(rtosyp)"\n"));使循环继续,为下一点的计算做准备:(setqj(+1j)));输出计算过程的关于角度运算的相关值:(princ(strcat"其实方位角的余弦值cosα="(rtosa)))(princ(strcat"其实方位角的余弦值sinα="(rtosb)))(princ))程序运行过程和加载结果如下如图5.7所示:图5.7程序加载过程和运行结果在这个程序中使用了循环,一个方面是使得程序的屡次循环,可以方便工作的进行,另外一个方面,使用循环记住要转换的坐标点的个数,以免由于数据量过大造成错误,方便检查。【例2】根据上例的数据,进行坐标点从城市坐标系到建筑坐标系的转换。解题思路:根据上例中提供的数据,按以下公式:;进行计算,把城市坐标系的点化成至建筑坐标系。在本例中,不再使用循环,上例中已经详细阐述,本例单纯只去计算一个坐标点的转换,不再赘述循环计算的相关内容。程序代码如下:;定义角度换算至十分制的调用函数(defuncc(abc/d);分别输入分秒度数:(setqa(getreal"角度的秒数:"))(setqb(getreal"角度的分数:"))(setqc(getreal"角度的度数:"));化成十进制(setqa(/a3600))(setqb(/b60))(setqd(+c(+ab))));定义函数变量(defunc:cj(/xyzabxpypijx0y0);调用角度换算函数:(setqz(ccxyz));输入数据:(setqx0(getreal"\n输入建筑坐标系原点0'x坐标:"))(setqy0(getreal"\n输入建筑坐标系原点0'y坐标:"));进行相关的角度计算:(setqz(*pi(/z180)))(setqa(cosz))(setqb(sinz));输入要转换坐标的城市坐标:(setqx1(getreal"输入城市坐标的x坐标:"))(setqy1(getreal"输入城市坐标的y坐标:"));行相关的计算:(setqxp(+(*a(-x1x0))(*b(-y1y0))))(setqyp(-(*a(-y1y0))(*b(-x1x0))));输出转换后的建筑坐标数据:(princ(strcat"\n转换后的建筑坐标系坐标:x="(rtosxp)))(princ(strcat";y="(rtosyp)"\n"));输出计算过程的关于角度运算的相关值:(princ(strcat"其实方位角的余弦值cosα="(rtosa)))(princ(strcat"其实方位角的余弦值sinα="(rtosb)))(princ))程序加载及运行结果如以下图5.8所示:图5.8程序运行过程及输出的结果上述两个例题详细介绍了两个坐标系坐标点的相互转化,使用这两个程序进行相关的换算时,可以准确无误的进行大量的数据处理,节省大量的人力物力。5.5地物绘制在测绘专业中,测绘地形是最常做的工作,而测绘地形的结果不仅仅只是大量数据的采集,除此之外,还要把这些数据结果以图形的形式输出来,就是绘制成等高线地形图。而在绘制地形图的时候,会有很多地物,大量的数据造成图形的绘制成为一个非常繁重的工作,如果可以编写程序根据的坐标数据进行地物的自动绘制,将会大大提高相关工作的工作效率。在前面已经介绍了AutoCAD具有强大的绘制图形的功能,如果使用AutoLISP语言编写相关代码完成地物的绘制,其意义是不言而喻的。但是如何处理数据,如何编写程序才能完成这项工作呢?下面先介绍下相关的编写程序的思路和解决方法。AutoLISP可以直接使用函数调用AutoCAD系统绘图功能进行点的连接,我们可以尝试使用这一功能把测量外业采集的数据用直线连接起来,这样就可以完成地物的绘制。如果地物比拟复杂,点位比拟多,如果采用循环完成者一工作就会十分简便,按照这个思路,接下来我们将编写程序代码进行等高线的绘制。【例】地物点的坐标点为:〔4,0〕、〔8,0〕、〔8,2.0〕、〔5.0,2.0〕、〔5.0,6.0〕、〔4.0,6〕、〔4.0,4.0〕、〔2,4〕、〔2,3.0〕、〔4,3.0〕,根据这些坐标数据,编写程序进行地物的绘制。编写程序代码如下:;用户定义函数和变量:(defunc:dh(/ijp1p2);输入起始点坐标:(setqp1(getpoint"\n输入起始点:"));输入所绘图形的点数:(setqi(getint"\n输入点数:"));把第一点赋值,记住第一点:(setqp3p1);将测量专业使用的坐标转换成绘图坐标:(setqp3(reversep3))(setqp3(cdrp3))(setqp1p3);将循环控制器j赋值:(setqj0);使用循环输入坐标点:(while(<ji)(setqp2(getpoint"\n输入下一点:"));将输入的坐标点转换坐标系:(setqp2(reversep2))(setqp2(cdrp2));绘制图形:(command"line"p3p2"");将输入的点赋值第一点,为下一个点的绘图做准备:(setqp3p2);使循环控制器增值,为下一点做准备:(setqj(1+j)));是绘制的图形闭合:(command"line"p1p2"c"))程序加载过程及运行结果如以下图5.9:图5.9程序加载过程及运行结果上例中是根据坐标点数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论