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 对话框按钮实现拾取
    • 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;
    }
    

返回目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架构篇28:业务高可用的保障-异地多活架构

文章目录 应用场景架构模式小结无论是高可用计算架构,还是高可用存储架构,其本质的设计目的都是为了解决部分服务器故障的场景下,如何保证系统能够继续提供服务。但在一些极端场景下,有可能所有服务器都出现故障。例如,典型的有机房断电、机房火灾、地震、水灾……这些极端…

【阿里云服务器数据迁移】 同一个账号 不同区域服务器

前言 假如说一台云服务器要过期了,现在新买了一台,有的人会烦恼又要将重新在新的服务器上装环境,部署上线旧服务器上的网站项目, 但是不必烦恼,本文将介绍如何快速将就旧的服务器上的数据迁移到新的服务器上. 包括所有的环境和网站项目噢 ! 步骤 (1) 创建旧服务器自定义镜像…

AI作画工具 stable-diffusion-webui 一键安装工具(A1111-Web-UI-Installer)

安装 下载最新版本确保你的 NVIDIA 显卡驱动程序是最新的&#xff08;起码不能太老&#xff09;启动安装程序在欢迎屏幕上单击下一步在屏幕上&#xff0c;选择要安装的内容如果你已经安装了 Python 3.10 和 Git&#xff0c;那么可以取消选中如果你不知道这些是什么&#xff0c…

Spring boot + Azure OpenAI 服务 1.使用 GPT-35-Turbo

Azure OpenAI 服务使用 GPT-35-Turbo 先决条件 maven 注意 beta.6 版本 <dependency><groupId>com.azure</groupId><artifactId>azure-ai-openai</artifactId><version>1.0.0-beta.6</version></dependency>问答工具类 pack…

Django介绍

一、介绍 Django是Python语言中的一个Web框架,Python语言中主流的web框架有Django、Tornado、Flask 等多种 优势:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等功能,是一个全能型框架,拥有自己的Admin数据管理后台,第三方工具齐全,性能折中 缺点:…

【深度学习:t-SNE 】T 分布随机邻域嵌入

【深度学习&#xff1a;t-SNE 】T 分布随机邻域嵌入 降低数据维度的目标什么是PCA和t-SNE&#xff0c;两者有什么区别或相似之处&#xff1f;主成分分析&#xff08;PCA&#xff09;t-分布式随机邻域嵌入&#xff08;t-SNE&#xff09; 在 MNIST 数据集上实现 PCA 和 t-SNE结论…

Sentinel:微服务守护神的崛起

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Sentinel&#xff1a;微服务守护神的崛起 前言Sentinel简介&#xff1a;微服务流控的新宠Sentinel工作原理 前言 想象一下你正在主持一场盛大的马拉松比赛&#xff0c;参赛者如潮水般汇聚&#xff0c…

换个思维方式快速上手UML和 plantUML——类图

和大多数朋友一样&#xff0c;Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西&#xff0c;对工程化工具十分厌恶&#xff0c;觉得它繁琐&#xff0c;需要记忆很多没有意思的东西。 但是之所以&#xff0c;肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻…

JVM篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、分代收集算法二、新生代与复制算法三、老年代与标记复制算法前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、分代…

数据结构(1)--> 顺序表

定义&#xff1a; 顺序表存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构&#xff0c;顺序表功能的实现借助于数组&#xff0c;通过对数组进行封装&#xff0c;从而实现增删查改的功能&#xff0c;严格意义上来说&#xff08;数组无法实现…

centos8源码安装python

前置条件&#xff0c;删除原来系统自带的python&#xff0c;如果系统自带的版本符合你的预期&#xff0c;就不用重新安装了。 yum remove python yum autoremove一、下载python 官网下载 这里是3.12.1版本 我的网盘下载 提取码&#xff1a;d8g1 文件名为Python-3.12.1.tgz 二…

Nginx进阶篇【五】

Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目&#xff0c;将其打包为war8.1.1.5.启动tomcat进…

MySQL:数据库索引详解

1、什么是索引&#xff1a; 索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树&#xff0c; B树和 Hash。 索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去找我们需要查的那个字…

深入理解TCP网络协议,三次握手

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08;bit&#xf…

【论文笔记】GPT,GPT-2,GPT-3

参考&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3【论文精读】 GPT Transformer的解码器&#xff0c;仅已知"过去"&#xff0c;推导"未来" 论文地址&#xff1a;Improving Language Understanding by Generative Pre-Training 半监督学习&#xff1…

Go 命令行解析 flag 包之通过子命令实现看 go 命令源码

上篇文章 介绍了 flag 中如何扩展一个新的类型支持。本篇介绍如何使用 flag 实现子命令&#xff0c;总的来说&#xff0c;这篇才是这个系列的核心&#xff0c;前两篇只是铺垫。 前两篇文章链接如下&#xff1a; Go 命令行解析 flag 包之快速上手 Go 命令行解析 flag 包之扩展…

网络原理——传输层1

1. 端口号 端口号标识了一个主机上运行的不同程序。在TCP/IP协议中&#xff0c;使用"源IP地址"、"源端口号"、"目的IP地址"、"目的端口号"和"协议号"这样一个五元组来标识一个通信。 端口号划分&#xff1a; 0 - 1023&am…

pytest教程-7-用例前后置方法

上一小节&#xff0c;我们学习了pytest跳过测试用例的方法&#xff0c;本小节我们讲解一下pytest用例的前后置方法。 在unittest中就有前置setup和后置teardown来处理测试用例执行前的准备工作&#xff08;浏览器驱动实例化&#xff0c;数据库连接等&#xff09;以及执行后的处…

常见の算法5

位图 一个int类型32字节&#xff0c;可以表示0-31这32个数出没出现过&#xff0c;出现过1没出现0&#xff0c;再扩大一点搞个数组&#xff0c;就可以表示0-1023出没出现过&#xff0c;一个long类型可储存64位 如何把10位组成的数&#xff0c;第四位由1改成零 package class05…

mcu短时间内发生多次中断,如何解决中断丢失问题?

问题 嵌入式开发中&#xff0c;如果中断A的处理函数执行时间长&#xff0c;某段时间内&#xff0c;快速来了2个中断A(例如&#xff1a;外部管脚输入信号变化)&#xff0c;则会导致第2个中断丢失。 我有几个疑问&#xff1a; 1.目前市面上的芯片&#xff0c;是否支持缓存中断标志…