寻求 批量查找特定文字 在其 文字上方加入 带序号前缀
例如以下数据 FM甲1021M2535 MM00 C5800 FC1058CC00通过查找M和C(不区分大小写) 并且排除MM和CC
最终实现效果为 1# 2# 3# 4#
FM甲1021 M2535 MM00 C5800 FC1058 CC00
有以下要求:
1、需要注意的是 查找的文字 可以是单行文字,多行文字,块内文字,天正文字等等
2、考虑到加入前缀后文字会变宽,接近文字可能会重叠,最好就是前缀和文字平行显示, 不要在一行显示。
例如不要显示为 (有时候会重叠) 1# FM甲10212#M2535MM00 3#C58004# FC1058 CC00
3、序号前缀可以设置字体 大小和颜色,便于区分
说明:其实CAD自带的查找 替换 可以简单实现,但是需要手工的一个个的加入 数字前缀,导致很繁琐。
https://atlisp.cn/static/videos/文本上加编号.mp4
(defun check-text (ent / str)
(setq matchs '("*M*" "*C*"))
(setq notmatchs '("*MM*" "*CC*"))
(if (setq str (entity:getdxf ent 1))
(and
(apply 'or (mapcar '(lambda(x)(wcmatch (strcase str) x)) matchs))
(apply 'and (mapcar '(lambda(x)(wcmatch (strcase str) (strcat "~" x))) notmatchs)))))
(defun findtext ()
(setq txts (pickset:to-list (ssget '((0 . "*text,attrib,insert")))))
(setq txts
(vl-remove-if-not
'(lambda(txt)
(cond
((/= "INSERT" (entity:getdxf txt 0))
(check-text txt))
((= "INSERT" (entity:getdxf txt 0))
(setq entlst (block:ent-list (entity:getdxf txt 2)))
(setq flag nil)
(while (and (setq ent (car entlst))
(null flag))
(if (wcmatch (entity:getdxf ent 0) "*TEXT")
(setq flag
(check-text ent)))
(setq entlst (cdr entlst))
)
flag)))
txts)))
(defun mark-order (ents)
(setq i 0)
(foreach
ent ents
(cond
((/="INSERT" (entity:getdxf ent 0))
;; 取文字中点
(setq pt-mid (apply 'point:mid (entity:getbox ent 0)))
;; 高度,角度
(setq h (entity:getdxf ent 40))
(setq ang (entity:getdxf ent 50))
(entity:putdxf
(entity:make-text
(strcat (itoa (setq i (1+ i)))"#")
(polar pt-mid (+ (* 0.5 pi) ang) h)
(* 0.9 h)
ang 0.8 0 "MM")
62
1
))
;; 块引用
((="INSERT" (entity:getdxf ent 0))
(setq pt-ins (entity:getdxf ent 10))
(setq ang-ins (entity:getdxf ent 50))
(setq scale-ins (entity:getdxf ent 41))
(setq subents (block:ent-list(setq blkname (entity:getdxf ent 2))))
(setq pt-base (entity:getdxf (tblobjname "block" blkname) 10))
(setq subents
(vl-remove-if-not
'(lambda(x)
(and (wcmatch (entity:getdxf x 0) "*TEXT")
(check-text x)))
subents)
)
(foreach
subent subents
;; 取文字中点 坐标变换
;;(print (entity:getbox subent 0))
(setq pt-mid(apply 'point:mid (entity:getbox subent 0)))
(setq pt-mid (block:bcs2wcs pt-mid pt-base pt-ins ang-ins scale-ins))
;; 高度,角度
(setq h (entity:getdxf subent 40))
(setq ang (+ (entity:getdxf subent 50)
ang-ins
))
(entity:putdxf
(entity:make-text
(strcat (itoa (setq i (1+ i)))"#")
(polar pt-mid (+ (* 0.5 pi) ang) h)
(* 0.9 h)
ang 0.8 0 "MM")
62
1
)))
)))
快内文字;P,这么麻烦的替换,是不是绘图不规范啊。 liuhe 发表于 2023-8-4 13:44
快内文字,这么麻烦的替换,是不是绘图不规范啊。
是的,图纸很不规范,乱七八糟的,扒图和统计起来经常有漏的和错误的 有没有这种情况
M33MM55
如果有,算哪种? vitalgg 发表于 2023-8-4 15:27
有没有这种情况
M33MM55
如果有,算哪种?
基本上 不会存在这种情况的,都是单独的 ,要不M33,要不MM55 vitalgg 发表于 2023-8-4 18:59
老师,大概就是这种效果的,我是小白刚接触,不知道怎么使用这个代码,是复制下来做成LSP格式还是?启动命令是什么?我按照视频的命令 ERASE 是删除命令 vitalgg 发表于 2023-8-4 12:05
老哥你好。这个能不能再帮忙更新一下,1、编号 和 查找的文字 用一个斜线连接或者 圈起来2、编号和查找的文字 整体可以提取到EXCEL表格,例如提取出来为 1# FM甲1021 2#M2535 3#C5800
页:
[1]