|
“ lisp二次开发CAD,进阶内容:图元组码操作+eval动态执行。” 01 — 需求简述 text文本,是CAD中一种重要的图元。 而多个text文本进行重复性操作,是一个常见的需求。 故,有必要寻求一个便捷方式。 02 — Lisp源码 (vl-load-com);;;==============================================================;;;功能:text文本内容综合处理;;;日期:zml84 于 2012-05-11(defun C:ttg (/ ss str i en ent PT TMP) (princ '\n功能:text文本内容综合处理') (if (and ;;1.提示用户,选取对象 (princ '\n>>>>>>>>>>>>>>>>>>>>>>>>>>>') (princ '\n>>>选择要处理的TEXT对象... ') (setq SS (ssget '((0 . 'TEXT')))) ;;2.提示用户,输入操作表达式 (princ (strcat '\n>>>小提示: I ----表示对象序号(0 1 2 ...)' '\n S ----表示TEXT对象内容' '\n X、Y、Z ----插入点X、Y、Z' '\n size ----字体高度' '\n layer ----对象图层名称' ) ) (setq STR (getstring t '\n请输入操作表达式: ')) (setq I 0) ) (repeat (sslength ss) (setq EN (ssname ss i) ent (entget en) s (cdr (assoc 1 ent)) ) (if (= (cdr (assoc 72 ent)) 0) (setq pt (cdr (assoc 10 ent))) (setq pt (cdr (assoc 11 ent))) ) (setq x (car pt) y (cadr pt) z (caddr pt) ) ;_插入点坐标 (setq size (cdr (assoc 40 ent)) ;_字体高度 layer (cdr (assoc 8 ent)) ;_对象图层名称 ) (if (setq ENT (entget en)) (progn (if (setq tmp (eval (read STR))) () (setq tmp STR) ) ;;更新文本内容 (entmod (subst (cons 1 (vl-princ-to-string tmp)) (assoc 1 ENT) ENT ) ) ) ) (setq I (1+ I)) ) ) (princ))03 — 代码详解 2025-02-07,使用 DeepSeek 对上面代码进行解释,结果如下: (未做删改,堪称完美) ![]() 这段代码是用AutoLISP编写的,用于在AutoCAD中对选定的TEXT对象进行综合处理。AutoLISP是AutoCAD的一种脚本语言,用于自动化绘图任务和扩展AutoCAD的功能。下面是对代码的详细解释: ### 代码结构 1. **加载AutoLISP扩展函数库**: 这行代码加载了AutoLISP的扩展函数库,使得可以使用一些高级函数(如`vl-princ-to-string`)。 2. **定义函数**: (defun C:ttg (/ ss str i en ent PT TMP) 定义了一个名为`ttg`的命令函数,用户可以在AutoCAD命令行中输入`ttg`来执行这个函数。`/ ss str i en ent PT TMP`表示这些变量是局部变量,不会影响全局变量。 3. **功能说明**: 这行代码在命令行中输出函数的用途说明。 4. **用户交互**: (if (and ;;1.提示用户,选取对象 (princ '\n>>>>>>>>>>>>>>>>>>>>>>>>>>>') (princ '\n>>>选择要处理的TEXT对象... ') (setq SS (ssget '((0 . 'TEXT')))) ;;2.提示用户,输入操作表达式 (princ (strcat '\n>>>小提示: I ----表示对象序号(0 1 2 ...)' '\n S ----表示TEXT对象内容' '\n X、Y、Z ----插入点X、Y、Z' '\n size ----字体高度' '\n layer ----对象图层名称' ) ) (setq STR (getstring t '\n请输入操作表达式: ')) (setq I 0) )这部分代码首先提示用户选择要处理的TEXT对象,然后提示用户输入一个操作表达式。操作表达式可以包含以下变量: - `I`:对象的序号(从0开始)。 - `S`:TEXT对象的内容。 - `X`、`Y`、`Z`:TEXT对象的插入点坐标。 - `size`:字体高度。 - `layer`:对象所在的图层名称。 5. **处理选定的TEXT对象**:
这部分代码遍历用户选定的所有TEXT对象,并根据用户输入的操作表达式更新每个TEXT对象的内容。具体步骤如下: - 获取当前TEXT对象的实体名称`EN`和实体数据`ent`。 - 获取TEXT对象的插入点坐标`pt`、字体高度`size`和图层名称`layer`。 - 使用`eval`函数对用户输入的操作表达式`STR`进行求值,并将结果赋值给`tmp`。 - 使用`entmod`函数更新TEXT对象的内容。 6. **结束函数**: (princ)这行代码表示函数执行完毕,返回`nil`。 ### 总结 这段代码的主要功能是允许用户选择多个TEXT对象,并根据用户输入的操作表达式对这些TEXT对象的内容进行批量修改。操作表达式可以引用TEXT对象的序号、内容、插入点坐标、字体高度和图层名称等属性。 04 — 运行效果 05 — 后记 使用 eval 函数,可以实现对用户输入的各种表达式,进行求值。极具灵活性。 DeepSeek 对代码的解释,也很惊艳。(远超我的预期,虽然部分内容略有瑕疵,但作为一个代码助手,是够用的) |
|
|