明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: wgij007

[提问] 可以去掉多行文字的空行吗,能框选

[复制链接]
发表于 2021-3-5 15:36 | 显示全部楼层
本帖最后由 叮咚 于 2021-3-5 15:38 编辑

D:\下载\1.gif
GIFhttps://share.weiyun.com/8UtuMrIF
VLX文件
https://share.weiyun.com/T19PTR20

回复

使用道具 举报

发表于 2021-3-5 16:53 | 显示全部楼层
试试这个
(DEFUN C:MKG ()
  (VL-LOAD-COM)
  (PRINC "\Select Text(s) 选择文字 :")
  (IF (SETQ SS (ssget '((-4 . "<and")(0 . "MTEXT")(1 . "*\\P\\P*")(-4 . "and>"))))
    (PROGN
      (SETQ I -1)
      (REPEAT (SSLENGTH SS)
        (SETQ ENT (ENTGET (SSNAME SS (SETQ I (1+ I))))
              AA  (CDR (ASSOC 1 ENT))
        )
        (WHILE (vl-string-search "\\P\\P" AA)             ;; 搜索指定字符串位置,0开始,即空行还在
          (SETQ AA (vl-string-subst "\\P" "\\P\\P" AA))   ;; 则用"\\P"替换"\\P\\P"
          (SETQ ENT (SUBST (CONS 1 AA) (ASSOC 1 ENT) ENT))
          (ENTMOD ENT)
        )
      )
    )
  )
  (PRINC)
)
回复

使用道具 举报

 楼主| 发表于 2021-3-6 08:51 | 显示全部楼层
cshimao 发表于 2021-3-5 16:53
试试这个
(DEFUN C:MKG ()
  (VL-LOAD-COM)

附件放在1楼了,没有换行符的,麻烦下载看看能不能解决。感激
回复

使用道具 举报

发表于 2021-3-6 10:45 | 显示全部楼层
本帖最后由 vitalgg 于 2021-3-6 10:48 编辑

自己试一下吧,因为 2016 会直接把最后那个空行删除了。(至少我这里是这样的)

  1. (defun string:from-lst(lst Separator)  "列表转成字符串"
  2.   (if (cdr lst)
  3.       (strcat (car lst) Separator (string:from-lst (cdr lst) Separator))
  4.       (car lst)))

  5. (defun string:to-lst (str Separator / pos)
  6.   "字符串转成列表"
  7.   (if (setq pos (vl-string-search Separator str))
  8.       (cons (substr str 1 pos)
  9.             (string:to-lst (substr str (+ pos 1 (strlen Separator))) Separator))
  10.       (list str)))

  11. (defun remove-mtext-lastspace (en0)  ;;"去多行文本最后一行的空格(只有一个空格,多了还得改,还有最后的空格不能有自己样式。就是一个纯空格)"
  12.   (setq strlst (string:to-lst (cdr (assoc 1 (entget en0))) "\\n"))
  13.   (if (or (= " " (last strlst))
  14.           (= "" (last strlst)))
  15.       (progn
  16.          (entmod
  17.           (subst
  18.            (cons 1 (string:from-lst (reverse (cdr (reverse strlst))) "\\n"))
  19.            (assoc 1 (entget en0)) (entget en0)))
  20.          (entupd en0)
  21.          )
  22.       ))
  23. (defun c:tt (/ i% ss-mtext)
  24.   (setq ss-mtext (ssget '((0 . "MTEXT"))))
  25.   (setq i% 0)
  26.   (while (< i% (sslength ss-mtext))
  27.     (remove-mtext-lastspace (ssname ss-mtext i%))
  28.     (setq i% (1+ i%))))
回复

使用道具 举报

 楼主| 发表于 2021-3-6 12:30 | 显示全部楼层
vitalgg 发表于 2021-3-6 10:45
自己试一下吧,因为 2016 会直接把最后那个空行删除了。(至少我这里是这样的)

不行呀
回复

使用道具 举报

发表于 2021-3-9 08:14 | 显示全部楼层
本帖最后由 cshimao 于 2021-3-9 08:33 编辑

把\\p换成\n就可以了,在CAD06上试试
(DEFUN C:MKG ()
  (VL-LOAD-COM)
  (PRINC "\Select Text(s) 选择文字 :")
  (IF (SETQ SS (ssget '((-4 . "<and")(0 . "MTEXT")(1 . "*\n\n*")(-4 . "and>"))))
    (PROGN
      (SETQ I -1)
      (REPEAT (SSLENGTH SS)
        (SETQ ENT (ENTGET (SSNAME SS (SETQ I (1+ I))))
              AA  (CDR (ASSOC 1 ENT))
        )
        (WHILE (vl-string-search "\n\n" AA)             ;; 搜索指定字符串位置,0开始,即空行

还在
          (SETQ AA (vl-string-subst "\n" "\n\n" AA))   ;; 则用"\n"替换"\n\n"
          (SETQ ENT (SUBST (CONS 1 AA) (ASSOC 1 ENT) ENT))
          (ENTMOD ENT)
        )
      )
    )
  )
  (PRINC)
)
回复

使用道具 举报

 楼主| 发表于 2021-3-9 08:37 | 显示全部楼层
cshimao 发表于 2021-3-9 08:14
把\\p换成\n就可以了,在CAD06上试试
(DEFUN C:MKG ()
  (VL-LOAD-COM)

不能选中,怎么回事?
回复

使用道具 举报

发表于 2021-3-9 09:33 | 显示全部楼层
本帖最后由 cshimao 于 2021-3-9 14:33 编辑

把多行文字的最后换行符删除即可,即"12546\ncfgr\n12489\ndsyso\n"->"12546\ncfgr\n12489\ndsyso"
(DEFUN C:MKH ()
  (defun I:StrRightTrim
            (TrimStr    ; string to trim out
             FullStr    ; string to trim from
             /        ; local variables
             lenStr        ; length of full string
             lenTrim    ; length of trim string
) ;_ closes variable declare
    (if
      (and                ; if still enough string to search
    (> (setq lenStr (strlen FullStr))
       (setq lenTrim (strlen TrimStr))
    ) ;_ closes >
    (not                ; and not too far
      (wcmatch FullStr (strcat "*" TrimStr))
    ) ;_ closes not
      ) ;_ closes and
       (I:StrRightTrim            ; then go futher
     TrimStr
     (substr FullStr 1 (1- (strlen FullStr)))
       ) ;_ closes I:StrRightTrim
       (if (> lenStr lenTrim)        ; else if found
     (substr FullStr 1 (- lenStr lenTrim)) ; return trimmed str
     nil                ; else return nil
       ) ;_ closes if
    ) ;_ closes if
  ) ;_ closes

  (VL-LOAD-COM)
  (PRINC "\Select Text(s) 选择文字 :")
  (IF (SETQ
    SS (ssget
         '((-4 . "<and") (0 . "MTEXT") (1 . "*\n") (-4 . "and>"))
       )
      )
    (PROGN
      (SETQ I -1)
      (REPEAT (SSLENGTH SS)
    (SETQ ENT (ENTGET (SSNAME SS (SETQ I (1+ I))))
          AA  (CDR (ASSOC 1 ENT))
    )
    (setq AA (I:STRRIGHTTRIM "\n" AA))
    (SETQ ENT (SUBST (CONS 1 AA) (ASSOC 1 ENT) ENT))
    (ENTMOD ENT)
                    ;)
      )
    )
  )
  (PRINC)
)
回复

使用道具 举报

发表于 2021-3-9 11:27 | 显示全部楼层
(DEFUN C:MKG ()
  (VL-LOAD-COM)
  (PRINC "\Select Text(s) 选择文字 :")
  (IF (SETQ SS (ssget '((-4 . "<and")(0 . "MTEXT")(1 . "*\n")(-4 . "and>"))))
    (PROGN
      (SETQ I -1)
      (REPEAT (SSLENGTH SS)
        (SETQ ENT (ENTGET (SSNAME SS (SETQ I (1+ I))))
              AA  (CDR (ASSOC 1 ENT))
              )
        (SETQ AA (vl-string-right-trim "\n" AA))
        (SETQ ENT (SUBST (CONS 1 AA) (ASSOC 1 ENT) ENT))
        (ENTMOD ENT)
      )
    )
  )
  (PRINC)
)
回复

使用道具 举报

发表于 2021-3-9 14:39 | 显示全部楼层
845245015 发表于 2021-3-9 11:27
(DEFUN C:MKG ()
  (VL-LOAD-COM)
  (PRINC "\Select Text(s) 选择文字 :")

用自带函数vl-string-right-trim,简洁。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-10 06:03 , Processed in 0.137213 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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