明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2327|回复: 13

[经验] 查找替换(三领的)

[复制链接]
发表于 2022-11-18 19:54 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2022-11-28 23:45 编辑

查找替换,是经典功能,本坛很多,我也有,不是没有,展示下:
提不出全部源码,见谅。。。。
支持几乎所有含有 文字的实体类型,包括标注,块类,多行MTEXT等

注:还是走了弯路,因为我解决不了一大片MTEXT文字,取字符串和定位的问题,也是刚发帖求助了
http://bbs.mjtd.com/thread-186647-1-1.html?_dsign=34261847
如果能解决上述问题,代码将大大的不一样,速度也会快的很多,并且还不出BUG。

  • ;;替换改字并换色---------------
  • (defun c:chgtext (/ std ss os ns oldcho dcl_id name)
  •   (setq oldcho (getvar "cmdecho"))
  •   (setvar "cmdecho" 0)
  •   (setq std 1 os "" ns "")
  •   (while (> std 0)
  •     (setq dcl_id (load_dialog (th-dcl)))
  •     (new_dialog "replace" dcl_id)
  •     (set_tile "oldword" os)
  •     (set_tile "newword" ns)
  •     (action_tile "oldword" "(setq os (get_tile \"oldword\"))")
  •     (action_tile "newword" "(setq ns (get_tile \"newword\"))")
  •     (action_tile "pick_1" "(done_dialog 1)")
  •     (action_tile "pick_11" "(done_dialog 2)")
  •     (action_tile "accept" "(done_dialog 0)")
  •     (setq std (start_dialog))
  •     (slunloaddcl dcl_id)
  •     (cond
  •       ((= std 1)
  •         (setq name (car (entsel (slmsg "\n 点选旧字符串:" "\n 點選舊字符串:" "\n Click the old string:"))))
  •         (setq os (getstr name))
  •       )
  •       ((= std 2)
  •         (setq name (car (entsel (slmsg "\n 点选新字符串:" "\n 點選新字符串:" "\n Click the new string:"))))
  •         (setq ns (getstr name))
  •       )
  •     )
  •   )
  •   (princ (slmsg "\n 选择含有文字类实体:" "\n 選擇含有文字類實體:" "\n Select entities containing text:"))
  •   (while (setq ss (ssget ":S" '((0 . "ATTDEF,DIMENSION,TEXT,MTEXT,INSERT,TCH_ARROW,TCH_TEXT,TCH_DRAWINGNAME,TCH_MULTILEADER,TCH_ELEVATION,TCH_MTEXT,ATTRIB"))))
  •     (if (and ss (/= os "") (/= ns ""))
  •       (reptext ss os ns)
  •     )
  •     (princ (slmsg "\n 选择含有文字类实体:" "\n 選擇含有文字類實體:" "\n Select entities containing text:"))
  •   )
  •   (setvar "cmdecho" oldcho)
  • )
  • ;;---------------------
  • (defun th-dcl (/ lst_str)
  •   (setq lst_str
  •     (cond
  •       ((= $Lgver 1)
  •         (list
  •           "replace:dialog {"
  •           "label = \"       替换含文字实体中指定子串\";"
  •           "initial_focus=oldword;"  
  •           ":boxed_row{"
  •           "label=\"旧字符串:\";"
  •           ":edit_box {key = \"oldword\";edit_width = 25;allow_accept=true;}"
  •           ":button{label=\"<--点取+\";key=\"pick_1\";}"
  •           "}"
  •           ":boxed_row{"
  •           "label=\"新字符串:\";"
  •           ":edit_box {key = \"newword\";edit_width = 25;allow_accept=true;}"
  •           ":button{label=\"<--点取+\";key=\"pick_11\";}"
  •           "}"
  •           $okbt
  •           "}"
  •         )
  •       )
  •       ((= $Lgver 2)
  •         (list
  •           "replace:dialog {"
  •           "label = \"       替換含文字實體中指定子串\";"
  •           "initial_focus=oldword;"  
  •           ":boxed_row{"
  •           "label=\"舊字符串:\";"
  •           ":edit_box {key = \"oldword\";edit_width = 25;allow_accept=true;}"
  •           ":button{label=\"<--點取+\";key=\"pick_1\";}"
  •           "}"
  •           ":boxed_row{"
  •           "label=\"新字符串:\";"
  •           ":edit_box {key = \"newword\";edit_width = 25;allow_accept=true;}"
  •           ":button{label=\"<--點取+\";key=\"pick_11\";}"
  •           "}"
  •           $okbt
  •           "}"
  •         )
  •       )
  •       ((= $Lgver 3)
  •         (list
  •           "replace:dialog {"
  •           "label = \"Replace the middle stator string of entities with text\";"
  •           "initial_focus=oldword;"  
  •           ":boxed_row{"
  •           "label=\"Old String:\";"
  •           ":edit_box {key = \"oldword\";edit_width = 25;allow_accept=true;}"
  •           ":button{label=\"<--Pick+\";key=\"pick_1\";}"
  •           "}"
  •           ":boxed_row{"
  •           "label=\"New String:\";"
  •           ":edit_box {key = \"newword\";edit_width = 25;allow_accept=true;}"
  •           ":button{label=\"<--Pick+\";key=\"pick_11\";}"
  •           "}"
  •           $okbt
  •           "}"
  •         )
  •       )
  •     )
  •   )
  •   (dcl2lisp lst_str)
  • )  

    • ;;筛选选择集中文字,文字中字符 以旧换新-------【一级】---------
    • ;; (reptext  ss <要找的文字> <替换成的文字>)
    • (defun reptext (ss oldch newch / enam p n tp etext txtln subln n1 schct newtext readch)
    •   (repeat (setq n (sslength ss))
    •     (setq enam (ssname ss (setq n (1- n))) tp (dxf1 enam 0))
    •     (cond
    •       ((or (= tp "MTEXT") (= tp "TCH_MTEXT"))
    •         (sl-mtext-old-new enam oldch newch)
    •         (ssdel enam ss)
    •       )
    •       ((= tp "INSERT")
    •         (blk-reptext enam oldch newch)
    •         (ssdel enam ss)
    •       )
    •     )
    •   )
    •   (if (setq p (sslength ss) subln (strlen oldch))
    •     (progn
    •       (setq n 0 n1 0)
    •       (while (< n p)
    •         (if (setq etext (getstr (setq enam (ssname ss n))))
    •           (progn
    •             (setq txtln (strlen etext) schct 1 newtext "")
    •             (while (<= schct txtln)
    •               (setq newtext
    •                 (strcat newtext
    •                   (if (= (setq readch (substr etext schct subln)) oldch)
    •                     (setq n1 (1+ n1) schct (+ schct subln) newch newch)
    •                     (progn
    •                       (setq schct (1+ schct))
    •                       (substr readch 1 1)
    •                     )
    •                   )
    •                 )
    •               )
    •             )
    •             (if (/= etext newtext)
    •               (chzi-enam enam newtext)
    •             )
    •           )
    •         )
    •         (setq n (1+ n))
    •       )
    •     )
    •   )
    • )
  • ;;取实体字符串-----(一级)------
  • (defun getstr (enam / e pt str en tp tp1 en2 obj lis)
  •   (setq e (entget enam) tp (dxf1 e 0) obj (en2obj enam))
  •   (cond
  •     ((member tp '("TEXT" "TCH_TEXT"))
  •       (setq str (dxf1 e 1))
  •     )
  •     ((member tp '("MTEXT" "TCH_MTEXT"))
  •       (setq lis (str->lst (dxf1 e 1) ";"))
  •       (if (> (length lis) 1)
  •         (setq str (cadr lis))
  •         (setq str (car lis))
  •       )
  •     )
  •     ((= tp "DIMENSION")
  •       (setq str (vla-get-textoverride obj))
  •       (if (or (= str "") (wcmatch str "*<>*"))
  •         (setq str (rtos (vla-get-measurement obj) 2 (vla-get-toleranceprecision obj)))
  •       )
  •     )
  •     ((= tp "MULTILEADER")
  •       (setq str (dxf1 e 304))
  •     )
  •     ((= tp "TCH_ARROW") ;天正箭头引注
  •       (setq str (vlax-get-property obj 'Text2))
  •     )
  •     ((member tp '("ATTDEF" "TCH_MULTILEADER")) ;如果是属性字,则取“标记”为源文字 ;天正引出标注
  •       (setq str (dxf1 e 2))
  •     )
  •     ((and (= tp "INSERT") (= (dxf1 e 66) 1)) ;;属性块 文字
  •       (setq en (entget (entnext enam)))
  •       (setq str (dxf1 en 1))
  •     )
  •     ((and (= tp "INSERT") (= (dxf1 e 66) 0)) ; 块内文字
  •       (if (null pt) (setq pt (cadr (grread 5))))
  •       (if (not (setq en2 (car (nentselp pt))))
  •         (setq en2 enam)
  •       )
  •       (setq tp1 (dxf1 en2 0))
  •       (if (member tp1 (list "TEXT" "MTEXT" "ATTRIB"))
  •         (setq str (vla-get-textstring (en2obj en2)))
  •       )
  •     )
  •   )
  •   str
  • )
  • ;MTEXT中字符以旧换新-----(一级)------
  • (defun sl-mtext-old-new (enam oldch newch / e)
  •   (setq e (entlast))
  •   (command "EXPLODE" enam)
  •   (reptext (last_ent e) oldch newch)
  •   (setq enam (sl-ss-txt2mtext (last_ent e)))
  •   enam
  • )
    • ;;块内实体文字,以旧换新---(一级)----
    • ;(blk-reptext <块实体名> <要找的文字> <替换成的文字>) (setq enam (car(entsel)))
    • ;;返回替换后的复原块 (blk-reptext (car(entsel)) "0" "1")
    • (defun blk-reptext (enam oldch newch / nam e ss)
    •   (setq nam (dxf1 enam 2))
    •   (while (tblsearch "block" nam)
    •     (setq nam (strcat nam (slsjqs)))
    •   )
    •   (setq e (entlast))
    •   (vl-catch-all-apply 'exp-blk (list enam))
    •   (if (setq ss (last_ent e))
    •     (progn
    •       (reptext ss oldch newch) ;;(reptext ss "0" "1")
    •       (setq ss (last_ent e))
    •       (emkblk ss (ssmpt ss) nam) ;;作普通块  
    •       (entlast)
    •     )
    •   )
    • )




    • ;文字合并到 MTEXT-----(一级)-------
    • ;返回合并后的MTEXT
    • (defun sl-ss-txt2mtext (ss / e_lst n el box boxl l blst strl h h0 hn py st)
    •   (setq e_lst (sysvar '("textsize" "textstyle")) h0 0.5)
    •   (repeat (setq n (sslength ss))
    •     (setq  
    •       el   (entget (ssname ss (setq n (1- n))))
    •       box  (textbox (vl-remove (assoc 50 el) el))
    •       boxl (cons box boxl)
    •       l    (+ (abs (caadr box)) (abs (cadadr box)))
    •       blst (cons l blst)
    •       strl (cons (list (dxf1 el 10) (dxf1 el 1)) strl)
    •       hn   (dxf1 el 40)
    •       st   (if (not st) (dxf1 el 7) st)
    •     )
    •     (if (> hn h0) (setq h hn) (setq h h0))
    •     (setq h0 h)
    •   )
    •   (sl:-erase ss)
    •   (setvar "textsize" h)
    •   (if (/= (getvar "textstyle") st) (setvar "textstyle" st))
    •   (setq strl
    •     (vl-sort strl
    •       '(lambda (e1 e2)
    •          (if (equal (cadar e1) (cadar e2) 0.00001)
    •            (< (caar e1) (caar e2))
    •            (> (cadar e1) (cadar e2))
    •          )
    •        )
    •     )
    •     py (apply 'max (mapcar 'cadr (apply 'append boxl)))
    •   )
    •   (vla-addmtext *Model-Space*
    •     (vlax-3d-point (list (caaar strl) (+ py (cadaar strl))))
    •     (apply 'max blst)
    •     (apply 'strcat (mapcar '(lambda (x) (strcat (last x) "\\P")) strl))
    •   )
    •   (mapcar 'eval e_lst)
    •   (entlast) ;返回合并后MTEXT实体
    • )
以下为 信的文字选择集转MTEXT,这个比较好,存在的大缺憾就是垂直方向需要改写。

  • ;单行文字选择集转多行文字----(一级)------
  • ;ssText  文字选择集 fSpace 行距比例
  • (defun sl-ss-txt2mtext (ssText fSpace / e_lst ptLeftTop fRecWidth Mats y lstText eText edata fHeight fWidth ang
  •                          lst1 lstText1 e e1 e2 box lstReplace ename)
  •   (setq e_lst (sysvar '("TEXTSTYLE" "CLAYER")))
  •   (setq lstText (ss-enlst ssText))
  •   (setq ename (ssname ssText 0))
  •   (setq edata (entget ename))
  •   (command "UCS" "OB" ename)
  •   (setq lstText
  •     (mapcar
  •       '(lambda (eText / edata pt)
  •          (setq edata (entget eText))
  •          (setq pt (dxf1 edata 10))
  •          (trans pt 0 1)
  •          (list pt edata)
  •        )
  •       lstText
  •     )
  •   )
  •   (setq lstText (vl-sort lstText '(lambda (e1 e2) (> (cadar e1) (cadar e2)))))
  •   (setq y (cadaar lstText))
  •   (foreach eText lstText
  •     (setq fHeight (dxf1 (cadr eText) 40))
  •     (if (< (abs (- y (cadar eText))) fHeight)    ;同行
  •       (progn
  •         (setq lst1 (cons eText lst1))
  •         (setq y (cadar eText))
  •       )
  •       (progn
  •         (setq lstText1 (cons lst1 lstText1))    ;加入
  •         (setq y (cadar eText))
  •         (setq lst1 (list eText))
  •       )
  •     )
  •   )
  •   (if lst1 (setq lstText1 (cons lst1 lstText1)))
  •   (setq lstText
  •     (mapcar
  •       '(lambda (lst1)
  •          (mapcar 'cadr (vl-sort lst1 '(lambda (e1 e2) (< (caar e1) (caar e2)))))
  •        )
  •       lstText1
  •     )
  •   )
  •   (setq lstText (reverse lstText))
  •   (setq fRecWidth
  •     (apply
  •       'max
  •       (mapcar
  •         '(lambda (e)
  •            (if (> (length e) 1)
  •              (apply
  •                '+
  •                (mapcar
  •                  '(lambda (e1 / box)
  •                     (setq box (textbox e1))
  •                     (caadr box)
  •                   )
  •                  e
  •                )
  •              )
  •              (caadr (textbox (car e)))
  •            )
  •          )
  •         lstText
  •       )
  •     )
  •   )
  •   (setq fRecWidth (* fRecWidth 1.2) lst1 (caar lstText))
  •   (setq fHeight (dxf1 lst1 40))
  •   (setq ptLeftTop (dxf1 lst1 10))
  •   (setq ang (dxf1 lst1 50))
  •   (setq box (textbox lst1))
  •   (setq ptLeftTop
  •     (polar ptLeftTop ang
  •       (apply 'min
  •         (setq a
  •           (vl-remove nil
  •             (mapcar
  •               '(lambda (lst / str)
  •                  (setq str (dxf1 lst 1))
  •                  (cond
  •                    ((wcmatch str " *, *") 0)
  •                    ((> (ascii (substr str 1 1)) 128)
  •                      0
  •                    )
  •                    (T
  •                      (caar (textbox lst))
  •                    )
  •                  )
  •                )
  •               (mapcar 'car lstText)
  •             )
  •           )
  •         )
  •       )
  •     )
  •   )
  •   (setq ptLeftTop (polar ptLeftTop (+ ang pi2) (apply 'max (mapcar '(lambda (e) (dxf1 e 40)) (car lstText)))))
  •   (sl:-erase ssText)
  •   (setvar 'clayer (dxf1 lst1 8))
  •   (setvar 'TEXTSTYLE (dxf1 lst1 7))
  •   (setq fWidth (dxf1 (tblsearch "Style" (getvar 'textstyle)) 41))
  •   (setq sText
  •     (mapcar
  •       '(lambda (e)
  •          (apply
  •            'strcat
  •            (mapcar
  •              '(lambda
  •                 (e1 / str h w c pre)
  •                 (setq str (dxf1 e1 1))
  •                 (setq h (dxf1 e1 40))
  •                 (setq w (dxf1 e1 41))
  •                 (setq c (dxf1 e1 62))
  •                 (setq str (t-string-subst  "\\{" "{" str))
  •                 (setq str (t-string-subst  "\\}" "}" str))
  •                 (setq pre "")
  •                 (if (not (equal h fHeight)) (setq pre (strcat pre "\\H" (rtos (/ h fHeight) 2 1) "x;")))
  •                 (if (not (equal w fWidth)) (setq pre (strcat pre "\\W" (rtos w 2 1) ";")))
  •                 (if c (setq pre (strcat pre "\\C" (rtos c 2 0) ";")))
  •                 (if (/= pre "")
  •                   (setq str (strcat "{" pre str "}"))
  •                   str
  •                 )
  •               )
  •              e
  •            )
  •          )
  •        )
  •       lstText
  •     )
  •   )
  •   (setq sText (slist->String sText "\\P"))
  •   (command "UCS" "")
  •   (Make-MText sText ptLeftTop fRecWidth fHeight fSpace ang 1 1)
  •   (mapcar 'eval e_lst)
  • )

以下为我改写信的代码,目的减小码子,但调试发现BUG,目前没有找到问题之所在
  • ;文字选择集转多行文字----(一级)------
  • ;ssText 文字选择集 fSpace 行距比例
  • (defun sl-ss-txt2mtext (ssText fSpace / e_lst y ptLeftTop fRecWidth lstText sText eText edata fHeight fWidth ang lst1 lstText1 e e1 e2 plis ename)
  •   (setq e_lst (sysvar '("TEXTSTYLE" "CLAYER")))
  •   (setq plis (ss9pt ssText nil))
  •   (setq ptLeftTop (nth 6 plis) fRecWidth (distance (car plis) (caddr plis)))
  •   (setq lstText (ss-enlst ssText))
  •   (setq ename (ssname ssText 0))
  •   (setq edata (entget ename))
  •   (command "UCS" "OB" ename)
  •   (setq lstText
  •     (mapcar
  •       '(lambda (eText / edata pt)
  •          (setq edata (entget eText))
  •          (setq pt (trans (dxf1 edata 10) 0 1))
  •          (list pt edata)
  •        )
  •       lstText
  •     )
  •   )
  •   (setq lstText (vl-sort lstText '(lambda (e1 e2) (> (cadar e1) (cadar e2)))))
  •   (setq y (cadaar lstText))
  •   (foreach eText lstText
  •     (setq fHeight (dxf1 (cadr eText) 40))
  •     (if (< (abs (- y (cadar eText))) fHeight)    ;同行
  •       (progn
  •         (setq lst1 (cons eText lst1))
  •         (setq y (cadar eText))
  •       )
  •       (progn
  •         (setq lstText1 (cons lst1 lstText1))    ;加入
  •         (setq y (cadar eText))
  •         (setq lst1 (list eText))
  •       )
  •     )
  •   )
  •   (if lst1 (setq lstText1 (cons lst1 lstText1)))
  •   (setq lstText
  •     (mapcar
  •       '(lambda (lst1)
  •          (mapcar 'cadr (vl-sort lst1 '(lambda (e1 e2) (< (caar e1) (caar e2)))))
  •        )
  •       lstText1
  •     )
  •   )
  •   (setq lstText (reverse lstText))
  •   (setq lst1 (caar lstText))
  •   (setq fHeight (dxf1 lst1 40))
  •   (setq ang (dxf1 lst1 50))
  •   (sl:-erase ssText)
  •   (setvar 'clayer (dxf1 lst1 8))
  •   (setvar 'TEXTSTYLE (dxf1 lst1 7))
  •   (setq fWidth (dxf1 (tblsearch "Style" (getvar 'textstyle)) 41))
  •   (setq sText
  •     (mapcar
  •       '(lambda (e)
  •          (apply
  •            'strcat
  •            (mapcar
  •              '(lambda
  •                 (e1 / str h w c pre)
  •                 (setq str (dxf1 e1 1))
  •                 (setq h (dxf1 e1 40))
  •                 (setq w (dxf1 e1 41))
  •                 (setq c (dxf1 e1 62))
  •                 (setq str (t-string-subst  "\\{" "{" str))
  •                 (setq str (t-string-subst  "\\}" "}" str))
  •                 (setq pre "")
  •                 (if (not (equal h fHeight)) (setq pre (strcat pre "\\H" (rtos (/ h fHeight) 2 1) "x;")))
  •                 (if (not (equal w fWidth)) (setq pre (strcat pre "\\W" (rtos w 2 1) ";")))
  •                 (if c (setq pre (strcat pre "\\C" (rtos c 2 0) ";")))
  •                 (if (/= pre "")
  •                   (setq str (strcat "{" pre str "}"))
  •                   str
  •                 )
  •               )
  •              e
  •            )
  •          )
  •        )
  •       lstText
  •     )
  •   )
  •   (setq sText (slist->String sText "\\P"))
  •   (command "UCS" "")
  •   (Make-MText sText ptLeftTop fRecWidth fHeight fSpace ang 1 1)
  •   (mapcar 'eval e_lst)
  • )



链接:https://pan.baidu.com/s/1RA53nRQM567jTvy12MZRtA
提取码:n3jd





本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
kucha007 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2022-11-19 20:00 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-11-19 21:20 编辑
rocking2008 发表于 2022-11-19 15:58
替换后的文字的位置是不是发生了改变?

有微动错位,确实,我比较追求功能全面,智能,比功能不全面强,暂时这么用,
打开图纸,插件发现功能部分失效,是极其不能接收的心病。
 楼主| 发表于 2022-11-19 09:02 | 显示全部楼层
本帖最后由 尘缘一生 于 2022-11-19 21:21 编辑
中国梦 发表于 2022-11-19 06:19
还可以,支持一下

已修改,主要想解决:多行MTEXT、块内实体问题,
 楼主| 发表于 2024-2-22 17:34 | 显示全部楼层
KO你 发表于 2024-2-22 17:18
能支持钢筋符号?

支持,集成里面处理了
发表于 2022-11-19 06:19 | 显示全部楼层
还可以,支持一下
发表于 2022-11-19 09:29 | 显示全部楼层
感谢大神分享,支持下~
发表于 2022-11-19 12:56 | 显示全部楼层
感谢大神分享
发表于 2022-11-19 13:09 | 显示全部楼层
感谢大神分享,支持下~   
发表于 2022-11-19 14:15 | 显示全部楼层
谢谢 三领老师的代码 把属性块修改给解惑了
发表于 2022-11-19 15:58 | 显示全部楼层
替换后的文字的位置是不是发生了改变?
发表于 2022-11-19 22:15 | 显示全部楼层
很不错的代码,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 19:45 , Processed in 2.245023 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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