多行文本转成单行的多行文本?
网上找到一个程序,怎么会丢行?;Explode MText;Explodes Mtext into single lines of mtext
;Written by: cmwade77 @ theswamp.org - July 2014
;Bug: Currenlty Only works on the first two lines of mtext
;Work Around: Repeat use until all lines are exploded
(defun c:explodemtext (/ *thisdrawing* *modelspace* *paperspace* Ent Object ObjectType Text pt1 style ct OldCt Width txtobj Layer LineCt Pt2 LSpace color)
(vl-load-com)
(setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object))
*modelspace*(vla-get-ModelSpace *thisdrawing*)
*paperspace*(vla-get-PaperSpace *thisdrawing*)
)
(setq Ent (nentselp "\rSelect text to explode: "))
(setq Object (vlax-ename->vla-object (car Ent))
ObjectType (vla-get-ObjectName Object)
)
(if (wcmatch ObjectType "*Text*")
(progn
(setq Text (vla-get-textstring Object)
pt1 (vla-get-InsertionPoint Object)
style (vla-get-StyleName Object)
Width (vla-get-width Object)
Layer (vla-get-Layer Object)
LSpace (vla-get-LineSpacingDistance Object)
pt1 (vlax-safearray->list (vlax-variant-value pt1))
color (vla-get-color Object)
)
(vla-delete Object)
(setq ct 1)
(setq LineCt 0)
(setq OldCt 1)
(while (<= ct (strlen Text))
(if (= (substr Text ct 2) "\\P")
(progn
(setq pt2 (vlax-3d-point (nth 0 Pt1) (- (nth 1 Pt1) (* LineCt LSPace)) (nth 2 Pt1)))
(setq NewText (substr Text OldCt (+ (- (- ct 1) OldCt) 1))
OldCt (+ ct 2)
LineCt (+ LineCt 1)
)
(if (or (/= (getvar "cvport") 1) (/= (getvar "tilemode") 0))
(setq txtobj (vla-AddMtext *modelspace* pt2 width NewText))
(setq txtobj (vla-AddMtext *paperspace* pt2 width NewText))
)
(vla-put-StyleName txtobj Style)
(vla-put-layer txtObj Layer)
(vla-put-color txtObj color)
)
)
(setq ct (+ ct 1))
)
)
)
)
;Explode MText
;Explodes Mtext into single lines of mtext
;Written by: cmwade77 @ theswamp.org - July 2014
;Bug: Currenlty Only works on the first two lines of mtext
;Work Around: Repeat use until all lines are exploded
;The bug modfiy by: edata@mjtd.com 2014-7-26
(defun c:explodemtext (/ *thisdrawing* *modelspace* *paperspace* Ent Object ObjectType Text NEWTEXT pt1 style textlstWidth txtobj Layer LineCt Pt2 LSpace color)
(vl-load-com)
(setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object))
*modelspace*(vla-get-ModelSpace *thisdrawing*)
*paperspace*(vla-get-PaperSpace *thisdrawing*)
)
(setq Ent (nentselp "\rSelect text to explode: "))
(setq Object (vlax-ename->vla-object (car Ent))
ObjectType (vla-get-ObjectName Object)
)
(if (wcmatch ObjectType "*Text*")
(progn
(setq Text (vla-get-textstring Object)
pt1 (vla-get-InsertionPoint Object)
style (vla-get-StyleName Object)
Width (vla-get-width Object)
Layer (vla-get-Layer Object)
LSpace (vla-get-LineSpacingDistance Object)
pt1 (vlax-safearray->list (vlax-variant-value pt1))
color (vla-get-color Object)
)
(vla-delete Object)
(setq LineCt 0)
(setq textlst(parse12 Text "\\P"))
(while (setq NewText(car textlst))
(setq pt2 (vlax-3d-point (nth 0 Pt1) (- (nth 1 Pt1) (* LineCt LSPace)) (nth 2 Pt1))
LineCt (+ LineCt 1))
(if (or (/= (getvar "cvport") 1) (/= (getvar "tilemode") 0))
(setq txtobj (vla-AddMtext *modelspace* pt2 width NewText))
(setq txtobj (vla-AddMtext *paperspace* pt2 width NewText))
)
(vla-put-StyleName txtobj Style)
(vla-put-layer txtObj Layer)
(vla-put-color txtObj color)
(setq textlst(cdr textlst))
)
)
)
)
;;string delimiter
;;code By st788796
(defun parse12 (str delimiter / POST STRL STRLST)
(setq strl (strlen delimiter))
(while (vl-string-search delimiter str)
(setq post (vl-string-search delimiter str))
(setq strlst (append strlst (list (substr str 1 post))))
(setq str (substr str (+ post (1+ strl))))
)
(vl-remove "" (append strlst (list str)))
) edata 发表于 2014-7-26 11:37 static/image/common/back.gif
E大,谢谢,其实我也用不上这个程序,只是在看到CAB在求助这样的程序,觉得奇怪,以他的能力应该能解决此类问题,所以把此问题拿到这里探讨,谢谢您的无私帮助! lucas_3333 发表于 2014-7-26 12:10 static/image/common/back.gif
E大,谢谢,其实我也用不上这个程序,只是在看到CAB在求助这样的程序,觉得奇怪,以他的能力应该能解决此 ...
这个仅仅适用于换行符效果。
对于CAB的问题,也不能做到很好的解决。 edata 发表于 2014-7-26 12:24 static/image/common/back.gif
这个仅仅适用于换行符效果。
对于CAB的问题,也不能做到很好的解决。
哈哈,难怪,看来他的问题是有点复杂! 他这个要全局分析所有转义代码,分析空行。转义代码控制字符显示高低等功能,如果仅仅分割换行符号,没有加上前面的转义字符,是不完整的。对于空行,也需要特殊处理,使之符号行距要求,如果有自动换行的,那么更糟糕。 edata 发表于 2014-7-26 13:02 static/image/common/back.gif
他这个要全局分析所有转义代码,分析空行。转义代码控制字符显示高低等功能,如果仅仅分割换行符号,没有加 ...
嗯,您的修改应该还是可以帮助一些人,比如cmwade77,哈哈,高手提出的问题,只有等待高手解决了。 做到基本行距
格式分析。。。没时间。
;Explode MText
;Explodes Mtext into single lines of mtext
;Written by: cmwade77 @ theswamp.org - July 2014
;Bug: Currenlty Only works on the first two lines of mtext
;Work Around: Repeat use until all lines are exploded
;The bug modify by: edata@mjtd.com 2014-7-26
(defun c:explodemtext (/ *thisdrawing* *modelspace* *paperspace* Ent Object ObjectType Text NEWTEXT pt1 style textlstWidth txtobj Layer LineCt Pt2 LSpace color)
(vl-load-com)
(setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object))
*modelspace*(vla-get-ModelSpace *thisdrawing*)
*paperspace*(vla-get-PaperSpace *thisdrawing*)
)
(setq Ent (nentselp "\rSelect text to explode: "))
(setq Object (vlax-ename->vla-object (car Ent))
ObjectType (vla-get-ObjectName Object)
)
(if (wcmatch ObjectType "*Text*")
(progn
(setq Text (vla-get-textstring Object)
pt1 (vla-get-InsertionPoint Object)
style (vla-get-StyleName Object)
Width (vla-get-width Object)
Layer (vla-get-Layer Object)
LSpace (vla-get-LineSpacingDistance Object)
pt1 (vlax-safearray->list (vlax-variant-value pt1))
color (vla-get-color Object)
)
(vla-delete Object)
(setq LineCt 0)
(setq textlst(parse12 Text "\\P"))
(print textlst)
(while (setq NewText(car textlst))
(setq pt2 (vlax-3d-point (nth 0 Pt1) (- (nth 1 Pt1) (* LineCt LSPace)) (nth 2 Pt1))
LineCt (+ LineCt 1))
(if (or (/= NewText "")(/= NewText " "))
(progn
(if (or (/= (getvar "cvport") 1) (/= (getvar "tilemode") 0))
(setq txtobj (vla-AddMtext *modelspace* pt2 width NewText))
(setq txtobj (vla-AddMtext *paperspace* pt2 width NewText))
)
(vla-put-StyleName txtobj Style)
(vla-put-layer txtObj Layer)
(vla-put-color txtObj color)
)
)
(setq textlst(cdr textlst))
)
)
)
)
;;string delimiter
;;code By st788796
(defun parse12 (str delimiter / POST STRL STRLST)
(setq strl (strlen delimiter))
(while (vl-string-search delimiter str)
(setq post (vl-string-search delimiter str))
(setq strlst (append strlst (list (substr str 1 post))))
(setq str (substr str (+ post (1+ strl))))
)
(append strlst (list str))
;(vl-remove "" (append strlst (list str)))
) edata 发表于 2014-7-26 15:42 static/image/common/back.gif
做到基本行距
格式分析。。。没时间。
E大,不要花时间在这上面了,
页:
[1]