669423907 发表于 2020-3-9 10:44:53

如何删除多行文字中特定类型的字符?

如下图:
如何删除多行文字中特定类型的字符?
删除多行文字中的公差,公差值的颜色和字高不是固定的,但都是堆叠的



669423907 发表于 2020-3-9 20:43:08

路过的大师指点一下啦

1291500406 发表于 2020-3-9 21:32:47

本帖最后由 1291500406 于 2020-3-10 09:53 编辑

{\\fSimSun|b0|i0|c134|p2;顶板}610×75{\\H0.5x;\\T0.95;\\C201;\\S+0.1^ 0;}×18{\\H0.5x;\\T0.95;\\C201;\\S+0.04^ 0;}

{\\fSimSun|b0|i0|c134|p2;顶板}610×75×18
;;测试
(vla-put-TextString (vlax-ename->vla-object (car (entsel))) "{\\fSimSun|b0|i0|c134|p2;顶板}610×75×18")

{\\fSimSun|b0|i0|c134|p2;顶板}610×75×18
移除定位字符串{\\H0.5x;\\T0.95;\\C201;\\S+0.04^ 0;}部分数据


_$ (vl-string-position (ascii"z") "azbdc")1_$ (vl-string-position 122"azbzc")1_$ (vl-string-position (ascii"x") "azbzc")nil    The search string used            in the following example contains two “z” characters. Reading            from left to right, with the first character being displacement            0, there is one z at displacement 1 and another z at displacement            3:                   _$ (vl-string-position (ascii"z") "azbzlmnqc")1
Searching from left to            right (the default), the “z” in position 1 is            the first one vl-string-position encounters.            But when searching from right to left, as in the following example,            the “z” in position 3 is the first one encountered:                  _$ (vl-string-position (ascii"z") "azbzlmnqc" nil t)3





669423907 发表于 2020-3-10 09:00:38

1291500406 发表于 2020-3-9 21:32
{\\fSimSun|b0|i0|c134|p2;顶板}610×75{\\H0.5x;\\T0.95;\\C201;\\S+0.1^ 0;}×18{\\H0.5x;\\T0.95;\\C201 ...

太深奥了,看不懂啊
我发现,如果不理会汉字部分,只要把 {} 成对的 大括弧 里面的所有字符以及大括弧本身全部删除,这样应该容易一些吧?是不是要用正则呢?

mikewolf2k 发表于 2020-3-10 09:24:05

       '删除堆迭格式
       'RE.Pattern = "\\S(.[^;]*)(\^|#|\\)(.[^;]*);"
       's = RE.Replace(s, "$1$3")
       '上标下标分开
       'RE.Pattern = "\\S(.[^;]*)(\^|#|\\);"
       's = RE.Replace(s, "$1")
       'RE.Pattern = "\\S\^(.[^;]*);"
       's = RE.Replace(s, "$1")
       '上下标分数一起
       'RE.Pattern = "\\S((.[^;]*)(\^|#|\\)|(\^|#|\\)(.[^;]*));"

用正则相当简单。{}是格式的意思,格式不仅仅是堆叠。

taoyi0727 发表于 2020-3-10 09:45:46

(defun c:tt (/ lst n name str t-string-separated txt)
        (defun T-string-separated (str del / lst pos)
                (if (/= str nil)
                        (progn
                                (while (setq pos (vl-string-search del str))
                                        (setq
                                                lst (cons (substr str 1 pos) lst)
                                                str (substr str (+ pos 1 (strlen del)))
                                        )
                                )
                                (reverse (cons str lst))
                        )
                )
        )
        (if (setq name(car (entsel)))
                (progn
                        (setq txt (vla-get-TextString (vlax-ename->vla-object name)))
                        (setq lst (T-string-separated txt "}"))
                        (setq n 0)
                        (foreach x lst
                                (if (= n 0)
                                        (setq str (substr x (+ (vl-string-search ";" x) 2)))
                                        (if (vl-string-search "{" x)
                                                (setq str (strcat str (car (T-string-separated x "{"))))
                                        )
                                )
                                (setq n (1+ n))
                        )
                )
        )
        str
)

669423907 发表于 2020-3-10 10:14:58

mikewolf2k 发表于 2020-3-10 09:24
'删除堆迭格式
       'RE.Pattern = "\\S(.[^;]*)(\^|#|\\)(.[^;]*);"
       's = RE.Replace(s ...

谢谢 mikewolf2k 版,以前只在安卓系统的 tasker 里玩过一下正则,语法跟这个一样,只是在lsp里不知道要怎么写,还望多多指教

669423907 发表于 2020-3-10 10:24:58

taoyi0727 发表于 2020-3-10 09:45
(defun c:tt (/ lst n name str t-string-separated txt)
        (defun T-string-separated (str del / lst pos ...

非常感谢 taoyi0727 大师的回复,这个效果可以,不知道是否方便改成通用一点的呢,因为公差和汉字的所在位置有时候会不一样

taoyi0727 发表于 2020-3-10 11:11:02

本帖最后由 taoyi0727 于 2020-3-10 11:27 编辑

669423907 发表于 2020-3-10 10:24
非常感谢 taoyi0727 大师的回复,这个效果可以,不知道是否方便改成通用一点的呢,因为公差和汉字的所在 ...
(defun c:tt (/ a ang color distance-pt height high last-name layer lst n name-new-pt name-pt obj pt ss str stylename t-string-separated txt)
        (defun T-string-separated (str del / lst pos)
                (if (/= str nil)
                        (progn
                                (while (setq pos (vl-string-search del str))
                                        (setq
                                                lst (cons (substr str 1 pos) lst)
                                                str (substr str (+ pos 1 (strlen del)))
                                        )
                                )
                                (reverse (cons str lst))
                        )
                )
        )
        (if (and
                                (setq ss (ssget '((0 . "MTEXT"))))
                                (setq pt (getpoint "\n请点取插入位置"))
                        )
                (progn
                        (setq a -1)
                        (repeat (sslength ss)
                                (setq obj (vlax-ename->vla-object (ssname ss (setq a (1+ a)))))
                                (setq name-pt (safearray-value (variant-value (vla-get-InsertionPoint obj))))
                                (setq color (vla-get-Color obj))
                                (setq Height (vla-get-Height obj))
                                (setq Layer (vla-get-Layer obj))
                                (setq StyleName (vla-get-StyleName obj))
                                (setq txt (vla-get-TextString obj))
                                (setq lst (T-string-separated txt "}"))
                                (setq n 0)
                                (foreach x lst
                                        (if (= n 0)
                                                (setq str (substr x (+ (vl-string-search ";" x) 2)))
                                                (if (vl-string-search "{" x)
                                                        (setq str (strcat str (car (T-string-separated x "{"))))
                                                )
                                        )
                                        (setq n (1+ n))
                                )
                                (if (not (and ang distance-pt))
                                        (progn
                                                (setq ang (angle name-pt pt))
                                                (setq distance-pt (distance name-pt pt))
                                        )
                                )
                                (setq name-new-pt (polar name-pt ang distance-pt))
                                (setq last-name (entlast))
                                (entmake (list
                                                                       '(0 . "MTEXT")
                                                                       '(100 . "AcDbEntity")
                                                                       '(100 . "AcDbMText")
                                                                       '(7 . "Standard")
                                                                       (cons 1 str)
                                                                       (cons 10 name-new-pt)
                                                               )
                                )
                                (if (/= (entlast) last-name)
                                        (progn
                                                (setq obj (vlax-ename->vla-object (entlast)))
                                                (vla-put-StyleName obj StyleName)
                                                (vla-put-Color obj color)
                                                (vla-put-Height obj Height)
                                                (vla-put-Layer obj Layer)
                                        )
                                )
                        )
                )
        )
)

水平也只有这样了
不会正则

taoyi0727 发表于 2020-3-10 11:19:52


页: [1]
查看完整版本: 如何删除多行文字中特定类型的字符?