明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 647|回复: 7

规律的单行文本,截取文字

[复制链接]
发表于 2023-12-4 11:27 | 显示全部楼层 |阅读模式

穷人,仅有的6币,给有缘人。
有规律的单行文本;求截取其中一段文字,其他的删掉,能批量执行;

示意图如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2023-12-4 11:37 | 显示全部楼层
每一个【-】之间的字段,是变化的。

如果取到【第三个横杠】和【第四个横杠】之间的文本,这个头痛。

附上截掉“尾巴”的程序,作者e派工具箱

;=号字符串截除
;by edata @mjtd 2015-7-14
(defun sk_trim= (str /  i a lst)
  (setq        i   0
        lst '()
  )
  (while (and (setq a (substr str (setq i (1+ i)) 1)) (/= a "="))
    (setq lst (cons a lst))
  )
  (setq lst (apply 'strcat (reverse lst)))
)
(defun c:tt(/ elist en ss str)
  (if (setq ss(ssget '((0 . "*text"))))
    (while(setq en(ssname ss 0))
      (setq elist(entget en))
      (setq str(sk_trim=(cdr(assoc 1 elist))))
      (entmod(subst (cons 1 str)(assoc 1 elist) elist))
      (setq ss(ssdel en ss))
      )
    )
  (princ)  
  )
发表于 2023-12-4 12:14 | 显示全部楼层
贡献VB.net源码
  1. <CommandMethod("TcTxtJieQu")>
  2.     Public Sub TcTxtJieQu()
  3.         On Error Resume Next
  4.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  5.         Dim acCurDb As Database = acDoc.Database
  6.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  7.             Dim acTypValAr(0) As TypedValue
  8.             acTypValAr.SetValue(New TypedValue(DxfCode.Start, "TEXT"), 0)
  9.             Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
  10.             Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection(acSelFtr)
  11.             If acSSPrompt.Status = PromptStatus.OK Then '选择成功
  12.                 Dim acSSet As SelectionSet = acSSPrompt.Value
  13.                 Dim acSSObj As SelectedObject
  14.                 For Each acSSObj In acSSet
  15.                     Dim acText As DBText = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)
  16.                     Dim T As String = acText.TextString.Substring(0, 1)
  17.                     If T.Contains("-") = True Then '字符必须含有“-”
  18.                         Dim s As String() = T.Split("-") '以“-”分割成数组
  19.                         If s.Length = 6 Then '数组长度必须为6
  20.                             acText.TextString = s(3) '保留序号为3的,其余删除
  21.                         End If
  22.                     End If
  23.                 Next
  24.             End If
  25.             acTrans.Commit()
  26.         End Using
  27.     End Sub

评分

参与人数 1明经币 +1 收起 理由
lengxiaxi + 1 很给力!穷的没币了,感谢您热情回帖

查看全部评分

发表于 2023-12-4 12:21 | 显示全部楼层
本帖最后由 kucha007 于 2023-12-4 14:12 编辑

试试这个:数据有效性未做检查
  1. (defun c:TT (/ K:STR->Lst SS i obj STRLST)
  2.   ;根据分隔符拆分字符串@LeeMac
  3.   (defun K:STR->Lst (STR Del / len Lst pos)
  4.     (setq len (1+ (strlen Del)))
  5.     (while (setq pos (vl-string-search Del STR))
  6.       (setq Lst (cons (substr STR 1 pos) Lst)
  7.             STR (substr STR (+ pos len))
  8.       )
  9.     )
  10.     (reverse (cons STR Lst))
  11.   )
  12.   (if (setq SS (ssget ":L" '((0 . "TEXT"))))  ;只选单行文字
  13.       (repeat (setq i (sslength SS))
  14.         (setq obj (vlax-ename->vla-object (ssname SS (setq i (1- i)))))
  15.         (setq STRLST (K:STR->Lst (Vla-get-TextString obj) "-"))
  16.         (if (and (eq 6 (length STRLST)) (nth 3 STRLST))
  17.           (Vla-put-TextString obj (nth 3 STRLST))
  18.         )
  19.       )
  20.   )
  21.   (princ)
  22. )


评分

参与人数 1明经币 +1 收起 理由
lengxiaxi + 1 亲测有效,和3楼逻辑相同,用“-”来分割文.

查看全部评分

发表于 2023-12-5 10:25 | 显示全部楼层

也可以直接截取第三与第四横杠之间的内容,横杠也有两种形式,中文或是英文的。
(defun c:jiequ (/ SSet^ cnt# vlaobj% STR& fegefu pstint#)
  (while (setq SSet^ (ssget  '((0 . "TEXT"))))  ;只选单行文字
       (repeat (setq cnt# (sslength SSet^))
        (setq vlaobj% (vlax-ename->vla-object (ssname SSet^ (setq cnt# (1- cnt#)))))
        (setq STR& (Vla-get-TextString vlaobj%))
         (if (or (setq fegefu  "-")(setq fegefu  "-"));考虑中英两种横杠
             (progn
               (setq STR& (vl-string-trim  fegefu  STR& ))
               (repeat 3 ;截掉前三个分隔符fegefu
               (setq  pstint#  (vl-string-position (ascii fegefu)  STR& ))
               (setq STR& (substr  STR&  (+ 1 pstint# (strlen fegefu) ) ))
              )
                (setq  pstint#  (vl-string-position (ascii fegefu)  STR& ))
                (setq STR& (substr  STR&  1  pstint# ));截取第四个分隔符之前的字段
                (Vla-put-TextString vlaobj%   STR&)
   
        )
         )
  )
)
(princ)
)

点评

666,感谢热情回帖  发表于 2023-12-5 10:42
发表于 2023-12-7 10:23 | 显示全部楼层
本帖最后由 d1742647821 于 2023-12-7 10:24 编辑

C#源码 Powered By IFoxCAD
IFoxCAD 基于.NET的Cad二次开发类库


  1.         using var tr = new DBTrans();
  2.         var r1=Env.Editor.GetSelection();
  3.         if (r1.Status != PromptStatus.OK)
  4.             return;
  5.         var dbTextList = r1.Value.GetEntities<DBText>().ToList();
  6.         foreach (var t1 in dbTextList)
  7.         {
  8.             var strArray = t1.TextString.Split('-');
  9.             if (strArray.Length >= 4)
  10.             {
  11.                 using (t1.ForWrite())
  12.                 {
  13.                     t1.TextString = strArray[4];
  14.                 }
  15.             }
  16.         }




发表于 2024-1-25 13:59 | 显示全部楼层
提供一种解决方法:
用以下逻辑判断处理:
框选处理范围
依次处理框选对象

1. 提取需要的文本
   可能的来源 1)含(0 . “TEXT")的图元  ,提取 (1 .  “xxx” )
                    2)含(0 . “MTEXT")的图元 ,提取 (1 .  “xxxx” )
                    3)属性值来源,比较复杂, 先不扩展了
2. 判断文本中,有没有符合条件的字符串段落,有       返回 提取表
                                                                    没有   返回 nil
                    1) 条件设定 (如  1 有效段落前,有“-”符号
                                                2 有效段落 以“数字”开始
                                                3 有效段落 有“.”符号
                                                4 有效段落后 以“-”符号表示结束
                                                  ......
                    2)  按字符长度n循环,从1到n逐个依次提取每个字符,按上述条件判断,
                                                  记录字符中符合条件的开始位置,和有效字符个数,
                    3) 按2的有效记录,生成提取表返回
                                                   
3 根据 2 的返回 有效提取表   提取有效字符段,替换组码,更新图元信息
                        nil                退出
处理下一个框选对象,直至最后一个完毕后退出。
               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 04:45 , Processed in 0.304132 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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