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

news2025/1/20 5:44:47

目录

  • 一、文件操作
    • 1.1 写文件
    • 1.2 读文件
  • 二、对话框DCL
    • 2.1 初识对话框
    • 2.2 常用对话框界面
      • 2.2.1 复选框、列表框
      • 2.2.2 下拉框
      • 2.2.3 文字输入框、单选点框
    • 2.3 Lisp对dcl的驱动
    • 2.4 对话框按钮实现拾取
    • 2.5 对话框加载图片
      • 2.5.1 幻灯片图片制作
      • 2.5.1 代码部分

一、文件操作

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

2.5 对话框加载图片

2.5.1 幻灯片图片制作

  • 步骤:
    • 新建cad绘制想展示的图片
    • 命令行输入:mslide,make slide的意思,制作幻灯片,保存即可
  • 图示
    在这里插入图片描述

2.5.1 代码部分

  • 效果
    在这里插入图片描述

  • temp.lsp

    (defun C:demo1 ()
      (setq	dlg_id (load_dialog
    		 "C:\\Users\\Administrator\\Desktop\\code\\temp.dcl")
      )
      (if (< dlg_id 0) (exit))
      (if (not (new_dialog "demo1_dcl" dlg_id)) (exit))
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;只有此区间新增
      (start_image "img_1")
      (slide_image 0 -20 (dimx_tile "img_1")(dimy_tile "img_1")
      		"C:\\Users\\Administrator\\Desktop\\code\\img_1.sld")
      (end_image)
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      (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)
    )
    
  • temp.dcl

    demo1_dcl:dialog{
    	label="image展示";
    	:row{
    		:column{
    			:image{
    				//先确定宽度,调整高度时不要同时调宽度
    				width=30;
    				//通过调整高度,使图像显示在中间,需要一点点试
    				height=10;
    				// 使背景色同主窗口
    				color=-2;
    				key="img_1";
    			}
    		}
    	}
    	ok_cancel;
    }
    

返回目录

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP 三次握手 四次挥手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…

CDSP认证:引领数据安全领域的权威之巅!

随着数据安全法和个人信息保护的施行&#xff0c;数据安全领域越来越受到重视。市场上涌现出众多数据安全相关的证书&#xff0c;而数据安全相关职位也成为了2023年最热门的职业之一。 &#x1f4a1;对于想要入门数据安全领域的小伙伴&#xff0c;我强烈推荐CDSP认证&#xff0…

【笔试常见编程题02】字符串中找出连续最长的数字串、数组中出现次数超过一半的数字、计算糖果、进制转换

1. 字符串中找出连续最长的数字串 读入一个字符串str&#xff0c;输出字符串str中的连续最长的数字串 输入描述 个测试输入包含1个测试用例&#xff0c;一个字符串str&#xff0c;长度不超过255。 输出描述 在一行内输出str中里连续最长的数字串。 示例 1 输入 abcd12345ed125s…

【前端】尚硅谷Node.js零基础视频教程笔记

文章目录 1.基础1.1. 基础命令1.2. 注意事项 2. Buffer&#xff08;缓冲器&#xff09;介绍与创建2.1 概念2.2 特点2.3 使用 3. fs模块(file system)3.1 文件写入3.2 文件读取 【前端目录贴】 参考视频: 尚硅谷Node.js零基础视频教程&#xff0c;nodejs新手到高手 1.基础 1.1.…

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法(LSBoost、Bag)含自动优化超参数和特征敏感性分析功能

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法&#xff08;LSBoost、Bag&#xff09;含自动优化超参数和特征敏感性分析功能 本文展示多种非常用多输入单输出回归预测模型效果。 注&#xff1a;每次运行数据训练集测试集为随机&#xff0c;故对比不严谨&…

搜维尔科技:【简报】元宇宙数字人赛道,《救食有道》!

在这个快速发展的数位时代里&#xff0c;本组相信透过制作融合虚拟人物 与 AI 智慧的创新宣传影片&#xff0c;定能为食物银行提高曝光率并让更多人 投身参与并落实减少食物浪费的行动&#xff0c;并与本组共同在生活中宣传食 物银行的理念 学校&#xff1a; 桃园市立中场商业高…

BTC的数据结构Merkle Tree和Hash pointer

比特币是一种基于区块链技术的加密数字货币&#xff0c;其底层数据结构被设计为分布式&#xff0c;去中心化的。它的核心数据结构是一个链式的区块&#xff0c;每个区块都包含了多笔交易记录和一个散列值。 比特币的底层数据结构使用了两个关键概念&#xff1a;hash pointer和…

【计算机网络】IP协议及动态路由算法

对应代码包传送门 IP协议及动态路由算法代码包及思科模拟器资料说明 相关文章 【计算机网络】中小型校园网构建与配置 【计算机网络】Socket通信编程与传输协议分析 【计算机网络】网络应用通信基本原理 目的&#xff1a; 1、掌握IP协议&#xff0c;IP分片&#xff0c;DH…

JCEF学习

JCEF重要概念 CEF CEF&#xff0c;全称Chromium Embedded Framework &#xff0c;它是基于Google Chromium的开源项目&#xff0c;它的目标是能够向第三方程序添加WEB浏览器功能&#xff0c;以及可以使用HTML、CSS和JS渲染界面。 CEF框架是由Marshall Greenblatt 在 2008 年创…

vue项目如何实现运行完项目就跳转到浏览器

在package.json中的启动命令中添加--open参数可以实现在Vue项目编译后自动打开浏览器的功能。 通过这样的设置&#xff0c;在运行npm run dev时&#xff0c;Vue项目编译完成后会自动打开默认浏览器并加载应用程序。

【问题解决】java-word转pdf踩坑

问题情境&#xff1a; 项目中采用word转pdf&#xff0c;最开始使用的pdf相关的apache的pdfbox和itextpdf&#xff0c;后面发现对于有图片背景的word转pdf的情景&#xff0c;word中的背景图会直接占用位置&#xff0c;导致正文不会正确落在背景图上。 解决方案&#xff1a; 采…

计算机网络——虚拟局域网+交换机基本配置实验

1.实验题目 虚拟局域网交换机基本配置实验 2.实验目的 1.了解交换机的作用 2.熟悉交换机的基本配置方法 3.熟悉Packet Tracer 7.0交换机模拟软件的使用 4.掌握在交换机上划分局域网&#xff0c;并且使用局域网与端口连接&#xff0c;检测信号传输 3.实验任务 1.了解交换…

C 变量

目录 1. C变量 2. C变量定义 2.1 变量初始化 2.2 C中的变量声明 3. C中的左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 1. C变量 在C语言中&#xff0c;变量可以根据其类型分为以下几种基本类型&#xff1a; 整型变量&#xff1a;用…

蓝桥小白赛4 乘飞机 抽屉原理 枚举

&#x1f468;‍&#x1f3eb; 乘飞机 &#x1f437; 抽屉原理 import java.util.Scanner;public class Main {static int N 100010;static int[] a new int[N];public static void main(String[] args){Scanner sc new Scanner(System.in);int n sc.nextInt();int q s…

(南京观海微电子)——OLED驱动与调试

一、OLED DDIC分类 OLED DDIC的技术方向可以分为3类&#xff1a;带Ram【内存】的IC、Ram-less IC和TDDI【显示&触控集成的IC】 1、带Ram的OLED DDIC OLED DDIC有两个Ram&#xff0c;分别是Demura Ram和Display Ram。 1、带Ram的OLED DDIC 1-1&#xff09;Demura Ram&a…

取消Vscode在输入符号时自动补全

取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…

C语言第十一弹---函数(下)

​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…

STM32+ESP8266 实现物联网设备节点

目录 一、硬件准备 二、编译环境 三、源代码地址 四、说明 五、测试方法 六、所有测试工具和文档 本项目使用stm32F103ZEesp8266实现一个物联网的通信节点&#xff0c;目前支持的协议有mqtt&#xff0c;tcp。后续会持续更新&#xff0c;增加JSON&#xff0c;传感器&#…

MySQL 聚集与非聚集索引

文章目录 1.聚集索引1.1 介绍1.2 优点1.3 缺点 2.非聚集索引3.区别参考文献 MySQL 中&#xff0c;根据索引树叶结点存放数据行还是数据行的地址&#xff0c;可以将索引分为两类&#xff1a; 存放数据行&#xff1a;聚集索引存放数据行地址&#xff1a;非聚集索引 InnoDB 使用聚…

VSCode 1.85.0更新的3个实用功能

1、单个文件可直接拖拽为独立窗口 当单文件过长&#xff0c;直接分成两个视图就不用上下频繁滚动 2、将终端移动到编辑器区域 此时&#xff0c;终端也可像文件一样拖拽为独立窗口 3、文件夹目录粘性头部 默认关闭&#xff0c;需要设置 "workbench.tree.enableStickyScro…