




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档 1欢迎下载 Autolisp 编程心得 1 养成良好的书写习惯 众所周知 Lisp 是一种表结构语言 括号必须成对出现 在调试时往往为遗漏了一个括号 大 费周折 所以 养成一个好的编程习惯是学好 Lisp 所必须的 选择一个较好的编辑器 这是一个基本条件 建议使用 Visual Lisp 编辑器或 Lisplink 等 专用编辑器 此类编辑器可以对函数突出显示 按 Lisp DCL 专有格式书写 并经常对程序进行 格式化 及时发现语法错误 并有 利于调试是查找错误 使用自定义函数 并辅助以适当得注释 在较大程序中按功能使用自定义函数可以使得 程 序条理化 2 函数中循环与转移的使用 在高级语言中一般有类似 goto 的语句实现转移 在 AutoLisp 中没有转移的函数 我们 可 以使用自定义函数实现转移 用 if 及 cond 辅助实现条件转移 当我们需要实现在满足一定条件时进行循环的功能 一般使用 while 函数 但有时需要判 断 的条件较复杂时 使用 while 函数往往不能实现或使得程序不够简洁 这时我们可以使用 转 移 将需要实现的功能作为 子 函数 使用恰当 可以在程序中任意 转移 一般认为 当一段代码在不同处重复使用时 我们才会使用子函数定义 其实 利用函数 的 更大的优点是使得程序更加结构化 这就使得我们不必拘泥于程序中的循环语句 而使用函数 的 循环调用 辅助适当的判断 实现 转移 如 A B A 当然也可以进行自身调用 构成一个 标准的 循环 如例一中 程序执行完毕返回 与 空选返回 两种情况如果使用循环语句 其条件是 完 全不同的 而将函数本身作为子函数调用 程序简洁明了 3 initget 函数中关键字 空格 的使用 空格可以被用作关键字 一般多用来定义鼠标右键退出 当用户输入函数不支持控制位 如 entsel nentsel nentselp 时 可直接使用 initget 当用户输入函数支持控制位 如 getpoint 等 时 可使用 initget 1 禁止空 输 入 而将回车等空输入作为关键字使用 当同时使用其它关键字时 应该将空格作为一系列关键字的最后一个 用 精品文档 2欢迎下载 initget C 两个空格 调用 否则无效 见例一 例一 defun ett ct initget C 关键字 C 及空格 setq s0 entsel n 设置颜色 C 选取文本 cond s0 C ett col 转设置颜色子函数 s0 nil 空格退出 and type s0 LIST 选择实体 cdr assoc 0 entget car s0 TEXT 判别文本 操作内容 ett ct 编辑后返回选择 t ett ct 空选返回选择 有时需要进行复杂的判断 使用如 s0 语句可能不能准确判别输入的空格关键字 与空选择 可以使用 type s0 STR 语句 4 Lisp 的暂停与 while 的特殊使用 Lisp 一般在交互输入时才会暂停 如果只需要实现屏幕显示暂停 可使用 grread 函数 grread 函数对所有合法的输入设备均会作出反应 有时我们只希望对键盘有反应 可使用 while 函数进行循环 princ nPress ENTER to continue while car grread 2 while 用于满足一定条件的循环 其标准语法为 while testexpr expr 其中 expr 解释为 在 testexpr 为 nil 之前要求值的一个或多个表达式 为可选项 在 R14 之前没有方括号 但仍为可选项 正常我们使用 while 时 总会有 expr 项 更多的时候 我们是为了 expr 项才会使用这种 循环 语句 所有我们往往有 expr 项是不可缺少的感觉 这里我们使用 while 函数的语法是 while 函 数的 特例 即没有 expr 项的情况 如果希望对鼠标右键同时反应 可以使用 精品文档 3欢迎下载 princ nPress ENTER to continue while and setq a car grread 2 键盘 a 11 鼠标右键 SHORTCUTMENU 0 a 25 鼠标右键 SHORTCUTMENU 0 5 输入距离 Lisp 语言中输入距离的函数为 getdist 但我们有时需要输入负值 有时需要在输入距离 的 同时得到角度 使用 getdist 函数就显得无能为力 这时 我们可以灵活使用其它交互输入函 数 如 getpoint getcorner 等 通过计算得到我们所需要的值 例二是一段输入长度的同时得到默认角度的代码 使用 getpoint 函数 例二 setq pt0 getpoint n 直线基点 pt1 getpoint pt0 n 直线长度 长度及角度可用键盘或鼠标定位 dst distance pt0 pt1 计算长度 ang angle pt0 pt1 计算默认角度 ang1 getangle pt0 strcat n 直线方向 例三是可以按阵列方式输入行列间距的代码 输入距离为正值 修改部分代码可输入负值 使用 getcorner 函数 同时使用 initget 的控制位 128 例三 defun lc dist initget 128 允许任意输入 setq disr getpoint n 指定单位单元或输入行间距 if type disr LIST 鼠标输入 progn initget 1 setq dis getcorner disr n 指定对角点 鼠标输入对角 disc abs car dis car disr 正值行距 disr abs cadr dis cadr disr 正值列距 计算行列间距 if type disr STR 键盘输入行距 if setq dis distof disr 判断输入的是否距离 progn initget 6 精品文档 4欢迎下载 setq disc getdist n 输入列间距 输入列距 progn 键盘输入格式不符返回 princ n 需要正数值或两个二维角点 lc dist progn 空输入返回 princ n 需要正数值或两个二维角点 lc dist 6 数学运算函数的数量界限 在 Lisp 中对表中数据进行求和 求最大值等数学运算时 往往直观的对表直接赋予运算函 数 使用语句如 eval cons MAX numlist 一般都可以进行计算 但当表中数据数量大于 255 时 将会出现错误 bad argument value does not fit in byte 256 对于这种情况 我们不必对数据表进行分段 可以直接使用函数 apply 语法更简单 apply MAX numlist apply 可将数据表传送给指定的函数进行求值而不受数据数量的影响 受表中数据数量影响的数学运算函数有 max min logand 及 logior 7 选择集与表 选择集是一种特殊结构的表 只能通过特定的函数进行操作 但这些函数对大量重复的操 作 只能通过循环实现 显得力不从心 不能体现 Lisp 语言表结构的优越性 其实我们只要通过存取实体名或实体句柄 将它们存为一个普通结构的表 完全可以通过 常 规表操作函数实现对实体的操作 例四是一段使用 apply mapcar 函数联合求文本选择集中文本基点最大 y 值得代码 只是 一个 示例 如果结合 VL sort 函数 可轻松实现对文本的排序 例四 setq sl nil i 1 repeat sslength setq ss ssget 0 TEXT 选择文本 setq i 1 i en ssname ss i 从选择集中取出文本 sl cons en sl 构造包含实体名的表 精品文档 5欢迎下载 setq maxy apply max 求文本基点最大 y 值 mapcar lambda x caddr assoc 10 entget x 提取 y 值 sl 当然 选择集也有其优势的一面 比如对选择集中实体的删除操作非常简单 选择集中的 实 体不会重复及选择集可以与 Acad 命令交互使用等特征是一般表所不具备的 所以 编程时应根 据 程序要求 灵活运用 8 cal 的使用与加载 Acad 随机附带了一些外部定义命令 其中 cal 计算器 命令是最常用的命令之一 在加 载 gromcal arx 后 cal 可以在 Lisp 程序中像其它函数一样使用 这就使得我们在程序中对文本的 四则 运算处理变得简单 如 cal 1 2 3 其中字符串 1 2 3 可以从图形的文本中提取 也 可 以是符合 cal 要求格式的任一字符串 详见 Acad 联机帮助 需要注意的是 在 Acad 中 gromcal arx 只能加载一次 重复加载将使 Acad 以外退出 无 提示 需要使用 cal 函数的 Lisp 程序 应在程序尾部加上以下代码 if or type c cal LIST R14 使用 type c cal SUBR R2000 使用 arxload geomcal arx 9 Undo 处理 一个完善的程序应该有较好的出错处理 这是在所有 Lisp 教材上都提及的 但程序的 Undo 处理就说得很少或没有提及 其实 Undo 处理对程序来说也是非常重要的 尤其对有较多输出的复杂程序而言 不能解决 Undo 问题 使用起来会极不方便 对于 Undo 问题的解决 一种方法是尽量少用或不用 command 函数 即不调用原始命令 这 是一种较好的方法 但必须注意的是 一段程序必须至少有一次调用 command 函数 否则 Undo 命令将取消程序运行前的前一次命令 解决的方法是在程序运行的起始位置加一个无谓的 精品文档 6欢迎下载 command 如 command color 有时不使用 command 函数不能达到我们要求的一些功能 或使得程序过于复杂 我们可能 需要使用一些 command 函数 原始命令 这是就应该在程序中进行 Undo 处理 即使用 Undo 命令的编组功能 例五是一段程序出错函数与 Undo 处理的示例 例五 defun newerr s 出错函数 if s progn term dialog 使用对话框时使用 if olderr setq error olderr 出错函数恢复 if oldvar setvar oldvar 系统变量恢复 if olderr setq error olderr 出错函数恢复 command undo e Undo 编组结束 princ defun c my 主程序 主函数 setvar cmdecho 0 取消命令回显提示 command undo BE Undo 编组开始 setq olderr error error newerr 调用自定义出错函数 setq oldvar getvar 保存相关系统变量 setvar 设置系统变量 程序段 setvar oldvar 恢复系统变量 setq error olderr 恢复出错函数 command undo E 结束 Undo 命令编组 princ 取消程序返回值 10 程序调试时块注释的使用 我们经常会加上或屏蔽一段代码辅助程序调试 此时最常用的是在需要暂时屏蔽的代码前 使 用行注释符号 对于较多的代码就需要使用块注释 如果一段代码需要频繁 屏蔽 将行注释与块注释组合使用 可以带来极大方便 下图是组合使用的示例 精品文档 7欢迎下载 ll j 附带了这个的图片 Vlisp 编程技巧摘要 1 1 如何获取多义线上的所有顶点 Code defun C getp ent PLTYPE obj vtx vtxlst n ptlst vl load com setq ent entsel n 选取多线 n if ent progn setq PLTYPE cdr assoc 0 entget car ent if or POLYLINE PLTYPE LWPOLYLINE PLTYPE progn setq obj vlax ename vla object car ent setq vtx vla get Coordinates obj setq vtxlst vlax safearray list vlax variant value vtx setq n 0 setq ptlst nil repeat length vtxlst 2 setq ptlst append ptlst list list nth n vtxlst nth 1 n vtxlst setq n n 2 if ptlst ptlst nil prompt n 选取实体不是多义线 if 精品文档 8欢迎下载 if 2 在对话框的文本栏里输入 怎样让它实时显示为密码 A 设计对话框时 控件的属性中加 password char srt dialog label 密码 edit box label 输入密码 key password password char fixed width true width 8 ok only defun c srt setq filename srt dcl if setq index value load dialog filename 0 装载对话框 progn setq dlgname srt if not new dialog dlgname index value exit 显视对话框 action tile password mypass action tile ok done dialog 0 start dialog alert n 不能载装指定的 DCL 文件定义的对话框 END IF princ defun mypass setq a1 value B 使用 DOSLib 输入密码的函数 3 怎样可以实现不用工具中的选项 来调出屏幕菜单 屏幕菜单切换 defun C pmmenu vl load com setq sd vla get display vla get preferences vlax get acad object 精品文档 9欢迎下载 if vla get displayscreenmenu sd vlax true vla put displayscreenmenu sd vlax false vla put displayscreenmenu sd vlax true vlax release object sd princ 4 怎么样用 Vlisp 来读取 AutoCAD 中搜索路径 vla get supportpath vla get files vla get preferences vlax get acad object 或 getenv ACAD 或 acet pref supportpath list 获取支持路径 5 如何捕获列表框 list box 的双击操作 在 edit box list box image button slider 中 有一个 reason 变量 用来 表示你执行了什么操作 在 list box 中 双击的变量值是 4 可在你的代码中加入判断 action tile listbox fun1 defun fun1 if reason 4 6 如何用 VLISP 创建目录 例如 A vl mkdir c hqd9639 B setq SYS vlax create object Scripting FileSystemObject setq FOLDER vlax invoke method SYS CREATEFOLDER c hqd9639 7 如何用 entsel 亮显选择物体 code if setq ent entsel nPick Object 精品文档 10欢迎下载 progn redraw car ent 3 redraw car ent 4 不亮显 8 如何隐藏选择实体 code if setq ent entsel nPick Object progn redraw car ent 1 隐藏实体 redraw car ent 2 显示实体 9 状态栏进度条的设计示例 defun c hqd1 acet ui progress 已经完成 100 setq x 0 while List hqd 11 如何在 CAD 中插入时间和日期 Code defun C inttime
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口琴考试题及答案
- 中兽医基础理论知到智慧树答案
- 药品购销员考试题及答案
- 幼儿园家长文明礼仪知识竞赛试题及答案
- 山西省工会财务知识竞赛考试题库-工会决算制度试题(附答案)
- 中学物理课堂教学基本技能训练知到智慧树答案
- 2025版绿色建筑瓦工劳务承包合同模板
- 2025版新媒体中心广告位租赁合同书
- 2025年物流配送中心停车场地租赁服务合同
- 2025版外汇借款合同与外汇市场波动应对策略及操作指南
- 物业管理中的控烟规章制度
- 云上贵州大数据(集团)有限公司招聘笔试冲刺题2024
- 反比例函数教材分析课件
- 空调工人安装合同模板
- Unit 8 Lets celebrate!教学设计2024-2025学年牛津译林版英语七年级上册
- 国际商务课件全套教程
- 22.3 实际问题与二次函数 课件 2024-2025学年人教版数学九年级上册
- 文言合集(1):120个文言实词小故事(教师版+学生版)
- 教科版(2024)小学科学一年级上册(全册)教案及反思(含目录)
- 【课件】2025届高三生物一轮复习备考策略研讨
- 中级会计师《经济法》历年真题及答案
评论
0/150
提交评论