AUTOLISP语言的学习和使用(1)
autolisp培训教程48页word
AutoLISP培训教程单元一: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基础教程
Autolisp基础教程单元一: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语言的学习和使用(1)
AutoLisp语⾔的学习和使⽤(1)第七节AutoLISP语⾔及其程序设计LISP(List Processing)是⼀种计算机的表处理语⾔。
LISP语⾔是⼈⼯智能领域中⼴泛应⽤的⼀种程序语⾔。
AutoLISP语⾔是⼀种运⾏在AutoCAD环境下的LISP编程语⾔,或称为AutoCAD的⼀种嵌⼊式语⾔。
它采⽤了与CommandLISP(⼀种通⽤的LISP语⾔版本)相近的语法及习惯约定,并吸收了LISP语⾔的主要函数,同时增加了针对AutoCAD特点的许多功能,如:可以把AutoLISP和AutoCAD的绘图命令透明地结合起来,使设计和绘图完全融为⼀体。
利⽤AutoLISP语⾔编程可以实现对AutoCAD当前图形数据库进⾏直接访问和修改。
在LISP语⾔中,最基本的数据类型是符号表达式。
LISP语⾔的特点是程序和数据都采⽤符号表达式的形式,即⼀个LISP程序可以把另⼀个LISP程序作为它的数据进⾏处理。
因此使⽤LISP语⾔编程⼗分灵活,看起来是⼀个⼀个的函数调⽤。
⽀持递归定义也是Auto LISP语⾔的重要特性。
AutoLISP语⾔是提供给⽤户的主要⼆次开发⼯具之⼀。
⽤AutoLISP语⾔编写应⽤程序,可以为AutoCAD增加新的命令或修改AutoCAD,以适应⽤户的特殊需要。
AutoCAD软件的开发者——AutoDesk公司许诺,将保证今后AutoCAD软件对AutoLISP 语⾔的⽀持。
掌握使⽤和编制AutoLISP应⽤程序的⽅法和技术将⼤⼤提⾼⽤户的⼯作效率和⼆次开发⽔平,增强AutoCAD的灵活性,并将得到长期、稳定的技术⽀持。
1.1 AutoLISP语⾔的基本知识1.1.1 AutoLISP语⾔的特性AutoLISP语⾔是⼀种解释型语⾔,它的特点如下:1.解释型语⾔编程语⾔有两种基本类型:解释型和编译型。
AutoLISP属于解释型语⾔。
在解释型语⾔中,⽤户编写的源程序直接由解释器解释并执⾏。
AUTOLisp教程
命令: (setq 32bit (float (* 3 30000)))
90000.0
字符串处理
AutoLISP 提供了如下处理字符串值的函数:
strcase strlen wcmatch
strcat substr
下列函数用于在字符串值和数字值之间相互转换(详细信息请参见转换函数)。
在命令行中输入文本时,AutoCAD 将该文本与内部的可用命令名列表作比较,以解释该文本。如果输入的文本与列表中的某项相匹配,AutoCAD 执行该命令。当 AutoCAD 接收到 AutoLISP 代码时,它将该代码传递给 AutoLISP 解释器。AutoLISP 解释器的核心是计算器。该计算器读取一行代码,对它求值,然后返回一个结果。代码必须符合 AutoLISP 表达式的格式要求,它可以从文件中读取,也可以由用户从 AutoCAD 命令行中输入。
30
常见错误是忽略了文本字符串中的双引号 (")。在这种情况下,右括号被解释为字符串的一部分,而不会对 n 产生影响。要改正此错误,可按 ESC 键取消该函数,然后重新输入正确的表达式。
虽然可以在命令行中输入 AutoLISP 代码,但在测试和调试 AutoLISP 代码时,从文件中加载 AutoLISP
~(按位非) expt lsh zerop
1+(增 1) fix max
1-(减 1) float min
关于每个数字处理函数的详细信息,请参见第十三章“AutoLISP 函数列表”。
除了在应用程序中执行复杂的数学计算以外,用户也可在日常使用 AutoCAD 时用数字处理函数来协助完成工作。例如要将一条直线按照长度为模数 *3.1415... 切分,而模数为 3,可在命令提示中使用 *(乘)函数。
AutoLISPVisualLISP教程学习教程
第9页/共87页
10.2.2访问其他AutoCAD对象
获取AutoCAD应用程序这个根对象之后,沿着AutoCAD对象模 型图,就可以将其作为起点,逐级访问它的下一级VLA对象。
第5页/共87页
2. 了解AutoCAD应用程序的属性和方法
(vlax-dump-object VLA对象 [T]),该函数的功能是列出指定 VLA对象的属性和方法,参数为VLA对象,如果未设置T,只列出 指定VLA对象的属性。例如
(vlax-dump-object myacad t)返回
; IAcadApplication: An instance of the AutoCAD application
; ZoomCenter (2) ; ZoomExtents () ; ZoomPickWindow () ; ZoomPrevious () ; ZoomScaled (2) ; ZoomWindow (2)
第8页/共87页
在Property values(属性)部份列出了AutoCAD应用程序具 有ActiveDocument(活动的文档)、Application(应用程序的 指针)、Caption(标题)、FullName(可执行文件名)等属性。
第13页/共87页
; Handle (RO) = "81" ; HasExtensionDictionary (RO) = 0 ; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 040a53f4> ; Layer = "0" ; Length (RO) = 50.0 ; Linetype = "ByLayer" ; LinetypeScale = 1.0 ; Lineweight = -1 ; Normal = (0.0 0.0 1.0) ; ObjectID (RO) = 2129985160 ; ObjectName (RO) = "AcDbLine" ; OwnerID (RO) = 2129984760 ; PlotStyleName = "ByLayer" ; StartPoint = (10.0 20.0 0.0) ; Thickness = 0.0 ; TrueColor = #<VLA-OBJECT IAcadAcCmColor 040a6db0> ; Visible = -1
AutoLISP详细讲解
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入门单元一: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 支持软件。
autocad-lisp教程
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教程
第十四章 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 入门
超值奉送Auto LISP 入门Auto LISP 是在AutoCAD 内部允许的一种内嵌式程序设计语言。
LISP (List Processing Language )是人工智能领域中广泛采用的一种表处理语言,具有较强的表处理功能,主要用于人工智能、机器人、专家系统、博弈、定理证明等领域。
LISP 也被称为符号式语言,因为它处理的对象是符号表达式。
Auto LISP 可以直接调用几何所有的AutoCAD 命令,为AutoCAD 提供了使用高级语言开发编程的途径,使得用户能充分利用它对AutoCAD 进行二次开发。
感谢:感谢您选购本图书。
本部分是《AutoCAD 2007中文版自学手册——入门提高篇》图书超值赠送的一部分,仅供读者个人参考使用。
未经许可,任何人不得将此部分用于其他商业用途。
欢迎您对我们的图书进行监督,并对我们的工作(图书质量、装帧设计、封面、印刷等)提出改进意见或建议。
网站:E-mail: editor.liu@QQ 群:9843746 (CAD/CAM/CAE 应用方向)您的支持是我们前进的动力,您的需要是我们努力的方向!冯如设计在线 2006-10-09A.1 Auto LISP基本函数自从AutoCAD RA.01 开始,出现了Visual LISP 语言,它是Autodesk公司为增强Auto LISP 程序开发能力而设计的软件工具,为Auto LISP增加了许多新的函数。
Visual LISP的集成开发环境提供很多特性,使用户创建和修改源代码、测试和调试程序更加方便。
自从Auto LISP 嵌入AutoCAD 之后,使仅仅作为交互式图形编辑软件的AutoCAD,通过编程使之能真正进行计算机辅助设计、绘图。
由于LISP灵活多变、易于学习和使用,因而使AutoCAD 成为功能很强大的工具性软件。
随着AutoCAD版本的升级,Auto LISP 的功能不断得到扩充和增强,主要功能如下:z能够把数据和程序统一表达为表结构,即S-表达式,因此可以把程序当作数据来处理,以可以把数据当作程序来执行;z有图形处理和程控方面的函数,可以直接调用AutoCAD的所有命令;z扩充了AutoCAD应用的特殊功能;z主要控制结构采用递归方式,使得程序设计简单易懂。
AutoLisp入门教程
單元一:AutoLISP主角瀟灑登場一. AutoLISP 是何方神聖?1.AutoLISP是AutoCAD的最佳拍檔!2.AutoLISP內含於AutoCAD軟體內,不用另外花錢買!3.AutoLISP是強化AutoCAD最好、最直接的『程式語言』!4.AutoLISP易學、易用,即使不會程式設計的AutoCAD使用者,都能在最短的時間內,寫出令人驚訝、讚嘆的功能!5.若說AutoLISP的出現,是替AutoCAD 創造一片天的『最大功臣』,實不為過一點也不誇張!6.AutoLISP希望您去學習它、改善它、發揮它、享受它.真的!它的威力、魅力無窮!二. AutoLISP 程式語言的特質分析:學習AutoLISP是非常容易的,對初學者而言,即使沒有學習過任何的程式語言,都能很快的上手,寫出精彩漂亮的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从入门到精通初级教程(新手必备)
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 支持软件。
AutoLISP教程
AutoLISP教程来源:中数休闲发表时间:2007-1-30 【字体:大中小】浏览次数:69414.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编程入门
基本指南:两数求和在命令行输入:(+ 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教程
函数 (Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.数据型态 (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. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案 (FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量数据型态 (Data Type)选集 (PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化 (VARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号 (SYM)用以储存静态数据的名称;例如内建或用户定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外: 左括号 ( 右括号 ) 句点 . 单引号 ' 双引号 " 分号 ;表 (LIST)亦称为串行,是放在一对小括号 ( )内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以 ( ) 或 (NIL) 表示变数 (Variable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全局(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态) 在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 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的控制台窗口中,于提示符号 _$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME)Result : STR若检查的变量没有储存数据,则会传回NIL练习 (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存入变数TEMP COMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP)Result : REALCOMMAND : (SETQ TEMP "AutoLISP");将字符串存入变量TEMP COMMAND : !TEMP Result : "AutoLISP" COMMAND : (TYPE TEMP)Result : STR+基本运算加函数(+ [数值参数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 数值参数2 ....] )e.g. (* 2 3 4)Result : 24结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3)Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意 : 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值 nil)取代.练习 (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反正切值(ATAN 弧度参数)e.g. (ATAN 1)Result : 0.785398其它数值处理次方值(EXPT 数值参数次方值 )e.g. (EXPT 2 4)Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数 )e.g. (SQRT 30)Result : 5.47723绝对值(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函数的反函数;传回值为实数型态数值资料转型实数转整数(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 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响弪度转字符串(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篇教程数值资料检查数值(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练习 (Exercises)计算下列算式 :(+ 1234567890 1234567890)Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下 : 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890)Result : 2.46914e+009计算下列算式 :(+ 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----用户定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,Visual LISP控制台,或供其它自定义函数内的表示式呼叫使用AutoLISP源代码均以纯文本格式存档,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文本编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD 等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下 :(DEFUN [C:] 函数名称( [自变量串行 ...] [/ 局部变数串行 ...] ) 表达式 ...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行 ( )加在函数名称之后若有提供局部变量,必须以斜线 / 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中)若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(默认在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名 : VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意 : 必须以正斜线 / 或两个反斜杠 \\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行e.g. (LOAD "TEST" "Load Fail") 或 (LOAD "TEST" (DOERROR))注意 :在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果练习 (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)批注单行批注分号 ;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回 T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为 T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回 T,否则传回 nile.g. (= 2 2.0)Result : Te.g. (= "A" CHR(65))Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回 Te.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条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(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 函数的循环 (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储存值恒久不变,导致条件式永远成立练习 (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))程序说明1设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为02WHILE循环函数,并设定进入循环的条件式(变量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,进入循环;将COUNT = 1 TOTAL = 1 TOTAL(现值0)加上COUNT,存回变数TOTALCOUNT = 2 TOTAL = 1 ----变数COUNT(现值1)递增1变为2,存回变数COUNT返回WHILE函数的开头,重新判断条件式----变量COUNT(现值2)小于NUM,进入循环;将----COUNT = 2 TOTAL = 3 TOTAL(现值1)加上COUNT,存回变数TOTAL----变数COUNT(现值2)递增1变为3,存回变数COUNT = 3 TOTAL = 3 COUNT返回WHILE函数的开头,重新判断条件式--------变量COUNT(现值3)小于NUM,进入循环;将COUNT = 3 TOTAL = 6 TOTAL(现值3)加上COUNT,存回变数TOTAL部份过程省略返回WHILE函数的开头,重新判断条件式----COUNT = 10 TOTAL = 55 变量COUNT(现值10)仍等于NUM,进入循环;----将TOTAL(现值45)加上COUNT,存回变数----变数COUNT(现值10)递增1变为11,存回变COUNT = 11 TOTAL = 55 数COUNT返回WHILE函数的开头,重新判断条件式----COUNT = 11 TOTAL = 55 变量COUNT(现值11)巳大于NUM(本范例假设----为10),条件判断不成立,循环结束----显示变量TOTAL的现存值,程序结束尝试用IF函数检查输入的自变量是否小于或等于0;若条件成立则不执行余下的程序(DEFUN SUM (NUM)(IF (<= NIM 0) (PRINC "Input Error")(PROGN略过 WHILE 及 PRINC 函数))(PRINC))程序说明1设定函数SUM并将自变量存入变量NUM,并用IF函数判断是否<=0,若条件成立则显示错误讯息2若条件不成立,即以PROGN函数包含上例中的循环及显示答案部份3尾3行的关括号是对应第2行的PROGN函数4尾2行的关括号是对应第1行的IF函数5最后一行最右边的关括号是对应第1行的DEFUN函数输入函数让AutoCAD应用程序可以提示用户输入程序所需的数据;这些输入函数一般都是以GET开头;当程序执行至输入函数时,程序便会暂停,等待用户输入指定类型的数据后,程序即会继续执行.亦可在函数内指定要显示的提示字符串,若不提供则没有任何提示.输入整数(GETINT [提示字符串] )e.g. (GETINT "Input Number : ")输入的范围从-32,768到+32,767之间;若超出范围,会有警告讯息若输入的数据不是整数型态,如文字或是实数,会显示警告讯息若输入空格或按下ENTER键响应,输入值为 nil输入实数(GETREAL [提示字符串] )e.g. (GETREAL "Input Number : ")若输入的数据是字符串型态,会显示警告讯息;若输入整数,则会自动转为实数若输入空格或按下ENTER键响应,输入值为 nil输入字符串(GETSTRING [模式] [提示字符串] )e.g. (GETSTRING T "Input Name : ")若有提供模式参数且不是 nil 值,用户即可在输入的字符串中包含空格;但此时必须按ENTER键结束输入若没有提供模式参数或该参数为 nil 值,要在字符串中包含空格时,必须在字符串的前后加上双引号 "输入时不须在字符串的前后加上双引号(上述的情况例外)若输入空格(没有模式参数或为 nil 值时)或按ENTER键响应时,输入值为"",即空字符串输入选取点(GETPOINT [基准点] [提示字符串] )e.g. (GETPOINT (LIST 0 0) "Select Point : ")可以在屏幕以指向设备(一般是鼠标)选取,或以键盘直接输入坐标值亦可若有提供基准点(目前UCS的2D或3D坐标),会从基准点出现伸缩线到十字光标所在位置可接受单一整数或实数作为长度,代替基准点参数;此时会以系统变量LASTPOINT为基准点,以目前十字光标的位置与LASTPOINT的角度为方向,以。
Autolisp编程心得
(ett_ct) ;编辑后返回选择)(t (ett_ct)) ;空选返回选择))************************************************有时需要进行复杂的判断,使用如“(= s0 "")”语句可能不能准确判别输入的空格关键字与空选择,可以使用“(= (type s0) 'STR)”语句。
4.Lisp的暂停与while的特殊使用Lisp一般在交互输入时才会暂停,如果只需要实现屏幕显示暂停,可使用grread函数,grread函数对所有合法的输入设备均会作出反应,有时我们只希望对键盘有反应,可使用while 函数进行循环。
*******************(princ "\nPress ENTER to continue:")(while (/= (car (grread)) 2))*******************while用于满足一定条件的循环,其标准语法为:(while testexpr [expr...])其中expr解释为“在 testexpr 为 nil 之前要求值的一个或多个表达式”,为可选项(在R14之前没有方括号,但仍为可选项)。
正常我们使用while时,总会有expr项,更多的时候,我们是为了expr项才会使用这种循环语句,所有我们往往有expr项是不可缺少的感觉。
这里我们使用while函数的语法是while函数的特例,即没有expr项的情况。
如果希望对鼠标右键同时反应,可以使用:*******************(princ "\nPress ENTER to continue:")(while (and (/= (setq a(car (grread))) 2) ;键盘(/= a 11) ;鼠标右键(SHORTCUTMENU=0)(/= a 25) ;鼠标右键(SHORTCUTMENU≠0)))*******************5.输入距离Lisp语言中输入距离的函数为getdist,但我们有时需要输入负值,有时需要在输入距离的同时得到角度,使用getdist函数就显得无能为力,这时,我们可以灵活使用其它交互输入函数如getpoint、getcorner等,通过计算得到我们所需要的值。
AutoLISP教学课件
程序编写原则 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程序入门教学资料AutoLISP程序入门-教学资料一. AutoLISP简介(优越性及缺点)AutoLISP语言是开发Autocad的主要工具,是LISP语言和Autocad有机结合的产物,在Autocad的发展及壮大过程中起到了重要的作用。
正是以AutoLISP为代表的开放式结构,才使Autocad在众多的CAD软件竞争中长期处于不败之地。
AutoLISP是一种解释型语言,可直接在Autocad中运行,而不象编译型语言必须借助于编译器对原程序进行编译和连接,才能生成可执行的代码模块,用户只需借助于文本编辑器(例如DOS的"EDIT"程序)即可进行编程。
AutoLISP(List Processing Language)是一种表处理语言?quot;表"是AutoLISP语言独有的数据结构,在AutoLISP中广泛使用,表是在一个变量中储存大量相关数据的有效方法。
例如AutoCAD中以三个实数(X Y Z)这种表的形式来表示三维点。
二. 在AutoLISP的赋值方法不象大多数计算机语言采用"中缀法"来表示程序语句(表达式),而采用"前缀法"。
例如:C语言中为实型数X赋值125.0,写成:X = 125.0;运算符"="放在操作数X和125.0之间。
而AutoLISP中则写成:(setq X 125.0)运算符"setq"放在操作数X和125.0之前。
"setq"是AutoLISP最主要的赋值函数,几乎所有的变量赋值都要依?quot;setq"来实现。
三. 如何向AutoCAD增加一个新命令(或如何定义一个函数)一般程序的结构组成及加载在下面的例子中,我们将了解AutoLISP语言一般程序的结构组成、如何定义一个在AutoCAD中可执行的函数、"setq"的用法以及如何在AutoCAD中加载程序。
AutoLISP(1)概述、基本函数、表处理函数、绘图函数
石家庄铁道学院工业设计系
计 算 机 绘 图
LISP语言的突出特点是程序和数据都取符号表达 式的形式,即一个LISP程序可以把另一个LISP程 序作为它的数据处理。 LISP是求值型而不是编译型或解 释型的语言。
石家庄铁道学院工业设计系
计 算 机 绘 图
Auto LISP语言的特点 语言的特点
AutoLISP是为扩展和自定义AutoCAD功能而设计 的一种编程语言。 八十年代中期,AutoLISP被引入AutoCAD R2.16 版中作为应用程序编程接口(API) ,至今仍然是其 主要的程序设计语言。 LISP之所以被选为AutoCAD最初的应用程序编程 接口,是因为只有它才适合于工程中的非结构化 设计过程。
石家庄铁道学院工业设计系
计 算 机 绘 图
例: (moo “Hello” 5) (moo “Hi” 1 2 3) (moo 1 2 3) (moo “Hello”) 正确 正确 不正确 不正确
石家庄铁道学院工业设计系
计 算 机 绘 图
二、函数 函数是AutoLISP中的基本数据,函数能对数据进 行一系列的处理,并返回其结果。 AutoLISP函数的规则: AutoLISP函数必须放在括号里,所有的括号应当 匹配 函数从左往右读 括号中的第一个原子为函数操作符,为一个命令, 告 诉 AutoLISP做什么。
石家庄铁道学院工业设计系
计 算 机 绘 图
六、点对
点对也是一种表,表中有两个元素,两个元素中间 有圆点“.”,圆点与前后元素之间必须各有一个空 格,例如 (A . B) 就是一个点对,A和B与圆点之间用空格分开,A 和B均为S表达式,A称为点对的左元素,B称为点 对的右元素。点对也可以嵌套。 点对常用于构造联结表。
autolisp教程
autolisp教程第⼗四章 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 就会很容易。
对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
表有两种基本类型:标准表和引用表。标准表是从左括号开始到配对的右括号结束。 表中的第一个元素(0 号元素)必须是一个合法的已存在的 AutoLISP 函数。引用表是在左 括号前加一撇号,表示不对此表作求值处理。 点对表 符号、字符串
表达式
原子 数
整数
实数
文件描述符
当 AutoLISP 打开一个文件时,系统将给该文件赋一个数字标号,在以后要访问该文件 时(读或写文件) ,可利用该文件描述符对指定的文件进行操作。 例如:
符号
AutoLISP 中符号用于存储数据,因此“符号”和“变量”这两个词含义相同,可以互 相交换使用。 符号名可以由除下列 6 个字符外的任何可以打印的长度不限的字符序列来组成: “ (” 、 “) “、 “ ,” 、 “ ’” 、 “ ”” 、 “ ;” ,当这 6 个字符中的任一字符在符号名中出现时,将 终止符号名。不允许使用数字符号作为第一个字符。 下列为合法的符号名: ABC,!A,&AB,A3 下列为不合法的符号名: ( A) ,A.B,3A 在 AutoLISP 中符号名的大小写是等价的。LISP 中“约束”是指对一对符号和值,当把 一个值赋给一个符号时,也即把这个符号约束为那个值。 例如: (setq a 6) “!a”将显示 6,表示 a 是一个整数,其值为 6。
第七节 AutoLISP 语言及其程序设计
LISP(List Processing) 是一种计算机的表处理语言。LISP 语言是人工智能领域中广泛应 用的一种程序语言。 AutoLISP 语言是一种运行在 AutoCAD 环境下的 LISP 编程语言,或称为 AutoCAD 的 一种嵌入式语言。它采用了与 CommandLISP(一种通用的 LISP 语言版本)相近的语法及习 惯约定,并吸收了 LISP 语言的主要函数,同时增加了针对 AutoCAD 特点的许多功能,如: 可以把 AutoLISP 和 AutoCAD 的绘图命令透明地结合起来,使设计和绘图完全融为一体。 利用 AutoLISP 语言编程可以实现对 AutoCAD 当前图形数据库进行直接访问和修改。 在 LISP 语言中,最基本的数据类型是符号表达式。LISP 语言的特点是程序和数据都采 用符号表达式的形式,即一个 LISP 程序可以把另一个 LISP 程序作为它的数据进行处理。 因此使用 LISP 语言编程十分灵活,看起来是一个一个的函数调用。支持递归定义也是 Auto LISP 语言的重要特性。 AutoLISP 语言是提供给用户的主要二次开发工具之一。 用 AutoLISP 语言编写应用程序, 可以为 AutoCAD 增加新的命令或修改 AutoCAD,以适应用户的特殊需要。AutoCAD 软件 的开发者——AutoDesk 公司许诺,将保证今后 AutoCAD 软件对 AutoLISP 语言的支持。掌 握使用和编制 AutoLISP 应用程序的方法和技术将大大提高用户的工作效率和二次开发水 平,增强 AutoCAD 的灵活性,并将得到长期、稳定的技术支持。
子程序和外部子程序
由 AutoLISP 提供的函数称为子程序(内部函数),外部子程序是由 ADSRX 或 ARX 应用 程序定义的子程序。
1.1.3
程序结构
C,VC,VB 等采用“中缀表示法” 例如: X=3.4 AutoLISP 采用的是“前缀表示法“ 例如: (setq x 3.4) 表达式 X=(A+B)*C 在 AutoLISP 中表示为: (setq X (* ( + A B) C) ) (setq a 2.3 )(setq b 6.7)(+ a b )
三维点: 以分别代表 x, y, z 坐标的三个实数所构成的表 (x,y,z) 的形式表示, 如: (3.21 7.58 4.68) 。 表的大小用其长度来度量。长度是表中顶层元素的个数。 例如: (setq (setq a a 6) (+ c (/ d 2) ) ) 表的长度为 3 表的长度为 3
表达式
所有 AutoLISP 表达式均为下述形式: (function_name [arguments]……) 左边以左括号“ (”开始,其后由函数名和函数的参数组成,最后以右括号“) ”结束。 每个表达式都有一个返回值。 表达式的参数可以是一个表达式, 它的返回值将被外层表达式 使用。
变量
AutoLISP 的变量有四种类型:整型数、实型数、字符串和表。变量的类型根据所赋的 值自动确定,并一直保持到下一次再赋值为止。 AutoLISP 用 setq 函数给变量赋值,格式如下: (setq 变量名 值) 其中参数“值”可以是一个表达式,执行结果返回变量的值。 例如: (setq x 5) x=5 整型数 (setq x 5.0) x=5.0 实型数 (setq x “Hello”) x=”hello” 字符串 (setq x ‘(3.7 6.5) ) x=(3.7 6.5) 表 当要用变量来响应 AutoCAD 提示时,只需在变量名前加一个“!”即可。 例如: command: (setq p1 ‘(100 100) ) (setq p2 ‘(200 200) ) (command “line” p1 p2) 函数: (defun C:aa1(/) (setq p1 '(100 100)) (setq p2 '(200 200)) (command "line" p1 p2) ) 或者: command:line From point:!p1
字符代码表 代码 \\ \” \e \n \r \t 意义 字符\键 字符”键 ESC 键 换行键 回车键 TAB 键 等价 ASCII 码值 \114 \142 \033 \012 \015 \011
例如:下面的表达式表示在显示提示内容前先进行换行,然后再显示字符串内容。 (prompt “\nEnter filename:”) 或 (prompt “\012Enter filename:”) 二者效果完全相同。
字符串
字符串(字符串常数)由一对双引号(”)括起来的字符序列组成。这对双引号是字符 串的定界符。 字符串常数最大长度为 132 个字符,但表示字符串的符号名所约束的值可以是任意长 度,因而可以利用“STRCAT“ (字符串拼接)函数无限制地增加其长度。 字符串中,同一字母的大小写认为是不同的字符,空格是一个有意义的字符。 字符串的长度是指字符串一对双引号之间的字符个数(不包括一对双引号)。如果字符串 的定界符之间无任何字符(即””)称为空串,其长度为零。 字符串中可以包含 ASCII 码中任一字符,通用的表示形式为“\nnn“,nnn 为八进制形 式的 ASCII 码。例如: “\101\102 \103”表示“ABC” ,两者的作用完全相同。由于反斜杠“\” 已作为字符串中的前导转义符,因而当字符串中要使用反斜杠时,必须加转义符,即用双反 斜杠“\\”表示字符串中一个反斜杠“\” ,也可以用反斜杠的 ASCII 码表示(即“\114” ) 。 同样, 由于双引号已作为字符串的定界符使用, 因而字符串中的双引号可以用 “\”” 或 “\042” 表示。对于一些常用的控制字符,其 ASCII 代码见下表。
打开一个名为: “myfile.dat” 的文件, 把打开文件时的文件描述符赋给符号 f, 再把 “This is a sample under AutoLISP.”写入该文件。 (setq f (open “c:\\myfile.dat” “w”) ) (print “This is a sample under AutoLISP.” f)
(defun C:ff(/) (setq a 2.3 ) (setq b 6.7) (setq c (+ a b ) ) )
1.1.4 求值
求值、表达式及变量
每个 LISP 程序的核心是一个求值器。求值器读入用户的输入行(一个符号表达式) ,对
其进行计算,然后返回计算结果。 AutoLISP 的求值过程如下: (1) 整形数、实型数、字符串对、文件指针和子程序以它们本身的值作为结果。 (2) 符号以它们当前的约束值作为计算结果。 (3) 表根据其第一个元素的类型来进行求值。
1.1.2 AutoLISP 语言中的数据类型
AutoLISP 支持下述 10 种数据类型: 整型数 实型数 字符串 符号
实体名 AutoCAD 选择集 内部函数(AutoLISP 子程序) 外部函数(ADS、ARX 函数)
整型数
AutoLISP 语言的另一个优点是可移植性。 AutoLISP 程序可以在运行于多种支持平台 (如 Windows、DOS、UNIX 和 Macintosh 等)上的 AutoCAD 中执行而与 CPU 或操作系统无关。 3. AutoCAD 的版本独立 AutoLISP 程序除平台和操作系统独立外, AutoLISP 的设计还考虑了向下的兼容。 这样, 任一版本 AutoCAD 编写的 AutoLISP 程序一般不加修改就可以在以后版本的 AutoCAD 中运 行。 4. AutoLISP 与主流编程语言的比较 AutoLISP 与目前使用比较多的编程语言(如 C/C++,BASIC 等)之间有一些明显的差 别。具体可体现在下述几个方面: (1) AutoLISP 与其它大多数语言之间最重要的差别是它用表 (List) 存放数据。 AutoLISP 没有数组、联合、结构及记录,所有复杂的数据集均由表来表示和处理。 (2)AutoLISP 的变量没有明确的类型。LISP 变量的类型是在赋值时动态确定的。 (3)AutoLISP 不需要预先声明变量或函数。 (4)与 C/C++,BASIC 等语言不一样,LISP 没有语句、关键词及运算符。它是函数定 位的语言,其所有运算都是由函数调用完成。 特点 声明 数组 可变变量类型 结构类型 用户类型 解释型 AutoLISP 无 无 有 无 无 是 C/C++ 有 有 无 有 有 否 VB 无 有 有 有 有 否