autolisp教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十二章从菜单执行函数
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)]:
>:命令: nil
2.解决办法:通过改变系统变量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;
}
注意:将单选按钮或复选框组成行列(或区)的时候,具体是有些不同的。
复选框直接用row,但单选按
钮则要用boxed_radio_row,否则,组中的其他单选按
钮是不能用的!
四、用程序驱动编辑框
(defun c:myradio()
;加载对话框文件,将返回文件识别码的值赋予dcl_id
(setq dcl_id (load_dialog "mydcl.dcl"))
;检查对话框显示是否成功
(if(not (new_dialog "dcl_demo" dcl_id)) (exit))
;回调函数
(setq thetext "vv")
(mode_tile "text" 2)
(action_tile "text" "(setq thetext $value)")
;开始接受用户的输入,如果用户单击“确定”,则oke=1
(setq oke (start_dialog))
;将所输入的内容进行输出
(if (= oke 1) (progn (princ "\n您输入的文本是:") (princ thetext)))
;卸载对话框文件
(unload_dialog dcl_id)
(princ)
)
下面是对话框程序:
dcl_demo : dialog
{
label = "编辑框示例";
: edit_box //定义编辑框
{
key = "text";
label = "文本:";
}
ok_cancel;
}
五、演示密码如何输入
(defun c:myradio()
;加载对话框文件,将返回文件识别码的值赋予dcl_id
(setq dcl_id (load_dialog "mydcl.dcl"))
;检查对话框显示是否成功
(if(not (new_dialog "dcl_demo" dcl_id)) (exit))
;回调函数
(mode_tile "text" 2)
(action_tile "text" "(setq password $value)")
;开始接受用户的输入,如果用户单击“确定”,则oke=1 (setq oke (start_dialog))
;将所输入的内容进行输出
(if (= oke 1)
(progn (princ "\n您的密码是:") (princ password))
(princ "\n没有输入密码!:")
)
;卸载对话框文件
(unload_dialog dcl_id)
(princ)
)
下面是对话框程序:
dcl_demo : dialog
{
label = "密码示例";
: edit_box //定义编辑框
{
key = "text";
label = "请输入密码:";
password_char = "*";
}
ok_cancel;
}
六、滚动条和编辑框配合示例
(defun c:ddslider()
;加载对话框文件
(setq dcl_id (load_dialog “slider.dcl”))
;检查对话框打开是否正确
(if(not (new_dialog “myslider”dcl_id)) (exit))
;定义编辑框响应函数
(defun give(why val)
(setq cval (atoi val))
(if(or (< cval 0) (> cval 100));如果不在范围内则提示错误!
(progn
(set_tile “error”“必须是0-100!”)
(setq val vval)
)
(set_tile “error”“”);如果在范围内,则不提示错误!
)
(if(= why 1) (set_tile "myslider" val));设置滚动条
)
;定义滚动条响应函数
(defun slmove(why val)
(if(or (= why 1) (= why 3)) (set_tile “editbox”val));设置
编辑框
(setq vval val)
)
;给编辑框和滚动条赋初值
(set_tile "editbox" "0")
(setq vval "0")
(set_tile "myslider" "0")
;给编辑框赋予焦点
(mode_tile "editbox" 2)
;编辑框、滚动条和确定按钮相应的动作
;编辑框$reason=1表示回车
;编辑框$reason=1表示箭头移动,$reason=3表示拖拽滑块移动
(action_tile "editbox" "(give $reason $value)")
(action_tile "myslider" "(slmove $reason $value)")
(action_tile "accept" "(done_dialog)")
;显示对话框
(start_dialog)
(unload_dialog dcl_id)
(princ)
)
对话框文件:
myslider : dialog
label = "滚动条示例:";
:edit_box
{
key = "editbox";
label = "输入滚动条的位置:";
}
:slider
{
key = "myslider";
max_value = 100;
min_value = 0;
value = 50;
}
ok_cancel;
errtile;
}
七、列表框和下拉列表框
(defun c:ddlist()
;加载对话框文件
(setq dcl_id (load_dialog "mylist.dcl"))
;检查对话框打开是否正确
(if(not (new_dialog "dcl_list" dcl_id)) (exit))
(defun show(name way num)
(cond
((= name "my_list") (setq myseason num))
((= name "my_listbox") (setq myfruit num))
)
(set_tile "error" (strcat "你喜欢的季节为:" myseason ";" "你喜欢的水果为:" myfruit)) )
;$key返回组件的名称
;$reason返回点选方式,单击为1,双击为4
;$value返回项目的序号(从0开始)
(set_tile "my_list" "1")
(setq myseason "1")
(action_tile "my_list" "(show $key $reason $value)")
(set_tile "my_listbox" "2")
(setq myfruit "2")
(action_tile "my_listbox" "(show $key $reason $value)")
;显示对话框
(start_dialog)
(unload_dialog dcl_id)
(princ)
对话框程序如下:
dcl_list : dialog
{
label = "喜好:";
:popup_list
{
key = "my_list";
label = "最喜欢的季节:";
list = "春\n夏\n秋\n冬";
}
:list_box
{
key = "my_listbox";
label = "最喜欢的水果:";
list = "苹果\n菠萝\n草莓\n香蕉";
height = 10;
}
ok_only;
errtile;
}。