明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: wzg356

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

    [复制链接]
发表于 2023-8-22 20:49:36 | 显示全部楼层
find太卡界面太大还不能自由缩放视窗
早就想做个替代程序了
但是在mtext这遇到了困难
无格式的好说
有格式的也不算太难
就是换行比较讨厌
还有些特殊符号
难以获取精确的box角标
发表于 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-22 23:11:01 | 显示全部楼层
本帖最后由 wzg356 于 2023-8-22 23:22 编辑

masterlong 发表于 2023-8-22 22:17


多行文本可以格式还原的,就按取得的有效字符(炸开后的)从头开始在原含格式的字符串里面逐个字符检索取回来就行了。
替换匹配是按有效字符匹配的。
主要问题是要替换的旧字串间有格式变化时,新字串格式如何人为安排。
发表于 2023-8-23 08:54:51 | 显示全部楼层
本帖最后由 gaics 于 2023-8-23 17:13 编辑

getlockedas函数针对图名中乱码的情况会报错。
比如我的图纸里"V_B"就存在乱码
命令: (tblsearch "layer" "V_B")
((0 . "LAYER") (2 . "V_B") (70 . 0) (62 . 8) (6 . "Continuous"))

建议改为如下方式:
(defun getlockedlas (/ la lst es)
  (vlax-for la (vla-get-layers
                 (vla-get-activedocument (vlax-get-acad-object))
               )
    (if        (or (eq (vla-get-Lock la) :vlax-true)
            (eq (vla-get-Freeze la) :vlax-true)
            (eq (vla-get-LayerOn la) :vlax-false)
        )
      (setq lst (cons (vla-get-name la) lst))
    )
  )
)


但是,为什么要排除“锁定”的图层呢?只排除“关闭”和“冻结”的不可见图层不行吗?
发表于 2023-8-23 08:56:43 | 显示全部楼层
本帖最后由 gaics 于 2023-8-23 13:57 编辑

还有个问题,查看时视图拉的太远,看不见文字在哪。

建议根据文字字高设置显示范围。
 楼主| 发表于 2023-8-23 18:20:10 来自手机 | 显示全部楼层
gaics 发表于 2023-8-23 08:56
还有个问题,查看时视图拉的太远,看不见文字在哪。

建议根据文字字高设置显示范围。

把最后用于查看的函数里面+-6000数据改小就是放大
发表于 2023-8-24 08:14:52 | 显示全部楼层
getlockedlas函数的值并没有传递给lockedlas
 楼主| 发表于 2023-8-24 10:42:09 来自手机 | 显示全部楼层
gaics 发表于 2023-8-23 08:54
getlockedas函数针对图名中乱码的情况会报错。
比如我的图纸里"V_B"就存在乱码
命令: (tblsearch "layer" ...

冻结好像选不上(自己试一下),不管,锁定层可以看—不能操作,自己据需求修改吧!查看,建注记(如画实体线框等)没问题,对文字对象操作难度很大,会误操作。

另,ssget用(1 . 通配符)过滤选多行文字不一定能选中(有格式变化时),有时又会误选(通配符与格式控制符配上),自己据需要是否包含
发表于 2023-8-24 11:04:54 | 显示全部楼层
本帖最后由 gaics 于 2023-8-24 11:07 编辑
wzg356 发表于 2023-8-24 10:42
冻结好像选不上(自己试一下),不管,锁定层可以看—不能操作,自己据需求修改吧!查看,建注记(如画实 ...

我试了,锁定、关闭和冻结 都能被选中
发表于 2023-8-24 14:51:12 | 显示全部楼层
gaics 发表于 2023-8-23 08:56
还有个问题,查看时视图拉的太远,看不见文字在哪。

建议根据文字字高设置显示范围。

我使用的时候也有这个问题,运行后自动窗口自动缩小了,标记框都找不到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 03:44 , Processed in 0.186684 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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