masterlong 发表于 2023-8-22 20:49:36

find太卡界面太大还不能自由缩放视窗
早就想做个替代程序了
但是在mtext这遇到了困难
无格式的好说
有格式的也不算太难
就是换行比较讨厌
还有些特殊符号
难以获取精确的box角标

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

;;去除单行文字中的上下划线标志   ---多行文字中的上下标格式,与单行文字的格式不一样。炸开mt后dt会自动进行转换,导致字符串总长度有差异。
(defun dtfix( str )
(setq str (vl-string-subst "" "%%U" (vl-string-subst "" "%%O" str)))
)
;;多行炸开变单行时,一些特殊的字符自动被转换,需要转换回去。
(defun spdtfix( str )
(setq str (vl-string-subst "%%p" "±" str))      ;\U+00B1
(setq str (vl-string-subst "%%c" "\U+2205" str))
(setq str (vl-string-subst "%%d" "°" str))      ;\U+00B0
)
;;多行文字提取单行文字   --来自明经--yuuboo改造,返回列表(list str str2biao):::str为脱格式后完整字符串,str2biao为考虑换行的字符串列表
(defun mt2dt( MTextString / regex s s1 s2 )
(setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
(vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
(vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
(setq s MTextString)

;替换\\字符
(vlax-put-property regex "Pattern" "\\\\\\\\")
(setq s (vlax-invoke-methodregex "Replace" s (chr 1)))
;替换\{字符
(vlax-put-property regex "Pattern" "\\\\{")
(setq s (vlax-invoke-methodregex "Replace" s (chr 2)))
;替换\}字符
(vlax-put-property regex "Pattern" "\\\\}")
(setq s (vlax-invoke-methodregex "Replace" s (chr 3)))
;删除段落缩进格式
(vlax-put-property regex "Pattern" "\\\\pi(.[^;]*);")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;删除制表符格式
(vlax-put-property regex "Pattern" "\\\\pt(.[^;]*);")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;删除堆迭格式
(vlax-put-property regex "Pattern" "\\\\S(.[^;]*)(\\^|#|\\\\)(.[^;]*);")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;删除字体、颜色、字高、字距、倾斜、字宽、对齐格式
(vlax-put-property regex "Pattern" "(\\\\F|\\\\f|\\\\C|\\\\H|\\\\\T|\\\\Q|\\\\W|\\\\A)(.[^;]*);")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;删除下划线、删除线格式
(vlax-put-property regex "Pattern" "(\\\\L|\\\\O|\\\\l|\\\\o)")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;删除不间断空格格式
(vlax-put-property regex "Pattern" "\\\\~")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;删除{}
(vlax-put-property regex "Pattern" "({|})")
(setq s (vlax-invoke-methodregex "Replace" s ""))
;替换回\\,\{,\}字符
(vlax-put-property regex "Pattern" "\\x01")
(setq s (vlax-invoke-methodregex "Replace" s "\\"))
(vlax-put-property regex "Pattern" "\\x02")
(setq s (vlax-invoke-methodregex "Replace" s "{"))
(vlax-put-property regex "Pattern" "\\x03")
(setq s (vlax-invoke-methodregex "Replace" s "}"))

      ;;几个特殊符号更换大小写
      (setq s (vl-string-subst "%%p" "%%P" (vl-string-subst "%%d" "%%D" (vl-string-subst "%%c" "%%C" s))))

;;;换行处理1
(setq s1 s)
;删除回车换行符格式
(vlax-put-property regex "Pattern" "\\\\P")
(setq s1 (vlax-invoke-methodregex "Replace" s1 ""))
;删除换行符格式(针对Shift+Enter格式)
(vlax-put-property regex "Pattern" "\n")
(setq s1 (vlax-invoke-methodregex "Replace" s1 ""))

;;;换行处理2
(setq s2 s)
;回车换行符格式替换为 "\n"
(vlax-put-property regex "Pattern" "\\\\P")
(setq s2 (vlax-invoke-methodregex "Replace" s2 "\\n"))
;回车换行符格式替换为 "\n"(针对Shift+Enter格式)
(vlax-put-property regex "Pattern" "\n")
(setq s2 (vlax-invoke-methodregex "Replace" s2 "\\n"))


(vlax-release-object regex)
(list s1 (dos_strtokens s2 "\\n" T))
)

wzg356 发表于 2023-8-22 23:11:01

本帖最后由 wzg356 于 2023-8-22 23:22 编辑

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


多行文本可以格式还原的,就按取得的有效字符(炸开后的)从头开始在原含格式的字符串里面逐个字符检索取回来就行了。
替换匹配是按有效字符匹配的。
主要问题是要替换的旧字串间有格式变化时,新字串格式如何人为安排。

gaics 发表于 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))
    )
)
)


但是,为什么要排除“锁定”的图层呢?只排除“关闭”和“冻结”的不可见图层不行吗?

gaics 发表于 2023-8-23 08:56:43

本帖最后由 gaics 于 2023-8-23 13:57 编辑

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

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

wzg356 发表于 2023-8-23 18:20:10

gaics 发表于 2023-8-23 08:56
还有个问题,查看时视图拉的太远,看不见文字在哪。

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

把最后用于查看的函数里面+-6000数据改小就是放大

gaics 发表于 2023-8-24 08:14:52

getlockedlas函数的值并没有传递给lockedlas

wzg356 发表于 2023-8-24 10:42:09

gaics 发表于 2023-8-23 08:54
getlockedas函数针对图名中乱码的情况会报错。
比如我的图纸里"V_B"就存在乱码
命令: (tblsearch "layer" ...

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

另,ssget用(1 . 通配符)过滤选多行文字不一定能选中(有格式变化时),有时又会误选(通配符与格式控制符配上),自己据需要是否包含

gaics 发表于 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
还有个问题,查看时视图拉的太远,看不见文字在哪。

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

我使用的时候也有这个问题,运行后自动窗口自动缩小了,标记框都找不到
页: 1 [2] 3 4 5 6 7
查看完整版本: 20231120更-完整源码-字串搜索定位及选择替换--支持*TEXT,*LEADER,DIM..块属性..