《机械CAD开发技术.ppt》由会员分享,可在线阅读,更多相关《机械CAD开发技术.ppt(61页珍藏版)》请在三一办公上搜索。
1、机械CAD开发技术,AutoCAD 二次开发入门,讲授:,吴 军,课程内容,(10+6学时)(1+0学时)(2+2学时)(2+2学时)(1+2学时)(2+0学时),4.对话框的设计,5.综合练习,6.VBA编程介绍,1.AutoLISP编程,2.Visual LISP开发,3.菜单的设计,理论,上机,第1讲 AutoLISP编程,1.AutoLISP语法2.AutoCAD命令复习3.AutoLISP与AutoCAD命令的连接 4.自动绘制图形5.图形对象选取6.编辑图形,穿插讲Visual Lisp开发环境的使用,AutoLISP编程语法,AutoLISP 语法数据类型:常量、变量、空间点语法
2、特点:表()赋值语句:setq数学运算:+、-、*、/、PI函数定义:defun输入语句:getpoint、getdist点的坐标:list、car、cadr、polar流程:判断if与选择while,AutoLISP编程语法,数据类型:整型、实型、字符串、表 函数(相对于子程序 如:PI、+)图元(图形对象)等常量 数字5、1.5 字符串“a”、“ab”“”(空串也是串)绘图命令中的“确认”!表(数组):(1,-2,3)(坐标点)变量(全局、局部)赋值语句(setq a 1)(setq b(1,2),AutoLISP编程语法,表()(注意:成对出现)操作符 操作数1 操作数2 符、数之间必须
3、有空格,以示区分!例:(+1 2)结果:3()可嵌套()与符、数、()之间可无空格例:(setq a(*(-5(+1 2)2)结果:a=4连+、-例:(setq a(+1 2 3 4)结果:a=10,AutoLISP编程语法,函数定义:(defun c:hanshu(a);注释内容)输入函数:(通过键盘、鼠标)getpoint 输入空间点(1,2)getdist 输入距离(数字)5例:(setq p(getpoint“n请输入圆心坐标:”)(setq r(getdist“n请输入圆半径值:”)(command“circle”p r),命令栏提示,AutoLISP编程Autocad命令,Auto
4、cad命令(注意:观察命令栏的提示)直线 line 矩形 rectangle圆 circle 圆弧 arc(多种方式)正多边形 polygon复制 copy 镜像 mirror 阵列 array对象选择方式“w”“c”“l”,AutoLISP编程与图形接口,绘图命令的接口:command(command“命令”参数1 参数2)(command“line”p1 p2“”)(command“line”“0,0”“30,20”“”)(command“circle”po r)(command“circle”“0,0”20)(command“arc”“c”po p1 p2),AutoLISP编程与图形接
5、口,绘直线为什么要有个空字符“”,格式:参数变量:(command“line”p1 p2“”)(command“circle”po r)参数常量(坐标点):(command“line”“0,0”“30,20”“”)(command“circle”“0,0”20),“”=确认键,“”中间不能空格,空格空,问:,例,dtr 角度转成弧度 setvar设置环境变量,cmdecho 0 原函数不起作用,1 起作用,直线,AutoLISP 编程语言流程,选择 if 单选,二选一(if 条件表达式 表达式1 表达式2)若条件表达式结果为真,执行表达式1,否则,执行表达式2(或下条语句)。例:(if(a 1
6、)(setq b 2)如果a 大于 1,则b等于2,否则执行下条语句。(if(a 1)(setq b 2)(setq b 3)如果a 大于 1,则b等于2,否则b等于3,求值结束。,AutoLISP 编程语言流程,选择 cond 选择分支,多选一(cond(测试表达式1 结果表达式1)(测试表达式2 结果表达式2),AutoLISP 编程语言流程,(progon 多语句)该函数将n个表达式组合起来,作为if函数的一个表达式。例如:(if(a 1)(progn(setq b 2)(print(b a)(progn(setq b 4)(print b)该程序段的执行过程是,若条件成立,b等于2,然
7、后打印a与b之和,返回a与b之和;若条件不成立,b等于4,然后打印4,返回4。,AutoLISP 编程语言流程,循环repeat n次循环(次数确定)While 满足条件循环(次数不确定)子程序,AutoLISP 编程语言举例,编程练习矩形框太极图单循环多循环,例,princ 命令栏不显示系统反馈的结果,如:出错,圆,循环,第2讲 Visual LISP 开发环境,LSP文件的编写、调试、加载()、函数、数值、注释的区分LSP程序的加载与运行LSP程序的自动加载,Visual LISP 开发环境,Visual LISP何用?开发AutoLISP程序 AutoLISP程序与C+、Basic一样,
8、可以用文本编辑器(如:word、记事本)编写,但不专业,且不能编译、试运行。进入Visual LISP 在AutoCAD下拉菜单中选择:工具AutoLISPVisual LISP编辑器,或命令行“Command:vlide”,即可进入下图所示的Visual LISP集成环境。,Visual LISP 开发环境,进入Visual LISP 在AutoCAD下拉菜单中选择:工具AutoLISPVisual LISP编辑器,或在命令提示“Command:”下键入vlide,即可进入下图所示的Visual LISP集成环境。,Visual LISP 开发环境,新建、打开下的程序编写Visual LIS
9、P控制台类似于命令栏command:(逐行解释执行命令)观察源代码的不同颜色:大红、兰、绿、桃红、黑、灰底红 括号 函数 数值 字符 自定义 注释,Visual LISP 开发环境,Visual LISP 开发环境,加载程序 加载文件名.lspVisual LISP编辑器:加载活动编辑窗口AutoCAD菜单:工具AutoLISP加载下次自动加载程序AutoCAD菜单:工具AutoLISP加载 启动组、内容、添加运行程序 运行程序名()command:程序名,AutoLISP 编程语言图形编辑,图形对象的选择:AutoCAD的图形对象称作图元,存于图形库里。图元之间是以链表的形式存储的。entn
10、ext:获取图形库第一个图元的名字或指定图元的下一个图元的名字。entlast:获取图形库最后一个,即最新生成的图元的名字。,AutoLISP 编程语言图形编辑,编辑命令:copymirrorarray,问:用copy改写6-18 用copy改写6-18,第3讲 菜单设计,Acad.mnu 默认菜单 在此基础上改动(定制)注意:acad.mnu与acad.mns的区别,我们可直接 修改acad.mns*popn 弹出式下拉菜单 n 排序*子菜单名称 无此,则整个子菜单无菜单中的每一项,按顺序排列(包括子孙菜单)例:ID_Line 直线(&L)CC_line唯一标识符 名称 快捷键 宏命令(函数
11、名),可视化对象编程,注意:孙菜单形式,菜单设计,Toolbars 工具栏的定制 添加工具栏添加按钮添加按钮图像添加宏 CC_命令 连接按钮与命令的“桥”,对话框可视化、操作直观简便、美观悦目。对话框文件:*.DCL 对话框的组成 对话框由若干控件组成,控件可以是按钮、编辑框、切换开关、列表或图像等。控件可以自定义与引用。AutoCAD提供了两个重要的DCL文件:ACAD.DCL存放AutoCAD系统定义的对话框,BASE.DCL为用户提供了一些常用的对话框标准控件。,第4讲 对话框设计,实例进入VLISP环境,将下列源代码输入到文本编辑窗口,选取下拉菜单ToolsInterface Tool
12、Preview DCL in Editor。sample:dialog label=简单的对话框实例;:text label=祝您成功!;:button key=accept;label=确认;is_default=true;fixed_width=true;alignment=centered;,1.按钮(Button)按钮的类型是button。有action、alignment、fixed_height、fixed_width、height、is_cancel、is_enabled、is_tab_stop、key、label、width 属性。它的标签(label)显示在按钮上。,控件 简
13、单的DCL设计可以采用引用控件的方式。AutoCAD为用户预定义了多种常用控件。每一种(个)控件有多个属性。每个属性都有一个名字和值。,2.编辑框(Edit Box)编辑框用于输入字符串。它的类型是edit_box。有allow_accept、edit_width、fixed_height、fixed_width、height、key、label、value、width属性。其标签显示在该框的左边,它的默认宽度为12个字符,当输入的字符多于12时,文本自动向左滚动,框内的字符串即为编辑框的值(value)。:edit_box key=test_text;label=长度:;value=100.
14、0;width=12;,3.列表框(List Bbox)列表的值是被选中的文本行的序号,序号从0开始。属性multiple_select为true时,允许同时选取框内的多行文本。,:list_box label=齿轮种类;list=圆柱直齿n圆柱斜齿n 圆锥直齿n螺旋伞齿n蜗轮n 蜗杆n;value=2;key=gear_list;height=6;,4.单选按钮(Radio Button)注:同组互锁:radio_button key=unit_mm;label=毫米;,5.复选开关(Toggle):toggle label=正交方式;key=ortho_mode;value=1;,组合类控
15、件1.列(Column)列是将若干控件构成垂直分布的一个组件。列的类型是column。有alignment、children_alignment、children_fixed_height、children_fixed_width、fixed_height、fixed_width、height、label、width 9个属性。,定义如下::column:buttonlabel=光标拾取;key=pick;:edit_boxlabel=x=;width=12;key=x;mnemonic=x;value=0.0;,:edit_boxlabel=y=;width=12;key=y;mnemoni
16、c=y;value=0.0;,2.加框列(Boxed Column)顾名思义:加了一个矩形框的列。,将定义的第一行:column 改为:boxed_columnlabel=左下角点;,3.互锁列(Radio Column)(左图)加框互锁列(Boxed Radio Column),定义:将互锁列定义的:radio_column改为:boxed_radio_column label=幅面规格;,互锁列的定义如下::radio_column key=size;:radio_buttonlabel=A,:radio_buttonlabel=A,:row:toggle label=纵向;key=dir
17、;:edit_box label=W(mm)=;mnemonic=W;key=w;value=420;:edit_box label=H(mm)=;mnemonic=H;key=h;value=297;,4.行(Row)、加框行(Boxed Row),:boxed_rowlabel=图纸幅面;,装饰性和信息类控件 装饰性和信息类控件无行为动作,用于显示信息、加强视觉效果或协助对话框布局。如:图像(Image)、文本(Text),5.对话框(dialog)对话框本身也可以看作是一种控件,至少要有一个确认(OK)或取消(Cancel)按钮。它的类型是dialog,有initial_focus、la
18、bel、value 3个属性。标签是对话框的标题。属性value也可以作为标题。,value:控件初始状态时的值。alignment 确定控件自身的定位方式。列类型的控件可选left(左对齐)、centered(中间对齐)和right(右对齐);行类型的控件可选top(顶对齐)、centered(中间对齐)和bottom(底对齐)。默认值:列类型控件为left,行类型控件为centeredinitial_focus 确定对话框内初始被聚焦的控件。相关的控件有:dialog。Label 确定控件的标签,label的值是一个由双引号括起来的字符串。它的显示位置取决于控件的类型。key 确定控件的关
19、键字,关键字是控件的标识,在一个对话框中的关键字必须是唯一的。关键字的值为字符串,且大小写不等价。,控件的属性,edit_width 确定编辑框的宽度,以字符为单位。若该属性的值默认为0,编辑框的宽度将是不固定的,布局时可自动扩充到整个可用空间。height 确定控件的最小高度,数值类型是整数或实数型。单位为屏幕字符的最大高度。如果属性fixed_height的值为true,height是控件的实际高度,否则,在自动布局时,控件的实际高度会超出该值。通常,不需指定该值,系统能自动采用合适的数值(图像及图像按钮除外)。width:确定控件的最小宽度。fixed_height(fixed_widt
20、h)当该属性的值为true时,属性height(width)有效,否则做相关调整。默认值:flasemnemonic 定义控件的热键,即助记符。助记符是控件标签中带下划线的字符。也可以在属性label中用“&”定义助记符。,对话框驱动程序 对话框文件描述了对话框的结构和外观、所属控件的样式、功能及控件的布局。但是将对话框显示到屏幕上,使对话框及其各控件发挥作用,必须靠程序驱动。用AutoLISP编写对话框的驱动程序。,返回本节,驱动程序内容(即:调用DCL文件的过程)1.加载对话框文件 AutoLISP程序首先调用load_dialog函数加载指定的对话框文件,若加载成功返回一个大于零的整数。
21、返回的整数类似于文件标识号,应该将其赋给一个变量保存,以备程序使用。2.将对话框显示到屏幕上 调用new_dialog函数,将已加载的对话框文件中指定名字的对话框(一个对话框文件可定义多个对话框)按照指定的位置显示到屏幕上,默认位置在屏幕的中央。3.初始化控件 根据对话框文件中控件的属性值对控件初始化。也可调用set_tile、mode_tile或action_tile等函数对控件初始化。经过初始化了的控件才有了初始的外观、状态或功能。,4.激活对话框 调用start_dialog函数,对话框处于激活状态,等待并接受用户施加在对话框上的操作,直到某一操作直接或间接地调用了done_dialog
22、函数,对话框才消失(并没有释放对话框所占用的存储空间)。5.用户操作对话框 用户可单击按钮或向编辑框键入字符等操作,控件执行相应的动作。动作可以是执行表达式、调用函数,也可以通过get_tile、get_attr等函数获取控件的属性值、通过set_tile、mode_tile函数设置控件的属性。,6.卸载对话框文件 如果用户选择了OK(确认)、Cancel(取消)、Exit(退出)或其它含有退出功能的按钮,首先调用done_dialog函数,对话框从屏幕上消失,然后调用unload_dialog函数,卸载对话框文件,释放对话框所占用的存储空间。7.对话框向应用程序传递数据 对话框本身并不具备向
23、应用程序传递数据的功能。它只是利用某些控件将用户的输入或操作作为属性的值存放到这些控件。应用程序必须自己从对话框的一些控件中获取数据。应用程序还要设置OK按钮和Cancel按钮的动作。这两个按钮都含有调用done_dialog函数的表达式,但OK按钮的动作还含有从对话框获取最新数据功能的表达式或函数,,对话框驱动函数1.加载、卸载对话框文件(1)(load_dialog dclfilename)加载一个对话框文件。参数dclfilename为对话框文件名(可省略扩展名.dcl),若未指定文件路径,该函数默认AutoCAD的搜索路径。若加载成功返回一个大于零的整数。例如:(setq dcl_id
24、(load_dialog d:usertest.dcl))若返回值大于0,表示加载成功;否则,加载失败。返回值类似于文件标识号,是显示对话框、卸载对话框文件的主要参数,应该将其赋给一个变量dcl_id,作为其它函数调用的参数。(2)(unload_dialog dcl_id)卸载一个与dcl_id相关联的对话框文件,释放该对话框所占存储空间。参数dcl_id为load_dialog函数的返回值。不论卸载是否成功,返回值均为nil。例如:(unload_dialog dcl_id),2.初始化、激活、关闭对话框(1)(new_dialog dlgname dcl_id action screen
25、_pt)(2)(start_dialog)激活由new_dialog函数显示的对话框,等待并接受用户的操作。此后对话框一直保持着激活状态。如果某一动作表达式调用了done_dialog函数,该函数才返回done_dialog函数的状态值。在调用start_dialog之前一定要检测new_dialog的返回值是否为T,否则会发生不可预料的结果。(3)(done_dialog status)隐藏对话框,参数status是一个整数,是提供给start_dialog函数的返回值。该函数的返回值为一个二维表表示的点的坐标。该坐标为对话框的左上角相对于屏幕左上角的位置(以像素为单位)。,建立图像控件和图
26、像按钮控件的图像 图像控件的大小和位置在DCL文件中定义,图像的内容只能用AutoLISP程序填写。图像的内容可以是矢量、填充块和幻灯片文件。(start_image key)打开key指定的图像控件,开始对其操作。这是图像操作必须用到的,而且是首先调用的函数。(end_ image)结束对当前图像控件的处理。这是图像操作必须用到的,而且是最后调用的函数。,实例:定义以对话框方式入圆的圆心和半径绘制圆的命令。;绘制圆的对话框驱动程序,文件名为12-12.lsp(defun c:drawcirc(/xc yc r id x1 y1);主函数,drawcirc 是AutoCAD命令名。(defun
27、 getdata();定义getdata 函数,其功能是获取三个编辑框的最终数据(setq xc(atof(get_tile X);获取编辑框X的值,转换为实数后赋给变量xc(setq yc(atof(get_tile Y);获取Y的值,转换为实数后赋给变量yc(setq r(atof(get_tile R);获取R的值,转换为实数后赋给变量r),(setq sdt 0);设置状态参数sdt为0(setq id(load_dialog d:exampledcl12-9.dcl);装入DCL文件,12-9是对话框文件名。(if(id 0)(exit);如果装入失败则退出(setq xc 50.0
28、 yc 50 r 25);设变量初值(if(not(new_dialog yuan id)(exit);显示名字为yuan的对话框,如果失败则退出(setq x1(dimx_tile img_cr);得到图象宽,img_cr是图像的关键字(setq y1(dimy_tile img_cr);得到图象高(start_image img_cr);图象操作开始(slide_image 0 0 x1 y1 d:examplesld12-12);填写图象内容,12-12是幻灯片文件名。(end_image);图象操作结束,(set_tile X(rtos xc 2 2);设置编辑框X初值(set_til
29、e Y(rtos yc 2 2);设置编辑框Y初值(set_tile R(rtos r 2 2);设置编辑框R初值;如果在dcl文件中,已经为上述编辑框设置了初值,可以缺少以上3行。(action_tile accept(getdata)(done_dialog 1);定义OK按钮的活动是执行getdata函数,然后以1为状态值关闭对话框(action_tile cancel(done_dialog-1);定义Cancel按钮时的活动是以-1为状态值关闭对话框(setq sdt(start_dialog);显示对话框,将得到关闭对话框时的状态值(unload_dialog id);卸载对话框文
30、件(if(sdt 0);判断关闭对话框时的状态值,即单击哪个按钮关闭的对话框(command circle(list xc yc)r);如果单击了OK按钮,则画圆(princ),加载以上AutoLISP文件,调用drawcirc命令,既可弹出下图所示绘制圆的对话框,进行绘制圆的操作。,【例12-13】定义绘制轴段的命令。(defun c:shaft(/d l x y id std x1 y1)(defun getdata();定义从编辑框获取D、L、x、y数据的函数。(setq d(atof(get_tile D_box)(setq l(atof(get_tile L_box)(setq x(
31、atof(get_tile X_box)(setq y(atof(get_tile Y_box);getdata函数定义结束(setvar cmdecho 0)(command layer m solid)(command layer m cen c 1 lt center)(setq id(load_dialog d:exampledcl12-13);装入对话框文件12-13.dcl(if(id 0)(exit),(setq d 50 l 100 x 0 y 0 std 2 p(list 0 0)(while(std 1);while循环开始(if(not(new_dialog zhou i
32、d)(exit)(setq x1(dimx_tile image);获取图象宽度赋给变量x1(setq y1(dimy_tile image);获取图象高度赋给变量y1(start_image image);开始建立图象(slide_image 0 0 x1 y1 d:examplesld12-13);图象的左上角、右下角、幻灯片文件为12-13.sld。(end_image);图象建立完毕(set_tile D_box(rtos d 2 2);设置编辑框控件的值(set_tile L_box(rtos l 2 2)(set_tile X_box(rtos x 2 2)(set_tile Y_
33、box(rtos y 2 2)(action_tile pick(getdata)(done_dialog 2);设置屏幕取点按钮的活动,(action_tile accept(getdata)(done_dialog 1);设置OK按钮的活动(action_tile cancel(done_dialog 0);设置Cancel按钮的活动(setq std(start_dialog)(if(=std 2);由于单击了屏幕取点按钮,注意:该表达式在while内部(progn(initget 1);禁止空输入(setq p(getpoint 定位点:);在屏幕上获取p点(setq x(car p)
34、y(cadr p);p点的X、Y坐标分别赋给变量x、y);取点之后,重新开始循环);while循环结束,(if(std 1);由于单击了OK按钮,绘制轴段(progn(command layer m solid)(command pline(list x(+y(*0.5 d)(list x(-y(*0.5 d)(list(+x l)(-y(*0.5 d)(list(+x l)(+y(*0.5 d)c)(command layer m cen)(command line(polar p pi 10)(polar p 0(+l 10)(unload_dialog id);卸载对话框文件,(prin
35、c);静默退出)程序说明:本例的屏幕取点、OK和Cancel按钮的活动都含有调用done_dialog函数的表达式,因此单击任意一个对话框都消失。屏幕取点和OK按钮的活动都含有调用getdata函数,前者以获取的数据进行对话框的初始化,后者用获取的数据进行作图。屏幕取点、OK和Cancel按钮在调用done_dialog函数时的状态值依次是2、1、0,也是start_dialog函数的返回并赋给std的值,是while循环的条件变量,std=2,仍然满足循环的条件,这就是屏幕取点之后重新显示对话框,而单击OK和Cancel按钮之后不再显示对话框的原因。表达式(set_tile D_box(rtos d 2 2)是将变量d的实数转换为字符串,作为编辑框控件D_box 的值。表达式(setq x(car p)y(cadr p)将从屏幕获取的p点的X、Y坐标分别赋给变量x、y,重新初始化对话框时通过(set_tile X_box(rtos x 2 2)等表达式将p点的X、Y坐标填入X、Y坐标的编辑框。,第6讲 VBA编程简介,Visual Basic Application acad.dcl、base.dcl,
链接地址:https://www.31ppt.com/p-6583588.html