AutoLisp程序设计教程解析
AutoLISP详细讲解
![AutoLISP详细讲解](https://img.taocdn.com/s3/m/0ecb204ff7ec4afe04a1df16.png)
AutoLISP详细讲解关于AutoLISPAutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor 的缩写)。
第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM 通讯》中发表的。
除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生下来,并且已经成为人工智能(AI)的首选程序序言。
AutoLISP解释程序位于AutoCAD软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP 解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。
AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。
例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。
通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。
事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。
现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。
目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。
在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。
但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。
同时,本章还假定读者并无编程方面的知识。
如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。
对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。
AutoLisp程序设计教程
![AutoLisp程序设计教程](https://img.taocdn.com/s3/m/715edd75a26925c52cc5bfec.png)
常用内部函数(5)
9.主要的交互输入函数 (1)(getangle [pt] [msg]):等待用户输入角度 (2) (getcorner [pt] [msg]):等待用户输入一个角点 (3) (getdist [pt] [msg]):等待用户输入一个距离 (4) (getpoint [pt] [msg]):等待用户输入一个点
应用实例2:画旋转矩形
(defun c:rect2( ) (setq p1 (getpoint "\n 请输入矩形的一个角点:")) (setq w (getdist p1 "\n 请输入矩形的长:")) (setq h (getdist p1 "\n 请输入矩形的宽:")) (setq alf (getangle p1 "\n 请输入矩形的旋转角:")) ;交互方式输入各个参数 (setq p2 (polar p1 alf w)) (setq p3 (polar p2 (+ alf (* 0.5 pi)) h)) (setq p4 (polar p1 (+ alf (* 0.5 pi)) h)) (command "pline" p1 p2 p3 p4 "c") )
流程控制(分支结构)
(2) (if 测试条件表达式 表达式1 [表达式2]) 如果测试表达式结果为真,则执行表达式1, 否则执行表达式2。 如 (if (>a 1) (setq b 2) ;如果a>1,则b=2 (if (>a 1) (setq b 2) (setq b 3);如果a>1,则b=2, 否则 b=3
AutoLISP详细讲解
![AutoLISP详细讲解](https://img.taocdn.com/s3/m/283c4143e518964bcf847ce9.png)
AutoLISP详细讲解关于AutoLISPAutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。
第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。
除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(AI)的首选程序序言。
AutoLISP解释程序位于AutoCAD 软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。
AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。
例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。
通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。
事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。
现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。
目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。
在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。
但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。
同时,本章还假定读者并无编程方面的知识。
如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。
对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。
AUTOLISP程序设计技巧
![AUTOLISP程序设计技巧](https://img.taocdn.com/s3/m/5eb5ab3d5bcfa1c7aa00b52acfc789eb162d9e6f.png)
AUTOLISP程序设计技巧AUTOLISP(即AutoCAD Lisp)是一种用于AutoCAD软件的编程语言。
它基于Lisp语言,可以用于创建自定义命令和功能,以自动执行一系列任务。
在编写AUTOLISP程序时,可以采用一些技巧来提高代码的可读性和性能。
下面将介绍一些常用的AUTOLISP程序设计技巧。
1.变量命名:为了增加代码的可读性,应该选择具有描述性的变量名。
避免使用单个字母或简写的名称,而应使用有意义的名称来描述变量的用途或含义。
2.注释:在代码中使用适当的注释是非常有帮助的,可以解释代码的目的、逻辑和特定部分的功能。
注释应该清晰明了,不冗余,并使用大写字母或其他方法来突出显示。
3.函数:使用函数来分割代码段,以便在需要时可以多次调用相同的代码块。
函数的使用可以提高代码的可读性,并使其更容易维护。
4.错误处理:在代码中加入适当的错误处理机制非常重要,可以避免程序崩溃或产生不期望的结果。
使用条件语句和错误处理函数来检测和处理可能发生的错误。
5.循环:使用循环语句来处理重复性任务,并减少代码的冗余。
根据任务的特点选择合适的循环类型(例如FOR循环、REPEAT循环等)。
6.嵌套:在必要时使用嵌套结构,将代码组织成逻辑结构清晰的块。
使用适当的缩进和代码布局来增加代码的可读性。
7.字符串处理:AUTOLISP中的字符串处理功能非常强大,可以使用字符串函数来处理、操作和格式化字符串。
了解并熟练使用字符串函数可以提高代码的灵活性和功能。
8.数组和列表:使用数组和列表可以存储和处理多个值。
熟练使用与数组和列表相关的函数(如CAR、CDR、CONS、LIST等)可以简化代码并提高性能。
9. 命令行交互:通过与用户进行命令行交互,可以提高程序的交互性。
使用getstring、princ等函数来获取用户输入,并使用条件语句来根据输入执行相应的操作。
10.优化:编写高效的代码可以提高程序的性能。
使用较少的迭代步骤、减少不必要的计算、选择合适的数据结构等都可以提高程序的效率。
autocad-lisp教程
![autocad-lisp教程](https://img.taocdn.com/s3/m/08a664ad68dc5022aaea998fcc22bcd126ff4228.png)
autocad-lisp教程Lisp教程一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令.AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成.是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言.程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响.数据及程序均统一以串行(List)结构表示.可直接调用几乎全部的AutoCAD命令.既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力.内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境.可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框.缺点: 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节--------------------------------------------------------------------------------函数(Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.第3节--------------------------------------------------------------------------------数据型态(Data Type)整数(INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数(REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5 当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示: 在E或e后加上次方值 e.g. 4.1e-6字符串(STR)一般文字,其前后必须加上双引号" e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜线\ e.g. "\AutoCAD"像素名称(ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g.像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)转化(V ARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号(SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号) 句点. 单引号' 双引号" 分号;表(LIST)亦称为串行,是放在一对小括号( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素) 点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以( ) 或(NIL) 表示第4节--------------------------------------------------------------------------------变数(Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPATION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(PRINC 变量名称)e.g. COMMAND : (PRINC NAME) Result : David"David"在绘图模式中,亦可于指令行中使用感叹号! 来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的主控台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME) Result : STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C ;自动联机至起点以关闭四边形画圆: 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE ;执行划圆指令Specify center.... : !CEN ;在提示后以变量CEN响应输入Specify radius.... : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMPCOMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP) Result : REALCOMMAND : (SETQ TEMP "AutoLISP") ;将字符串存入变量TEMPCOMMAND : !TEMP Result : "AutoLISP"COMMAND : (TYPE TEMP) Result : STR二数值资料第1节--------------------------------------------------------------------------------基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代第2节--------------------------------------------------------------------------------练习(Exercises)计算式(2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式(50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意: 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数)e.g. (1+ 2) Result : 3递减(1- 数值参数)e.g. (1- 4) Result : 3三角函数(Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(A TAN 弧度参数)e.g. (ATAN 1) Result : 0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT 数值参数次方值)e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数)(ABS 数值参数)e.g. (ABS -123) Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数)e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数)e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数(FIX 数值参数)e.g. (FIX 12.56) Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOAT 数值参数)e.g. (FLOAT 12) Result : 12.0整数转字符串(ITOA 数值参数)e.g. (ITOA -17) Result : "-17"数值转字符串(RTOS 数值参数[模式[小数字] ] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC 的设定值转换模式设定值可以是下列数值之一:1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数(ANGTOS 角度参数[模式[小数字] ] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一:0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程第5节--------------------------------------------------------------------------------数值资料检查数值(NUMBERP 数值参数)e.g. (NUMBERP -3.45) Result : Te.g. (NUMBERP "AutoLISP") Result : nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数)e.g. (MINUSP -3.45) Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值(ZEROP 数值参数)e.g. (ZEROP 0) Result : Te.g. (ZEROP 3.45) Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习(Exercises)计算下列算式:(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6---- 最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41 ---- 再利函数SQRT,将41开方根,结果为6.4031---- 最后使用FIX函数,截去其小数字,得到最后的结果为6三程序设计第1节--------------------------------------------------------------------------------使用者定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP主控台,或供其它自定义函数内的表示式呼叫使用AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文字编辑器进行开发,如DOS 的EDIT,WINDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下: (DEFUN [C:] 函数名称( [自变量串行...] [/ 局部变数串行...] ) 表达式...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行( )加在函数名称之后若有提供局部变量,必须以斜线/ 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数第2节--------------------------------------------------------------------------------加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意: 必须以正斜线/ 或两个反斜线\\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行注意:在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习(Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘(C:\TEST.LSP)---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")---- 在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载---- 在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)第4节--------------------------------------------------------------------------------批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(= 参数1 [参数2 ....] )不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回T e.g. (/= 1 2.0) Result : Te.g. (/= "a" CHR(65)) Result : Te.g. (/= 10 30 40 10 20) Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g. (< 1 2) Result : Te.g. (< "a" CHR(65)) Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g. (> 1 2) Result : nile.g. (> "a" CHR(65)) Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g. (<= 1 2) Result : Te.g. (<= 2 2) Result : Te.g. (<= "a" CHR(65)) Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g. (>= 1 2) Result : nile.g. (>= 2 2) Result : Te.g. (>= "a" CHR(65)) Result : nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND [表达式....] )若各表达式的传回值均为T,函数即返回T 值;若其中一个传回值为nil,函数传回nile.g. (AND (< 1 2) (> 8 5)) Result : T或运算(OR [表达式....] )若各表达式的传回值均为nil,函数即返回nil 值;若其中一个传回值为T,函数传回Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式)若表达式的传回值为T,函数即返回nil 值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nilCOMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码: (DEFUN AIR (NUM) (> NUM 200))---- 输入后存盘(纯文字格式)---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND : (LOAD "C:/TEST")---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T四流程控制第1节--------------------------------------------------------------------------------条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式] )函数先检查条件表达式,若其传回值为T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习(Exercises)判断空气污染指数: 大于100 = Very High, 51至100 = High, 26至50 = Medium, 25或以下= Low---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下:(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "Very High")) (IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRINC "Low"))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串Very High响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习: 修改上一课的程序练习,将多个IF函数合并成巢状嵌套---- 启动文字编辑器,开启C:/TEST.LSP程序文件---- 新增程序AIR-2,其程序代码如下:(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "Very high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串Very High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意:第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100)第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC 函数,尾3的关括号则是对应IF 函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "Very High") (PRINC DISP)))注意: 最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的第2节--------------------------------------------------------------------------------条件判断(COND [ (条件表达式是表达式) ....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为nil练习(Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "Very High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示Severe 讯息;第3至6行依此类推7 注意条件式为一个T 字母,表示条件式恒为真(成立),显示讯息Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式第3节--------------------------------------------------------------------------------循环(Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称(REPEAT 重复次数[表达式....] )e.g. (REPEAT 10 (PRINC "David")) ;重复显示David字符串10次重复(WHILE 条件表达式[是表达式....] )若条件表达式的传回值为T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为nil,函数内各表达式将不会被执行e.g. (SETQ COUNT 1) ;将1存入变数COUNT(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10(PRINC "David") ;若条件成立则以PRINC函数显示David字符串(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意: 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为T,令循环不断重复而无法结束;在上例中:---- 若WHILE函数的条件表达式设定为(T) ;即条件永远成立---- 不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立第4节--------------------------------------------------------------------------------练习(Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明2 WHILE循环函数,并设定进入循环的条件式(变量COUNT小于或等于变量NUM)3 若条件成立即进入循环内部,先将变量TOTAL加上变量COUNT,再用SETQ函数存回变量TOTAL中,覆盖原值4 将变量COUNT递增1,存回变数COUNT并覆盖原值5 关括号与第2行的WHILE函数左边的开括号对应6 循环结束后,用PRINC函数显示变量TOTAL(总和)的内容程序流程假设执行程序时传入变量NUM的数值为10---- 变数初始值COUNT = 1 TOTAL = 0---- 判断变量COUNT是否<=变量NUM COUNT = 1 TOTAL = 0---- 变量COUNT(现值1)小于NUM,进入循环;将TOTAL(现值0)加上COUNT,存回变数TOTAL COUNT = 1 TOTAL = 1---- 变数COUNT(现值1)递增1变为2,存回变数COUNT COUNT = 2 TOTAL = 1。
AutoLISP从入门到精通初级教程(新手必备)
![AutoLISP从入门到精通初级教程(新手必备)](https://img.taocdn.com/s3/m/570629efe109581b6bd97f19227916888486b916.png)
AutoLISPxx单元一: AutoLISP主角登场一. AutoLISP 是何方神圣 ?1、AutoLISP是 AutoCAD的最正确拍檔 !2、AutoLISP内含于 AutoCAD软件内 ,不用此外花费买 !3、AutoLISP是加强 AutoCAD最好、最直接的『程序语言』!4、AutoLISP易学、易用 ,即便不会程序设计的 AutoCAD使用者 ,都能在最短的时间内 ,写出令人吃惊、赞美的功能 !若说 AutoLISP的出现 ,是替 AutoCAD 创建一片天的『最大元勋』 ,实不为过一点也不夸张 !5、AutoLISP希望您去学习它、改良它、发挥它、享受它 .真的 ! 它的威力、魅力无量 !二. AutoLISP 程序语言的特质解析 :学习 AutoLISP是特别简单的 ,对初学者而言 ,即便没有学习过任何的程序语言 , 都能很快的上手 ,写出出色美丽的 AutoLISP程序 !语法简单:不用特别的变量宣布 ,特别富裕弹性 ,比起其他的程序语言 ,它的语法可说是特别简单而有其独到的风格 !功能函数强盛:除一般性的功能函数外,又拥有为数许多控制配合AutoCAD 的特别函数 ,再加上 AutoLISP可直接呼喊履行所有 AutoCAD的指令 ,以及掌握运用所有的 AutoCAD系统变量 ,功能之强盛令人惊喜不已 !撰写的环境不挑剔:只假如一般的文书编写软件都合用 ! 如:Windows 的记事本、 P2、P3、D3、书中仙、汉书、 EDIT....等直译式程序:不用再作编译 ,『即写即测、即测即用』 ,立刻能够在 AutoCAD 中响应成效 ,立刻就有成就感 !横跨各作业平台:悠闲自得 ,固然 AutoCAD有 DOS、Windows 版本之分但是AutoLISP却可在不改写的原貌下 ,加载与履行 !三.撰写 AutoLISP 的动机 ?1、欲加强AutoCAD 原有指令时 .2、欲创建更实用的AutoCAD 新指令 .3、欲简化繁琐的环境设定或画图步骤时.4、欲办理参数式画图时 .5、欲做图面资料读文件、写文件.6、欲做AutoCAD 简报展现时 .7、欲达到真实灵巧掌控AutoCAD 时.8、欲提高自己跨上AutoCAD 能手列车时 .四.AutoLISP 的效益评估 ?1.对企业负责人或设计主管而言 :A. 或许某职工或干部花了 20 个小时撰写一个 AutoLISP程序 ,表面上 ,这快要三天的时间 ,他连一张图都没有画 ,甚至可能偶有发呆、沈思 ,若此程序一天能够替企业画图部门节俭 1 小时画图时间 ,那算一算 ,只需 20 天就抵销开发成本 ,而 20 天此后都是赚的 ,『用的愈久 ,省的愈多』!B. 若职工皆有此动力 ,在不影响正常工作 ,『鼓舞』都来不及 ,那有『压迫』的道理 ,甚至还要差遣优异人员出去受训 ,学习更好的设计技巧与创意呢?!C. 千万不要由于您的不懂或压迫 ,SHOW您的威望与 POWER,这样 ,不只对职工造成打击 ,甚至您可能成为阻挡了企业计算机化进步的罪魁祸首D. 自然 ,若要撰写的程序好多 ,内部设计人员的程序功力距离太远 ,达成需求的时间反而变得遥遥无期 ,那倒不如求援于市道上已有的有关 AutoCAD 支持软件。
3-1AutoLISP程序设计(v)
![3-1AutoLISP程序设计(v)](https://img.taocdn.com/s3/m/a54c093fbd64783e08122b01.png)
嵌套很多层,从外层向里依次称为0层,1层,2层……
2016/6/28
18
AutoLISP程序设计
5)表中的元素是有顺序的,为便于对表中元素进行存取,
每个元素都有一个序号。从左向右,第一个元素序号为0,
第2个元素序号是1,„„,第n个元素序号是n-1。 6)表的大小为表的长度,即表中顶层元素的个数。没有 任 何 元 素 的 表 称 为 空 表 。 空 表 用 ( ) 或 nil 表 示 。 在 AutoLISP中,nil是一个特殊的符号原子,它既是原子又是
1. 表达式
• 表达式含义:AutoLISP处理的对象是符号 表达式(简称表达式)。它相当于其它编 程语言中的程序语句。 • 表达式的构成:表达式由原子或表构成。 多数情况下以表的形式存在,例如 : (函数 名 [变元]…)。
AutoLISP程序设计
• 表达式前缀表示法:即把运算符放在操作
数之前,用圆括号括起来,以表的形式表 示。如:(setq X 210.0)。 • 表达式的求值规则:整型数、实型数和字 符串以其本身的值作为求值结果;符号以
2016/6/28
12
AutoLISP程序设计
(6)点对
点对也是一种表,表中有两个元素,两个元 素中间有圆点“ .” ,圆点与前后元素之间必 须各有一个空格,例如(A . B)
就是一个点对, A 和 B 与圆点之间用空格分 开, A 和 B均为 S 表达式, A 称为点对的左元 素, B称为点对的右元素。点对也可以嵌套。
AutoLISP程序设计
• 变量的数据类型不需要事先说明,变量被 赋予值的类型就为变量的类型。 • 不能使用内部函数名和关键字作变量名。
• 变量赋值:(setq 变量1 值1 [变量2 值 2...]) • 显示变量的值:!变量名(同时将值传递 给autocad)。
AutoLisp编程入门
![AutoLisp编程入门](https://img.taocdn.com/s3/m/f2e263cf5fbfc77da269b110.png)
基本指南:两数求和在命令行输入:(+ 2 3) (- 2 3) (* 2 3) (/ 2 3)如果直接输入(/ 2 3)则会显示0 因为2和3是整型所以AutoLisp把这些数字译为整型(AutoLisp进行了四舍五入)所以输入(setq x (/2.0 3))就可得到0.666667六位小数在命令行输入:!p则会显示p这个变量的值SETQ和变量Setq是来保存计算的结果的,相当于给一个变量赋值例:(setq x (/2.0 3)) 这边x是变量就是把2.0/3的值赋给xSetq能完成多项“设置相等”例如:(setq x 1.0 y 2.0 z 3.0) 就是分别赋给x y z 赋值AutoLISP函数1.数学函数(min 7 3 5 11) 就是取7 3 5 11这四个数的最小值(setq minbr (min 7 3 5 11))数学函数功能+加- 减*乘/除1+自增11- 自减1FLX截取实数的整数部分FLOAT整数变为实数REM返回除法的余数EXPT指数SIN求弧度角的正弦COS求弧度角的余弦ATAN求两个数字的反正切(setq rad (*(/ 45 180.0)pi))2.几何函数(setq p1 '(1.3 5.7)) ‘表示指定2个(3个)的坐标值,这样AutoLISP就不会计算这些值了(setq p2 '(7.5 3.1))(setq p3 '(9 4))(setq p4 '(0.1 2.5))(distance p1 p2)(angle p1 p2)(inters p1 p2 p3 p4)(osnap p1 "mid")2.例:在一个绘制楼梯间的AutoLISP例程中,一部分程序检查层高是否大于8英寸:如果大于,就绘制出14级台阶,如果小于就绘制13级台阶。
3.(strlen “Using AutoCAD”)STRLEN函数将报告Using AutoCAD为13个字符,计算空格。
一步步学AutoLisp(二)
![一步步学AutoLisp(二)](https://img.taocdn.com/s3/m/d11841b3c77da26925c5b0ee.png)
一步步学AutoLisp(二)在第一步中我们是在CAD命令行中进行一些练习,这显然无法满足我们正常的使用要求,所以我们一般将程序写成文件,LISP程序文件的扩展名为“.lsp”。
在AutoCAD2004及以后的CAD中有专门的软件编写程序Visual Lisp,也可以用普通的文本编写软件如记事本进行编写,但文件的扩展名一定要是“.lsp”。
为使大家能对lsp文件的使用有更好的理解,本文一律按使用普通文本编辑器编写的方式进行描述。
打开文本编辑器编写一个文件,文件名为“key.lsp”,将文件保存到C盘根目录下。
键入如下一行程序:(defun c:cm() (command "COPY" pause "" "m"))保存后,在CAD命令行键入:(load"c:/key"),即可将key.lsp调入CAD,返回c:cm。
如下图:在命令行键入“cm”可以执行对一个图元进行多次拷贝的命令,在lisp程序中函数及参数不区分大小写,但参数的返回值有大小之分。
先对程序进行解读:defun 定义函数的函数,后面的c:cm是一个函数的名称。
c:cm 自我定义的函数名称,带“c:”的函数是可以作为操作命令的函数,我们姑且将这类函数称为命令函数。
如果没有“c:”,只有“cm”,则得到的返回值是“cm”,在命令行键入“cm”则不会执行前面的多重拷贝操作。
键入“(cm)”就会执行该操作,我们就称之为一般函数。
() 这个空括弧是用来填写参数的,由于我们的这段程序没有用到任何其他参数,所以括弧内是空的。
command 调用CAD原有命令的函数,这是lsp程序中应用非常多的一个函数,许多操作可以直接调用CAD自己的命令,不许再重新编写。
"copy" 调用的CAD命令名称,名称与前面的command之间有没有空格都可以,而且要用命令全名,不能用简化命令,而且要用引号。
AutoLISP绘图程序设计ppt课件
![AutoLISP绘图程序设计ppt课件](https://img.taocdn.com/s3/m/58a0afe66c85ec3a86c2c579.png)
;;在屏幕上显示 ASCII码为(65-90)的字符
(defun C:zm(/ as)
;自定义命令
(setq as 65 n 100)
(while (<= as 90)
(command "text" (list n 100) 15 "" (chr as))
(setq as (+ as 1) n (+ n 20))
16.07.2021
整理ppt
8
二、几个基本概念
1.常数 PI——数学中的π(3.1415929…) T——逻辑真,即成立。
NIL——逻辑假,即不成立。还代表空,即无值。 注意:(1)大小写等效;(2)它们不能作为变量。 2.原子 是程序处理中最小的数据单元。 3.表达式 原子和表的统称。 如:(setq P '(12.36 -26.58))
(5)表(LIST):带有一对括号、有若干元素 组成。(元素1 元素2 … 元素n)
如:(2 4 f)
◇元素的个数叫表的长度。
◇元素也可以是表,如(45 (3 6) 7),这 叫嵌套。
◇元素之间必须用“空格” 隔开。
◇表的定义方式:(LIST 5 6);’(5 6); 还可以用defun定义(后面讲)。
(while (<= a n) (command "circle" P0 R) (setq P0 (polar P0 0 L)) (setq a (1+ a))
) )
16.07.2021
整理ppt
3
(4)AutoLISP语言中使用大量的函数(有 200多个函数),进行各种运算;
(5)AutoLISP编写的程序特点(学习中注 意):
AUTOLISP程序的设计技巧
![AUTOLISP程序的设计技巧](https://img.taocdn.com/s3/m/5230682f551810a6f4248606.png)
AUTOLISP程序设计技巧一、引言在AutoCAD中的角度捕捉只有当正交状态打开时的直和水平方向,对于其他特殊角度无能为力;另外,其网点捕捉也是相对于X轴和Y轴,无法实现其他方向的特殊长度捕捉,给绘图带来极大的不方便。
在应用AutoCAD进行设计制图的操作中,LINE和POLYLINE是使用频率最高的两个命令,经常要遇到在某些特定角度上绘制特定长度的简单线或复合线的情况,因而实现这两个捕捉对提高AutoCAD作图效率很有实用价值。
二、方法原理所谓角度捕捉,是指当十字光标在某一角度a的一定围选取一点时,该点自动落在该a角度线上;当我们设定捕捉角度为a时, 将会以基准点作为原点、自X轴正方向出发,将整个屏幕划分为[360/ a]个区间,则NX%角度就是角度捕捉线,其中,0W N K[360/ a],[360/ a ]表示不大于360/ a的整数。
所谓长度捕捉,是在角度捕捉的基础上,在某一角度线上有一系列捕捉点,该系列点离基准点的距离为捕捉长度的正整数倍,当选取直线上的一点时,落点自动落到离其最近的捕捉点上。
实现特定角度和长度捕捉的关键点是:当十字光标(即十字交叉线)移动时,程序要随时跟踪其交叉点的位置,并将该位置与用户所设定的捕捉角度与长度对应起来,从而计算岀在该角度上的落点。
以下举例说明该两个捕捉的实现过程:假定捕捉角度为a=30°,捕捉长度为L。
当十字光标在任意的某一区间移动时,比如在第5区间(120°〜150 ° )移动时,此时,落点只能在120°或150°线上(该线在图中并不直接显示),该两根角度线的中心线为135。
当十字光标的中心点处在120°〜135°之间时,则落点应在120°线上,该落点的具体位置为由十字光标的中心点向120°线作垂线来获得,其交点D(称为垂点)即为落点,为直观起见,此时由基准点(此处为O 点)向落点作一橡筋拖曳线,该橡筋拖曳线随十字光标的移动而相应移动,显示岀拖动过程(见图1);同样,当十字光标的中心点处在135。
AutoLISP详细讲解
![AutoLISP详细讲解](https://img.taocdn.com/s3/m/283c4143e518964bcf847ce9.png)
AutoLISP详细讲解关于AutoLISPAutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。
第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。
除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(AI)的首选程序序言。
AutoLISP解释程序位于AutoCAD 软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。
AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。
例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。
通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。
事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。
现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。
目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。
在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。
但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。
同时,本章还假定读者并无编程方面的知识。
如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。
对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。
AutoLISP教学课件
![AutoLISP教学课件](https://img.taocdn.com/s3/m/3ed26f315a8102d276a22fb3.png)
程序编写原则 1 先写出对称的括号,再添入其内的函 数和参数。 2 适当缩排,使程序各语句间主从关系 明确化。 3 做必要的空行,以区分程序中的各单 元。 4 尽量加上注释。
例如: ;暂不考虑除数为零的情况 (defun test1 (a b) (setq w (+ a b) x (- a b) y (* a b) z (/ a b) z1 (/ a b 1.0) ;避免出现整数相除 ) )
2其他常用语法 1)(rem <数1> <数2><数3>…. 函数返回数1除以数2 的余数,如果参数 多于两个,则将<数1 >除以<数2>的余数再 除以<数3>的余数….返回。 2)(max <数1> <数2><数3>….) (min <数1> <数2><数3>….)
3) (exp <数1> ) 返回e的<数1> 次幂的值。 4) (expt <底数> <指数>) 返回<底数> 的<指数>次方。 5)(log <数1> ) (exp)的反函数,返回<数1> 的自然对数 值 6) (abs <数1> )
五 常量、变量与数据类型 常量 AutoLISP有四个内建常量,在设定变量 和自定义函数时,要避免和这四个常量同 名 t 真假值中的真值。 nil 空值,同时代表真假值中的假值 pi 圆周率值 pause 双反斜线\\字符,用于函数等待 用户输入
序列 LISP语言是专门以序列(list)形式处理 的,序列就是把一群数据用括号括起来, 类似数学中集合的概念。如: ( “p1” 3.3 12 38.5) 四元素序列 ((2 3) 12) 两个元素序列 () 空序列 后面的课程里我们将发现AutoCAD图形 文件中的对象数据与符号表,全是以序列状 态保存的。
autolisp教程
![autolisp教程](https://img.taocdn.com/s3/m/ced6fefa0242a8956bece4fa.png)
第十四章AutoLISP14.1 关于AutoLISPAutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。
第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。
除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生下来,并且已经成为人工智能(AI)的首选程序序言。
AutoLISP解释程序位于AutoCAD软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。
AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。
例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。
通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。
事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。
现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。
目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。
在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。
但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。
同时,本章还假定读者并无编程方面的知识。
如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。
对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。
AutoLISP从入门到精通初级教程[新手必备]
![AutoLISP从入门到精通初级教程[新手必备]](https://img.taocdn.com/s3/m/d91331bc84868762caaed59a.png)
AutoLISP入门单元一:AutoLISP主角登场 (2)单元二:AutoLISP的关键、基本结构及语法 (4)单元三:快速分类浏览AutoLISP功能函数(一) (10)单元四:快速分类浏览AutoLISP功能函数(二) (13)单元五:轻松快速的掌握AutoLISP设计技巧 (16)单元六:图元数据的取得与活用技巧(一) (21)单元七:图元数据的取得与活用技巧(二) (25)单元八:新手上路-参数设计的关键技巧 (32)单元一:AutoLISP主角登场一. AutoLISP 是何方神圣?1、AutoLISP是AutoCAD的最佳拍檔!2、AutoLISP内含于AutoCAD软件内,不用另外花钱买!3、AutoLISP是强化AutoCAD最好、最直接的『程序语言』!4、AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短的时间内,写出令人惊讶、赞叹的功能!若说AutoLISP的出现,是替 AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张!5、AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷!二. AutoLISP 程序语言的特质分析:学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序!语法简单:不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而有其独特的风格!功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合AutoCAD的特殊函数,再加上AutoLISP可直接呼叫执行所有AutoCAD的指令,以及掌握运用所有的AutoCAD系统变量,功能之强大令人欣喜不已!撰写的环境不挑剔:只要是一般的文书编辑软件都适用! 如:Windows的记事本、PE2、PE3、DW3、书中仙、汉书、EDIT....等直译式程序:不用再作编译,『即写即测、即测即用』,马上可以在AutoCAD中响应效果,马上就有成就感!横跨各作业平台:悠然自得,虽然AutoCAD有DOS、Windows版本之分但是AutoLISP却可在不改写的原貌下,加载与执行!三.撰写 AutoLISP 的动机?1、欲强化 AutoCAD 原有指令时.2、欲创造更有用的 AutoCAD 新指令.3、欲简化繁琐的环境设定或绘图步骤时.4、欲处理参数式绘图时.5、欲做图面资料读文件、写文件.6、欲做 AutoCAD 简报展示时.7、欲达到真正灵活掌控 AutoCAD 时.8、欲提升自己跨上 AutoCAD 高手列车时.四.AutoLISP 的效益评估?1. 对公司负责人或设计主管而言:A. 也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沈思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』!B. 若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?!C. 千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关 AutoCAD 支持软件。
AutoLisp教程第2章
![AutoLisp教程第2章](https://img.taocdn.com/s3/m/bfb71102a21614791711289c.png)
同之处。
在 AutoLISP 中,符号的大小写等价,符号的长 度没有限制,且所有的字符都是有意义的。 如果一个符号的长度不超过 6,就用节点本身来存
储;如果符号的长度超过 6 ,这样的符号就不能用节
点来存储,而是在节点中存放一个指向实际存储符号 名的指针。这将会多占用存储空间,且减慢了执行速 度。因此,符号的长度最好不要超过6。
2. 实型(REAL)
实型数是带小数点的数。在-1和1之间的实数必须以0开头,例 如:.5是错误的,应该写成0.5。实数用双精度的浮点数表示,并 且至少有14位有效位数的精度。注意,Visual LISP不显示所有的 有效位。
3. 字符串(STR)
字符串又被称为字符常数 ,它是由双引号括起来的字符序列。
2.2.4 预定义的符号
AutoLISP对变量 nil、T、Pause和Pi进行了预定义,用户可以 在编写AutoLISP程序时直接使用。 (1) nil 如果变量没有被赋值,它的值为 nil 。 nil 与空和 0 不同的是, 它既不是空串,也不是0值,它表示尚无定义。引用未被赋值的 变量是错误的。例如,变量 x 尚未被赋值,( + 1 x )就会出现 error: bad argument type(坏的参数类型错)。 将nil赋给某一有定义的变量,其结果是:取消该变量的定义 ,并释放其所占存储空间。 nil作为逻辑变量的值,表示不成立,相当于其他程序设计语 言的false。
2.2.2 变量的数据类型
AutoLISP变量属于符号,是指存储静态数据的符号。 数据类型是变量的重要的特征,因为它关系到存放变量值的 存储空间的大小。多数的计算机语言都在为变量赋值前对变量做 显式或隐式的说明。 AutoLISP 无须对变量做事先的类型说明, 变量被赋予值的类型即为变量的类型。 用setq函数对变量赋值,例如,(setq a 5),赋值后的结果是 :变量a是整型的,因为5是整型的;同样的原因,(setq b 2.5) 之后, b是实型的,(setq c "ABC")之后,c就是字符串类型的。
AutoLISP绘图程序设计PPT优秀课件
![AutoLISP绘图程序设计PPT优秀课件](https://img.taocdn.com/s3/m/6cd59d507cd184254a353525.png)
18.10.2020
6
例: (setq P(list 12.36 -26.58)) 结果是:(12.36 -26.58) 例:(setq P '(12.36 -26.58)) 结果是:(12.36 -26.58)
提示: (1)表的嵌套时一定要注意括号“(”、“)”
匹 配。 (2)西文状态下输入!!!
❖以表形式描述数据处理过程,程序执行过 程就是函数求值过程;
❖每段程序都是一个函数; ❖具有交互处理功能,边解释边执行; ❖采用模块化设计方法。
18.10.2020
4
2.AutoLISP的数据类型
(1)整型数(INT):是由0、1、2…9、+、-组成的。
(2)实型数(REAL):如0.4(0不能少)、-1.23、 0.526E9(0.526×109)。
8
二、几个基本概念
1.常数 PI——数学中的π(3.1415929…) T——逻辑真,即成立。
NIL——逻辑假,即不成立。还代表空,即无值。 注意:(1)大小写等效;(2)它们不能作为变量。 2.原子 是程序处理中最小的数据单元。 3.表达式 原子和表的统称。 如:(setq P '(12.36 -26.58))
(while (<= a n) (command "circle" P0 R) (setq P0 (polar P0 0 L)) (setq a (1+ a))
) )
18.10.2020
3
(4)AutoLISP语言中使用大量的函数(有 200多个函数),进行各种运算;
(5)AutoLISP编写的程序特点(学习中注 意):
(5)表(LIST):带有一对括号、有若干元素 组成。(元素1 元素2 … 元素n)
AutoLISP从入门到精通初级教程[新手必备]
![AutoLISP从入门到精通初级教程[新手必备]](https://img.taocdn.com/s3/m/d91331bc84868762caaed59a.png)
AutoLISP入门单元一:AutoLISP主角登场 (2)单元二:AutoLISP的关键、基本结构及语法 (4)单元三:快速分类浏览AutoLISP功能函数(一) (10)单元四:快速分类浏览AutoLISP功能函数(二) (13)单元五:轻松快速的掌握AutoLISP设计技巧 (16)单元六:图元数据的取得与活用技巧(一) (21)单元七:图元数据的取得与活用技巧(二) (25)单元八:新手上路-参数设计的关键技巧 (32)单元一:AutoLISP主角登场一. AutoLISP 是何方神圣?1、AutoLISP是AutoCAD的最佳拍檔!2、AutoLISP内含于AutoCAD软件内,不用另外花钱买!3、AutoLISP是强化AutoCAD最好、最直接的『程序语言』!4、AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短的时间内,写出令人惊讶、赞叹的功能!若说AutoLISP的出现,是替 AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张!5、AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷!二. AutoLISP 程序语言的特质分析:学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序!语法简单:不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而有其独特的风格!功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合AutoCAD的特殊函数,再加上AutoLISP可直接呼叫执行所有AutoCAD的指令,以及掌握运用所有的AutoCAD系统变量,功能之强大令人欣喜不已!撰写的环境不挑剔:只要是一般的文书编辑软件都适用! 如:Windows的记事本、PE2、PE3、DW3、书中仙、汉书、EDIT....等直译式程序:不用再作编译,『即写即测、即测即用』,马上可以在AutoCAD中响应效果,马上就有成就感!横跨各作业平台:悠然自得,虽然AutoCAD有DOS、Windows版本之分但是AutoLISP却可在不改写的原貌下,加载与执行!三.撰写 AutoLISP 的动机?1、欲强化 AutoCAD 原有指令时.2、欲创造更有用的 AutoCAD 新指令.3、欲简化繁琐的环境设定或绘图步骤时.4、欲处理参数式绘图时.5、欲做图面资料读文件、写文件.6、欲做 AutoCAD 简报展示时.7、欲达到真正灵活掌控 AutoCAD 时.8、欲提升自己跨上 AutoCAD 高手列车时.四.AutoLISP 的效益评估?1. 对公司负责人或设计主管而言:A. 也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沈思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』!B. 若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?!C. 千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关 AutoCAD 支持软件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Visual Lisp简介(2)
AutoLISP程序由注释和表达式组成。与其他 的高级语言不同的是,它的注释用;来表示。 而表达式用的是前缀表示法,即把运算符放在 表的第一个元素位置,后面才是其他参数。表 达式一般是通过调用函数来执行。
变量(1)
1.符号:用来作为变量、函数的名字。符号可 包含数据和字符((、)、. 、‘、 “、;除外)。 符号的长度最好不要超过6个字符。 2.变量的数据类型:不需对变量事先进行类型 说明,变量被赋值时,值的类型就是变量的类 型。在程序运行过程中,同一变量在不同的时 刻可以赋予不同类型的值。 3.赋值: (setq 变量1 值1 [变量2 值2 ……])
3.表达式的求值过程 在Lisp语言中,函数之间不存在优先关系, 运算的先后顺序只能通过表的层次来实现, 最里层的表最先被求值,再传给外层的表, 直到求值完毕。
表达式(3)
4.表达式的求值规则 (1)整型数、实型数、字符串,以它们本身的 值作为求值结果 (2)符号以它们当前的约束值作为求值结果 (3)表是根据其第一个元素来进行计算的。 其中quote函数表示直接引用,可用 单号来 表示。如(setq p1 (quote (25 10))) 可写成: (setq p1’ (25 10))
Lisp语言是人工智能领域中广泛采用的一种 程序设计语言。 AutoLisp 程序和autoCAD的绘图命令可以 透明的结合起来,使设计和绘图完全融为一 体。还可以实现对AutoCAD图形数据 直接访 问、修改,为实现对图形的实时修改、交互 设计、参数化设计以及在绘图领域中应用人 工智能提供了必要的条件。是一种人工智能 绘图语言。
常用内部函数(5)
mand函数:执行AutoCAD标准命令 利用command函数AutoLISP几乎可以调用CAD 里的全部命令。 格式:
(command “AutoCAD 命令” 据”……) “命令所需的数
如画圆:(command “circle” “2,4” 5) 如直线: (command “line” “100,120” ”23,116”””):调用line、 pline、 layer时以“”结尾,等效于按一次空格 键。
AutoCAD的二次开发(Visual Lisp程序设计)
AutoCAD的显著特点之一是它不仅具有强大的 图形绘制与编辑功能,而且体系结构开放,允许用 户对其进行定制与开发。可针对工程领域的特殊应 用问题,开发一个既有计算分析功能和专用的工程 图形数据库,又有强大图形处理功能的CAD应用系 统。
Visual Lisp简介(1)
(car <点或表>):返回第一个元素 (cdr <点或表>):返回除第一个元素外内容的表
ห้องสมุดไป่ตู้
常用内部函数(5)
9.主要的交互输入函数 (1)(getangle [pt] [msg]):等待用户输入角度 (2) (getcorner [pt] [msg]):等待用户输入一个角点 (3) (getdist [pt] [msg]):等待用户输入一个距离 (4) (getpoint [pt] [msg]):等待用户输入一个点
1.计算函数 (+ n m)、 (- n m)、 (* n m)、 (/ n m) (1+ m)、 (1- m)、(sqrt m) 2.关系运算函数 (= n m) (/= n m) (< n m) (>= n m) 3.逻辑运算函数 (and 表达式1 表达式2 ……) (or 表达式1 表达式2…… ) (not (项))
常用内部函数(1)
常用内部函数(2)
4. 赋值函数 ( setq <符号1><表达式1>……) 5.引用函数 (quote<表达式>)或简写成(‘<表达式>) 6.转换函数 (itoa <整数>):整数转换为字符串 (atoi <字符串>):字符串转换为整数 (atof<字符串>):字符串转换为浮点数
CAD/CAE/CAM系统的编程基础 与二次开发技术
商业化的CAD/CAE/CAM系统在某些方面难以满足工 程需要,为提高和扩展系统的功能,需要对 CAD/CAE/CAM系统进行开发。 开发的方式主要有三种: (1)在通用CAD/CAE/CAM软件基础进行二次开发, 如SolidEdge, SolidWorks,AutoCAD等CAD系统的二次 开发。 (2)基于CAD/CAE/CAM软件平台的开发。如当前 流行的图形核心技术开发平台有ACIS、Parasolid、 CAS.CADE和Granite等,稳定性好,但成本高。 (3)完全自主版权的开发,如C++等结合OpenGL进 行开发。
自定义函数(1)
1.定义函数
格式:(defun 函数名(变量表/局部变量表)表达式……)
如定义一个加10的函数 (defun add10(x) (setq x(+ 10 x)) 2.调用函数 格式: (函数名 [变元]……) 如 (sqrt 4) (add10 3) (setq y(add10 (+2 3))
表达式(1)
表达式相当于程序的语句,主要是由原子或 表构成的。 1.以表的形式存在的表达式 格式: (函数名 [变元]……) 2.前缀表示法:将函数名放在所有的操作数之 前:如x=(a+b)*c 用Lisp表示为:(setq x (* (+ a b) c)),相当于说 运算符也属于函数。
表达式(2)
常用内部函数(3)
7.字符串处理函数 (strcat <字符串1> <字符串2>):将字符串按顺 序连结成一个新字符串 (substr <字符串><开始><长度>):从开始处截 取某长度的字符串。 (strlen <字符串>):求字符串的长度。
常用内部函数(4)
8.求值函数 (distance <点1> <点2>):两点之间的距离 (polar <点> <角度> <距离>):以相对极坐标方式 返回另一个点 ( angle <点1> <点2>):返回两点连线与X轴正向 夹角 (osnap <点> 字符串):返回以点来指定对象的捕 捉点