fangmin723 发表于 2024-4-8 07:56:51

MText Line Space 多行文字行间距修改

本帖最后由 fangmin723 于 2024-4-8 13:23 编辑

在CAD帮助中,对多行文字的行距有具体的介绍,介绍如下:

行距

指定多行文字对象的行距。行距是一行文字的底部(或基线)与下一行文字底部之间的垂直距离。


注: 用 MTEXT 创建表格时最好使用精确间距。请使用比指定的行距小的文字高度以保证文字不互相重叠。


[*]至少。根据行中最大字符的高度自动调整文字行。当选定“至少”时,包含更高字符的文字行会在行之间加大间距。


[*]距离。将行距设定为以图形单位测量的绝对值。有效值必须在 0.0833 (0.25x) 和 1.3333 (4x) 之间。


[*]精确。强制多行文字对象中所有文字行之间的行距相等。间距由对象的文字高度或文字样式决定。


[*]间距比例。将行距设定为单倍行距的倍数。

单倍行距是文字字符高度的 1.66 倍。可以以数字后跟 x 的形式输入行距比例,表示单倍行距的倍数。


例如,输入 1x 指定单倍行距,输入 2x 指定双倍行距。

上述文字中说,单倍行距是文字字符高度的 1.66 倍,即:文字高度是行距的0.6倍
(progn;;;(MLS)MText Line Space 多行文字行间距修改 by 702099480@qq.com 2023.5.11
(defun c:mls(/ dxf44 edata ei ent n rdis si ss str);;CAD快捷命令MLS
    (if (setq ss (ssget '((0 . "MTEXT"))))
      (progn
      (if (= nil (setq rdis (getreal "\n输入新行距【0.25~4.00】,默认<0.6>:"))) (setq rdis 0.6))
      (if (< rdis 0.25) (setq rdis 0.25))
      (if (> rdis 4.0) (setq rdis 4.0))
      (setq n -1)
      (while (setq ent (ssname ss (setq n (1+ n))))
          (setq edata (entget ent) str (cdr (assoc 1 edata)))
          ;;;(setq edata (entget (car (entsel))) str (cdr (assoc 1 edata)))
          (if (wcmatch str "*\\psm#.##;*,*\\psm#.#;*,*\\psm#;*")
            (progn
            (setq si (1+ (vl-string-search "\\psm" str)))
            (setq ei (1+ (vl-string-search ";" str (1+ si))))
            ;;如果采用注释部分时修改行号后,在读取内容时会有乱码,暂不考虑
            ;;(setq ow (substr str si (- ei si -1)))
            ;;(setq nw (strcat "\\psm" (rtos rdis 2 2) ";"))
            ;;(setq str (vl-string-subst nw ow str))
            ;;(setq edata (subst (cons 1 str) (assoc 1 edata) edata))
            (setq str (vl-string-subst "" (substr str si (- ei si -1)) str))
            (setq edata (subst (cons 1 str) (assoc 1 edata) edata))
            )
          )
          (if (setq dxf44 (assoc 44 edata))
            (setq edata (subst (cons 44 rdis) dxf44 edata))
            (setq edata (append edata (list (cons 44 rdis))))
          )
          (entmod edata)
      )
      )
    )
    (princ (strcat "共修改【" (rtos (sslength ss)) "】个多行文字!"))
    (prin1)
)
(princ "\n多行文字行间距修改快捷命令 << MLS >>")
(prin1)
)

qazxswk 发表于 7 天前

本帖最后由 qazxswk 于 2025-4-23 18:59 编辑

我来更新一下,借花献佛,在浩辰CAD中,支持修改多行文字与多重引线文字。在AutoCAD里不支持修改多重引线文字。可能原因是,多重引线有两个304组码,AutoCAD读取混乱了。

(defun c:11(/ dxf44 dxf45 edata ei ent n rdis si ss s0 str)
    (if (setq ss (ssget '((0 . "MTEXT,MULTILEADER"))))
      (progn
      (if (= nil (setq rdis (getreal "\n输入新行距【0.25~4.00】,默认<0.6>:"))) (setq rdis 0.6))
      (if (< rdis 0.25) (setq rdis 0.25))
      (if (> rdis 4.0) (setq rdis 4.0))
      (setq n -1)
      (while (setq ent (ssname ss (setq n (1+ n))))
      (setq s0 (cdr (assoc 0 (entget ent))))
         (cond
      ((member s0 '("MTEXT"))
      (setq edata (entget ent) str (cdr (assoc 1 edata)))
          (if (wcmatch str "*\\psm#.##;*,*\\psm#.#;*,*\\psm#;*")
            (progn
            (setq si (1+ (vl-string-search "\\psm" str)))
            (setq ei (1+ (vl-string-search ";" str (1+ si))))
            (setq str (vl-string-subst "" (substr str si (- ei si -1)) str))
            (setq edata (subst (cons 1 str) (assoc 1 edata) edata))
            ) )
       (if (setq dxf44 (assoc 44 edata))
            (setq edata (subst (cons 44 rdis) dxf44 edata))
            (setq edata (append edata (list (cons 44 rdis))))
          )
      (entmod edata))
      
      ((member s0 '("MULTILEADER"))
      (setq edata (entget ent) str (cdr (assoc 304 edata)))
         (if (wcmatch str "*\\psm#.##;*,*\\psm#.#;*,*\\psm#;*")
            (progn
            (setq si (1+ (vl-string-search "\\psm" str)))
            (setq ei (1+ (vl-string-search ";" str (1+ si))))
            (setq str (vl-string-subst "" (substr str si (- ei si -1)) str))
            (setq edata (subst (cons 304 str) (assoc 304 edata) edata))
            ) )
      (if (setq dxf45 (assoc 45 edata))
            (setq edata (subst (cons 45 rdis) dxf45 edata))
            (setq edata (append edata (list (cons 45 rdis))))
          )
      (entmod edata))
      );;cond
      )
      )
    )
    (princ (strcat "共修改【" (rtos (sslength ss)) "】个多行文字!"))
    (princ))

黄翔 发表于 7 天前

(defun c:mls( / _entn _nn _rdis _ss)
(if (setq _ss (ssget '((0 . "MTEXT"))))
   (progn
      (setq _rdis (getreal "\n输入新行距【0.25~4.00】,默认<0.6>:"))
      (setq _rdis (cond((null _rdis) 0.6)((< _rdis 0.25) 0.25)((> _rdis 4.0)4.0)(T _rdis)))
      (repeat (setq _nn (sslength _ss))
      (setq _entn (ssname _ss (setq _nn (1- _nn))))   
      (vla-put-LineSpacingFactor (vlax-ename->vla-object _entn) _rdis)                       
      )   
   )
))我也来一个

xiaofeixia007 发表于 2024-4-8 11:09:52

期待更新!!!

lxl217114 发表于 2024-4-8 12:59:08

大神新作,感谢分享

jkop 发表于 2024-4-8 13:51:16

简洁、快速的修改多行文字,很方便,推!

lifenwei 发表于 2024-4-8 15:56:45

好东西。可以很高效。

zhangrunze 发表于 2024-4-11 16:17:21

快速修改行距~
不错,学习了~

fangmin723 发表于 7 天前

xiaofeixia007 发表于 2024-4-8 11:09
期待更新!!!

更新啥???

qazxswk 发表于 7 天前

我的想法,想找到控制这个行间距的系统变量,把它设为固定值。

fangmin723 发表于 7 天前

黄翔 发表于 2025-4-23 10:22
我也来一个

如果是用*\\psm#.##;*,*\\psm#.#;*,*\\psm#;*这些格式符控制的,你这种方法还能修改吗
页: [1] 2
查看完整版本: MText Line Space 多行文字行间距修改