明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 58842|回复: 182

[源码] 文字刷-2021.11更新 刷相同文字 支持块中文字、单多行文字、天正文字

    [复制链接]
发表于 2012-9-7 17:19:03 | 显示全部楼层 |阅读模式
本帖最后由 print1985 于 2021-11-22 17:22 编辑

参考各位大神的代码,做了个文本内容刷-刷相同文字
支持块中文字(块中文字只能点选,其它文字可以框选)、单行文字、多行文字、天正文字、天正图名、天正标高、属性文字、块中属性文字。
因为没人帮忙测试,如发现bug请反馈。
更多功能以后再慢慢添加。


更新记录:
V3.2 2021.11 增加天正标注、CAD多重引注(都是源码,需要支持更多类型,自己改改就行)
V3.0 2016.04 多行文字刷单行文字时,去除多行文字无用格式符号;增加亮显、错误处理及其它地方小改。
V2.1 修正用户坐标系时,无法点选刷字的bug
V2.0 增加了对属性文字、块中属性文字的支持









本帖子中包含更多资源

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

x

点评

能否增加天正箭头引注的刷子?  发表于 2013-1-2 00:57

评分

参与人数 8明经币 +8 收起 理由
菜鸟初来乍到 + 1
kucha007 + 1 很给力!
tigcat + 1 很给力!
chixun99 + 1 厉害好用
奥特蛋 + 1 多谢阿甘,有没得时间升级一下你的词库呀
头大无恼 + 1 很给力!
革天明 + 1 别人测试都是黑盒测试,没有白盒直接
669423907 + 1 很给力!

查看全部评分

"觉得好,就打赏"
      共2人打赏

本帖被以下淘专辑推荐:

发表于 2021-7-19 09:59:32 | 显示全部楼层
阿甘大师好
在天正T20 v7与CAD2022的软件搭配环境下测试了

从“天正图元”刷到“CAD图元”
1.天正图元(标高标注、图名标注)> CAD图元(文字、多行文字、块内文字),完美可行。

然后把条件反转一下
从“CAD图元”刷到“天正图元”
2.CAD图元(文字、多行文字、块内文字)> 天正图元(标高标注、图名标注),不能刷成功。
发表于 2022-8-17 16:26:41 | 显示全部楼层
刷标注的时候可以正常刷,但是对象只要移动位置标注文字就会变回去,查看标注的文字替代是空的。关键是这个现象有时候出现有时候又没事,不知道啥原因。
发表于 2021-4-21 14:24:29 | 显示全部楼层
kucha007 发表于 2021-4-20 14:42
附议。这个功能真的很需要。改物料的时候简直崩溃

感谢大大的回复,受教了。不过确实也是因为自己不会改才会请求完善代码
发表于 2012-9-7 17:51:42 | 显示全部楼层
好东东。
发表于 2012-9-7 18:14:49 来自手机 | 显示全部楼层
谢谢分享。
发表于 2012-9-7 18:43:22 | 显示全部楼层
源码顶下
发表于 2012-9-7 18:45:28 | 显示全部楼层
非常好的程序,要是能再加上文本内容对换就完美了。。。
下面这个是Lee-mac的文本刷,不过不支持天正文字。。。
  1. ;**************文本内容刷/对换
  2. (defun c:2 nil (CopyorSwapText nil))

  3. (defun c:22 nil (CopyorSwapText t))
  4. (defun CopyorSwapText

  5.               (swap     /       *error*   _StartUndo
  6.                _EndUndo     _UnFormat _AllowsFormatting
  7.                doc     entity       ms1         ms2
  8.                mstr     o1       o2         ostr
  9.                regexp     ss       string    ts1
  10.                ts2     tstr
  11.               )

  12.   (vl-load-com)

  13.   (setq    *retain* (cond (*retain*)
  14.                ("Yes")
  15.          )
  16.   )

  17.   ;;------------------------------------------------------------;;
  18.   ;;                     Local Functions                        ;;
  19.   ;;------------------------------------------------------------;;

  20.   (defun *error* (msg)
  21.     (LM:ReleaseObject RegExp)
  22.     (if    doc
  23.       (_EndUndo doc)
  24.     )
  25.     (or    (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  26.     (princ (strcat "\n** Error: " msg " **"))
  27.     )
  28.     (princ)
  29.   )

  30.   ;;------------------------------------------------------------;;

  31.   (defun _StartUndo (doc)
  32.     (_EndUndo doc)
  33.     (vla-StartUndoMark doc)
  34.   )

  35.   ;;------------------------------------------------------------;;

  36.   (defun _EndUndo (doc)
  37.     (if    (= 8 (logand 8 (getvar 'UNDOCTL)))
  38.       (vla-EndUndoMark doc)
  39.     )
  40.   )

  41.   ;;------------------------------------------------------------;;

  42.   (defun _UnFormat
  43.      (regex entity textstring mtextstring / *error* _Replace)

  44.     (defun _Replace (new old string)
  45.       (vlax-put-property regex 'pattern old)
  46.       (vlax-invoke regex 'replace string new)
  47.     )

  48.     (
  49.      (lambda (string)
  50.        (if (_AllowsFormatting entity)
  51.      (mapcar
  52.        (function
  53.          (lambda (x)
  54.            (setq string (_Replace (car x) (cdr x) string))
  55.          )
  56.        )
  57.        '(
  58.          ("" . "\\\\\\\\")
  59.          (" " . "\\\\P|\\n|\\t")
  60.          ("$1"
  61.           .
  62.           "\\\\(\\\\[ACcFfHLlOopQTW])|\\\\[ACcFfHLlOopQTW][^\\\\;]*;|\\\\[ACcFfHLlOopQTW]"
  63.          )
  64.          ("$1$2/$3" . "([^\\\\])\\\\S([^;]*)[/#\\^]([^;]*);")
  65.          ("$1$2" . "\\\\(\\\\S)|[\\\\](})|}")
  66.          ("$1" . "[\\\\]({)|{")
  67.         )
  68.      )
  69.      (setq string
  70.         (_Replace "" "%%[OoUu]" (_Replace "" "\\\\" string))
  71.      )
  72.        )
  73.        (set mtextstring
  74.         (_Replace "\\\\"
  75.               ""
  76.               (_Replace    "\\$1$2$3"
  77.                 "(\\\\[ACcFfHLlOoPpQSTW])|({)|(})"
  78.                 string
  79.               )
  80.         )
  81.        )
  82.        (set textstring (_Replace "\\" "" string))
  83.      )
  84.       (LM:GetTextString entity)
  85.     )
  86.     nil
  87.   )

  88.   ;;------------------------------------------------------------;;

  89.   (defun _Selectif (pred func str keyW / e result)
  90.     (while
  91.       (progn (setvar 'ERRNO 0)
  92.          (if keyW
  93.            (initget keyW)
  94.          )
  95.          (setq e (func str))
  96.          (cond
  97.            ((= 7 (getvar 'ERRNO))

  98.         (princ "\n** 未选择, 请重新选择对象 **")
  99.            )
  100.            ((and keyW (eq 'STR (type e)))

  101.         (not (setq result e))
  102.            )
  103.            ((vl-consp e)

  104.         (if (and pred (not (pred (car e))))
  105.           (princ "\n** 无效的物体被选择 **")
  106.           (not (setq result (car e)))
  107.         )
  108.            )
  109.          )
  110.       )
  111.     )
  112.     result
  113.   )

  114.   ;;------------------------------------------------------------;;

  115.   (defun _AllowsFormatting (entity / object)

  116.     (or    (wcmatch (cdr (assoc 0 (entget entity)))
  117.          "MTEXT,MULTILEADER"
  118.     )
  119.     (and
  120.       (eq "ATTRIB" (cdr (assoc 0 (entget entity))))
  121.       (vlax-property-available-p
  122.         (setq object (vlax-ename->vla-object entity))
  123.         'MTextAttribute
  124.       )
  125.       (eq :vlax-true (vla-get-MTextAttribute object))
  126.     )
  127.     )
  128.   )

  129.   ;;------------------------------------------------------------;;
  130.   ;;                      Main Function                         ;;
  131.   ;;------------------------------------------------------------;;

  132.   (setq RegExp (vlax-get-or-create-object "VBScript.RegExp"))

  133.   (mapcar
  134.     (function
  135.       (lambda (x) (vlax-put-property RegExp (car x) (cdr x)))
  136.     )
  137.     (list (cons 'global actrue)
  138.       (cons 'ignorecase acfalse)
  139.       (cons 'multiline actrue)
  140.     )
  141.   )

  142.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))

  143.   (cond
  144.     (
  145.      swap
  146.      (while
  147.        (and
  148.      (progn
  149.        (while
  150.          (and (princ (strcat "\n--> Formatting Retained: " *retain*))
  151.           (setq    o1
  152.              (_Selectif
  153.                (lambda (entity)
  154.                  (wcmatch (cdr (assoc 0 (entget entity)))
  155.                       "*TEXT,ATTRIB,MULTILEADER"
  156.                  )
  157.                )
  158.                nentsel
  159.                "\nSelect Text to Swap [Settings/Exit] <Exit>: "
  160.                "Settings Exit"
  161.              )
  162.           )
  163.           (eq 'STR (type o1))
  164.           (not (eq "Exit" o1))
  165.          )
  166.           (initget "Yes No")
  167.           (setq *retain*
  168.              (cond
  169.                (
  170.             (getkword
  171.               (strcat "\nRetain MText Formatting [Yes/No] <"
  172.                   *retain*
  173.                   "> : "
  174.               )
  175.             )
  176.                )
  177.                (*retain*)
  178.              )
  179.           )
  180.        )
  181.        o1
  182.      )
  183.      (setq o2
  184.         (_Selectif
  185.           (lambda (entity)
  186.             (wcmatch (cdr (assoc 0 (entget entity)))
  187.                  "*TEXT,ATTRIB,MULTILEADER"
  188.             )
  189.           )
  190.           nentsel
  191.           "\nAnd Text to Swap it With [Exit] <Exit>: "
  192.           "Exit"
  193.         )
  194.      )
  195.      (not (eq "Exit" o2))
  196.        )

  197.     (_StartUndo doc)

  198.     (setq s1 (LM:GetTextString o1)
  199.           s2 (LM:GetTextString o2)
  200.     )

  201.     (_Unformat RegExp o1 'ts1 'ms1)
  202.     (_Unformat RegExp o2 'ts2 'ms2)

  203.     (apply
  204.       (function
  205.         (lambda (retain MText1 MText2)

  206.           (setq o1 (vlax-ename->vla-object o1)
  207.             o2 (vlax-ename->vla-object o2)
  208.           )
  209.           (cond
  210.         (
  211.          (and MText1 MText2)

  212.          (vla-Put-TextString
  213.            o1
  214.            (if retain
  215.              s2
  216.              ms2
  217.            )
  218.          )
  219.          (vla-Put-TextString
  220.            o2
  221.            (if retain
  222.              s1
  223.              ms1
  224.            )
  225.          )
  226.         )
  227.         (
  228.          MText1

  229.          (vla-Put-TextString o1 ms2)
  230.          (vla-Put-TextString o2 ts1)
  231.         )
  232.         (
  233.          MText2

  234.          (vla-Put-TextString o1 ts2)
  235.          (vla-Put-TextString o2 ms1)
  236.         )
  237.         (
  238.          t

  239.          (vla-Put-TextString
  240.            o1
  241.            (if retain
  242.              s2
  243.              ts2
  244.            )
  245.          )
  246.          (vla-Put-TextString
  247.            o2
  248.            (if retain
  249.              s1
  250.              ts1
  251.            )
  252.          )
  253.         )
  254.           )
  255.         )
  256.       )
  257.       (cons    (eq "Yes" *retain*)
  258.         (mapcar '_AllowsFormatting (list o1 o2))
  259.       )
  260.     )

  261.     (_EndUndo doc)
  262.      )
  263.     )
  264.     (t
  265.      (if
  266.        (progn
  267.      (while
  268.        (and    (princ (strcat "\n--> Formatting Retained: " *retain*))
  269.         (setq o1
  270.                (_Selectif
  271.              (lambda (entity)
  272.                (wcmatch (cdr (assoc 0 (entget entity)))
  273.                     "*TEXT,ATTRIB,MULTILEADER"
  274.                )
  275.              )
  276.              nentsel
  277.              "\nSelect Source Object [Settings/Exit] <Exit>: "
  278.              "Settings Exit"
  279.                )
  280.         )
  281.         (eq 'STR (type o1))
  282.         (not (eq "Exit" o1))
  283.        )
  284.         (initget "Yes No")
  285.         (setq *retain*
  286.            (cond
  287.              (
  288.               (getkword
  289.             (strcat    "\nRetain MText Formatting [Yes/No] <"
  290.                 *retain*
  291.                 "> : "
  292.             )
  293.               )
  294.              )
  295.              (*retain*)
  296.            )
  297.         )
  298.      )
  299.      o1
  300.        )
  301.     (progn
  302.       (setq ostr (LM:GetTextString o1))

  303.       (_Unformat RegExp o1 'tstr 'mstr)

  304.       (if (eq "Yes" *retain*)
  305.         (set (if (_AllowsFormatting o1)
  306.            'mstr
  307.            'tstr
  308.          )
  309.          ostr
  310.         )
  311.       )

  312.       (_StartUndo doc)
  313.       (terpri)

  314.       (while
  315.         (and
  316.           (setq o2
  317.              (_Selectif
  318.                (lambda (entity)
  319.              (wcmatch (cdr (assoc 0 (entget entity)))
  320.                   "*TEXT,ATTRIB,MULTILEADER"
  321.              )
  322.                )
  323.                nentsel
  324.                "\rSelect Destination Object [多个<M>/Exit] <Exit>: "
  325.                "Multiple Exit"
  326.              )
  327.           )
  328.           (not (eq "Exit" o2))
  329.         )
  330.          (cond
  331.            (
  332.         (eq "Multiple" o2)

  333.         (if
  334.           (setq    ss
  335.              (ssget    "_:L"
  336.                 '(
  337.                   (-4 . "<OR")
  338.                   (0 . "TEXT,MTEXT,MULTILEADER")
  339.                   (-4 . "<AND")
  340.                   (0 . "INSERT")
  341.                   (66 . 1)
  342.                   (-4 . "AND>")
  343.                   (-4 . "OR>")
  344.                  )
  345.              )
  346.           )
  347.            (
  348.             (lambda (i / _type e)
  349.               (while (setq e (ssname ss (setq i (1+ i))))
  350.             (cond
  351.               (
  352.                (eq "INSERT"
  353.                    (setq _type (cdr (assoc 0 (entget e))))
  354.                )

  355.                (mapcar
  356.                  (function
  357.                    (lambda (attrib)
  358.                  (vla-put-TextString
  359.                    attrib
  360.                    (if
  361.                      (and
  362.                        (vlax-property-available-p
  363.                      attrib
  364.                      'MTextAttribute
  365.                        )
  366.                        (eq :vlax-true
  367.                        (vla-get-MTextAttribute attrib)
  368.                        )
  369.                      )
  370.                       mstr
  371.                       tstr
  372.                    )
  373.                  )
  374.                    )
  375.                  )
  376.                  (vlax-invoke
  377.                    (vlax-ename->vla-object e)
  378.                    'GetAttributes
  379.                  )
  380.                )
  381.               )
  382.               (t
  383.                (vla-put-TextString
  384.                  (vlax-ename->vla-object e)
  385.                  (if (_AllowsFormatting e)
  386.                    mstr
  387.                    tstr
  388.                  )
  389.                )
  390.               )
  391.             )
  392.               )
  393.             )
  394.              -1
  395.            )
  396.         )
  397.         t
  398.            )
  399.            ((vla-put-TextString
  400.           (vlax-ename->vla-object o2)
  401.           (if (_AllowsFormatting o2)
  402.             mstr
  403.             tstr
  404.           )
  405.         )
  406.            )
  407.          )
  408.       )

  409.       (_EndUndo doc)
  410.     )
  411.      )
  412.     )
  413.   )

  414.   (LM:ReleaseObject RegExp)
  415.   (princ)
  416. )
  417. ;;--------------------=={ Get TextString }==------------------;;


  418. (defun LM:GetTextString    (object)
  419.   ;;  Lee Mac 2010
  420.   (
  421.    (lambda (entity / _type elist)
  422.      (cond
  423.        (
  424.     (wcmatch
  425.       (setq    _type
  426.          (cdr
  427.            (assoc 0
  428.               (setq    elist
  429.                  (entget entity)
  430.               )
  431.            )
  432.          )
  433.       )
  434.       "TEXT,*DIMENSION"
  435.     )
  436.     (cdr (assoc 1 elist))
  437.        )
  438.        (
  439.     (eq "MULTILEADER" _type)

  440.     (cdr (assoc 304 elist))
  441.        )
  442.        (
  443.     (wcmatch _type "ATTRIB,MTEXT")

  444.     (
  445.      (lambda (string)
  446.        (mapcar
  447.          (function
  448.            (lambda (pair)
  449.          (if (member (car pair) '(1 3))
  450.            (setq string (strcat string (cdr pair)))
  451.          )
  452.            )
  453.          )
  454.          elist
  455.        )
  456.        string
  457.      )
  458.       ""
  459.     )
  460.        )
  461.      )
  462.    )
  463.     (if    (eq 'VLA-OBJECT (type object))
  464.       (vlax-vla-object->ename object)
  465.       object
  466.     )
  467.   )
  468. )
  469. ;;------------------=={ Release Object }==--------------------;;

  470. (defun LM:ReleaseObject    (obj)
  471.   (vl-load-com)
  472.   ;;  Lee Mac 2010
  473.   (and obj
  474.        (eq 'VLA-OBJECT (type obj))
  475.        (not (vlax-object-released-p obj))
  476.        (not
  477.      (vl-catch-all-error-p
  478.        (vl-catch-all-apply
  479.          (function vlax-release-object)
  480.          (list obj)
  481.        )
  482.      )
  483.        )
  484.   )
  485. )
  486. (princ)

发表于 2012-9-7 19:24:03 | 显示全部楼层
支持天正文字,这个不错
发表于 2012-9-7 19:44:12 | 显示全部楼层
谢谢分享源码。
发表于 2012-9-7 20:07:58 | 显示全部楼层
谢谢分享。
发表于 2012-9-7 20:31:08 | 显示全部楼层
谢谢楼主的分享!
等会试试。
谢谢!
发表于 2012-9-7 20:33:08 | 显示全部楼层
ㄘ丶转裑ㄧ灬 发表于 2012-9-7 18:45
非常好的程序,要是能再加上文本内容对换就完美了。。。
下面这个是Lee-mac的文本刷,不过不支持天正文字。 ...

谢谢楼上的源码分享!
等会试试。
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 01:27 , Processed in 0.204290 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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