第7章 CAD软件的二次开发_LISP语言.ppt_第1页
第7章 CAD软件的二次开发_LISP语言.ppt_第2页
第7章 CAD软件的二次开发_LISP语言.ppt_第3页
第7章 CAD软件的二次开发_LISP语言.ppt_第4页
第7章 CAD软件的二次开发_LISP语言.ppt_第5页
免费预览已结束,剩余266页可下载查看

下载本文档

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

文档简介

1、1,第七章 CAD软件的二次开发技术,2,Pro/Engineer、UGII、I-DeaS、MASTERCAM、Solodedge 等,都是商品化的通用平台,基本上覆盖了整个制造行业. 专业针对性差,并且不能满足各种各样的具体产品的设计需要,在实际的工程设计中难以达到理想的效果,几乎不能真正实现软件的灵活高效的特点。 CAD软件的二次开发问题就成为了CAD技术推广应用过程中所必须面对和解决的课题之一。,第七章 CAD软件的二次开发技术,3,二次开发的定义: 就是把商品化、通用化的CAD系统用户化、本地化的过程,即以优秀的CAD系统为基础平台,研制开发符合国家标准、适合企业实际应用的用户化、专业

2、化、集成化软件。,AutoCAD软件包是目前最为流行的工程绘图软件,该软件包因其构造、编辑图形能力强、开发性好、支持微机平台等优点,在国内得到广泛的应用。但AutoCAD软件本身是一种非参数化环境的软件,只能通过交互式绘图命令及一些二次开发手段来进行设计制图。,4,AutoCAD软件其不足主要表现为: (1)图形输入工作量大、效率低。 (2)若需生成系列图纸,CAD人员只能通过大量修改, “人工”参数化绘图。 AutoCAD强大的生命力不仅在于其完善的绘图功能,良好的用户界面,易学易用的操作特点而且还在于它开放的结构体系,AutoCAD为用户提供了多种二次开发工具。AutoCAD强大的图形编辑

3、功能和完全开放的结构有利于对其进行再开发,以满足用户的特殊要求。从而克服了软件的不足和局限性,提高了设计效率和质量。,5,Auto lisp技术 Autolisp是嵌入AutoCAD的解释型过程语言, 继承了 Lisp语言的语法传统约定和基本函数与数据类型,并且扩展了图形处理,几乎能调用 CAD的所有命令。具有比较强的开发能力,但是运行速度慢,不宜用于高强度的数据处理。,6,ARX( C+ )技术 ARX( AutoCAD Runtime Extension )是AutoCAD R13之后推出的以C+语言为基础的、面向对象的开发环境应用程序接口。 ARX 程序本质上为Windows 动态链接库

4、(DLL)程序,与AutoCAD 共享地址空间,直接调用AutoCAD的核心函数,可直接访问AutoCAD数据库的核心数据结构和代码。以便能够在运行期间扩展AutoCAD固有命令特权的新命令。,7,VBA技术 VBA(Visual Basic for Application)最早是嵌入在 Office中的一种编程语言,因为易学易用,功能强大,AutoDesk公司开始在AutoCAD 版本中内置VBA开发工具,同时提供了使用的对象模型和开发环境,到AutoCAD2000功能得到了加强。,8,AUTOLISP二次开发,7.1 AUTOLISP语言的特性 7.2 AUTOLISP语言常用函数 7.3

5、 AUTOCAD命令的定义与调用方法 7.4应用AutoLisp语言进行数据文件操作及实体访问 7.5 AutoCAD对话框设计技术 7.6 利用AUTOLISP开发应用程序 7.7 DXF文件的图形数据交换 7.8 SCR文件的图形数据交换,9,7.1 AutoLisp语言的特性,解释型语言 用户编写的源程序代码直接由解释器解释并执行。 平台和操作系统独立 AutoLisp程序可移植性好,程序可在多种平台和操作系统上运行。 版本独立 AutoLisp语言向后兼容,为任意版本AutoCAD编写的AutoLisp程序可以在以后版本的AutoCAD中运行。,10,7.1 AutoLisp语言的特性

6、,AutoLisp与主流编程语言的比较: AutoLisp与其他语言最大的区别是用表存放数据,没有数组、结构等。 变量没有明确的类型,变量类型在赋值时动态确定,不用事先定义变量类型。 没有语句、关键词以及运算符。它是函数定位的语言,所有运算都有函数调用完成。,11,Autolisp 有如下优点: (1)Lisp 是所用编程语言中最容易学习和掌握的。,(2)Autolisp提供的大多数函数都是直接针对AutoCAD的操作,可用它编写访问AutoCAD的数据库的操作。,(3)解释执行,立竿见影 可以在AutoCAD的提示符:command:下逐条输入 Autolisp 指令,立即得到结果。,7.1

7、 AutoLisp语言的特性,(4)Autolisp 可在功能强大的开发工具Visual lisp上开发运行,12,7.1 AutoLisp语言的特性,AutoLISP是开发AutoCAD的最主要的工具。 用户可以利用AutoLISP语言实现对AutoCAD当前图形数据库的直接访问和修改,增加AutoCAD新命令和开发参数化绘图程序等。,13,(1) 符号 符号用于存储数据,“符号”与“变量”含义相当,可互相交换使用。 符号: 除了一些特殊字符(如(、)、. 、 、 “、 ;)以外的任何可打印字符; 符号的大小写是等效的。 不允许使用数字作为符号名的第一位。 合法符号:abc、$AD、a3;

8、非法的符号:(a)、3d、a.b、A;等,7.2.1 AutoLISP的数据类型,7.2 AutoLisp语言常用函数,14,7.2.1 AutoLISP的数据类型,(2) 字符串 字符串是由双引号引起来的字符序列组成。 字符串中同一字母的大小写被认为是不同的字符,空格也是一个有意义的字符。 例如: ABC abc abc abc 在字符串中用可以添加控制字符。 例如: r : 表示回车; n :表示换行; : 表示 ; e :表示ESC 键,15,7.2.1 AutoLISP的数据类型,(3) 表 它是指放在一对左、右圆括号中的元素的有序集合。 表中的项称为表的元素。 元素可以是:整型数、实

9、型数、字符串、符号、表、函数名; 例1:(21 30 45 60)为一个表,包含4个元素。 例2:(setq a 63)为一个表,表中包含3个元素。,16,7.2.1 AutoLISP的数据类型,在Auto LISP语言中,用表来表示图形中点的坐标。 例如: (56.4 30.0 8.0)表示三维点的坐标; 第一、二、三个元素分别对应点的X、Y、Z坐标值。 (setq a 63)表中三个元素: setq -为函数名;a -变量;表示:a=63 ( setq b ( + a 108) ) 表示:b = a + 108,17,7.2.1 AutoLISP的数据类型,表有两种基本类型:标准表和引用表

10、; 标准表:表中第一个元素必须是一个合法的已存在的Autolisp函数,AutoCAD将按照此函数的功能完成其操作; 例如: (setq b ( + a 108) ) 引用表: 在表前加一单引号(),表示不对此表作求值处理。 例如:(setq po (100 58 96) 表示:Po=(100 158 96),18,7.2.1 AutoLISP的数据类型,(4) 文件描述符 文件描述符是一个指针,指向用Auto LISP语言的OPEN函数打开了的某个文件。 该指针返回为一个数字标号; 在访问该文件时,根据该文件描述符对指定文件进行操作。,例如:(setq fp (open “myfile.da

11、t” “w”)) (print “1563” fp) 第一句:以写的方式打开数据文件 myfile.dat,并把文件的指针赋予文件描述符 fp ; 第二句:将字符串 “1563”输出到fp指向的数据文件。,19,7.2.1 AutoLISP的数据类型,(5)实体名 实体名是AutoCAD系统在绘图过程中赋予所绘实体的一个数字符号。 利用实体名,AutoLISP函数可以查找到实体的数据库记录,并对实体进行各种处理。 例如:(setq elast (entlast)) 把最后绘制的实体用变量elast表示。,(6) 选择集 选择集是多个实体的集合。 在AutoLISP程序中可以构造一个选择集,并把

12、它赋予一个变量(或符号)供其它函数调用。,20,1AutoLISP语言表达式与高级语言的区别 高级语言采用“中缀表示法”:运算符、赋值符位于中间。 如:表达式 x=(a+b)c x=(a+b)*c AutoLISP语言采用“前缀表示法”:运算符、赋值符位于前面。 如:表达式 x=(a+b)c (setq x ( * ( + a b) c ) 式中: setq =,7.2.2 AutoLISP语言的程序结构,21,7.2.2 AutoLISP语言的程序结构,2AutoLISP语言的程序结构与高级语言的程序结构的区别: 高级语言的程序由一系列的语句组成。 AutoLISP语言的程序由一系列的表组成

13、。 表的格式为: (function1 (function2 (function3 参数1 参数2 ) 表中第一个元素是函数,其余元素是该函数所需要的参数,每个参数又可以是另一个表,即表可以嵌套。 表的运算过程:先内后外,22,7.2.2 AutoLISP语言的程序结构,例如: (defun init_global_date ( ) (setvar cmdecho 0) (setq dssf (getvar osmode) (setvar osmode 0) (setq p1 (/ pi 2) (setq p2 ( * (/ pi 2) 3) (setq p3 (/ pi 4) (setq a

14、0 ( * pi (/ 20.0 180.0 ) ) ) (setq list_n 1) (setq init_point (list 100 100 ) ) ),23,(1)加函数 ( ) 该函数返回 + 相加的和 (2) 减函数 ( ) 该函数返回- 的差。 (3) 乘函数(* ) 该函数返回相乘的积。,7.2.3 AutoLISP的数值计算函数,24,7.2.3 AutoLISP的数值计算函数,(4) 除函数(/ ) 该函数返回的商。 (5)乘方函数(expt ) 该函数返回数为底的次幂的值 (6)平方根函数(sqrt ) 该函数返回数的实型平方根。,25,7.2.3 AutoLISP的

15、数值计算函数,(7)正弦函数(sin ) 该函数返回角度的正弦值,其中的单位为弧度。 (8) 余弦函数(cos ) 该函数返回角度的余弦值,其中的单位为弧度。 (9)求整函数(fix ) 该函数返回小于或等于的最大整数。,26,(1)等于函数(= 原子1 原子2 原子3 ) 原子:数或字符串; 所有原子都相等,函数返回 T,否则返回 NIL; 例如:(if (= x y z) (fx1) (2)不等于函数(/= 原子1 原子2 ) 所有原子都不相等,函数返回T,否则返回NIL; 例如:(if (/= x y z) (fx2 ),7.2.4 逻辑运算函数,27,7.2.4 逻辑运算函数,(3)小

16、于函数 (原子1 原子2 原子3 ) 如果 原子1原子2原子3,函数返回T,否则返回NIL;,28,7.2.4 逻辑运算函数,(5)表达式相等测试函数 (eq 式1 式2)(略) 若表达式1与表达式2完全相同,函数返回T,否则返回NIL; (6)表达式值相等测试函数 (equal 式1 式2)(略) 若表达式1的函数值与表达式2的函数值完全相同,函数返回T,否则返回NIL;,如:a=3 b=6 c=16 ; d=3 e=6 f=16 (setq s1 ( + ( a b c)) (setq s2 ( + (d e f) ( eq s1 s2) (equal s1 s2), 返回NIL, 返回T

17、.,29,7.2.5表处理函数,(1)取表中第一个元素 (car ) 该函数返回中的第一个元素。 (2)取子表(cdr ) 该函数返回中去掉第一个顶层元素后剩下的元素组成的表。 (3)取表中第n个函数(nth ) 该函数返回中第n个元素。 n为元素序号,从0开始计数。 例如:(nth 0 (a b c d e f ) a (nth 3 (a b c d e f ) d,30,7.2.5表处理函数,(4)构建表函数 (list ) 该函数返回所有表达式 的值构成的表。 例如:(setq x 58 y 62) (list x y) (list ( + x 100) (+ y 100) 157),

18、(58 62), (158 162 157),31,7.2.5表处理函数,(5)取表中最后一个元素 (last ) 该函数返回中的最后一个元素。 (6)测表长度函数(length ) 该函数返回的长度,即表中元素的个数。 例:(length (a b c) 3 (length (a (b c) 2,32,执行族输入函数时,计算机将暂停下来,等待接受来自键盘、数字化仪或鼠标器的输入。 (1) 整型数输入函数(GETINT 提示) 执行该函数时,将等待用户输入一个整型数,并返回该整型数。 例如:(setq z ( getint “请输入齿数Z=” )) 屏幕显示:请输入齿数Z= 20,7.2.6

19、GET 族输入函数,33,7.2.6 族输入函数,(2) 实型数输入函数(GETREAL 提示) 执行该函数时,将等待用户输入一个实数,并返回该数对应的实型数。 例如: (setq M (GETREAL “请输入模数M =” )) 屏幕显示:请输入模数M= 2.5,34,7.2.6 族输入函数,(3)点输入函数(GETPOINT 基点提示) 执行该函数时,将等待用户输入一个点。 输入方法:键盘或用光标在屏幕上拾取一点。,1) (GETPOINT 提示) 例如: (setq P1 (GETPOINT “请输入基点坐标P1 =” )) 屏幕显示:请输入基点坐标P1 =100,100 或在屏幕上拾取

20、一点,赋值给P1,35,7.2.6 族输入函数,2) (GETPOINT 基点 提示) 例如:(setq P2 (GETPOINT P1 “请输入第二点坐标P2 =” )) 屏幕显示:请输入第二点坐标P2= 50,50 或在屏幕上拾取一点,赋值给P2; 此时,在屏幕从基点P1点向P2点(或光标处)出现一条可拖动的直线。,36,7.2.6 族输入函数,(5)字符串输入函数 (GETSTRING T 提示) 执行该函数时,将等待用户输入一个字符串,并返回该字符串 1)(GETSTRING T 提示) T表示:输入的字符串中可以有空格,用回车键终止字符串的输入。,2)(GETSTRING 提示) 表

21、示:输入字符串时,用空格键或回车键终止字符串的输入。,37,7.2.6 族输入函数,例如:要求输入参数: “This is a book”,并赋值给变量 S1 。 (setq s1(GETSTRING T “请输入参数:”) 屏幕显示:请输入参数:This is a book S1=“This is a book” (setq s1 (GETSTRING “请输入参数:”) 屏幕显示:请输入参数:This S1=“This”,38,7.2.6 族输入函数,(6)距离输入函数 (GETDIST 基点 提示) 执行该函数时,将等待用户输入一个距离值。 输入方法有两种:, 等待用户输入一个距离值 例

22、:(setq L1 (GETDIST “请输入L1的长度 =” )) 屏幕显示:请输入L1的长度 =153,1) (GETDIST 提示),39,7.2.6 族输入函数, 等待用户在屏幕上指定两点的方式输入一个距离值 例如: (setq L1 (GETDIST “请输入L1的长度 =” )) 屏幕显示:请输入L1的长度 = 用户在屏幕上用光指定两点 P1,P2,返回两点间的距离,40,7.2.6 族输入函数,2)(GETDIST 基点 提示) 已知第一点坐标,输入第二点坐标,求两点间的距离 例如:(setq L1 (GETDIST P1 “请输入第二点坐标P2 =” )) 屏幕显示:请输入第二

23、点坐标P2 = 83,92 计算机将返回P1,P2 两点间的距离,并赋值给L1,41,7.2.6 族输入函数,位值的作用:控制允许输入的方式,取值范围1127;,(7)输入控制函数 (INITGET 位值关键字列表),表中的位值可以组合相加得到一个值,该值可同时起几种控制作用。,该函数为其后使用的GET族函数建立各种控制选项。,42,7.2.6 族输入函数,关键字列表的作用: 定义一个关键字表,用于对其后GET族函数的输入值进行检查,判断用户的输入是否与表中规定的输入类型相符。若不相符,AUTOCAD将要求用户重新输入,关键字列表的两种形式: 1) “关键字1 关键字2 关键字3 ,大写的缩写

24、字母1 大写的缩写字母2 大写的缩写字母3 ” 输入时只输入相应得大写的缩写字母。,43,7.2.6 族输入函数,例如: (initget 7 “Radius Diameter ,R D” ) (setq W (GETSTRING “n请选择:直径(D)/半径(R)) (If (= W “Diameter” )(SETQ D (GETREAL “请输入直径” )(SETQ R (GETREAL “请输入半径” ) ),44,7.2.6 族输入函数,2)列表:“关键字1 关键字2 ” 关键字中保留的字母用大写,其余的用小写。,例1:(initget 7 “Ltype Color” ) (setq

25、 W (GETSTRING “n请输入:线形(L)/颜色(C)),45,(defun gety( ) (initget 1 “Pi Two-pi,P T”) (setq x (getreal “Pi /Two-pi/:”)) (cond (eq x “Pi”) (setq y pi) (eq x “Two-pi”) (setq y ( * pi 2) (setq y x) ) (print y) ),例2: 若x=“Pi”, 则 y=3.14159 若x=“Two-pi”, 则 y=6.28318 其余 y=x,46,7.2.6 族输入函数,(8)关键字输入函数 ( getkword 提示)

26、该函数要求用户输入一个关键字。 在调用本函数之前需先用INITGET函数设置一个关键字表。,例1: (initget 1 “Yes No”) (setq W (getkword “Are you sure ?(Yes/ No)”) 输入Y 或N,47,7.2.6 族输入函数,例2: (initget 7 6 8 10 12 15 16 18 20 ) (setq M (getkword “n请选择螺栓直径 M”) ),48,7.2.7 计算函数,1 求方位角函数 (angle 点1 点2) 该函数返回两点连线的方位角。 从当前作图平面的X轴正向开始,按逆时针方向计算该角度。,例如: (angl

27、e (1.0 1.0) (1.0 8.0)),1.5707,3.141593,(angle (5.0 1.33) (2.4 1.33)),49,7.2.7 计算函数,2 求两点间距离函数 (distance 点1 点2) 该函数返回两个三维点之间的距离 (distance (1.0 2.5 3.0) (7.0 2.5 3.0) 6.000000,50,7.2.7 计算函数,3 已知一点求另一点坐标的函数 (polar 已知点 方位角度 距离 ) 该函数可以根据一个已知点求出另一个点。 角度是另一点所在方位角;,例如: 若P1=(26 150 562),求距 P1 点L,方位角30的点坐标;,(

28、SETQ P2(polar P1 30 L )),51,7.2.7 计算函数,求交点函数 (inters 点1 点2 点3 点4 方式) 该函数返回两条线的交点。 点1 与 点2 :为第一条线的两个端点; 点3 与 点4: 为第二条线的两个端点;相交方式: 若方式为 “NIL”,则交点可以在两条线段的延长线上; 若无方式,则交点只在两条线段内;,52,7.2.8 字符串处理函数,字符串长度函数 (strlen 字符串1 字符串2 ) 该函数返回字符串的长度,即字符串中所含字符的个数。,例如: (strlen “about”) 5; (strlen “a” “b” “ t”) 3,53,7.2.

29、8 字符串处理函数,(2) 字符串连接函数 (strcat 字符串1 字符串2 ) 该函数返回由字符串 构成的长字符串。,例如: ( strcat “M” “50 ”),( strcat “%C” “50” ), “M50”,( strcat “R” “50”), “R50”, “50”,54,7.2.8 字符串处理函数,(3) 整型数转换为数字型字符串函数 (itoa 整型数) 该函数将整型数转换为一个 例如:(itoa 65) “65”,R65,( strcat “R” (itoa 65) ),55,7.2.8 字符串处理函数,(4) 数字型字符串转换为整型数函数 (atoi ) 该函数将

30、转换为一个整型数。 例如: (atoi “5785”) 5785 (atoi “5785.863”) 5785,56,7.2.8 字符串处理函数,(5) 数字型字符串转换为实型数 (atof ) 该函数将转换为一个实型数。,例如: (atof “5785.863”) 5785.863 (atof “5785”) 5785.0,57,7.2.8 字符串处理函数,(6) 整型变实型函数 (float整型数) 该函数将“整型数”转换为一个实型数。 例如:(float 6) 6.0,(7) 实型变整型函数 (fix 实型数) 该函数将“实型数”转换为一个整型数。 例如: (fix 5.6) 5,58,

31、7.2.8 字符串处理函数,(8)角度单位制转换函数 (angtos 角 方式 精度) 该函数将“角”(单位为弧度)转换为其他单位制,并以字符串的方式返回角度。,方式:0 转换为度; 1 转换为度/分/秒 2 转换为梯度;3 转换为弧度;,精度:小数的位数;,例如:(angtos 0.3928 0 2) (angtos 0.3928 1 1), 22.50,22300,59,7.2.8 字符串处理函数,(9)实型数计数制转换函数 (rtos 实数 方式 精度) 该函数对“实数”按要求的“方式”和给定的“精度”进行计数制的转换,并以字符串的方式返回。,方式: 1 科学计数法; 2 十进制; 3

32、工程制(英寸与小数英寸); 4 建筑制(英寸与分数英寸);,60,4.3.8 字符串处理函数,例如:(rtos 18.50 1 3) (rtos 18.5000000 2 2),( strcat “%C” (rtos 18.5000000 2 2) ),“18.50”, “1.850E+01”, “18.50”,61,7.2.9 条件分支函数,(1)条件函数 (if 表达式2) 该函数根据“条件”的真或假来执行后面的表达式。 若测试条件为真(T),则执行“表达式1”, 否则,就执行“表达式2”。,(setq x (getreal “请输入 x=”)) (if ( = x 0) (setq fx

33、 ( x 5) (setq fx ( x 6) ) (print fx),例如:,62,7.2.9 条件分支函数,(2) 分支函数 (cond ( ) ( ) ( ) ) 该函数将依次检查每一个的值,若查到某个的值为真(T),则执行与该相关的那些表达式。此时函数不再对剩余的其它分支进行测试。,7.2.9 条件分支函数,例如:,(setq x (getreal “请输入 x=”)) (cond ( x 0) (setq fx (+ x 2 ) ( x 0) (setq fx (+ (expt x 2) (* x 3) 5) ( =x 0) (setq fx 9) ) (prompt “f(x)

34、=”) (print fx) prompt函数用于在屏幕的命令提示区内显示消息,该消息的内容必须置于双引号中,64,7.2.10 循环函数,(1) 重复函数 (repeat ) 该函数按照给定的“次数”,重复执行后面的所有表达式,并返回最后一次循环的最后一个表达式的值。,例如:求,(defun sum ( / n s) (setq n 1 s 0) (repeat 100 (setq s (+ s n) (setq n ( 1 + n) ) ),65,7.2.10 循环函数,(2)循环函数 (while ) 该函数先对测试求值,若为真(T),则执行后面所有的表达式,然后再次对测试求值。重复上述

35、过程,一直循环到测试的值为nil为止。 While返回最后一次循环时的最后一个表达式的值。,66,7.2.10 循环函数,例如:求,(defun sum (/ n s) (setq n 1 s 0) (WHILE (= N 100) (setq s (+ s n) (setq n ( 1 + n) ) (PRINT S) ),67,(3) 求多个表达式值的函数 (prong ) 该函数是用于只能有一个表达式的地方。,如:(if 表达式2) 其中,式1和式2 只能有一个表达式。,68,7.2.10 循环函数,(If ( D 50) (PRONG (SETQ A 20 ) (SETQ B 30)

36、(SETQ C (+ A B) (PRINT C) ) (PRONG (SETQ A 35 ) (SETQ B 42) (SETQ C (+ (*A 2) B) (PRINT C) ) ),例如: 若 D50: A=20,B=30,C=A+B; 若 D50 : A=35,B=42,C=2A+B;,69,AutoLISP提供的特殊函数Defun 用来定义用户函数,它的调用格式为:,7.3.1 自定义函数,7.3 AUTOCAD命令的定义与调用方法,(defun 函数名 变量表 表达式1 表达式2 . ),70,7.3.1 自定义函数,(3) 表达式部分:是用户所定义的函数的内容,用于完成所需的功

37、能。,(1)函数名:用户自定义的函数名,可被其它程序或函数调用。,(2) 变量表:是函数的参数表,一般格式为: ( ./ .) 形参:在函数调用时必须用实参代替; 局部变量:仅用于函数内部,不参与函数传递。,71,7.3.1 自定义函数,(defun sum (n /s) (setq i 1 s 0) (WHILE (= i n) (setq s (+ s i) (setq i ( 1 + i) ) ) 调用格式:(sum 90),例如: 求,72,AutoLISP提供了一个在AutoLISP程序中调用AutoCAD标准命令的Command函数。 该函数的调用格式为: (Command ),7

38、.3.2 调用AutoCAD标准命令的函数,73,7.3.2 调用AutoCAD标准命令的函数,(command “circle” (20 16) 5 ),例1: 从点(5,4) 到点(20,15)画一条直线。,(command “line” “5,4” “20,15” “”) 或 (command “line” (5 4) (20 15) “”),例2:过中心(20, 16)画半径为5的圆。,74,首要应掌握的简单基本函数,(+ ) (- ) (* ) (/ ) (1+ ) (1- ) (abs ) (sin ) (cos ),(= ) (/= ) () ( ),(and) (or) (no

39、t),(itoa ) (atoi ) (atof ) (fix ) (float),(itoa ) (atoi ) (atof ) (fix ) (float),75,(strcat ) (substr ) (strcase ) (strlen ),(polar) (angle) (osnap ,(car) (cdr) (last) (nth) (list),(while ) (repeat),(open) (close),(getint) (getreal) (getstring) (getpoint) (getcorner) (getangle),(if) (cond() (),76,格式

40、: (defun C:命令名( / ) 表达式 ) 用该方法定义的命令,在AutoCAD环境下可以利用Load 命令被加载到内存中,可以像AutoCAD的命令一样使用。 调用格式: 命令名,7.3.3 定义AutoCAD命令的函数,例如:已知一点坐标与边长。定义画一个正方形的命令。,(defun C:square ( / pt1 pt2 pt3 pt4),(setq pt1 (getpoit “输入左下角坐标:” ),(setq len (getdist “输入边长:” ),(setq pt2 (polar pt1 0.0 len ),(setq pt3 (polar pt2 ( / pi 2

41、) len ),(setq pt4 (polar pt3 pi len ),(initget 1),(Initget 7),(command “PLINE” pt1 pt2 pt3 pt4 “c”) ),调用格式: command: square,78,绘制下图的长方形和圆。已知长方形的长和宽,圆的半径。要求圆在长方形内。,应用举例-1,79,分析:绘制该图首先应有一个绘图基点pt_base。长方形的绘制可用line、pline和rectang命令绘制。绘制该图时用到的点位图及相关参数如右图所示。,80,程序设计小技巧: 将问题分散解决,逐步完善程序的功能。 本例中先编制绘制长方形和圆,将“要

42、求圆在长方形内”条件及中心线绘制一个一个地解决,将问题分散解决。,81,第一步:实现长方形及圆的绘制,要求要求圆在长方形内,但不判断圆是否超出长方形。 利用GET族输入函数输入已知参数: 绘图基点,长方形的长和宽,圆的半径,82,利用已知一点求另一点坐标的函数(POLAR) (polar 已知点 方位角度 距离 ) 计算出: 长方形其他顶点坐标和圆心坐标,83,文件名:lt1.lsp,84,第二步:增加判断圆是否超出长方形的功能,利用字符串处理函数RTOS将长方形宽度转化成数字型字符 利用字符串处理函数STRCAT构造错误提示字符串,85,86,程序设计的核心是算法设计; 算法的特性之一是:健

43、壮性,即程序的容错处理技术。 运行出错时显示如下:,问题1:可否将while改为if?,问题2:圆与长方形内切,程序怎么改?,87,第二步:增加中心线绘制功能 (setq p10 (polar pt_cen pi (+ (/ len 2) 3.0) ;水平中心线起点 (setq p20 (polar pt_cen 0 (+ (/ len 2) 3.0) ;水平中心线终点 (setq p30 (polar pt_cen ( / pi 2) (+ (/ width 2) 3.0) ;垂直中心线 起点 (setq p40 (polar pt_cen ( /( * 3 pi ) 2) (+ (/ wi

44、dth 2) 3.0) ;垂直中 (command 心线终 点 layer m 1 lt center 1 c 3 1 line p10 p20 line p30 p40 ) ),88,趣味程序 绘制下图所示的趣味图形,以指定点为起点,绘指定长度的任意多条直线,每绘一条直线就自动变化一种颜色,且在360内画完所有直线。,应用举例-2,89,90,91,92,该程序还存在不足,当输入直线条数255时则出错。运行时输入500,出错内容如下: 命令: color 输入默认对象颜色 真彩色(T)/配色系统(CO) : 256 颜色编号无效。 ; 错误: 函数被取消 输入默认对象颜色 真彩色(T)/配色

45、系统(CO) :,93,94,绘制花形图案:已知参数为中心点cen1、半径rr和花瓣数nn,圆弧圆心角180。,本图案的绘制,先绘制下图所示的图形,通过阵列复制来完成。下图为点位图。在参数绘图中,点位图是十分重要的内容。,应用举例-3,95,96,在机械制图中,由于很多零、部件的形状是相似的,因此它们的二维视图也是相似的。例如键、销、螺钉、螺母、滚动轴承、齿轮等。,7.6 利用AUTOLISP开发应用程序,绘制这类零件的视图都可以采用参数化编程方式,即编写AutoLISP绘图程序,用户在调用程序时,只需向程序提供所要求的参数,程序就能自动绘出相应的零件图。,97,定义一个绘制带键槽的轴剖面图的

46、命令。,流程图,1) 打开数据文件 “key00.txt” ; 2) 读取轴径d及键槽尺寸(b, h, t) ,并计算ds; 3) 绘制轴剖面图形,并标注 尺寸:d、ds和b。,98,99,100,(defun C:axise() (initget 7 1 2) (keydata1) (setq p0(getpoint n请输圆心:) (print p0) (print d) (print b) (print ds) (print t0) (setq p1 (polar p0 pi (+ (/ d 2) 3.0) (print p1) (setq p2 (polar p1 0 (+ d 6.0

47、)(print p2) (setq p3 (polar p0 (/ pi 2)(+ (/ d 2) 3.0) (setq p4 (polar p3 (/ (* pi 3) 2) (+ d 6.0),轴图,101,(print p1) (print p2) (print p3) (print p4) (setq x5 (- (car p0) (/ b 2) (setq sina (/ b d) (setq cosa (sqrt (- 1 (expt sina 2) (setq y5 (+ (cadr p0) (*(/ d 2) cosa) (setq p5 (list x5 y5) (print

48、 p5) (setq x6 x5) (setq y6 (+ (cadr p0) (- ds (/ d 2) (setq p6 (list x6 y6) (print p6) (setq p7 (polar p6 0 b) (print p7) (setq p8 (polar p5 0 b) (print p8),轴图,102,(command limits (list(- (car p0) d) (- (cadr p0) (* d 1.1) (list(+ (car p0) (* d 1.1) (+ (cadr p0) (* d 1.1) zoom a layer s 0 arc p5 c p

49、0 p8 layer n 1 line p5 p6 p7 p8 dim hor (polar p0 pi (/ d 2) ) (polar p0 0 (/ d 2) (polar p3 (/ (* pi 3) 2) (+ d 9.0) (strcat %c (rtos d 2 2),轴图,103,hor p5 p7 p3 (rtos b 2 2) exit hatch ansi31,n 1 0 w (list (car p1) (cadr p4) (list (car p2) (cadr p3) layer m 1 lt center 1 c 3 1 line p1 p2 line p3 p4

50、 ) ),轴图,104,(defun keydata (/ lm lm1 tt f) (setq f (open D:lispgearkey00.txt r) (setq lm (read-line f) (print lm) (read lm) (print lm ) (setq lm1 (strcat ( lm ) (setq lm1 (read lm1) (close f) (print lm) (setq tt (listp lm1) (print tt),105,(if (= tt T) (progn (setq d (nth 0 lm1) (setq ds (nth 1 lm1)

51、(setq b (nth 3 lm1) (setq t0 (nth 4 lm1) (print lm1) (print d) (print b) (print ds) (print t0) ) (progn (print 数据文件出错!) (exit ) ) ) ),106,Visual Lisp 的使用,启动Visual Lisp Visual Lisp必须在AUTOCAD环境下运行。,方法2: 在AUTOCAD的命令行(COMMAND:) 输入命令:VLIDE,方法1: 从AUTOCAD主菜单Tools AutoLisp Visual Lisp Editor.,107,使用Visual L

52、isp文本编辑器录入程序,在Visual Lisp文本编辑器窗口中键入程序。 注意: Visual Lisp文本编辑器可根据字符串的属性自动的设定颜色。,单击Visual Lisp文本编辑器窗口的任意地方激活文本编辑器,从Visual Lisp的File菜单中选择New File选项弹出Visual Lisp文本编辑器窗口。,步骤:,108,存盘:SAVE 或SAVE AS,109,程序的加载与运行 1)程序的加载 在Visual Lisp文本编辑窗口,从Tools菜单中选择Load Text in Editor(加载编辑器中的文本)选项。,2)程序的运行 将窗口切换为AUTOCAD环境 自定

53、义函数的运行:在命令行输入自定义函数名 格式: (keydata) 命令的运行:在命令行输入命令名。 格式: axise,110,7.7 SCR文件的图形数据交换,SCR文件也就是命令组文件法 这种方法就是把一系列人机交互操作的命令、选择项和数据,集中编写成一个扩展名为SCR的文件,然后在AutoCAD环境下,以批处理的方式逐条进行,并生成相应的图形。 在SCR文件中,命令、选择项和数据的排列顺序和人机交互作业方式下,用Command:命令输入状态时完全一致。在文件中,用空格表示回车(return),用逗号作为坐标x,y,z值间的分隔符。,111,生成SCR文件的方法有两种: 利用各种文本编辑

54、软件来生成SCR文件。 因为SCR文件是ASCII码的文本文件,因此就可用PE、TC编辑器、记事本等编辑软件来直接编辑形成SCR文件。 利用高级语言编写绘图程序,运行程序后自动生成SCR文件。这种方法由于可实现设计和绘图成为一体,因此使用比上一种方法广泛。,112,例2:使用C语言建立SCR文件。 #include #include /*函数声明*/ FILE *fp; char fname12; /*建立一个scr文件*/ void begin() printf(enter scr file name:); scanf(%s,fname); strcat(fname,.scr); fp=fo

55、pen(fname,w); ,113,/*设置绘图界限子程序*/ void limits(float x1,float y1,float x2,float y2) fprintf(fp,limits %f,%f %f,%fn,x1,y1,x2,y2); ,114,/*显示整个绘图范围*/ void zoomall() fprintf(fp,zoom an); ,115,/*两点之间画直线的模块*/ void line(float xs,float ys,float xe,float ye) fprintf(fp,line %f,%f %f,%f n,xs,ys,xe,ye); ,116,/*用

56、圆心半径画圆的程序模块*/ void circle(float xc,float yc,float r) fprintf(fp,circle %f,%f %fn,xc,yc,r); ,117,/*三点画圆弧的模块*/ void arc(float ax1,float ay1,float ax2,float ay2,float ax3,float ay3) fprintf(fp,arc %f,%f %f,%f %f,%fn,ax1,ay1,ax2,ay2,ax3,ay3); ,118,/*关闭scr文件*/ void end() fclose(fp); ,119,/*主函数*/ void mai

57、n() float x1=0,y1=0,x2=200.0,y2=200.0,r1=3.0,r2=2.0,h=4.0; float x0=6.0,y0=6.0; float xc,yc,r,ax1,ay1,ax2,ay2,ax3,ay3; float xs,ys,xe,ye; xc=x0; yc=y0; r=r2; begin(); circle(xc,yc,r); ax1=x0+r1; ay1=y0; ax2=x0; ay2=y0+r1; ax3=x0-r1; ay3=y0;,120,arc(ax1,ay1,ax2,ay2,ax3,ay3); xs=x0-r1; ys=y0; xe=xs; y

58、e=y0-h; line(xs,ys,xe,ye); ys=ye; xe=x0+r1; line(xs,ys,xe,ye); xs=xe; ye=y0; line(xs,ys,xe,ye); end(); ,121,SCR 文件执行方式 Command: SCRIPT SCRIPT FILE NAME: (输入命令组文件名) 采用SCR文件形式编写绘图程序 优点:直观,便于修改检查; 缺点:由于是逐行执行,逐行显示,因而绘图速度较慢。,122,7.8 DXF文件的图形数据交换,AutoCAD是以绘图为主的交互式绘图软件包,它主要是以图形处理为主,科学计算能力有限。 AutoCAD 优点:绘图能力强。缺点:计算能力弱。 高级语言 优点:计算能力强。缺点:绘图能力弱。 在工程计算中工程技术人员往往是使用C语言等来进行计算。,123,DXF文件的图形数据交换,在AUTOCAD中,图形数据都采用压缩的数据格式来存储,因此,普通人员用高级语言编写的程序难于直接从中取得有关的图形数据。

温馨提示

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

评论

0/150

提交评论