AutoLISP在机械设计中的应用

2014-10-22 11:03王淑芳石平琳
电脑知识与技术 2014年27期
关键词:机械制图

王淑芳 石平琳

摘要:AutoCAD是美国Autodesk公司开发的专门用于计算机设计绘图工作的软件,而AutoLISP 是内含于AutoCAD软件内、强化AutoCAD的最好、最直接的程序语言。该文介绍AutoLISP的一些基本语法、函数及作者在使用中编写的AutoLISP 程序。

关键词:AutoCAD;Auto LSP;机械制图

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2014)27-6539-03

Abstract: AutoCAD is the development of America Autodesk company specialize in computer design drawing software, and AutoLISP is embedded in AutoCAD software, strengthen AutoCAD the best, the most direct programming language. This paper introduces the AutoLISP some of the basic grammar, function and writers in the use of the AutoLISP program.

Key words: AutoCAD; Auto LSP; mechanical drawing

1 概述

AutoCAD是一套向量式计算机辅助制图软件,可广泛地应用于机械、化工、电机、电器、土木、结构、建筑、水电、消防、室内设计、地理信息、地图、考古及服装设计等各行业中工作图绘制。而各行业都各有其特有的制图方法及所需的绘图功能,如果将这些功能都放进来,AutoCAD势必会变得庞大而笨拙。因此AutoCAD提供了程序应用界面,以为平台,让用户或软件开发商利用AutoLISP、Visual LISP、VBA、VB、Object ARX(C++)等计算机语言发展特殊的应用程序,同时兼顾软件的执行速度与用户的工作效率。而由于AutoLISP内含于AutoCAD,且简单易学、准确无误等优点,深受工程技术人员的青睐。

AutoLISP程序语言的特点是:语法简单、功能函数强大、对编写环境不挑剔,直译式程序、“即写即测、即测即用”。除一般性的功能函数外,还拥有大量控制AutoCAD的特殊函数;可直接调用执行所有AutoCAD的命令,并可运用所有的AutoCAD系统变量。

2 AutoLISP的基本语法结构

1. 以括号组成表达式,左、右括号一定要成双成对且对称。

2. 表达式格式:(函数名 运算符 运算符 运算符 …)

或(函数(式) 自变量 自变量 自变量 …)

或(函数(式) 元素 元素 元素 …)

1) 操作函数:包括功能函数(如+、max、setq、min等)和自定义函数(由设计者自行定义的新函数或子程序)

2) 运算符:又称自变量或元素,包括整数、实数、字符串、列表、对象名称代码、文件代码、选择集代码。

3. 表达式中的运算符可以是另一个表达式或子程序。

4. 多重的括号表达式运算的先后顺序是“由内而外,由左而右”。

5. 以文件格式存在的AutoLISP程序,其扩展名必须是“.LSP”.

6. 对于编写的环境,最佳选择是AutoCAD内的Visual LISP编辑器。

7. 使用defun功能函数定义新的命令或新的功能函数。

8. 新定义的功能函数名称,若为“C:函数名”,则此函数可以作为AutoCAD的新命令,加载此LISP程序后,可在AutoCAD界面命令行直接输入新定义的命苦。

9. 加载AutoLISP程序的做法:命令行直接输入(load “LISP主程序名”)。

10. AutoLISP程序中,分号后的内容均为批注,程序不予处理,适时地增加批注,将使程序更具可读性、学习性及完整性。

11. AutoLISP最常用的变量类型是整数、实数、字符串、点列表四种,变量的类型依据给定值二而自动定义,变量会一直保存该值,直到被重新设定或绘图退出而自动消失。

12. 以setq功能函数设定变量值,语句结构为:(setq 变量名称 设定值)。如(setq a 100),即为变量a值设定为整数100。

13. 想在AutoCAD的环境中查看某一变量的值,可在命令行输入“!变量名”。

14.在使用(defun C:函数名(自变量/更改变量) …)的程序中,变量若在“/”右边变量内,则称为局部变量,否则为全局变量(注:在AutoLISP中,未赋予值得变量,其返回值皆为nil)。

3 AutoLISP功能函数

1. 数学运算功能函数:共21个,用于数值之间的数学运算。

2. 检验和逻辑运算功能函数:共11个,用于数值或表达式之间的判断和逻辑运算。

3. 转换运算功能函数:共9个,用于字符串、数值、整数、实数之间的转换。

4. 列表功能函数:共16个,用于形成一个列表或从列表中选取某个所需的数值。

5. 字符串、字符、文件处理功能函数:共14个,可对字符串、字符、文件进行处理,如改变字符串中字母大小写、提取所需的字符、计算字符串长度等。

6. 等待输入功能函数:共10个,请求从键盘或用鼠标输入一个数值,可以是点、距离、字符串、整数、实数、关键词等。

7. 几何运算功能函数:共6个,可计算出两点间的角度值和距离、两条直线的交点、字符串两个对角点的坐标值等。

8. 压对象除了功能函数:共11个,可删除或取消删除对象、取出对象名称的信息列表、创建新的对象列表、选取一个对象等。

9. 选择集、符号表处理功能函数:共9个,可将对象添加至选择集或创建一个新的选择集、将对象从选择集中移出、计算选择集的对象个数、查看符号表、搜索符号等。

10. AutoCAD相关查询、控制功能函数:共7个,可调用AutoCAD命令、查找文件名的路径及文件名、获得环境变量和系统变量的设置值、设定系统变量等。

11. 判断式、循环相关功能函数:共5个,可根据检验比较式结果判断需执行的表达式、可重复执行N次表达式、可进行多条件式的if整合功能等。

12. 函数处理、定义、追踪与错误处理功能函数:共12个,可列出程序错误时的警示信息、自定义函数或子程序、对函数设置追踪标记和辅助检错等。

13.显示、打印控制功能函数:共16个,对绘图界面进行切换和清理、将表达式打印于命令区、重画整张图等。

14. 符号、元素、表达式处理功能函数:共12个,可判断元素是否列表、判断元素是否被赋值、响应表达式是否有值存在等。

另外,还有AutoLISP加载与释放函数、内存空间管理函数、DCL对话框相关函数等,便于AutoLISP程序的编写和操作使用。

4 AutoLISP语句的写法

括号在AutoLISP程序内是很重要的符号,所有的函数语句都必须用括号括住。括号使得AutoLISP的语句产生嵌套功能,内层函数的运算结果可直接当做外层函数的操作数继续运算。如果程序中的左右括号不对称,则程序不是在加载时发生错误,便是在执行时死锁或产生错误结果。范例如下:

1. 计算式32+15-18*2可以表示成(32+15-(18*2) ,它的AutoLISP语句可写成:

(- (+ 32 15) (* 18 2)),也可以写成(+ 32 (- 15 (* 18 2))。

2. 假如程序中要赋值变量x=y+z2/5,它的AutoLISP语句可写成:

(setq x (+ y (/ (* z z) 5.0)))。

3. 在绘图界面等待输入一个点或一个数值,它的AutoLISP语句可写成:

(setq mycen (getpoint “\nCenter point:”)) ;要求输入圆心

(setq myrad (getdist mycen “\nRadius:”)) ;要求输入圆的半径

当计算式有优先级时,最后运算的运算符要先写出;括号与括号以及括号与运算符或操作数之间,可以不用空格;除法运算中,如果所有的操作数都为整数,将得到整数结果,若要得到实数结果,必须确认至少有一个操作数是实数类型。

5 AutoLISP程序范例

范例1. 用AutoLISP程序绘制图框(程序名为plate.lsp)

在绘制一个零件的工程图时,需要先绘制图框。一般在绘制工程图时,先绘制一个标准图框,将工程图按比例缩小绘制,再按原尺寸标注,在此我们可以先在“标注样式”对话框中设置绘图比例(使用全局比例),再加载plate.lsp程序,执行plate命令时,程序会自动取得设置的比例值,将图框放大(大于1) 或缩小(小于1) 绘制,你只需按实际尺寸绘制工程图,并按测量尺寸标注即可。

(defun c:plate(/ tl tb dd dd1 pqq) ;定义绘制图框的命令plate

(setvar "cmdecho" 0) ;设置系统变量cmdecho为0

(setvar "osmode" 0) ;设置系统变量osmode为0

(setq tl 0 tb 0)

(setq tl (getreal "\n输入图幅长度:")) ;绘图界面中键盘输入

(setq tb (getraal "\n输入图幅宽度:")) ;绘图界面中键盘输入

(setq blyz (getvar "dimscale")) ;取得设置的比例值

(setvar "ltscale" (* blyz 15.))

(setq tls (* tl blyz) tbs (* tb blyz)) ;将图框放大或缩小

(command "limits" '(0 0) (list tls tbs))

(commad "layer" "s" "line" "") ;设置绘制图框的图层

(command "pline" '(0 0) (list tls 0) (list tls tbs) (list 0 tbs) "c")

(if (and (> tb 297) (> tl 420)) (setq dd 10. dd1 22.) (setq dd 5. dd1 17.))

(setq dds (* dd blyz) dd1s (* dd1 blyz))

(command "layer" "s" "0" "")

(command "pline" (list (* 25 blyz) dds) (list (- tls dds) dds) (LIST (- TLs dds) (- TBs dds)) (list (* 25 blyz) (- tbs dds)) "c")

(command "pline" (list (* 25 blyz) (- tbs dd1s)) (list (* 85 blyz) (- tbs dd1s)) (list (* 85 blyz) (- tbs dds)) "")

(setq pqq (list (- (car (getvar "limmax")) dds) dds))

(command "insert" "d:/bzj/btl" pqq blyz "" "")

(command "insert" "d:/bzj/dttz" (list 0 dds) blyz "" "")

(command "limits" (list (* 25 blyz) dds)(list (- tls dds) (- tbs dds)))

(command "zoom" "e")

(setvar "osmode" 183); )设置捕捉

范例2:绘制剖视符号(程序名为psfh.lsp)

需绘制剖面视图时,需在主要视图上绘制剖视图符号,如果一个一个去画,再添加剖视符号,会花费不少时间,使用此程序,只添加几个点和剖视符号即可。

(defun dtr(a / a) (* a (/ pi 180)) ) ;将角度值单位转换弧度的子程序

(defun jt(fp ep) ;定义绘制箭头的子程序

(setq ang (angle fp ep))

(setq jtp1 (polar fp (+ ang (dtr 9.46)) (* 2.5345 blyz)))

(setq jtp2 (polar fp (- ang (dtr 9.46)) (* 2.5345 blyz)))

(command "solid" fp jtp1 jtp2 jtp2 "") )

(defun c:psfh() ;定义绘制剖视符号的命令psfh

(setq blyz (getvar "dimscale"))

(initget 1) ;设定下次getpoint函数为有限输入

(setq pp1 (getpoint "\n输入剖视符号的起点:"))

(initget 1)

(setq pp11 (getpoint pp1 "\n输入剖视起点方向点:"))

(initget 1)

(setq pp2 (getpoint pp1 "\n输入剖视符号的下一个点:"))

(setvar "osmode" 0)

(command "layer" "s" "DIM" "")

(command "line" pp1 (polar pp1 (angle pp1 pp11) (* 7 blyz)) "")

(jt (polar pp1 (angle pp1 pp11) (* 7 blyz)) pp1) ;绘制箭头

(command "layer" "s" "part" "")

(command "line" pp1 (polar pp1 (angle pp1 pp2) (* 5 blyz)) "")

(setq pp3 (getpoint pp2 "\n输入剖视符号的下一个点:"))

(while pp3 ;循环输入剖视符号点,结束时直接回车

(command "line" (polar pp2 (angle pp2 pp1) (* 5 blyz)) pp2 (polar pp2 (angle pp2 pp3) (* 5 blyz)) "")

(setq pp1 pp2)

(setq pp2 pp3)

(setq pp3 (getpoint pp2 "\n输入剖视符号的下一个点:")))

(initget 1)

(setq pp33 (getpoint pp2 "\n输入剖视终点方向点:"))

(command "line" (polar pp2 (angle pp2 pp1) (* 5 blyz)) pp2 "")

(command "layer" "s" "dim" "")

(command "line" pp2 (polar pp2 (angle pp2 pp33) (* 7 blyz)) "")

(jt (polar pp2 (angle pp2 pp33) (* 7 blyz)) pp2)

(initget 7)

(setq txt (getstring "\n输入剖视符号标注字母:"))

(setvar "orthomode" 0)

(initget 7)

(setq pst (getpoint "\n输入剖视符号标注位置:"))

(command "layer" "s" "text" "")

(while pst ;循环标注剖视符号字母

(command "text" "m" pst (* 4 blyz) "0" txt)

(setq pst (getpoint "\n输入剖视符号标注位置:")))

(command "layer" "s" "dim" "")

(setvar "osmode" 183))

作者在AutoCAD使用中还标注了其他制图(绘制异型孔、螺纹孔等)和标注(形位公差、尺寸公差、焊接符号、填写明细表等)的程序,还编制绘制轴承、螺栓、螺母、垫圈等标准件的程序,缩短了技术人员的设计时间,提高了项目研发速度,得到技术人员的青睐,现已在我公司得到广泛使用。

参考文献:

[1] 蓝屹生.AutoLISP学习导引[M].中国铁道出版社出版,2010.

[2] 史宇宏,张传记.AutoCAD 2011从入门到精通[M].北京希望电子出版社,2011.

猜你喜欢
机械制图
CAD三维转二维在《机械制图》教学中的应用
基于Visual LISP的机械制图自动组卷
论3D打印技术在《机械制图》课堂教学中的应用
UG软件在机械制图相贯线教学中的应用
基于工程师启蒙教育的机械制图课改的几点思考
多媒体在《机械制图》课中的应用