至野异族 发表于 2019-4-14 17:08:55

分享一个【查找并选中指定文本内容】的插件

源码分享,不喜勿喷
我是新人,还请给位多多支持。
功能:根据选择的文本(可以是多个)对象精确查找并选中相同文本内容的文本对象(使用的是完全匹配的算法)


用法:
1、先选择要查找的文本(可以是多个对象)。
2、框选要查找的文本进行查找。


3、找到相同的文本对象,这些对象被选中。

200853006 发表于 2019-6-27 10:16:04

依然小小鸟 发表于 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:36:06

本帖最后由 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)"),
它将被按字义读取。

yjpyjp 发表于 2019-4-26 12:19:27

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)))
    )
)
)

evayleung1983 发表于 2019-4-14 17:10:54

谢谢分享。。。。这个功能不错哦。。。

hao3ren 发表于 2019-4-14 23:31:26

加连线更直观

1028695446 发表于 2019-4-15 00:11:13

本帖最后由 1028695446 于 2019-4-15 00:14 编辑

easy

你的这个能完全匹配带#号之类的文字?


看下这个帖子,希望能对你有所启发
http://bbs.mjtd.com/thread-179270-1-1.html




半听可乐 发表于 2019-4-16 19:18:27

hao3ren 发表于 2019-4-14 23:31
加连线更直观

有带连线的程序吗?不求多目标查找,每次查找单一目标即可,之前见院长演示过

yjpyjp 发表于 2019-4-21 23:31:06

谢谢分享

yjpyjp 发表于 2019-4-21 23:34:37

您好 ,请问能改一份 不完全匹配的吗,,只要含文字的都能选中出来

1291500406 发表于 2019-4-26 10:47:14

yjpyjp 发表于 2019-4-21 23:34
您好 ,请问能改一份 不完全匹配的吗,,只要含文字的都能选中出来

不完全匹配,是前后加*

1291500406 发表于 2019-4-26 13:20:02

本帖最后由 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))
页: [1] 2 3
查看完整版本: 分享一个【查找并选中指定文本内容】的插件