lengxiaxi 发表于 2023-12-4 11:27:04

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


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

示意图如下:

lengxiaxi 发表于 2023-12-4 11:37: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)
)

tiancao100 发表于 2023-12-4 12:14:39

贡献VB.net源码
<CommandMethod("TcTxtJieQu")>
    Public Sub TcTxtJieQu()
      On Error Resume Next
      Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
      Dim acCurDb As Database = acDoc.Database
      Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim acTypValAr(0) As TypedValue
            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "TEXT"), 0)
            Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr)
            Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection(acSelFtr)
            If acSSPrompt.Status = PromptStatus.OK Then '选择成功
                Dim acSSet As SelectionSet = acSSPrompt.Value
                Dim acSSObj As SelectedObject
                For Each acSSObj In acSSet
                  Dim acText As DBText = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)
                  Dim T As String = acText.TextString.Substring(0, 1)
                  If T.Contains("-") = True Then '字符必须含有“-”
                        Dim s As String() = T.Split("-") '以“-”分割成数组
                        If s.Length = 6 Then '数组长度必须为6
                            acText.TextString = s(3) '保留序号为3的,其余删除
                        End If
                  End If
                Next
            End If
            acTrans.Commit()
      End Using
    End Sub

kucha007 发表于 2023-12-4 12:21:25

本帖最后由 kucha007 于 2023-12-4 14:12 编辑

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

goldwheat 发表于 2023-12-5 10:25:11


也可以直接截取第三与第四横杠之间的内容,横杠也有两种形式,中文或是英文的。
(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-trimfegefuSTR& ))
               (repeat 3 ;截掉前三个分隔符fegefu
               (setqpstint#(vl-string-position (ascii fegefu)STR& ))
               (setq STR& (substrSTR&(+ 1 pstint# (strlen fegefu) ) ))
            )
                (setqpstint#(vl-string-position (ascii fegefu)STR& ))
                (setq STR& (substrSTR&1pstint# ));截取第四个分隔符之前的字段
                (Vla-put-TextString vlaobj%   STR&)
   
      )
         )
)
)
(princ)
)

d1742647821 发表于 2023-12-7 10:23:07

本帖最后由 d1742647821 于 2023-12-7 10:24 编辑

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


      using var tr = new DBTrans();
      var r1=Env.Editor.GetSelection();
      if (r1.Status != PromptStatus.OK)
            return;
      var dbTextList = r1.Value.GetEntities<DBText>().ToList();
      foreach (var t1 in dbTextList)
      {
            var strArray = t1.TextString.Split('-');
            if (strArray.Length >= 4)
            {
                using (t1.ForWrite())
                {
                  t1.TextString = strArray;
                }
            }
      }



shiy65 发表于 2024-1-25 13:59:23

提供一种解决方法:
用以下逻辑判断处理:
框选处理范围
依次处理框选对象

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                退出
处理下一个框选对象,直至最后一个完毕后退出。
               
页: [1]
查看完整版本: 规律的单行文本,截取文字