明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7810|回复: 61

[源码] 20231120更-完整源码-字串搜索定位及选择替换--支持*TEXT,*LEADER,DIM..块属性..

    [复制链接]
发表于 2023-8-22 11:47:15 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2023-11-20 15:03 编辑


20231120“字符串搜索定位替换3.0.lsp/fas”选择搜索对象时---回车=全图搜索
=========================
20230924更,修正取得文字包围盒的小bug
字符串搜索定位替换-非分解定位版.lsp"速度问题基本解决,但只适用左对正,放弃了,继续搞代码太长,有兴趣的可以下。
=============================================================
20230908更-实际没有加速,改为查看过程中再取定位坐标--丝滑体验,感觉不到慢,该贴到此结束

推荐方案:“字符串搜索定位替换3.0.lsp/fas”为老版本改进更新--速度优势明显,mtext用分解定位方案,加持“通用参数输入dcl.lsp”(fas已打包-我大部分工具直接用,说明见其它贴)则可拾取文字--主要是不想再写对话框了---下载过的重新下就行了

比选方案:"字符串搜索定位替换-非分解定位版.lsp"可用完整,推荐方案术路线不同,mtext多行文字采用非分解定位技术,速度稍慢一些(感觉也不明显)由于该方案我已放弃,*LEADER,DIM没有转mtexi(还是炸取metxt)--对分解有偏见者或有其他用途的可以拿去---里面的函数修改一下可取得mtext各行包围框识别自然换行


以上2方案功能结果一样
非分解定位还有其它手段,速度比前述2方案没优势,就不发了
==================================
20230906消缺,MTEXT换行(非自然换行)不匹配
====================
20230904改进,过滤无效的正则匹配,执行效率有所提高
另外,提一个知识点:(ssget'((0 . "MTEXT")(1 . "....")))仅对最后250个字符匹配检索,组码3不参与匹配,故string过滤匹配均放在取得选择集之后
======================================
20230902更,修正bug,增加:属性块/尺寸标注

支持以下五种图元,排除锁定/冻结/关闭层- 可检索到,隐患大
TEXT
INSERT-----只针对属性块的"ATTRIB"值查看/替换
以上两项均属单行文本,执行效率最高

MTEXT
MULTILEADER
DIMENSION---只针对有文字替代的尺寸标注且仅对文字替代查看/替换
以上3项属多行文本,需炸开取得定位坐标,效率慢一些(图元名及属性没改变,也无垃圾产生)
为避免漏选,多行文本过滤放在程序内部引入正则过滤检索--格式变化/换行不影响检索结果

操作选项采用grread跟踪,直接按相应键即可,查看下一项默认回车/空格
每一次替换操作均弹出输入框,以便临时更改替换字符,替换字符无变化直接回车即可。

可以先选择后执行——以便结合选择工具使用提高操作效率
选择工具可参见http://bbs.mjtd.com/thread-183273-1-1.html

本帖的意义在于提供了多行文本查找定位替换的一些思路——含格式变化换行的处理
进一步扩展,有能力的自己加,比如修改替换/未替换处的标记或其他操作

另,有回复提议操作块内文本,因替换涉及块重定义(与所见即所得相违)或改名----而使用者可能不知道该结果,未采纳(会对其它插件误伤)
同样道理,也不对正常显示测量尺寸的标注进行操作

fas与lsp同步更新了,功能一样的
lsp文件比原贴,加收1个币
程序命令c:findr
















本帖子中包含更多资源

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

x

评分

参与人数 5明经币 +5 金钱 +25 收起 理由
baitang36 + 1 很给力!
天天问 + 1 + 20 很给力!
gaics + 1 很给力!
434939575 + 1 赞一个!
tigcat + 1 + 5 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-8-22 22:17:04 | 显示全部楼层
  1. ;;去除单行文字中的上下划线标志   ---多行文字中的上下标格式,与单行文字的格式不一样。炸开mt后dt会自动进行转换,导致字符串总长度有差异。
  2. (defun dtfix( str )
  3.   (setq str (vl-string-subst "" "%%U" (vl-string-subst "" "%%O" str)))
  4. )
  5. ;;多行炸开变单行时,一些特殊的字符自动被转换,需要转换回去。
  6. (defun spdtfix( str )
  7.   (setq str (vl-string-subst "%%p" "±" str))        ;\U+00B1
  8.   (setq str (vl-string-subst "%%c" "\U+2205" str))
  9.   (setq str (vl-string-subst "%%d" "°" str))        ;\U+00B0
  10. )
  11. ;;多行文字提取单行文字   --来自明经  --yuuboo改造,返回列表(list str str2biao)  :::  str为脱格式后完整字符串,str2biao为考虑换行的字符串列表
  12. (defun mt2dt( MTextString / regex s s1 s2 )
  13.   (setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  14.   (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  15.   (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  16.   (setq s MTextString)
  17.   
  18.   ;替换\\字符
  19.   (vlax-put-property regex "Pattern" "\\\\\\\")
  20.   (setq s (vlax-invoke-method  regex "Replace" s (chr 1)))
  21.   ;替换\{字符
  22.   (vlax-put-property regex "Pattern" "\\\\{")
  23.   (setq s (vlax-invoke-method  regex "Replace" s (chr 2)))
  24.   ;替换\}字符
  25.   (vlax-put-property regex "Pattern" "\\\\}")
  26.   (setq s (vlax-invoke-method  regex "Replace" s (chr 3)))
  27.   ;删除段落缩进格式
  28.   (vlax-put-property regex "Pattern" "\\\\pi(.[^;]*);")
  29.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  30.   ;删除制表符格式
  31.   (vlax-put-property regex "Pattern" "\\\\pt(.[^;]*);")
  32.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  33.   ;删除堆迭格式
  34.   (vlax-put-property regex "Pattern" "\\\\S(.[^;]*)(\\^|#|\\\\)(.[^;]*);")
  35.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  36.   ;删除字体、颜色、字高、字距、倾斜、字宽、对齐格式
  37.   (vlax-put-property regex "Pattern" "(\\\\F|\\\\f|\\\\C|\\\\H|\\\\\T|\\\\Q|\\\\W|\\\\A)(.[^;]*);")
  38.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  39.   ;删除下划线、删除线格式
  40.   (vlax-put-property regex "Pattern" "(\\\\L|\\\\O|\\\\l|\\\\o)")
  41.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  42.   ;删除不间断空格格式
  43.   (vlax-put-property regex "Pattern" "\\\\~")
  44.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  45.   ;删除{}
  46.   (vlax-put-property regex "Pattern" "({|})")
  47.   (setq s (vlax-invoke-method  regex "Replace" s ""))
  48.   ;替换回\\,\{,\}字符
  49.   (vlax-put-property regex "Pattern" "\\x01")
  50.   (setq s (vlax-invoke-method  regex "Replace" s "\"))
  51.   (vlax-put-property regex "Pattern" "\\x02")
  52.   (setq s (vlax-invoke-method  regex "Replace" s "{"))
  53.   (vlax-put-property regex "Pattern" "\\x03")
  54.   (setq s (vlax-invoke-method  regex "Replace" s "}"))
  55.   
  56.       ;;几个特殊符号更换大小写
  57.       (setq s (vl-string-subst "%%p" "%%P" (vl-string-subst "%%d" "%%D" (vl-string-subst "%%c" "%%C" s))))
  58.   
  59.   ;;;换行处理1
  60.   (setq s1 s)
  61.   ;删除回车换行符格式
  62.   (vlax-put-property regex "Pattern" "\\\\P")
  63.   (setq s1 (vlax-invoke-method  regex "Replace" s1 ""))
  64.   ;删除换行符格式(针对Shift+Enter格式)
  65.   (vlax-put-property regex "Pattern" "\n")
  66.   (setq s1 (vlax-invoke-method  regex "Replace" s1 ""))
  67.   
  68.   ;;;换行处理2
  69.   (setq s2 s)
  70.   ;回车换行符格式替换为 "\n"
  71.   (vlax-put-property regex "Pattern" "\\\\P")
  72.   (setq s2 (vlax-invoke-method  regex "Replace" s2 "\\n"))
  73.   ;回车换行符格式替换为 "\n"(针对Shift+Enter格式)
  74.   (vlax-put-property regex "Pattern" "\n")
  75.   (setq s2 (vlax-invoke-method  regex "Replace" s2 "\\n"))
  76.   

  77.   (vlax-release-object regex)
  78.   (list s1 (dos_strtokens s2 "\\n" T))
  79. )


回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-24 15:05:59 | 显示全部楼层
天天问 发表于 2023-8-24 14:51
我使用的时候也有这个问题,运行后自动窗口自动缩小了,标记框都找不到

替换一下这个函数,我把缩放改为字高的10倍
(defun grdrawboxs (boxs ys / n cmd ps p hi)
  (setq        n   0
        cmd (if        command-s
              command-s
              vl-cmdf
            )
  )
  (while (and (setq ps (nth n boxs))
              (equal "" (getstring "\n输入空格或回车查看:"))
         )
    (setq p (car ps))
    (setq hi (* 10 (distance p (car (reverse ps)))))
    (cmd "_zoom"
         (mapcar '- p (list hi hi))
         (mapcar '+ p (list hi hi))
    )
    (mapcar (function (lambda (a b) (grdraw a b ys)))
            ps
            (cdr ps)
    )
    (grdraw (car ps) (last ps) ys)
    (setq n (1+ n))
  )
  (alert "\n查看结束!")
)
发表于 2023-8-22 13:02:08 | 显示全部楼层
感谢楼主分享。
发表于 2023-8-22 13:13:15 | 显示全部楼层
感谢楼主分享
发表于 2023-8-22 13:17:19 | 显示全部楼层
666666666666666666666666666
发表于 2023-8-22 13:40:35 | 显示全部楼层
find  不好用吗?
 楼主| 发表于 2023-8-22 14:06:07 来自手机 | 显示全部楼层
liuhe 发表于 2023-8-22 13:40
find  不好用吗?

目的不限于查看和替换
发表于 2023-8-22 15:40:19 | 显示全部楼层
感谢楼主的分享!
这个很方便!!
发表于 2023-8-22 16:06:00 | 显示全部楼层
本帖最后由 panliang9 于 2023-8-22 16:25 编辑

用2007 2010 2020 都测试了一下,但没有挨个看的效果,准备再试一下。
 楼主| 发表于 2023-8-22 16:35:10 | 显示全部楼层
本帖最后由 wzg356 于 2023-8-22 16:36 编辑
panliang9 发表于 2023-8-22 16:06
用2007 2010 2020 都测试了一下,但没有挨个看的效果,准备再试一下。

老师傅啊,查找的字串有没有,看是否有数据返回,box是一堆坐标
发表于 2023-8-22 16:57:27 | 显示全部楼层
wzg356 发表于 2023-8-22 16:35
老师傅啊,查找的字串有没有,看是否有数据返回,box是一堆坐标

效果出来了,但不是回车键,是空格键。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 01:59 , Processed in 0.183187 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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