明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6458|回复: 30

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

  [复制链接]
发表于 2019-4-14 17:08:55 | 显示全部楼层 |阅读模式
源码分享,不喜勿喷
我是新人,还请给位多多支持。
功能:根据选择的文本(可以是多个)对象精确查找并选中相同文本内容的文本对象(使用的是完全匹配的算法)


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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 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 0  pt (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))
                        )
                )
        )
)

我也不会,要是能框选拾取目标字符, 然后再框选范围就完美了。
回复 支持 0 反对 1

使用道具 举报

发表于 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
所有包含在括号 ([ . . . ]) 中的字符都按字义读取,所以不必使用转义字符。但有如下例外:波浪
号 (~) 只有当它不是括号里的第一个字符(如 "[A~BC]")时才按字义读取;否则作为一个“非”字
符读取它,这意味着 wcmatch 函数将匹配跟随在波浪号之后那些字符(如 "[~ABC]")之外的所有字
符。而连字符 (-) 则只有当它是括号中的第一个字符或最后一个字符(如 "[-ABC]" 或 "[ABC-]")时,
才按字义读取。否则,在括号中的连字符用于指定某特定字符的取值范围。该范围仅限于单个字符,
所以,"STR[1-38]" 与 STR1、STR2、STR3 和 STR8 匹配,而 "[A-Z]" 与任意单个大写字母匹配。
如果闭括号 (")") 是括号内的首个字符或跟随在波浪号之后(如 "[ ]ABC)" 或 "[~]ABC)"),
它将被按字义读取。

发表于 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)))
    )
  )
)
发表于 2019-4-14 17:10:54 | 显示全部楼层
谢谢分享。。。。这个功能不错哦。。。
发表于 2019-4-14 23:31:26 | 显示全部楼层
加连线更直观
发表于 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
加连线更直观

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

点评

工具箱之查找到位功能:ep-czdw  发表于 2019-4-22 07:48
发表于 2019-4-21 23:34:37 | 显示全部楼层
您好 ,请问能改一份 不完全匹配的吗,,只要含文字的都能选中出来
发表于 2019-4-26 10:47:14 | 显示全部楼层
yjpyjp 发表于 2019-4-21 23:34
您好 ,请问能改一份 不完全匹配的吗,,只要含文字的都能选中出来

不完全匹配,是前后加*
发表于 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))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-21 01:47 , Processed in 0.175520 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表