规律的单行文本,截取文字
穷人,仅有的6币,给有缘人。
有规律的单行文本;求截取其中一段文字,其他的删掉,:time:能批量执行;
示意图如下:
每一个【-】之间的字段,是变化的。
如果取到【第三个横杠】和【第四个横杠】之间的文本,这个头痛。
附上截掉“尾巴”的程序,作者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)
) 贡献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 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)
)
也可以直接截取第三与第四横杠之间的内容,横杠也有两种形式,中文或是英文的。
(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: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;
}
}
}
提供一种解决方法:
用以下逻辑判断处理:
框选处理范围
依次处理框选对象
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]