CAD-autolisp(三)——文件、对话框

目录

  • 一、文件操作
    • 1.1 写文件
    • 1.2 读文件
  • 二、对话框DCL
    • 2.1 初识对话框
    • 2.2 常用对话框界面
      • 2.2.1 复选框、列表框
      • 2.2.2 下拉框
      • 2.2.3 文字输入框、单选点框
    • 2.3 Lisp对dcl的驱动
    • 2.4 对话框按钮实现拾取

一、文件操作

1.1 写文件

  • 代码示例
    (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 读文件

  • 代码示例
    (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
    // 冒号后面为控件名字
    // 对话框的名字:demo1_dcl
    demo1_dcl:dialog{// 中括号内为属性label="对话框名";// 中括号内也可以包含空间:text{// 控件中的属性label="对话框内容";}// cad封装好的控件ok_cancel;	}
    

  • temp.lsp(完全版,可以作为模版)
    (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;
  • temp.lsp(精简版)
    (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
    demo1_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
    demo1_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
    demo1_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精简模式
    (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
    demo1_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

    demo1_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

    (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))
    )
    

返回目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433568.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Visual Studio Code创建JavaScript运行环境【2024版】

用Visual Studio Code创建JavaScript运行环境 JavaScript 的历史 JavaScript 最初被称为 LiveScript&#xff0c;由 Netscape&#xff08;Netscape Communications Corporation&#xff0c;网景通信公司&#xff09;公司的布兰登艾奇&#xff08;Brendan Eich&#xff09;在 …

[C++开发 03_2/2 _ STL(185)]

知识点1&#xff1a;STL初始 概述&#xff1a; STL是标准模板库的意思&#xff0c;STL从广义上来讲分为&#xff1a;容器&#xff0c;算法&#xff0c;迭代器。 容器算法之间通过迭代器进行无缝连接。 知识点2&#xff1a;STL初始 2.1 STL诞生 C中面向对象的三大特性&#xff1…

YARN介绍

1 概念 YARN 是一个资源管理、任务调度的框架&#xff0c;主要包含三大模块&#xff1a;ResourceManager&#xff08;RM&#xff09;、 NodeManager&#xff08;NM&#xff09;、ApplicationMaster&#xff08;AM&#xff09;。其中&#xff0c;ResourceManager 负责所有资 源…

LVS 概念介绍

1、集群简介 集群概述 集群称呼来自于英文单词 cluster&#xff0c;表示一群、一串的意思&#xff0c;用在服务器领域则表示大量服务器的集合体&#xff0c;协同起来向用户提供系统资源&#xff0c;系统服务。通过网络连接组合成一个计算机组&#xff0c;来共同完一个任务。 …

Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )

目录 事务事务概念什么是事务事务四个特性&#xff08;ACID&#xff09; 搭建事务操作环境Spring 事务管理介绍注解声明式事务管理声明式事务管理参数配置XML 声明式事务管理事务操作&#xff08;完全注解声明式事务管理&#xff09;感谢阅读 开篇: 欢迎再次来到 Spring 5 学习…

记一个信息泄露到RCE

打点 开局一个登录框 信息收集 发现了一处接口泄露了部分信息 不过只有支付宝密钥的信息无法扩大危害&#xff0c;此时尝试寻找了一下其他同类型系统同样的接口&#xff0c;查看一下是否泄露的信息相同 因为如果相同就说明是静态的&#xff0c;没有价值横向收集 此时访问其他…

关于我写过那些MySQL专栏

写在文章开头 这是截至今日写过的文章汇总&#xff0c;对于关注笔者公众号有一段时间的读者都知道&#xff0c;笔者会每周对自己写过的文章整理至相关专栏&#xff0c;以便读者可以按需进行检索阅读。 你好&#xff0c;我叫sharkchili&#xff0c;目前还是在一线奋斗的Java开…

无需手动部署3分钟自动化搞定幻兽帕鲁游戏联机服务器搭建与好友一起玩

生存类游戏《幻兽帕鲁》异常火爆&#xff0c;大量玩家遭遇了卡顿、闪退、延迟高的糟糕体验&#xff0c;其实我们玩家也可以选择《幻兽帕鲁》的专用服务器模式&#xff0c;自行搭建服务器和好友畅玩&#xff0c;无需手动部署&#xff0c;3分钟自动化搞定游戏联机服务器搭建。 1…

代码随想录算法训练营第32天(贪心算法02● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

贪心算法 part02 122.买卖股票的最佳时机II解题思路 55. 跳跃游戏解题思路 45.跳跃游戏II &#xff08;来不及了 明天刷解题思路 122.买卖股票的最佳时机II 动态规划章节会重点讲买卖股票问题 本题解法很巧妙&#xff0c;大家可以看题思考一下&#xff0c;在看题解。 题目链接&…

Cybellum—信息安全测试工具

产品概述 由于软件和数据在汽车上的使用越来越多&#xff0c;汽车越来越“智能化”&#xff0c;汽车行业面临着重大的信息安全挑战。2021年8月&#xff0c;ISO/SAE 21434正式发布&#xff0c;标准中对汽车的信息安全提出了规范化的要求&#xff0c;汽车信息安全不容忽视。 Cyb…

HTML 曲线图表特效

下面是代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>基于 ApexCharts 的 HTML5 曲线图表DEMO演示</title><style> body {background: #000524; }#wrapper {padding-top: 20px;background: #000524;b…

Huggingface上传自己的模型

5.8更新几个比较坑的点 首先如果你的模型太大&#xff08;>5GB&#xff09;&#xff0c;那么需要使用下面的命令声明一下&#xff0c;否则无法push $ huggingface-cli lfs-enable-largefiles ./path/to/your/repo假如使用VScode提交&#xff0c;那么需要注意&#xff0c;在…