第2讲 利用AutoLisp语言绘图
- 格式:pdf
- 大小:209.01 KB
- 文档页数:3
第2讲利⽤AutoLisp语⾔绘图第2讲利⽤AutoLisp语⾔绘图在AuotCAD绘制简单图形时,有三种主要⽅式:(1)图标菜单(2)下拉式菜单(3)命令⾏。
事实上还有另外⼀种绘图⽅式,即通过lisp语⾔实现绘制图形。
利⽤Lisp语⾔绘图的最⼤优点是可以实现批处理,降低劳动强度。
⼩知识:Lisp语⾔最⼤优势是和AutoCAD绘图结合的很好,这也是该语⾔⾄今仍未被淘汰的最主要原因。
1、简单的绘图语句⼏乎AuotCAD中所有的绘图及环境设置命令都可以通过程序调⽤!,利⽤Lisp语⾔编写绘图命令的窍门是⾸先在命令⾏下把绘图命令和对应的参数记住,然后⽤Lisp语⾔的格式书写出即可。
1.1 绘制直线(command "line" "0,0" "1,1" "")1.2 绘制圆(command "circle" "0,0" 5)1.3 绘制正多边形(command "polygon" 5 "0,0" "i" 5)(command "polygon" "5" "0,0" "i" "5")都正确1.4 新建图层(command "la yer" "m" "道路" "c" 2 "" "")请同学⾃⼰编写⾼度为2,起点位置在“0,0”,⽂字内容是“理⼯⼤”的程序2、⽤多条绘图语句表⽰复杂图形正常情况下图形都⽐较复杂,需要⽤多条语句编写,例如测绘中的下⽔井、路灯等符号。
例1、下⽔井的绘制(defun c:xsj()(command "circle" "0,0" 0.5)(command "line" "-0.5,0" "0.5,0" "")(command "line" "0,-0.5" "0,0.5" ""))3、循环控制语句例2、绘制同⼼圆例3、绘制可多次插⼊的下⽔井符号例4、绘制y=sinx 曲线4、课后练习题4.1 编写lisp 程序,绘制路灯图案,参照下⽔井程序,改写成可以多次插⼊的程序。
用LISP语言自定义AutoCAD命令AutoLISP语言作为AutoCAD的二次开发工具,虽然在功能、运行速度和保密性等方面比起ARX等工具要逊色一些,但由于它易学易用,交互性好,灵活性强,对于那些经常使用AutoCAD进行绘图的普通用户来说,不失为一种理想的开发工具。
下面就介绍用AutoLISP 语言自定义的几个AutoCAD绘图命令,可以起到简化操作、提高作图效率的作用。
一、键槽尺寸视图的绘制命令“jct”在绘制轴、齿轮或带轮等零件图时,经常需要画轴上键槽处的剖视图或轮毂键槽的端面视图,比较麻烦;由于键槽的尺寸随轴径的变化而变化,所以我们可以用LISP程序来实现自动绘图。
加载下面的程序,在命令行中键入”jct”并回车,通过人机交互的形式输入有关参数,可自动完成轴上键槽的剖视图和轮毂键槽的端面视图的绘制。
代码示例如下所示。
(defun C:jct ()(setq pt0 (getpoint "\n 请输入视图的中心位置点:"))(initget 7)(setq loop T)(while loop(setq d (getreal "\n请输入键槽处的轴径(12<d<130)(mm):"))(if(or (< d 12) (> d 130))(alert "轴径数据输入错误!\n\n请重新输入!")(setq loop nil));if);while(cond;根据轴径检索键槽尺寸((and (> d 12) (<= d 17)) (setq b 5 t1 3.0 t2 2.3));b表示键槽的宽度((and (> d 17) (<= d 22)) (setq b 6 t1 3.5 t2 2.8));t1表示轴上键槽的深度((and (> d 22) (<= d 30)) (setq b 8 t1 4.0 t2 3.3));t2表示轮毂上键槽的高度((and (> d 30) (<= d 38)) (setq b 10 t1 5.0 t2 3.3))((and (> d 38) (<= d 44)) (setq b 12 t1 5.0 t2 3.3))((and (> d 44) (<= d 50)) (setq b 14 t1 5.5 t2 3.8))((and (> d 50) (<= d 58)) (setq b 16 t1 6.0 t2 4.3))((and (> d 58) (<= d 65)) (setq b 18 t1 7.0 t2 4.4))((and (> d 65) (<= d 75)) (setq b 20 t1 7.5 t2 4.9))((and (> d 75) (<= d 85)) (setq b 22 t1 9.0 t2 5.4))((and (> d 85) (<= d 95)) (setq b 25 t1 9.0 t2 5.4))((and (> d 95) (<= d 110)) (setq b 28 t1 10.0 t2 6.4))((and (> d 110) (<= d 130)) (setq b 32 t1 11.0 t2 7.4)))(command "circle" pt0 "d" d)(command "zoom" "a")(setq s1 (ssget "l" ))(setq di (-(* (/ d 2.0) (/ d 2.0)) (* (/ b 2.0) (/ b 2.0)))dx (sqrt di)dy (/ b 2.0)pt1 (list (+ (car pt0) dx) (+ (cadr pt0) dy)))(initget "Zc Lc");Zc表示画轴键槽的剖视图,Lc表示画轮毂键槽的端面视图(setq zrl (getkword "\n 画轴键槽的剖视图还是轮毂键槽的端面视图(Z/L)?"))(if (= zrl "Zc")(progn;计算轴键槽上点的坐标(setq pt2 (list (+ (car pt0) (-(/ d 2.0) t1)) (+ (cadr pt0) dy))pt3 (polar pt2 (- (/ pi 2.0)) b)pt4 (polar pt3 0 (- dx (- (/ d 2.0) t1)))));progn);if(if (= zrl "Lc")(progn;计算轮毂键槽上点的坐标(setq pt2 (list (+ (car pt0) (+(/ d 2.0) t2)) (+ (cadr pt0) dy))pt3 (polar pt2 (- (/ pi 2.0)) b)pt4 (polar pt3 (- pi) (- (+ (/ d 2.0) t2) dx))));progn);if(command "pline" pt1 pt2 pt3 pt4 "");画键槽(setq s2 (ssget "l"))(command "layer" "m" 5 "l" "center" 5 "c" 1 5 "")(command "ltscale" 8)(command "line" (polar pt0 (- pi) (+ (/ d 2.0) 10));画中心线(polar pt0 0 (+ (/ d 2.0) 10)) "")(command "line" (polar pt0(-(/ pi 2.0)) (+ (/ d 2.0) 10))(polar pt0 (/ pi 2.0) (+ (/ d 2.0) 10)) "")(command "layer" "s" 0 "")(if (= zrl "Zc")(progn(setq s3 (entsel "\n 请选择修剪的目标:"))(command "trim" s2 "" s3 "");修剪形成键槽(command "hatch" "U" "45" "2" "n" s1 s2 ""));画轴上键槽处剖视图的剖面线);if(if (= zrl "Lc")(progn(setq s4 (entsel "\n 请选择修剪的目标:"))(command "trim" s2 "" s4 "");修剪形成键槽(command "rotate" s1 s2 "" pt0 90));将轮毂键槽的端面视图旋转90度);if);end defun二、螺纹孔剖视图的绘制命令“lwk”在绘制机械零件图时,经常要画螺纹孔的剖视图,同样由于螺纹孔的有关尺寸都随螺纹的公称直径而变化,我们可以用下面的程序自动完成其剖视图的绘制。
使用CAD进行程序化绘图的方法与示例CAD(计算机辅助设计)软件是现代工程设计中不可或缺的工具之一。
它可以大幅提高工作效率,提供精确的设计模型和绘图输出。
在CAD中,程序化绘图技术可以进一步提高设计工作的效率和准确性。
本文将介绍使用CAD进行程序化绘图的方法与示例。
在CAD中,我们可以通过编写脚本或使用宏来实现程序化绘图。
常见的CAD软件如AutoCAD、SolidWorks和CATIA等都提供了编程接口和相关的编程语言,如AutoLISP、VBA和C#等。
下面我们将以AutoCAD为例,介绍使用AutoLISP进行程序化绘图的方法与示例。
AutoLISP是AutoCAD的内置编程语言,它与AutoCAD的各种功能紧密结合,可以实现从基本绘图操作到自定义功能的自动化。
以下是使用AutoLISP进行程序化绘图的几个示例:1. 绘制矩形:我们可以使用AutoLISP编写一个简单的程序来绘制矩形。
下面是一个示例程序:```(defun c:draw-rectangle (/ p1 p2)(setq p1 (getpoint "\nEnter the first corner point: "))(setq p2 (getcorner p1 "\nEnter the opposite corner point: "))(command "RECTANG" p1 p2)```在AutoCAD中,我们可以运行该程序的命令`draw-rectangle`,然后按照提示,输入第一个和第二个角点,即可绘制一个矩形。
2. 绘制圆形:类似地,我们可以使用AutoLISP编写一个程序来绘制圆形。
下面是一个示例程序:```(defun c:draw-circle (/ center radius)(setq center (getpoint "\nEnter the center point: "))(setq radius (getdist "\nEnter the radius: "))(command "CIRCLE" center radius))```在AutoCAD中,我们可以运行该程序的命令`draw-circle`,然后按照提示,输入圆心和半径,即可绘制一个圆形。
文章编号:100926825(2002)0420159202用Auto LISP 语言编程实现参数化绘图收稿日期:2002201222作者简介:康保成(19552),男,1987年毕业于广东教育学院工程图学专业,高级讲师,太原理工大学轻纺工程与美术学院,山西晋中 030600康保成摘 要:简要介绍Auto LISP 语言在Auto C AD 环境下实现参数绘图的应用状况。
对建筑制图中绘制楼梯台阶进行分析,并结合Auto LISP 语言编程特点,编制了Auto LISP 程序,顺利完成楼梯台阶的绘制过程,达到利用参数输入形式,严格、准确、快捷地完成绘图工作目的,还为在Auto C AD 环境下绘制形状相同、尺寸不同的系列图形提供了方便。
关键词:Auto LISP ,Auto C AD ,楼梯台阶中图分类号:T U20114文献标识码:A引言随着时代的进步,计算机辅助设计发展迅猛,全面取代传统的丁字尺加图板的手工绘图方式已成必然。
这种势头给各行各业都带来了冲击,从早年间颁布的红头文件可见一斑。
可以毫不夸张地说,对于作为衡量素质标准的计算机辅助设计,不能等闲视之。
Auto C AD 作为C AD 的工具,是一个功能极强的计算机辅助设计、绘图的通用软件包。
如今Auto C AD 在各部门得到广泛应用。
Auto C AD 实际上已经成为一种微机C AD 系统的标准,工程设计人员之间交流设计思想的公共语言。
Auto C AD 之所以得到如此广泛的应用,除了它功能强大,易学易用外,还在于它是一个开放的、交互式的软件。
用户可以编写Auto LISP 、ADS 或ARX 应用程序,作为新的命令,实现特定用户的特殊需要,或对AutoC AD 做一些二次开发和应用,以使用户更方便、快捷地满足工作要求。
1 问题的提出正如前面所述,Auto C AD 在各个领域都得到了广泛的应用,可见其通用性是很强的;但它在一些领域的某些方面还有不尽人意的地方。
利用Auto LISP提高机械设计CAD绘图效率闵旭光1,熊中侃2(1.南昌高等专科学校机电系,江西南昌 330008;2.南昌高等专科学校计算机系,江西南昌 330008)摘 要:介绍了一种利用Auto LISP语言编程,提高机械设计C AD绘图效率的方法。
关键词:Auto LISP;C AD绘图;机械设计;制图中图分类号:TP391.72 文献标识码:A 文章编号:1008-7354(2005)01-0079-02 在零部件较多(有时达到上百个零件)的机械装置(例如发电机组、级进模、自动装配机等)设计中,一般都要给零部件分层。
比如:部件1、2、3……;零件101、102、103……或201、202、203……;等等。
在装配图设计中相邻零件(图层)颜色也要设置成不同,以便于零件间的区别。
并且在设计中需要经常打开或关闭某些图层,改变线型等等。
虽然利用AutoC AD的CH(Change)等某些命令可以达到这些目的,但在执行过程中,都需要操作两步以上,较繁琐。
为此,我们利用Auto LISP,编制了一个程序,经使用验证,能较好地提高机械设计,特别是零部件较多时的C AD绘图效率,该程序如下:;TF33333turn on previous turn off(defun c:TF()(command″layer″″f″″3″″″));AN33333thaw a layer(defun c:AN(/x)(setvar″cmdecho″0)(setq x(getstring″\n input thaw layer name:″))(command″layer″″thaw″x″″)(setvar″cmdecho″1));AF33333freeze a layer(defun c:AF(/x)(setq x(entsel″\n select freeze layer:″))(com mand″layer″″freeze″(cdr(ass oc8(entget(car x))))″″));T N33333all of layer turn on(defun c:T N()(command″layer″″t″″3″″on″″3″″u″″3″″″)(command″layer″″off″″opaper f″″″)(princ));C N33333change selected layer to a new layer(defun c:C N()(graphscr)(setvar″cmdecho″0)(prom pt″\nEntities to be changed:″)(setq e1(ssget))(setq mylayer(getstring″input new layer name:″))(setq oldla(getvar″clayer″))(command″layer″″make″mylayer″″)(setq e2(cons8mylayer))(setq i0)(repeat(sslength e1)(setq e4(entget(ssname e1i)))(setq e5(ass oc8e4))(setq e4(subst e2e5e4))(entm od e4)(setq i(l+i)))(princ″\nAll selected entities change to layer″)(princ(cdr e2))(princ));C A33333change current layer to match an enti2 ty’s layer3333(defun c:C A(/x)(setq x(entsel″\n select object which layer is to be matched:″))(command″layer″″s″(cdr(ass oc8(entget(car x))))″″)(command″layer″″u″(cdr(ass oc8(entget(car x))))″″));CC33333change layer’s color3333(defun c:CC(/x)(setvar″cmdecho″0)(setq x(entsel″\n select a layer to be changing col2 or:″))(command″layer″″c″(acad-colordlg7)(cdr(ass oc8 (entget(car x))))″″)(setvar″cmdecho″1));LC33333change properties to be center line33 33南昌高专学报 2005年第1期(总第56期) 2005年2月出版Journal o f Nanchang Junior College No.1(Sum56)Feb.200579 收稿日期:2004-08-28(defun c:LC()(ssget)(command″chprop″″p″″″″c″6″lt″″center″″″)(princ));LP33333change properties to be divide line33 33(defun c:LP()(ssget)(command″chprop″″p″″″″c″2″lt″″phantom″″″));LD33333change properties to be dashed line33 33(defun c:LD()(ssget)(command″chprop″″p″″″″c″4″lt″″dashed″″″));LG33333change properties to be color=3(defun c:LG()(ssget)(command″chprop″″p″″″″c″3″″));LR33333change properties to be color=1(defun c:LR()(ssget)(command″chprop″″p″″″″c″1″″));LY33333change properties to be color=2(defun c:LY()(ssget)(command″chprop″″p″″″″c″2″″));LB33333change properties to be color=5(defun c:LB()(ssget)(command″chprop″″p″″″″c″5″″));LC O33333change properties to be bylayer&line2 type=continue3333(defun c:LC O()(ssget)(command″chprop″″p″″″″c″″bylayer″″lt″″bylayer″″″))以上程序先写在记事本文档中,取个名如:min.lsp,再存到AutoC AD2002或AutoC AD2004的目录S UPPORT 下,并打开acadr2002.lsp或acad2004.lsp,在该程序最后增加:(load″min.lsp″)(princ)存盘后,退出,重新启动计算机即可使用该Auto LISP 程序了。
一步步学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之间有没有空格都可以,而且要用命令全名,不能用简化命令,而且要用引号。
第2讲利用AutoLisp语言绘图
在AuotCAD绘制简单图形时,有三种主要方式:(1)图标菜单(2)下拉式菜单(3)命令行。
事实上还有另外一种绘图方式,即通过lisp语言实现绘制图形。
利用Lisp语言绘图的最大优点是可以实现批处理,降低劳动强度。
小知识:
Lisp语言最大优势是和AutoCAD绘图结合的很好,这也
是该语言至今仍未被淘汰的最主要原因。
1、简单的绘图语句
几乎AuotCAD中所有的绘图及环境设置命令都可以通过程序调用!,利用Lisp语言编写绘图命令的窍门是首先在命令行下把绘图命令和对应的参数记住,然后用Lisp语言的格式书写出即可。
1.1 绘制直线
(command "line" "0,0" "1,1" "")
1.2 绘制圆
(command "circle" "0,0" 5)
1.3 绘制正多边形
(command "polygon" 5 "0,0" "i" 5)
(command "polygon" "5" "0,0" "i" "5")都正确
1.4 新建图层
(command "la yer" "m" "道路" "c" 2 "" "")
请同学自己编写高度为2,起点位置在“0,0”,文字内容是“理工大”的程序2、用多条绘图语句表示复杂图形
正常情况下图形都比较复杂,需要用多条语句编写,例如测绘中的下水井、路灯等符号。
例1、下水井的绘制
(defun c:xsj()
(command "circle" "0,0" 0.5)
(command "line" "-0.5,0" "0.5,0" "")
(command "line" "0,-0.5" "0,0.5" "")
)
3、循环控制语句
例2、绘制同心圆
例3、绘制可多次插入的下水井符号
例4、绘制y=sinx 曲线
4、课后练习题
4.1 编写lisp 程序,绘制路灯图案,参照下水井程序,改写成可以多次插入的程序。
4.2 编写lisp 程序,绘制(1) y =sinx
x (2) y =1
√2πexp(−x 2
2) 的图形,并用matlab 程序编写,比较两种语言的各自特点。
(defun c:tx y() (setq r 1.0) (while (< r 10) (command "circle " "0,0" r) (setq r (+ r 1)) ) ) (defun c:xsj() (setq r 0.5) (setq pt (getpoint "\请确定点位: ")) (while pt (setq x (nth 0 pt) y (nth 1 pt)) (setq x1 (- x 0.5) x2 (+ x 0.5) y1 (- y 0.5) y2 (+ y 0.5) ) (command "circle " pt r) (command "line" (list x1 y) (list x2 y) "") (command "line" (list x y1) (list x y2) "") (setq pt (getpoint "\请确定点位: ")) ) ) (defun c:sinx() (setq x (* pi -2)) (command "pline") (while (< x (* pi 2)) (command (list x (sin x))) (setq x (+ x 0.1)) ) (command "") ) matlab 程序: x=-pi:0.1:pi; plot(x,sin(x)); axis equal
5、过三点的外接圆参考程序。