分享

【lisp】进阶:text文本内容综合处理

 微微南来的风 2025-02-08 发布于河南

 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扩展函数库**:

(vl-load-com) 

   这行代码加载了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. **功能说明**:

(princ '\n功能:text文本内容综合处理'

   这行代码在命令行中输出函数的用途说明。

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对象**:

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

   这部分代码遍历用户选定的所有TEXT对象,并根据用户输入的操作表达式更新每个TEXT对象的内容。具体步骤如下:

   - 获取当前TEXT对象的实体名称`EN`和实体数据`ent`。

   - 获取TEXT对象的插入点坐标`pt`、字体高度`size`和图层名称`layer`。

   - 使用`eval`函数对用户输入的操作表达式`STR`进行求值,并将结果赋值给`tmp`。

   - 使用`entmod`函数更新TEXT对象的内容。

6. **结束函数**:

(princ)

   这行代码表示函数执行完毕,返回`nil`。

### 总结

这段代码的主要功能是允许用户选择多个TEXT对象,并根据用户输入的操作表达式对这些TEXT对象的内容进行批量修改。操作表达式可以引用TEXT对象的序号、内容、插入点坐标、字体高度和图层名称等属性。

04


运行效果

05


后记

使用 eval 函数,可以实现对用户输入的各种表达式,进行求值。极具灵活性。

 DeepSeek 对代码的解释,也很惊艳。(远超我的预期,虽然部分内容略有瑕疵,但作为一个代码助手,是够用的

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多