分享一个【查找并选中指定文本内容】的插件
源码分享,不喜勿喷我是新人,还请给位多多支持。
功能:根据选择的文本(可以是多个)对象精确查找并选中相同文本内容的文本对象(使用的是完全匹配的算法)
用法:
1、先选择要查找的文本(可以是多个对象)。
2、框选要查找的文本进行查找。
3、找到相同的文本对象,这些对象被选中。
依然小小鸟 发表于 2019-6-21 17:13
能辛苦组合在一起吗新手不太会
(defun c:2121 (/ n pt ss str)
(if (setq str (getstring "\n输入文字含有的字符:"))
(progn(setq str (strcat "*" str "*") n 0pt (getpoint "\n指定集合点:"))
(repeat (sslength (setq ss (ssget "X" (list '(0 . "*TEXT") (cons 1 str)))))
(entmake (list '(0 . "LINE") (cons 10 pt) (cons 11 (cdr (assoc 10 (entget (ssname ss n))))) '(62 . 1)))
(setq n (+ n 1)))))(sssetfirst nil ss))
(setq n (+ n 1))
)
)
)
)
我也不会,要是能框选拾取目标字符, 然后再框选范围就完美了。 本帖最后由 1291500406 于 2019-4-26 14:38 编辑
yjpyjp 发表于 2019-4-26 14:22
em 。好像后面那个点取查找文本部分有问题,输入查找的没问题
还有 能否改成忽略输入的大小写
http://bbs.mjtd.com/forum.php?mo ... =%B4%F3%D0%A1%D0%B4
wcmatch(函数)
将模式字符串与某指定的字符串进行匹配比较. (wcmatch string pattern)
wcmatch 函数将字符串 string 与模式字符串 pattern 进行比较,看它们是否相匹配。如果匹配,
它返回 T;否则它返回 nil。string 和 pattern 这两个参数既可以是由双引号引起来的字符串,也可以
是变量。pattern 参数中可以包含下表所列的通配符。本函数仅对 string 和 pattern 中最前面的 500 个
字符进行比较,超过 500 个字符之后的那些字符会被忽略。 通配符
通配符 说明
140
# 匹配任意单个数字字符
@ 匹配任意单个字母字符
.(圆点) 匹配任意单个非字母数字字符
*(星号) 匹配任意字符序列,包括空字符串,它可以出现在任何位置,包括开头、中间
和结尾处
?(问号) 匹配任意单个字符
~(波浪号) 如果它是模式字符串的第一个字符,则匹配除此字符串之外的任意字符串
[...] 匹配括号中的任意一个字符
[~...] 匹配不在括号中的任意单个字符
-(连字符) 用在括号里面,用来指明单个字符的取值范围
,(逗号) 分隔两个模式字符串
`(反引号) 特殊转义字符(按字义读取随后的字符)
(wcmatch "Name" "N*") 返回 T
该例子测试字符串 "Name" 是否以字符 N 开头。可以在模式字符串中使用逗号来分隔多个测试
条件,下例就进行三个比较:
(wcmatch "Name" "???,~*m*,N*") 返回 T
只要字符串匹配上述三个模式字符串中的任何一个,wcmatch 函数就返回 T。在本例中进行的测
试有:"Name" 有三个字符(为假);"Name" 中不含字符 m(为假);"Name" 以字符 N 开头(为真)。
由于满足了其中至少一个条件,所以表达式返回 T。
本函数进行的比较是区分大小写的,所以其大写和小写必须匹配。在 string 和 pattern 参数中,
可以使用由 AutoLISP 函数返回的变量和值。
为了测试一个字符串中的通配符,必须使用单个反引号 (`) 来转义字符。转义是指跟在单个反引
号后面的字符不当作通配符读取,而是按其表面值进行比较。例如,为了测试在字符串 "Name" 中是
否包含逗号,可以使用如下表达式:
(wcmatch "Name" "*`,*") 返回 nil
注意 由于 AutoLISP 的后续版本中可能会加入其他的通配符,所以建议在样本中给所有非字母
数字字符加上转义字符转义,以确保它的向上兼容性。
由于 C 和 AutoLISP 程序设计语言都使用反斜杠 (\) 作为转义字符,所以在字符串中必须使用
两个反斜杠 (\\) 才能产生一个反斜杠。为了测试字符串 "Name" 中是否包含一个反斜杠,可以使用如
下表达式:
(wcmatch "Name" "*`\\*") 返回 nil
所有包含在括号 ([ . . . ]) 中的字符都按字义读取,所以不必使用转义字符。但有如下例外:波浪
号 (~) 只有当它不是括号里的第一个字符(如 "")时才按字义读取;否则作为一个“非”字
符读取它,这意味着 wcmatch 函数将匹配跟随在波浪号之后那些字符(如 "[~ABC]")之外的所有字
符。而连字符 (-) 则只有当它是括号中的第一个字符或最后一个字符(如 "[-ABC]" 或 "")时,
才按字义读取。否则,在括号中的连字符用于指定某特定字符的取值范围。该范围仅限于单个字符,
所以,"STR" 与 STR1、STR2、STR3 和 STR8 匹配,而 "" 与任意单个大写字母匹配。
如果闭括号 (")") 是括号内的首个字符或跟随在波浪号之后(如 "[ ]ABC)" 或 "[~]ABC)"),
它将被按字义读取。
1291500406 发表于 2019-4-26 10:47
不完全匹配,是前后加*
请问是哪一句呐QuQ
(defun c:xx ( / i lst s s1 ss1 ss2)
(if (and
(princ "\n请选取源对象,框选后回车")
(setq ss1 (ssget '((0 . "*TEXT"))))
(princ "\n框选区域,框选后回车")
(setq ss2 (ssget '((0 . "*TEXT"))))
)
(progn
(setq i (sslength ss1))
(while (setq s1 (ssname ss1 (setq i (1- i))))
(setq lst (cons (xx-entity-dxfGet 1 s1) lst))
)
(setq i (sslength ss2)
s(ssadd )
)
(while (setq s1 (ssname ss2 (setq i (1- i))))
(if (member (xx-entity-dxfGet 1 s1) lst)
(ssadd s1 s)
)
)
(sssetfirst nil s)
)
)
)
(defun xx-entity-dxfGet(code s1 / ent)
(if (= (type code) 'LIST)
(progn
(setq ent (entget s1))
(mapcar
(function (lambda (x)
(list x (cdr (assoc x ent)))
)
)
code
)
)
(if (= code -3)
(cdr (assoc code (entget s1 '("*"))))
(cdr (assoc code (entget s1)))
)
)
)
谢谢分享。。。。这个功能不错哦。。。 加连线更直观 本帖最后由 1028695446 于 2019-4-15 00:14 编辑
easy
你的这个能完全匹配带#号之类的文字?
看下这个帖子,希望能对你有所启发
http://bbs.mjtd.com/thread-179270-1-1.html
hao3ren 发表于 2019-4-14 23:31
加连线更直观
有带连线的程序吗?不求多目标查找,每次查找单一目标即可,之前见院长演示过 谢谢分享 您好 ,请问能改一份 不完全匹配的吗,,只要含文字的都能选中出来 yjpyjp 发表于 2019-4-21 23:34
您好 ,请问能改一份 不完全匹配的吗,,只要含文字的都能选中出来
不完全匹配,是前后加* 本帖最后由 1291500406 于 2019-4-26 13:52 编辑
yjpyjp 发表于 2019-4-26 12:19
请问是哪一句呐QuQ
(defun c:bb ()(sssetfirst nil (ssget (list '(0 . "text,mtext") (cons 1 (strcat "*" (cdr(assoc 1 (entget(car (entsel "\n必强提示,选择要查找的文字 :"))))) "*")))))(princ))