autolisp教程

  • 格式:doc
  • 大小:89.50 KB
  • 文档页数:15

第十二章从菜单执行函数1.制作简单的菜单(a)首先定义一个函数,并保存为plus32.lsp:(defun plus32()(setq a (+ 3 2)))(b)编写菜单生成文件,并保存为mylisp.mnu:***MENUGROUP=Mylisp ;菜单组的名称***POP1 ;第一组下拉菜单[Mylisp] ;第一组下拉菜单总的名称[plus] ^c^c^p(load “plus32.lsp”) (plus32) ;菜单名,加载,执行;一定是一个空行(c)加载菜单和执行函数用menuload函数执行加载.2.制作较为复杂的菜单(a)首先定义两个函数,并保存为plus32.lsp和plus45.lsp :(defun plus32()(setq a (+ 3 2)))(defun plus45()(setq a (+ 4 5)))(b)编写菜单生成文件,并保存为mylisp.mnu:***MENYGROUP=MYLISP***pop1[mylisp1][first] ^c^c^p(load "plus32.lsp") (plus32)[first2] ^c^c^p(load "plus45.lsp") (plus45)***pop2[mylisp2][first2] ^c^c^p(load "plus32.lsp") (plus32)[first4] ^c^c^p(load “plus45.lsp”) (plus45)(c)加载菜单和执行函数用menuload函数执行加载.第十三章保持程序畅通1.程序示例(a)首先定义一个函数,并保存为myline.lsp:(defun myline()(graphscr)(setq pt1 (getpoint "\n请输入第一个点:"))(setq pt2 (getpoint pt1 "\n请输入第二个点:"))(command "line" pt1 pt2 ""))(b)执行上述程序后,出现提示,显得很繁琐>:请输入第一个点:>:请输入第二个点:line 指定第一点:>:指定下一点或[放弃(U)]:>:指定下一点或[放弃(U)]:>:命令: nil2.解决办法:通过改变系统变量cmdecho的值来关闭响应(defun myline()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)(setq pt1 (getpoint "\n请输入第一个点:"))(setq pt2 (getpoint pt1 "\n请输入第二个点:"))(command "line" pt1 pt2 "")(setvar "cmdecho" oce)(princ))3.程序框架:(defun ×××()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)…… ……(setvar "cmdecho" oce)(princ))第十四章读写数据库1.打开数据文件(setq fp (open "d:/lisp/point.txt" "r"))用open函数打开数据库,文件须制定路径,同时需要指出文件的读取模式.文件的读取模式:r----读出w---写入a---添加2.读出数据(setq pt1 (read-line fp)) ;按行读出数据(setq pt1 (read pt1)) ;去掉数据外面的双引号3.关闭数据库(close fp)4.读取数据库程序示例首先建立数据文件d:/lisp/point.txt编写下面的程序,运行,检验程序的正确性.(defun myline()(graphscr) ;图形窗口(setq oce (getvar “cmdecho”)) ;保存变量的值(setvar “cmdecho” 0) ;改变变量的值(setq fp (open “d:/lisp/point.txt”“r”)) ;打开文件(while (/= (setq pt1 (read-line fp)) nil) ;判断是否到文件末(setq pt1 (read pt1)) ;去掉外层引号(princ “\n”) ;回车键(princ pt1) ;显示数据)(close fp) ;关闭文件(setvar “cmdecho”oce) ;回复变量的值(princ) ;关闭最后的响应)5.读取数据库并绘制直线(defun myline()(graphscr) ;图形窗口(setq oce (getvar “cmdecho”)) ;保存变量的值(setvar “cmdecho”0) ;改变变量的值(setq fp (open “d:/lisp/point.t xt”“r”)) ;打开文件(setq pt1 (read-line fp))(setq pt1 (read pt1))(setq pt11 pt1)(while (/= (setq pt2 (read-line fp)) nil)(setq pt2 (read pt2))(command "line" pt1 pt2 "")(setq pt1 pt2))(command "line" pt1 pt11 "")(close fp) ;关闭文件(setvar “cmdecho”oce) ;回复变量的值(princ) ;关闭最后的响应)6.读取数据库并写入另一文件(defun myline()(graphscr)(setq oce (getvar "cmdecho"))(setvar "cmdecho" 0)(setq fp (open “d:/lisp/point.txt”“r”)) ;打开数据文件(setq fp1 (open "d:/lisp/point1.txt" "w"))(while (/= (setq pt1 (read-line fp)) nil) ;读出数据(setq pt1 (read pt1))(princ pt1 fp1) ;写数据(princ “\n”fp1) ;换行)(close fp)(close fp1)(setvar "cmdecho" oce)(princ))第十五章自定义错误函数Autolisp遇到错误时,会通过两种渠道显示错误情况:ERRNO系统变量和*error*函数.通常以后者为主.当*error*函数被设为nil时,Autolisp的错误以预设的显示方式显示:例如:command: (/ 1 0); 错误: 除数为零一般来说(并非所有),当Autolisp的函数执行导致autocad侦测到错误时,系统变量ERRNO会保存对应的错误码.所以,程序里面的自定义错误函数的自定义变得可行.首先定义一个简单报错函数:(defun *error* (msg)(alert msg)(princ))执行语句(/ 1 0) 后,看看响应的提示.1.自定义错误函数的应用(defun sqrtnum()(setvar "errno" 0) ;设置系统变量的值(setq olderr *error*) ;保存*error*的值(defun *error* (msg) ;定义*error*函数(setq en (getvar "errno")) ;取得系统变量"errno"的代码(setq errmsg (strcat "ERRNO = " (itoa en) "\nError: " msg));系统变量的值和错误信息(alert errmsg) ;显示统变量的值和错误信息(setq *error* olderr) ;恢复*error*的值)(setq x (getreal "\n请输入一个数:"))(setq y (* x x))(princ "\n")(princ x)(princ "^2 = ")(princ y)(setq *error* olderr)(princ))运行程序,输入数值时按ESC键看看错误提示.第十六章对话框定义Autolisp不能相其他语言一样用拖拽的方式设计对话框,而是以对话框控制语言进行对话框的设计.Autolisp对话框包括以下的基本组件:标签、按钮、单选框、复选框、编辑框、列表框、下拉列表、滚动条、图象框、图像按钮一、定义各种类型的对话框组件(a) 定义一个空对话框dcl_demo : dialog{label = "我的对话框";ok_cancel;}利用工具菜单里面的“界面工具”,可以对对话框进行预览,如上图所示.(b) 定义一个单选按钮dcl_demo : dialog{label = "我的对话框";: radio_button{key = "myradio";label = "这是一个单选按钮!";}ok_cancel;}(c) 定义一个复选按钮dcl_demo : dialog{label = "我的对话框";: radio_button //定义单选按钮{key = "myradio";label = "这是一个单选按钮!";}: toggle //定义复选按钮{key = "mytoggle";label = "这是一个复选按钮!";}ok_cancel;}(d) 定义一个按钮dcl_demo : dialog{label = "我的对话框";: radio_button //定义单选按钮{key = "myradio";label = "这是一个单选按钮!";}: toggle //定义复选按钮{key = "mytoggle";label = "这是一个复选按钮!";}: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}ok_cancel;}(e) 定义一个编辑框dcl_demo : dialog{label = “我的对话框”;… … … …: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}: edit_box //定义编辑框{key = "myeditbox";label = "这是一个编辑框:";}ok_cancel;}(f) 定义一个标签栏dcl_demo : dialog{label = “我的对话框”;… … … …: button //定义按钮{key = "mybutton";label = "这是一个按钮!";}: edit_box //定义编辑框{key = "myeditbox";label = "这是一个编辑框:";}: text //定义标签栏{key = "mytext";label = "这是一个标签栏,用来写文字说明的!";}ok_cancel;}(g) 定义一个滚动条dcl_demo : dialog{label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50;}ok_cancel;}(h) 定义一个下拉列表框dcl_demo : dialog{label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50;}: popup_list //定义下拉列表框{key = "mypopup";label = "右边是下拉列表框:";list = "选项1\n选项2\n选项3";edit_width = 12;}ok_cancel;}(i) 定义一个下拉列表框dcl_demo : dialog {label = "我的对话框";: slider //定义滚动条{key = "myslider";layout = horizontal;max_value = 100;min_value = 1;value = 50; }: popup_list //定义下拉列表框{key = "mypopup";label = "右边是下拉列表框:";list = "选项1\n选项2\n选项3";edit_width = 12; }: list_box //定义列表框{key = "mylist";label = "下边是列表框:";list = "选项1\n选项2\n选项3";height = 12; }ok_cancel;}二、用程序驱动单选按钮对话框单选按钮对话框程序dcl_demo : dialog{label = "旋转角度";: boxed_radio_row{key = "rot_angle";label = "请选择一个旋转角度:";: radio_button //定义单选按钮{key = "angle0";label = "0";}: radio_button //定义单选按钮{key = "angle90";label = "90";}: radio_button //定义单选按钮{key = "angle180";label = "180";}: radio_button //定义单选按钮{key = "angle270";label = "270";}}ok_only;}编写上述文件,并保存为dialog.dcl文件.其对应的对话框界面如下图所示: (b)对话框驱动程序,保存为test.lsp文件(defun c:myradio();加载对话框文件,将返回文件识别码的值赋予dcl_id(setq dcl_id (load_dialog "dialog.dcl"));检查打开对话框是否成功(if(not (new_dialog “dcl_demo” dcl_id)) (exit));回调函数(defun choose(ang)(cond((= ang "angle0") (setq r_ang 0))((= ang "angle90") (setq r_ang 90))((= ang "angle180") (setq r_ang 180))((= ang "angle270") (setq r_ang 270))));设定angle0的初始值为"1"(set_tile "angle0" "1");将r_ang的初始值设为0(setq r_ang 0);用户选择的时候进行判断,返回所选的值(action_tile "rot_angle" "(choose $value)");如果单击确定按钮,则销毁对话框(action_tile "accept" "(done_dialog)");显示对话框(start_dialog);将所选的数值进行输出(princ "\n您选择了")(princ r_ang)(princ " 度!");卸载对话框文件(unload_dialog dcl_id)(princ))加载执行可以看到程序的运行结果!三、用程序驱动复选框对话框(defun c:myradio();加载对话框文件,将返回文件识别码的值赋予dcl_id(setq dcl_id (load_dialog "mydcl.dcl"));检查打开对话框是否成功(if(not (new_dialog "dcl_demo" dcl_id)) (exit));回调函数(setq xian 0 sany 0 lanz 0)(action_tile "xa" "(setq xian (atoi $value))")(action_tile "sy" "(setq sany (atoi $value))")(action_tile "lz" "(setq lanz (atoi $value))");如果单击确定按钮,则销毁对话框(action_tile "accept" "(done_dialog)");显示对话框(start_dialog);将所选的数值进行输出(princ "\n在下面的几个城市中,我选择::")(princ "\n西安:") (if(= xian 1) (princ "想去!") (princ "不想去!")) (princ "\n三亚:") (if(= sany 1) (princ "想去!") (princ "不想去!")) (princ "\n兰州:") (if(= lanz 1) (princ "想去!") (princ "不想去!")) ;卸载对话框文件(unload_dialog dcl_id)(princ))下面是对话框程序:dcl_demo : dialog{label = "旋转角度";: row{key = "rot_angle";label = "请选择你想去的旅游城市:";: toggle //定义复选按钮{key = "xa";label = "西安";}: toggle //定义复选按钮{key = "sy";label = "三亚";}: toggle //定义复选按钮{key = "lz";label = "兰州";}}ok_only;}注意:将单选按钮或复选框组成行列(或区)的时候,具体是有些不同的。