明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 610|回复: 1

[源码] 多重引线标注改文字和直线的距离

[复制链接]
发表于 2025-2-13 09:29:33 | 显示全部楼层 |阅读模式
本帖最后由 woshilj 于 2025-2-13 09:31 编辑

没有学过编程,之前一直在这里当伸手党,最近deepseek比较火热,于是也用来写了一个小插件,写完也调试了很多遍,最后终于能跑了,当然代码写的不够好看,主打一个能跑就行现在直接分享源码,看看大佬们有空的话优化一下更美观。

  1. (defun c:CML (/ ss idx mleader entData textContent newContent obj)
  2.   ;; 选择多重引线
  3.   (prompt "\n选择多重引线: ")
  4.   (setq ss (ssget '((0 . "MULTILEADER"))))
  5.   (if ss
  6.     (progn
  7.       (setq idx 0)
  8.       (while (< idx (sslength ss))
  9.         (setq mleader (ssname ss idx))
  10.         (setq entData (entget mleader))
  11.         ;; 获取多重引线内的多行文字内容(组码 304)
  12.         (setq textContent (cdr (assoc 304 entData)))
  13.         
  14.         ;; 清除所有以 \p 开始、以 ; 结尾的格式代码(排除 \\p 的情况)
  15.         (setq textContent (remove-p-format-codes textContent))
  16.         
  17.         ;; 在文字最前面添加 \pxse1.2;
  18.         (setq newContent (strcat "\\pxse1.2;" textContent))
  19.         
  20.         ;; 在 \P 分隔符后添加行距参数
  21.         (setq newContent (add-line-spacing newContent))
  22.         
  23.         ;; 更新多重引线的多行文字内容
  24.         (setq entData (subst (cons 304 newContent) (assoc 304 entData) entData))
  25.         (entmod entData)
  26.         (entupd mleader)
  27.         
  28.         ;; 获取多重引线的 ActiveX 对象
  29.         (setq obj (vlax-ename->vla-object mleader))
  30.         
  31.         ;; 设置连接位置 - 左为第一行加下划线
  32.         (vlax-put obj 'TextLeftAttachmentType 3)
  33.         
  34.         ;; 设置连接位置 - 右为第一行加下划线
  35.         (vlax-put obj 'TextRightAttachmentType 3)
  36.         
  37.         ;; 设置箭头样式为无
  38.         (vlax-put obj 'ArrowheadType 19)
  39.         
  40.         ;; 设置基线距离为 0.5
  41.         (vlax-put obj 'DoglegLength 0.5)
  42.         
  43.         (setq idx (1+ idx))
  44.       )
  45.       (prompt "\n多重引线内多行文字段落行距修改完成,并设置连接位置为第一行加下划线,箭头样式为无,基线距离为 0.5。")
  46.     )
  47.     (prompt "\n未选择到多重引线。")
  48.   )
  49.   (princ)
  50. )

  51. ;; 辅助函数:清除所有以 \p 开始、以 ; 结尾的格式代码(排除 \\p 的情况)
  52. (defun remove-p-format-codes (text / pos1 pos2)
  53.   (setq pos1 0)
  54.   (while (setq pos1 (vl-string-search "\\p" text pos1))
  55.     ;; 检查 \p 前面是否有 \ 符号
  56.     (if (and (> pos1 0) (eq (substr text pos1 1) "\"))
  57.       (setq pos1 (+ pos1 2)) ;; 排除 \\p,继续查找下一个 \p
  58.       (progn
  59.         ;; 查找分号 ;
  60.         (setq pos2 (vl-string-search ";" text pos1))
  61.         (if pos2
  62.           (progn
  63.             ;; 删除 \p 到 ; 的内容
  64.             (setq text (strcat (substr text 1 pos1) (substr text (+ pos2 2))))
  65.             (setq pos1 0) ;; 重新开始查找
  66.           )
  67.           (setq pos1 (strlen text)) ;; 如果没有分号,结束查找
  68.         )
  69.       )
  70.     )
  71.   )
  72.   text
  73. )

  74. ;; 辅助函数:在 \P 分隔符后添加行距参数
  75. (defun add-line-spacing (text / pos1 pos2)
  76.   ;; 查找第一个 \P 的位置
  77.   (setq pos1 (vl-string-search "\\P" text))
  78.   (if pos1
  79.     (progn
  80.       ;; 在第一个 \P 后添加 \pxse0.25;
  81.       (setq text (strcat (substr text 1 (+ pos1 2)) "\\pxse0.25;" (substr text (+ pos1 3))))
  82.       
  83.       ;; 查找第二个 \P 的位置
  84.       (setq pos2 (vl-string-search "\\P" text (+ pos1 3)))
  85.       (if pos2
  86.         ;; 在第二个 \P 后添加 \psm0.6;
  87.         (setq text (strcat (substr text 1 (+ pos2 2)) "\\psm0.6;" (substr text (+ pos2 3))))
  88.       )
  89.     )
  90.   )
  91.   text
  92. )
插件的效果是让标注文字更贴近引线的直线。



后问一下各位大佬,怎么样调试插件和查看代码各个单词的意思?之前是一遍遍新建图纸再加载测试效果的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2025-2-14 11:44:44 | 显示全部楼层
** Error: no function definition: REMOVE-P-FORMAT-CODES **
差一个函数
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-5 11:50 , Processed in 0.171511 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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