目录
- 一、文件操作
-
- [1.1 写文件](#1.1 写文件)
- [1.2 读文件](#1.2 读文件)
- 二、对话框DCL
-
- [2.1 初识对话框](#2.1 初识对话框)
- [2.2 常用对话框界面](#2.2 常用对话框界面)
-
- [2.2.1 复选框、列表框](#2.2.1 复选框、列表框)
- [2.2.2 下拉框](#2.2.2 下拉框)
- [2.2.3 文字输入框、单选点框](#2.2.3 文字输入框、单选点框)
- [2.3 Lisp对dcl的驱动](#2.3 Lisp对dcl的驱动)
- [2.4 对话框按钮实现拾取](#2.4 对话框按钮实现拾取)
一、文件操作
1.1 写文件
-
代码示例
lisp(defun c:writefile() ;getfiled函数:对话框的名称,默认文件夹路径,过滤后缀名,flag ;getfiled返回的是文件的绝对路径,是字符串 (setq filepath (getfiled "选择要预览的对话框所在的文件" "C:\\Users\\" "txt" 7)) ;返回文件的操作符 ;w:有则覆盖,没有则新建。a:有则追加,无则新建 (setq file (open filepath "w")) (write-line "0,0" file) (write-line "100,0" file) (close file) )
-
对话框选择
1.2 读文件
-
代码示例
lisp(defun c:readfile() ;getfiled返回的是文件的绝对路径,是字符串 (setq filepath (getfiled "选择要预览的对话框所在的文件" "C:\\Users\\" "txt" 2)) ;返回文件的操作符 (setq file (open filepath "r")) ;操作文件操作符 (setq fdata (read-line file)) ;注意:这里演示可以把一个命令拆分成几块 (command "pline") (while fdata (command fdata) (setq fdata (rade-line file)) ) (command "") (close file) (print) )
-
对话框选择
二、对话框DCL
- DCL:Dialog Control Language,对话框控制语言,后缀名dcl,定义对话框样式布局。
- 重点:一定别忘了
分号
,一定要用英文标点
2.1 初识对话框
-
显示效果
按确认:会在命令行输出"确认",temp.lsp中定义 -
temp.dcl
c// 冒号后面为控件名字 // 对话框的名字:demo1_dcl demo1_dcl:dialog{ // 中括号内为属性 label="对话框名"; // 中括号内也可以包含空间 :text{ // 控件中的属性 label="对话框内容"; } // cad封装好的控件 ok_cancel; }
-
temp.lsp(完全版,可以作为模版)
lisp(defun C:demo1 () ;选择dcl对话框文件:一个对话框文件中可以包含多个对话框 (setq dlg_file (getfiled "选择要预览的对话框所在的文件" "C:\\Users\\" "dcl" 2)) (if (= dlg_file nil) (exit)) ;选择对话框文件中的demo1_dcl命名的对话框:有此提示时候输入demo1_dcl (setq dlg_name (getstring "\n输入对话框名称:")) (if (= dlg_name "") (exit)) ;加载dcl对话框文件:返回加载标识符,如果只有文件名,则搜索默认路径,见代码下注释 (setq dlg_id (load_dialog dlg_file)) ;加载失败退出 (if (< dlg_id 0) (exit)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;用于保存对话框操作状态 (setq std 0) ;创建对话框对象,此时还没显示对话框,可以向对话框中添加东西 (if (not (new_dialog dlg_name dlg_id))(exit)) ;此处有两个key值:accept,cancel,是系统封装的确定取消按钮控件的key名 ;确认是accept,取消是cancel ;done_dialog函数:结束当前对话框并指定一个结束码, ;通常用来判断用户点击了哪个控件 (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") ;启动对话框:开始接受使用者输入,对话框获得控制权 (setq std (start_dialog)) ;卸载对话框:控制权还给cad主程序 (unload_dialog dlg_id) ;根据std做相应动作 (if (= std 1) (print "确定")) (if (= std 0) (print "取消")) (print) )
- 默认搜索路径:通过(getvar "acadprefix")
C:\Users\Administrator\appdata\roaming\autodesk\autocad 2014\r19.1\chs\support;
C:\program files\autodesk\autocad 2014\support;
C:\program files\autodesk\autocad 2014\fonts;
C:\program files\autodesk\autocad 2014\help;
C:\program files\autodesk\autocad 2014\support\zh-cn;
C:\Program Files\Autodesk\AutoCAD 2014\drv;
- 默认搜索路径:通过(getvar "acadprefix")
-
temp.lsp(精简版)
lisp(defun C:demo1 () (setq dlg_file "C:\\Users\\Administrator\\Desktop\\code\\temp.dcl") (setq std 0) (setq dlg_id (load_dialog dlg_file)) (new_dialog "demo1_dcl" dlg_id) (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq std (start_dialog)) (unload_dialog dlg_id) (if (= std 1)(print "确定")) (if (= std 0)(print "取消")) (print) )
2.2 常用对话框界面
2.2.1 复选框、列表框
-
temp.dcl
cdemo1_dcl:dialog{ label="带边框的单复选框"; // row控件中的元素都在一行 // boxed_row带边框的行 :row{ //带外边框的列 :boxed_column{ label="水果"; // 复选框 :toggle{ label="苹果"; } // value=1默认选中,预设值 :toggle{ label="香蕉"; value=1; } :toggle{ label="石榴"; } } // 清单选框 :list_box{ label="蔬菜"; // 直接换行分割 list="西红柿\n黄瓜\n金针菇"; // 默认选择第三个,从0开始 value=2; // 开启多选(按住shift),没有则是单选 multiple_select=true; } } ok_cancel; }
-
效果
加载:temp.lsp及调出对话框同2.1
2.2.2 下拉框
-
temp.dcl
cdemo1_dcl:dialog{ label="带边框的单复选框"; spacer_1; :row{ :popup_list{ label="干果"; list="核桃\n夏威夷果\n杏仁"; // 默认选择第三个 value=2; // 右侧下拉框的宽度 edit_width=10; } } //加一个空行 spacer_1; ok_cancel; }
-
效果
2.2.3 文字输入框、单选点框
-
temp.dcl
cdemo1_dcl:dialog{ label="对话框名"; :row{ // 带边框的列,排版用 :boxed_column{ label="坐标"; :edit_box{ // &后的字母会有下划线,对应键盘快捷键 label="&X 坐标:"; // 输入框宽度 edit_width=10; } } :boxed_radio_row{ label="性别"; :radio_button{ label="male"; } :radio_button{ label="female"; } :radio_button{ label="middle"; value=1; } } } ok_cancel; }
-
效果
2.3 Lisp对dcl的驱动
-
temp.lsp精简模式
lisp(defun C:demo1 () (setq dlg_file "C:\\Users\\Administrator\\Desktop\\code\\temp.dcl") (setq std 0) ;加载对话框文件 (setq dlg_id (load_dialog dlg_file)) ;创建对话框对象,此时可以向里面加东西 (new_dialog "demo1_dcl" dlg_id) ;设置对应key值的value (setdata) ;设置对应两个按钮控件的回调函数,此处有两个 (action_tile "accept" "(getdata) (done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") ;显示对话框,同时控制权从cad主程序转给对话框 (setq std (start_dialog)) ;卸载对话框 (unload_dialog dlg_id) ;点确定做相应动作 (if (= std 1) (command "circle" (list x y) r) ) (if (= std 0) (print "取消") ) (command "zoom" "e") (print) ) ;获得控件对应key值的value:其是字符串 (defun getdata () (setq x (atof (get_tile "cir_x"))) (setq y (atof (get_tile "cir_y"))) (setq r (atof (get_tile "cir_r"))) ) ;设置控件对应key值的默认value:其是字符串 ;如果是radio等类型控件,则其value值是真假"0"、"1" ;如果是list等类型控件,则其value值是序号"0"、"1"、"2" (defun setdata () (set_tile "cir_x" "200.00") (set_tile "cir_y" "200.00") (set_tile "cir_r" "200.00") )
-
temp.dcl
cdemo1_dcl:dialog{ label="对话框名"; :boxed_row{ label="画圆"; :edit_box{ label="&X 坐标:"; edit_width=10; // 设置控件的key值 key="cir_x"; } :edit_box{ label="&Y 坐标:"; edit_width=10; // 设置控件的key值 key="cir_y"; } :edit_box{ label="&R 半径:"; edit_width=10; // 设置控件的key值 key="cir_r"; } } ok_cancel; }
-
显示效果
2.4 对话框按钮实现拾取
-
效果图
-
temp.dcl
cdemo1_dcl:dialog{ label="绘制圆"; :column{ :edit_box{ label="&R 半径:"; edit_width=10; key="cir_r"; } :boxed_column{ label="中心"; :button{ label="拾取中心点"; key="but_cir"; } :edit_box{ label="&X 坐标:"; edit_width=10; key="cir_x"; } :edit_box{ label="&Y 坐标:"; edit_width=10; key="cir_y"; } } } spacer_1; ok_cancel; }
-
temp.lsp
lisp(defun C:demo1 () (setq dlg_id (load_dialog "C:\\Users\\Administrator\\Desktop\\code\\temp.dcl" ) ) (if (< dlg_id 0) (exit)) ;为了使下面while启动,此处设置大于1的整型 (setq r 200 x 200 y 200 std 2) ;只要没点确认或取消,就一直循环 (while (> std 1) ;注意:每次循环都用相同的dcl文件创建一个新的对话框对象 (if (not (new_dialog "demo1_dcl" dlg_id))(exit)) ;设置控件value值 (setdata "cir_r" r "cir_x" x "cir_y" y) ;设置按钮动作,done_dialog函数可以关闭对话框 (action_tile "but_cir" "(getdata) (done_dialog 2)") (action_tile "accept" "(getdata) (done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") ;上面三个的done_dialog函数可以关闭对话框并返回std (setq std (start_dialog)) (if (= std 2) (progn (initget 1) (setq p (getpoint "\n请选择圆心")) (setq x (car p) y (cadr p)) ) ) ) ;跳出循环,卸载对话框 (unload_dialog dlg_id) ;针对确定、取消做动作 (if (= std 1)(command "circle" (list x y) r)) (if (= std 0)(print "取消")) ;退出前做了一次缩放 (command "zoom" "e") (print) ) ;;;获取当前控件key值对应的value,并设置x y r:dcl-》lisp ;;;用于计算 (defun getdata () (setq x (atof (get_tile "cir_x"))) (setq y (atof (get_tile "cir_y"))) (setq r (atof (get_tile "cir_r"))) ) ;;;设置当前控件key值对应的value:lisp -》dcl ;;;用于展示 (defun setdata (key_r r1 key_x x1 key_y y1) (set_tile key_r (rtos r1 2 2)) (set_tile key_x (rtos x1 2 2)) (set_tile key_y (rtos y1 2 2)) )