wgij007 发表于 2021-1-18 14:12:05

求一代码

本帖最后由 wgij007 于 2021-1-22 08:19 编辑

把多行文本的格式改一下,4行删最后一行.要框选(多行文本没有换行符的)。同时处理多个。
http://bbs.mjtd.com/thread-182786-1-1.html 这程序处理过的 最后一行最前面第一个字都是最


utyh 258
1 Pli
447-8po
最2548 587 m2



改为

utyh 258 1 Pli 447-8po



bssurvey 发表于 2021-1-18 14:12:06

本帖最后由 bssurvey 于 2021-1-25 08:45 编辑

wgij007 发表于 2021-1-22 19:00
麻烦你下一下了。
https://pan.baidu.com/s/1HexnYCK5r2znUcwW05LAyQ
提取码:yods
請您測試一下
(defun c:tt ()
      (vl-load-com)
      (setq ss (ssget'((0 . "MTEXT"))))
      (setq slen (sslength ss))
      (setq n 0)
      (while (< n slen)
                (setq ssn (ssname ss n))
                (setq entdat (entget ssn))
                (setq pt(cdr (assoc 10 entdat))       ;读取文字的插入点坐标
            txt (cdr (assoc 1 entdat))      ;读取文字内容
            zg(cdr (assoc 40 entdat))       ;读取文字的字高
            zg1(cdr (assoc 71 entdat))
            lay1(cdr (assoc 8 entdat))
            st1(cdr (assoc 7 entdat)))
            (setq ftxt (substr txt 1 (vl-string-search "\n" txt)))   ;第一行
                (setq a1 (strlen ftxt))
                (setq txt (substr txt (+ 2 a1)))
                (setq gtxt (substr txt 1 (vl-string-search "\n" txt)))   ;第二行
                (setq a2 (strlen gtxt))
                (setq txt (substr txt (+ 2 a2)))
                (setq htxt (substr txt 1 (vl-string-search "\n" txt)))   ;第三行
                (setq result (strcat ftxt" " gtxt " " htxt))                              ;合并前三行
                (entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 7 st1) (cons 1 result) (cons 10 pt)(cons 40 zg)(cons 71 zg1)(cons 8 lay1)))    ;创建多行文字
                (entdel ssn)                ;删除原多行文字
                (setq n (+ 1 n))                                                                                                                                          
      )
(princ)
)

insufficient 发表于 2021-1-18 15:40:17

(defun c:tt ()
        (setq ss (ssget'((0 . "MTEXT"))))
        (setq slen (sslength ss))
        (setq n 0)

        (while (< n slen)
                (setq ssn (ssname ss n))
                (setq entdat (entget ssn))
                (setq pt(cdr (assoc 10 entdat))       ;读取文字的插入点坐标
            txt (cdr (assoc 1 entdat))      ;读取文字内容
            zg(cdr (assoc 40 entdat)))      ;读取文字的字高

                (setq i 1 ftxt "")
                (while (and (< i (strlen txt)) (/= (setq tmp (substr txt i 1)) "\\"))
                        (setq ftxt (strcat ftxt tmp) i (1+ i))
                )
                (princ ftxt)    ;第一行

                (setq a1 (strlen ftxt))
                (setq txt (substr txt (+ 3 a1)))
                (setq i 1 gtxt "")
                (while (and (< i (strlen txt)) (/= (setq tmp (substr txt i 1)) "\\"))
                        (setq gtxt (strcat gtxt tmp) i (1+ i))
                )
                (princ gtxt)    ;第二行

                (setq a2 (strlen gtxt))
                (setq txt (substr txt (+ 3 a2)))
                (setq i 1 htxt "")
                (while (and (< i (strlen txt)) (/= (setq tmp (substr txt i 1)) "\\"))
                        (setq htxt (strcat htxt tmp) i (1+ i))
                )
                (princ htxt)    ;第三行

                (setq result (strcat ftxt" " gtxt " " htxt))    ;合并前三行
               
                (entmake (list '(0 . "TEXT") (cons 1 result) (cons 10 pt) (cons 40 zg)))
                (entdel ssn)

                (setq n (+ 1 n))
        )
(princ)
)

就你所提的要求简单写了下,如果需要更改为更宽的应用场景再做修改调整

insufficient 发表于 2021-1-18 16:24:10

(defun c:tt ()
      (vl-load-com)
        (setq ss (ssget'((0 . "MTEXT"))))
        (setq slen (sslength ss))
        (setq n 0)

        (while (< n slen)
                (setq ssn (ssname ss n))
                (setq entdat (entget ssn))
                (setq pt(cdr (assoc 10 entdat))       ;读取文字的插入点坐标
            txt (cdr (assoc 1 entdat))      ;读取文字内容
            zg(cdr (assoc 40 entdat)))      ;读取文字的字高

                (setq ftxt (substr txt 1 (vl-string-search "\\P" txt)))   ;第一行

                (setq a1 (strlen ftxt))
                (setq txt (substr txt (+ 3 a1)))
                (setq gtxt (substr txt 1 (vl-string-search "\\P" txt)))   ;第二行

                (setq a2 (strlen gtxt))
                (setq txt (substr txt (+ 3 a2)))
                (setq htxt (substr txt 1 (vl-string-search "\\P" txt)))   ;第二行

                (setq result (strcat ftxt" " gtxt " " htxt))                                ;合并前三行
               
                (entmake (list '(0 . "TEXT") (cons 1 result) (cons 10 pt) (cons 40 zg)))                ;创建单行文字
                (entdel ssn)                ;删除原多行文字

                (setq n (+ 1 n))
        )
(princ)
)


修改了一下

wgij007 发表于 2021-1-19 08:27:55

本帖最后由 wgij007 于 2021-1-19 08:37 编辑

insufficient 发表于 2021-1-18 16:24
修改了一下
有点问题,我的多行文本是去了换行符的。
显视
utyh 258
            1 Pli
                     447-8po
                                 最2548 587 mm2   

不能上传,好麻烦呀





insufficient 发表于 2021-1-19 08:39:53

wgij007 发表于 2021-1-19 08:27
有点问题,我的多行文本是去了换行符的。
显视
utyh 258


你的多行文本都是这种格式吗?又没有什么规律比如说:是否前面需要保留的字符数恒定?或者所有多行文字都是要去除“最”字之后的字符?

wgij007 发表于 2021-1-19 15:07:34

insufficient 发表于 2021-1-19 08:39
你的多行文本都是这种格式吗?又没有什么规律比如说:是否前面需要保留的字符数恒定?或者所有多行文 ...
是的,都没有换行符的

http://bbs.mjtd.com/thread-182786-1-1.html

都是转后的格式

bssurvey 发表于 2021-1-20 11:13:32

wgij007 发表于 2021-1-19 15:07
是的,都没有换行符的

http://bbs.mjtd.com/thread-182786-1-1.html


可以用insufficient的LISP 把"\\P"改成"\n"試試

wgij007 发表于 2021-1-21 11:25:05

bssurvey 发表于 2021-1-20 11:13
可以用insufficient的LISP 把"\\P"改成"\n"試試

还是不行,一样的

wgij007 发表于 2021-1-22 08:15:00

可能去了换行符没标识就不好搞了
页: [1] 2
查看完整版本: 求一代码