明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1849|回复: 8

[讨论] 多行文本转成单行的多行文本?

[复制链接]
发表于 2014-7-26 08:57 | 显示全部楼层 |阅读模式
网上找到一个程序,怎么会丢行?
  1. ;Explode MText
  2. ;Explodes Mtext into single lines of mtext
  3. ;Written by: cmwade77 @ theswamp.org - July 2014
  4. ;Bug: Currenlty Only works on the first two lines of mtext
  5. ;Work Around: Repeat use until all lines are exploded
  6. (defun c:explodemtext (/ *thisdrawing* *modelspace* *paperspace* Ent Object ObjectType Text pt1 style ct OldCt Width txtobj Layer LineCt Pt2 LSpace color)
  7.   (vl-load-com)
  8.   (setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object))
  9.         *modelspace*  (vla-get-ModelSpace *thisdrawing*)
  10.       *paperspace*  (vla-get-PaperSpace *thisdrawing*)
  11.   )
  12.   (setq Ent (nentselp "\rSelect text to explode: "))
  13.   (setq Object (vlax-ename->vla-object (car Ent))
  14.       ObjectType (vla-get-ObjectName Object)
  15.   )
  16.   (if (wcmatch ObjectType "*Text*")
  17.     (progn
  18.       (setq Text (vla-get-textstring Object)
  19.           pt1 (vla-get-InsertionPoint Object)
  20.           style (vla-get-StyleName Object)
  21.           Width (vla-get-width Object)
  22.           Layer (vla-get-Layer Object)
  23.           LSpace (vla-get-LineSpacingDistance Object)
  24.           pt1 (vlax-safearray->list (vlax-variant-value pt1))
  25.           color (vla-get-color Object)
  26.       )
  27.       (vla-delete Object)
  28.       (setq ct 1)
  29.       (setq LineCt 0)
  30.       (setq OldCt 1)
  31.       (while (<= ct (strlen Text))
  32.         (if (= (substr Text ct 2) "\\P")
  33.           (progn
  34.             (setq pt2 (vlax-3d-point (nth 0 Pt1) (- (nth 1 Pt1) (* LineCt LSPace)) (nth 2 Pt1)))
  35.             (setq NewText (substr Text OldCt (+ (- (- ct 1) OldCt) 1))
  36.                 OldCt (+ ct 2)
  37.                 LineCt (+ LineCt 1)               
  38.             )   
  39.             (if (or (/= (getvar "cvport") 1) (/= (getvar "tilemode") 0))
  40.               (setq txtobj (vla-AddMtext *modelspace* pt2 width NewText))
  41.               (setq txtobj (vla-AddMtext *paperspace* pt2 width NewText))
  42.             )
  43.             (vla-put-StyleName txtobj Style)
  44.             (vla-put-layer txtObj Layer)
  45.             (vla-put-color txtObj color)
  46.           )
  47.         )
  48.         (setq ct (+ ct 1))
  49.       )
  50.     )
  51.   )
  52. )

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-7-26 11:37 | 显示全部楼层
  1. ;Explode MText
  2. ;Explodes Mtext into single lines of mtext
  3. ;Written by: cmwade77 @ theswamp.org - July 2014
  4. ;Bug: Currenlty Only works on the first two lines of mtext
  5. ;Work Around: Repeat use until all lines are exploded
  6. ;The bug modfiy by: edata  @mjtd.com 2014-7-26

  7. (defun c:explodemtext (/ *thisdrawing* *modelspace* *paperspace* Ent Object ObjectType Text NEWTEXT pt1 style textlst  Width txtobj Layer LineCt Pt2 LSpace color)
  8.   (vl-load-com)
  9.   (setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object))
  10.         *modelspace*  (vla-get-ModelSpace *thisdrawing*)
  11.       *paperspace*  (vla-get-PaperSpace *thisdrawing*)
  12.   )
  13.   (setq Ent (nentselp "\rSelect text to explode: "))
  14.   (setq Object (vlax-ename->vla-object (car Ent))
  15.       ObjectType (vla-get-ObjectName Object)
  16.   )
  17.   (if (wcmatch ObjectType "*Text*")
  18.     (progn
  19.       (setq Text (vla-get-textstring Object)
  20.           pt1 (vla-get-InsertionPoint Object)
  21.           style (vla-get-StyleName Object)
  22.           Width (vla-get-width Object)
  23.           Layer (vla-get-Layer Object)
  24.           LSpace (vla-get-LineSpacingDistance Object)
  25.           pt1 (vlax-safearray->list (vlax-variant-value pt1))
  26.           color (vla-get-color Object)
  27.       )
  28.       (vla-delete Object)      
  29.       (setq LineCt 0)            
  30.       (setq textlst(parse12 Text "\\P"))      
  31.       (while (setq NewText(car textlst))
  32.         (setq pt2 (vlax-3d-point (nth 0 Pt1) (- (nth 1 Pt1) (* LineCt LSPace)) (nth 2 Pt1))
  33.               LineCt (+ LineCt 1))
  34.         (if (or (/= (getvar "cvport") 1) (/= (getvar "tilemode") 0))
  35.               (setq txtobj (vla-AddMtext *modelspace* pt2 width NewText))
  36.               (setq txtobj (vla-AddMtext *paperspace* pt2 width NewText))
  37.             )
  38.             (vla-put-StyleName txtobj Style)
  39.             (vla-put-layer txtObj Layer)
  40.             (vla-put-color txtObj color)
  41.         (setq textlst(cdr textlst))
  42.         )
  43.     )
  44.   )
  45. )
  46. ;;string delimiter
  47. ;;code By st788796
  48. (defun parse12 (str delimiter / POST STRL STRLST)
  49.   (setq strl (strlen delimiter))
  50.   (while (vl-string-search delimiter str)
  51.     (setq post (vl-string-search delimiter str))
  52.     (setq strlst (append strlst (list (substr str 1 post))))
  53.     (setq str (substr str (+ post (1+ strl))))
  54.   )
  55.   (vl-remove "" (append strlst (list str)))
  56. )

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 谢谢E大,心中除了感激还是感激!

查看全部评分

 楼主| 发表于 2014-7-26 12:10 | 显示全部楼层
edata 发表于 2014-7-26 11:37

E大,谢谢,其实我也用不上这个程序,只是在看到CAB在求助这样的程序,觉得奇怪,以他的能力应该能解决此类问题,所以把此问题拿到这里探讨,谢谢您的无私帮助!
发表于 2014-7-26 12:24 | 显示全部楼层
lucas_3333 发表于 2014-7-26 12:10
E大,谢谢,其实我也用不上这个程序,只是在看到CAB在求助这样的程序,觉得奇怪,以他的能力应该能解决此 ...

这个仅仅适用于换行符效果。
对于CAB的问题,也不能做到很好的解决。
 楼主| 发表于 2014-7-26 12:51 | 显示全部楼层
edata 发表于 2014-7-26 12:24
这个仅仅适用于换行符效果。
对于CAB的问题,也不能做到很好的解决。

哈哈,难怪,看来他的问题是有点复杂!
发表于 2014-7-26 13:02 | 显示全部楼层
他这个要全局分析所有转义代码,分析空行。转义代码控制字符显示高低等功能,如果仅仅分割换行符号,没有加上前面的转义字符,是不完整的。对于空行,也需要特殊处理,使之符号行距要求,如果有自动换行的,那么更糟糕。
 楼主| 发表于 2014-7-26 13:13 | 显示全部楼层
edata 发表于 2014-7-26 13:02
他这个要全局分析所有转义代码,分析空行。转义代码控制字符显示高低等功能,如果仅仅分割换行符号,没有加 ...

嗯,您的修改应该还是可以帮助一些人,比如cmwade77,哈哈,高手提出的问题,只有等待高手解决了。
发表于 2014-7-26 15:42 | 显示全部楼层
做到基本行距
格式分析。。。没时间。
  1. ;Explode MText
  2. ;Explodes Mtext into single lines of mtext
  3. ;Written by: cmwade77 @ theswamp.org - July 2014
  4. ;Bug: Currenlty Only works on the first two lines of mtext
  5. ;Work Around: Repeat use until all lines are exploded
  6. ;The bug modify by: edata  @mjtd.com 2014-7-26

  7. (defun c:explodemtext (/ *thisdrawing* *modelspace* *paperspace* Ent Object ObjectType Text NEWTEXT pt1 style textlst  Width txtobj Layer LineCt Pt2 LSpace color)
  8.   (vl-load-com)
  9.   (setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object))
  10.         *modelspace*  (vla-get-ModelSpace *thisdrawing*)
  11.       *paperspace*  (vla-get-PaperSpace *thisdrawing*)
  12.   )
  13.   (setq Ent (nentselp "\rSelect text to explode: "))
  14.   (setq Object (vlax-ename->vla-object (car Ent))
  15.       ObjectType (vla-get-ObjectName Object)
  16.   )
  17.   (if (wcmatch ObjectType "*Text*")
  18.     (progn
  19.       (setq Text (vla-get-textstring Object)
  20.           pt1 (vla-get-InsertionPoint Object)
  21.           style (vla-get-StyleName Object)
  22.           Width (vla-get-width Object)
  23.           Layer (vla-get-Layer Object)
  24.           LSpace (vla-get-LineSpacingDistance Object)
  25.           pt1 (vlax-safearray->list (vlax-variant-value pt1))
  26.           color (vla-get-color Object)
  27.       )
  28.       (vla-delete Object)      
  29.       (setq LineCt 0)            
  30.       (setq textlst(parse12 Text "\\P"))
  31.       (print textlst)
  32.       (while (setq NewText(car textlst))
  33.         (setq pt2 (vlax-3d-point (nth 0 Pt1) (- (nth 1 Pt1) (* LineCt LSPace)) (nth 2 Pt1))
  34.               LineCt (+ LineCt 1))
  35.         (if (or (/= NewText "")(/= NewText " "))
  36.           (progn
  37.             (if (or (/= (getvar "cvport") 1) (/= (getvar "tilemode") 0))
  38.               (setq txtobj (vla-AddMtext *modelspace* pt2 width NewText))
  39.               (setq txtobj (vla-AddMtext *paperspace* pt2 width NewText))
  40.               )
  41.             (vla-put-StyleName txtobj Style)
  42.             (vla-put-layer txtObj Layer)
  43.             (vla-put-color txtObj color)
  44.             )
  45.           )
  46.         (setq textlst(cdr textlst))
  47.         )
  48.     )
  49.   )
  50. )
  51. ;;string delimiter
  52. ;;code By st788796
  53. (defun parse12 (str delimiter / POST STRL STRLST)
  54.   (setq strl (strlen delimiter))
  55.   (while (vl-string-search delimiter str)
  56.     (setq post (vl-string-search delimiter str))
  57.     (setq strlst (append strlst (list (substr str 1 post))))
  58.     (setq str (substr str (+ post (1+ strl))))
  59.   )
  60.   (append strlst (list str))
  61.   ;(vl-remove "" (append strlst (list str)))
  62. )

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-7-26 15:46 | 显示全部楼层
edata 发表于 2014-7-26 15:42
做到基本行距
格式分析。。。没时间。

E大,不要花时间在这上面了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 17:37 , Processed in 0.427194 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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