您好,欢迎来到99网。
搜索
您的当前位置:首页AutoCAD高级培训第五讲之一

AutoCAD高级培训第五讲之一

来源:99网


AutoCAD高级培训 第五讲之一

——AutoCAD二次开发

(AutoLISP 语言编程概述)

二次开发:采用编程的方法扩充AutoCAD的功能,如增加新的绘图命令、新的修改命令等。

例如,AutoCAD中本来没有绘制正弦曲线(函数形式为Y=Asin(X+))命令,通过编程开发一个AutoCAD的新命令,使用户可以使用该命令实现绘制正弦曲线,在命令的交互过程中,系统提示用户依次输入所需要的参数:坐标原点、振幅、周期数、初相角等。

常用二次开发工具:AutoLISP语言(运行于VisualLISP集成开发环境)、ActiveX、VBA、JAVA、C、ObjectARX等

需要掌握:AutoLISP语言(高级证书所必需)

一、 AutoLISP 语言简介

1. LISP——List Processing Language

2. AutoLISP:嵌套于AutoCAD内部,将LISP与AutoCAD有机结合,是AutoCAD开发的重要工具。

1

3. AutoLISP的功能:

可直接调用AutoCAD的几乎全部命令

具备一般高级语言的结构和功能

具备一般高级语言所没有的强大的图形处理功能

4. AutoLISP的特点

仅能以解释方式运行于AutoCAD内部(解释性程序设计语言)

程序的全部内容均以函数形式给出,没有语句的概念,也没有其他语法结构,执行程序就是执行一系列的函数调用,也称“函数语言”

把数据和程序统一表达为表结构,程序即数据,数据即程序,故也称为“表语言”

运行程序就是对函数求值的过程,在此过程中实现函数的功能

例如,下面的内容就是一个完整的AutoLISP程序:

(defun math()

(setq x 10)

(setq y 20)

2

(+ x y)

(* x y)

)

该程序运行的结果是:200

二、 AutoLISP的数据类型

整型数

实型数

符号 (SYM)

字符串 (STR)

表 (LIST)

文件描述符 (FILE)

AutoLISP的内部函数(SUBR)

AutoCAD的选择集 (PICKSET)

3

AutoCAD的实体名 (ENAME)

函数分页表 (PAGETB)

基本应用:涉及用蓝色显示的6种,前4种称为“原子”。

1. 原子(原子就是“表”中的元素,常作函数的参数)

(1)整数

(2)实型数

(3)符号(常用来作变量名)

(4)字符串:在一对双引号“”内的一组字符

2. 表

表有如下几项特征:

(1) 放在一对圆括号内

(2) 其中的元素可以是:数字、符号、字符串、表

(3) 元素之间有空格

4

(4) 可任意嵌套,如 (15 (a b) c d)

(5) 元素在表中按先后顺序取得序号,依次为0,1,2,……

(6) 表的大小即表的长度,没有元素的称为空表,用()或nil表示

(7) 有两种类型:标准表、引用表

标准表——实现函数调用的表,第一个元素是函数,后面的元素是函数的参数;

引用表——被当作数据引用的表,如表示点的坐标(x,y)的表

三、 AutoLISP的程序结构

有一个或一系列按顺序排列的标准表组成,如:

(setq x 25.0) (setq函数,见辅导材料P34)

(setq y 12.2)

(+ (* x y) x)

AutoLISP程序书写格式的特点:

1. AutoLISP程序全部由函数组成,函数的形式是表,表的括号需左右匹配;

5

2. AutoLISP程序阅读函数时按从左到右的规则;

3. 函数必须是第一个元素,函数与参数、参数与参数之间均至少要一个空格分开;

4. 两个表之间和表内的多余空格和回车是不产生作用的,因此一个表可占多行,一行也可以写多个表。如前述程序可写为:

(setq x 25.0) (setq y 12.2) (+ (* x y) x)

5. 用“;”开始的内容作为对程序的注释;

6. 文件类型为“.LSP”,是ASCⅡ码的文本文件。

AutoLISP程序就是对AutoLISP函数的调用,AutoLISP函数分为系统内部函数和用户定义的外部函数,AutoLISP对函数的调用是通过标准表来实现的,程序的执行就是对标准表依次进行求值的过程,在求值的过程中实现相应的功能。

四、 AutoLISP程序的执行过程

1. 加载AutoLISP文件

一个简单的弹出对话框的例子(设文件名为test.lsp):

(defun c:testlisp() (defun函数,见辅导材料P43、p44)

(alert “Hello, The World!”)

6

(alert为错误处理函数,其作用是在屏幕上显示一个警告框,警告框中的内容是它后面的字符串)

加载AutoLISP文件有以下几种方法:

a) 命令行加载(键盘命令方式)

命令:(load “路径\\\\文件名”)

b) 对话框方式

工具——AutoLISP——加载应用程序——选择AutoLISP文件——点击加载

c) 自动加载方式(略)

2. 运行AutoLISP

(1) 若为函数,则在“命令:”提示符下输入“(函数名)”并回车。

(2) 若为命令,则在“命令:”提示符下输入“命令名”并回车。

五、 两个AutoLISP例程

1. 绘制圆的渐开线

7

X=r(cos+sin)

Y=r(sin-cos)

r——基圆半径

;程序代码(involute.lsp)

(defun c:inv(/ p0 phi phimax phimin) ;参见辅导材料P43-44

(setq p0 (getpoint \"\\n请输入基圆的圆心:\"))

;参见辅导材料P34和P46

(setq r (getdist p0 \"\\n请输入基圆的半径:\"))

;参见辅导材料P46

(command \"circle\" p0 r) ;参见辅导材料P49

(setq phimin (getreal \"\\n输入渐开线的起始角度( ;参见辅导材料P45

(setq phimax (getreal \"\\n输入渐开线的终止角度(弧度):\"))

(setq dphi (getreal \"\\n输入角度增量(弧度):\"))

8

弧度):

\"))

(setq n (/ (- phimax phimin) dphi))

;参见辅导材料P34

(setq dphi (/ (- phimax phimin) n))

(setq x0 (car p0) y0 (cadr p0)) ;表处理函数

(setq phi phimin)

(setq x1 (+ x0 (* r (+ (cos phi) (* phi (sin phi))))))

(setq y1 (+ y0 (* r (- (sin phi) (* phi (cos phi))))))

(while (<= phi phimax) ;见辅导材料P41

(setq phi (+ phi dphi))

(setq x2 (+ x0 (* r (+ (cos phi) (* phi (sin phi))))))

;见辅导材料P36

(setq y2 (+ y0 (* r (- (sin phi) (* phi (cos phi))))))

(setq p1 (list x1 y1)) ;表处理函数

9

(setq p2 (list x2 y2))

(command \"pline\" p1 p2 \"\")

(setq x1 x2 y1 y2)

)

)

[本例中相关的表处理函数]:

(1) car函数

格式:(car 表)

作用:取表中第一个元素。

(2) cdr函数

格式:(cdr 表)

作用:取子表,得到表中除第一个元素以外的所有元素组成的新表。

(3) 由car和cdr组合而成的函数

10

格式:(cadr 表)、(caddr 表)、(cdadar 表)等

作用:分别等价于(car (cdr 表))、(car (cdr (cdr 表)))、(cdr (car (cdr (car表))))。这种组合最多可达四级,即最多为六个字符,AutoLISP执行这种组合函数时先从后面做起。

(4) list函数

格式:(list 表达式 . . .)

作用:将所有表达式的值建立成一个表。该函数的变量个数不限。

2. 绘制太极图案

程序源代码:

(defun yinyang(/ origin radius i-radius half-r origin-x os) ;参见辅导材料P43-44

(setq os (getvar \"OSMODE\")) ;参见辅导材料P51

(setvar \"OSMODE\" 0) ;参见辅导材料P51

(setq origin (getpoint \"\\nOrigin of inyn sign:\"))

(setq radius (getdist \"\\nRadius of inyn sign:\" origin))

11

origin-y

(setq i-radius (getdist \"\\nRadius of internal circle:\" origin))

(if (> i-radius radius) (setq i-radius (/ radius 4)))

;参见辅导材料P41

(setq half-r (/ radius 2))

(setq origin-x (car origin))

(setq origin-y (cadr origin))

(command \"CIRCLE\" origin radius)

(command \"ARC\"

\"C\"

(list origin-x (+ origin-y half-r))

(list origin-x (+ origin-y radius))

origin

)

12

(command \"ARC\"

\"C\"

(list origin-x (- origin-y half-r))

(list origin-x (- origin-y radius))

origin

)

(command \"CIRCLE\"

(list origin-x (+ origin-y half-r))

i-radius

)

(command \"CIRCLE\"

(list origin-x (- origin-y half-r))

i-radius

13

)

(setvar \"OSMODE\" os)

(princ) ;参见辅导材料P49

)

[本例中相关的打印功能函数]

(1)prinl函数

格式:(prinl [表达式] [文件描述符])

作用:将“表达式”打印在屏幕上或文件中,并返回该表达式。“表达式”可以是任何形式的表达式,不一定必须是字符串。无表达式时,则不做任何打印,仅返回一个空值(NIL)。

(2)princ函数

格式:(princ [表达式] [文件描述符])

作用:与prinl函数基本相同。

14

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务