doremidai 发表于 2008-5-18 11:37:00

[求助]把文字从空格处断开自动变2行,行距由用户输入

<strong><font face="Verdana" color="#da2549">请高手编个程序,把文字从空格处断开自动变2行,如"KL2-22(11) 200X700",括号后为空格,从空格处把这行文字断开成2行,行距由用户输入。</font></strong>

doremidai 发表于 2008-5-19 21:45:00

<p>自己顶一下.</p><p>有高手编写了断开文字换行的程序,但不能连续选择.</p><p>而且不能指定行距.</p>

sailorcwx 发表于 2008-5-20 23:42:00

<p>(defun c:strsplit(/ ACADSPC DST INDEX OBJ SLTSET STRING)<br/>&nbsp; (vl-load-com)<br/>&nbsp; (if (= (getvar "TILEMODE") 1)<br/>&nbsp;&nbsp;&nbsp; (setq acadspc (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))<br/>&nbsp;&nbsp;&nbsp; (setq acadspc (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object))))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (setq dst (getdist "\n输入行间距: "))<br/>&nbsp; (if (null dst)(setq dst 0))<br/>&nbsp; (while (and (setq sltset (ssget '((0 . "TEXT")))) (/= (setq string (getstring 1 "\n输入分割字符: ")) ""))<br/>&nbsp;&nbsp;&nbsp; (setq index 0)<br/>&nbsp;&nbsp;&nbsp; (repeat (sslength sltset)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq obj (vlax-ename-&gt;vla-object (ssname sltset index)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (stringsplit obj string dst acadspc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq index (1+ index))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; </p><p>(defun stringsplit(obj string dst acadspc / BPT BPT1 NINSERTPOINT NTEXTSTRING STRINDEX TEXTH TEXTSTRING)<br/>&nbsp; (setq bpt (vla-get-insertionpoint obj)<br/>&nbsp;bpt1 (vlax-safearray-&gt;list (vlax-variant-value bpt))<br/>&nbsp;texth (vla-get-height obj)<br/>&nbsp;)<br/>&nbsp; (vla-put-alignment obj acalignmentleft)<br/>&nbsp; (vla-put-insertionpoint obj bpt)<br/>&nbsp; (setq textstring (vla-get-textstring obj))<br/>&nbsp; (setq strindex (vl-string-search string textstring))<br/>&nbsp; (if strindex<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-textstring obj (substr textstring 1 strindex))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ntextstring (substr textstring (+ strindex 2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ninsertpoint (polar bpt1 (* 1.5 pi) (+ texth dst))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq obj (vla-addtext acadspc ntextstring (vlax-3d-point ninsertpoint) texth))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (stringsplit obj string dst acadspc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )</p>

sailorcwx 发表于 2008-5-20 23:44:00

<p>递归算法,可以连续分解</p><p></p><p></p>

doremidai 发表于 2008-5-21 12:04:00

本帖最后由 作者 于 2008-5-21 14:17:39 编辑 <br /><br /> <p><strong><font face="Verdana" color="#61b713">多谢sailorcwx,高手出招。</font></strong></p><p><strong><font face="Verdana" color="#61b713">希望做一下优化:</font></strong></p><p><strong><font face="Verdana" color="#61b713">文字换行后样式为当前样式,能否改成与选择的文字样式和图层都相同;</font></strong></p><p><strong><font face="Verdana" color="#61b713">另外,只能处理文字为水平(0度)的文字,如果文字是90度换行后仍然0度,且不能处理倾斜角度的文字。能否与选择文字平行?</font></strong></p>

sailorcwx 发表于 2008-5-21 15:32:00

<p>(defun c:strsplit(/ ACADSPC DST INDEX OBJ SLTSET STRING)<br/>&nbsp; (vl-load-com)<br/>&nbsp; (if (= (getvar "TILEMODE") 1)<br/>&nbsp;&nbsp;&nbsp; (setq acadspc (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))<br/>&nbsp;&nbsp;&nbsp; (setq acadspc (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object))))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (setq dst (getdist "\n输入行间距: "))<br/>&nbsp; (if (null dst)(setq dst 0))<br/>&nbsp; (setq string " ")<br/>&nbsp; (while (setq sltset (ssget '((0 . "TEXT"))))<br/>&nbsp;&nbsp;&nbsp; (setq index 0)<br/>&nbsp;&nbsp;&nbsp; (repeat (sslength sltset)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq obj (vlax-ename-&gt;vla-object (ssname sltset index)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (stringsplit obj string dst acadspc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq index (1+ index))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; </p><p>(defun stringsplit(obj string dst acadspc / BPT BPT1 NINSERTPOINT NTEXTSTRING STRINDEX TEXTH TEXTSTRING TEXTANGLE TEXTCOLOR TEXTLAYER TEXTSCALE TEXTSTYLE)<br/>&nbsp; (setq bpt (vla-get-insertionpoint obj)<br/>&nbsp;bpt1 (vlax-safearray-&gt;list (vlax-variant-value bpt))<br/>&nbsp;texth (vla-get-height obj)<br/>&nbsp;)<br/>&nbsp; (vla-put-alignment obj acalignmentleft)<br/>&nbsp; (vla-put-insertionpoint obj bpt)<br/>&nbsp; (setq textstring (vla-get-textstring obj)<br/>&nbsp;textlayer (vla-get-layer obj)<br/>&nbsp;textcolor (vla-get-color obj)<br/>&nbsp;textangle (vla-get-rotation obj)<br/>&nbsp;textstyle (vla-get-stylename obj)<br/>&nbsp;textscale (vla-get-scalefactor obj)<br/>&nbsp;)<br/>&nbsp; (setq strindex (vl-string-search string textstring))<br/>&nbsp; (if strindex<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-textstring obj (substr textstring 1 strindex))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ntextstring (substr textstring (+ strindex 2))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ninsertpoint (polar bpt1 (- textangle (* 0.5 pi)) (+ texth dst))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq obj (vla-addtext acadspc ntextstring (vlax-3d-point ninsertpoint) texth))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-layer obj textlayer)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-color obj textcolor)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-rotation obj textangle)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-stylename obj textstyle)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-scalefactor obj textscale)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (stringsplit obj string dst acadspc)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/></p>

doremidai 发表于 2008-5-21 18:01:00

<p><strong><font face="Verdana" color="#61b713">多谢sailorcwx,搞定了。</font></strong></p><p><strong><font face="Verdana" color="#61b713">向你学习。</font></strong></p>

freefeng 发表于 2008-6-17 17:52:00

<p>别分成一个一个的单词呀,最好能指定首个句子的长度。</p>

hdlyt11 发表于 2008-7-18 13:31:00

<p>能不能不用输入行距,自动排列</p>
页: [1]
查看完整版本: [求助]把文字从空格处断开自动变2行,行距由用户输入