明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: tranque

字段关联文字递增

[复制链接]
发表于 前天 14:14 | 显示全部楼层
tranque 发表于 2026-1-5 12:11
你把源码喂给国内AI,描述的详细点,国内AI分分钟就给你做出来一个适配07版本的

07自身的反应器不行,适配不了
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 15:53 | 显示全部楼层
水洗可口可乐 发表于 2026-1-5 14:14
07自身的反应器不行,适配不了

问完AI了,测试得靠你自己了,我没安装07版本的ACAD
要在 AutoCAD 2007 中完美运行这段代码,我们需要解决两个核心兼容性问题:
  • ObjectID 的获取方式:AutoCAD 2007 是较早的版本,不支持 GetObjectIdString 这种 64 位方法。在 2007 环境下,ObjectID 通常是一个 32 位整数,直接使用 vla-get-ObjectID 即可。
  • 字段表达式(Field)的格式:旧版本的字段语法对空格和斜杠较为敏感。
  • 刷新机制:2007 版本对 UPDATEFIELD 命令的支持及对象刷新机制与现代版本略有不同。

以下是适配 AutoCAD 2007 的优化版本:

  1. (vl-load-com)

  2. (defun c:NumLink (/ *error* js en ent vla-obj
  3.                     str-val pt
  4.                     obj-id field-str
  5.                     acad-obj doc util
  6.                     inc-val new-en)

  7.   ;; 1. 错误处理
  8.   (defun *error* (msg)
  9.     (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*")))
  10.       (princ (strcat "\n错误: " msg))
  11.     )
  12.     (if doc (vla-EndUndoMark doc))
  13.     (setvar "CMDECHO" 1)
  14.     (princ)
  15.   )

  16.   ;; 2. 初始化
  17.   (setq acad-obj (vlax-get-acad-object))
  18.   (setq doc (vla-get-ActiveDocument acad-obj))
  19.   (setq util (vla-get-Utility doc))

  20.   (vla-StartUndoMark doc)
  21.   (setvar "CMDECHO" 0)

  22.   ;; 3. 校验函数
  23.   (defun Is-String-Numeric (str)
  24.     (if (distof str) T nil)
  25.   )

  26.   ;; 4. 获取 ObjectID (适配 2007 32位环境)
  27.   (defun Get-Field-ObjectID (obj)
  28.     ;; 2007版本直接获取ObjectID即可,转换为字符串
  29.     (vl-princ-to-string (vla-get-ObjectID obj))
  30.   )

  31.   ;; 5. 主逻辑
  32.   (princ "\n请选择基准数字文字 (TEXT): ")

  33.   (if (setq js (ssget ":S" '((0 . "TEXT"))))
  34.     (progn
  35.       (setq en (ssname js 0))
  36.       (setq ent (entget en))
  37.       (setq vla-obj (vlax-ename->vla-object en))
  38.       (setq str-val (cdr (assoc 1 ent)))

  39.       (if (Is-String-Numeric str-val)
  40.         (progn
  41.           (setq obj-id (Get-Field-ObjectID vla-obj))
  42.           (setq inc-val 1)

  43.           ;; 循环放置
  44.           (while (setq pt (getpoint (strcat "\n放置位置 (当前基准 +" (itoa inc-val) ") [右键或ESC退出]: ")))

  45.             ;; 构建 2007 兼容的字段表达式
  46.             ;; 注意:2007 字段中的 ObjId 后面不一定需要额外的控制字符
  47.             (setq field-str
  48.               (strcat
  49.                 "%<\\AcExpr (%<\\AcObjProp Object(%<\\_ObjId "
  50.                 obj-id
  51.                 ">%).TextString>% + "
  52.                 (itoa inc-val)
  53.                 ") \\f \"%lu2%pr0\">%"
  54.               )
  55.             )

  56.             ;; 生成文字 (entmake 在 2007 中非常稳定)
  57.             (setq new-en
  58.               (entmake
  59.                 (list
  60.                   '(0 . "TEXT")
  61.                   '(100 . "AcDbEntity")
  62.                   '(100 . "AcDbText")
  63.                   (cons 10 pt)
  64.                   (cons 40 (cdr (assoc 40 ent)))
  65.                   (cons 1 field-str)
  66.                   (cons 7 (cdr (assoc 7 ent)))
  67.                   (cons 8 (cdr (assoc 8 ent)))
  68.                   (if (assoc 62 ent) (assoc 62 ent) '(62 . 256)) ; 随层颜色
  69.                   (cons 50 (cdr (assoc 50 ent)))
  70.                   (cons 41 (cdr (assoc 41 ent)))
  71.                 )
  72.               )
  73.             )

  74.             ;; 刷新显示
  75.             (if new-en
  76.               (progn
  77.                 (setq new-obj-ename (entlast))
  78.                 ;; 2007 中字段有时需要 Regen 或 UpdateField
  79.                 (vl-cmdf "_.UPDATEFIELD" new-obj-ename "")
  80.                 (entupd new-obj-ename)
  81.               )
  82.             )

  83.             (setq inc-val (1+ inc-val))
  84.           )
  85.         )
  86.         (princ "\n错误: 所选文字不是有效的数字。")
  87.       )
  88.     )
  89.     (princ "\n未选中 TEXT 对象。")
  90.   )

  91.   (vla-EndUndoMark doc)
  92.   (setvar "CMDECHO" 1)
  93.   (princ)
  94. )

  95. (princ "\n适配版 NumLink 已加载。输入 NUMLINK 运行。")
  96. (princ)

回复 支持 反对

使用道具 举报

发表于 前天 16:54 | 显示全部楼层
年底了,楼主这头像,哈哈哈。
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 17:10 | 显示全部楼层
tigcat 发表于 2026-1-5 16:54
年底了,楼主这头像,哈哈哈。

被他发自内心的真心笑容感染了,这个瞬间,我想张子强先生一定是自豪和幸福的
回复 支持 1 反对 1

使用道具 举报

发表于 前天 22:13 | 显示全部楼层
感谢分享。  
回复 支持 反对

使用道具 举报

发表于 前天 22:29 | 显示全部楼层
应用上可以搭配流水号 ,图面编号使用,收藏!
回复 支持 反对

使用道具 举报

发表于 昨天 11:29 | 显示全部楼层
牛啊 学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2026-1-7 10:49 , Processed in 0.162424 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表