明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 654|回复: 6

[经验] 多个同名块修改其中一个同名块后执行attsync不变形

[复制链接]
发表于 2025-1-1 15:09:08 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2025-1-1 15:10 编辑

经常会遇到用户复制粘贴图纸,同名块很多,用户可能修改了其中一个块,一旦执行attsync会导致很多同名块一起同步了,有的时候并不希望修改其它的同名块,能否让attsync的时候不会修改其它同名块呢?请看下面的代码

  1. (defun $kuai-chong-fu-rename-copy-insert$
  2.        (ent km-new-str lst / $block-rename$ ent-new ents i km-new mark name2 pt ss)
  3.           ;同名块中修改其中一个块
  4.   (defun $block-rename$
  5.    (ent oldname newname lst / blocks blk rename obj)
  6.           ;修改块名
  7.           ;($block-rename$ (car (entsel)) nil "dx777" nil)($block-rename$ nil "电线7" "dx777" nil)
  8.     (IF  ENT
  9.       (PROGN
  10.   (if (not oldname)
  11.     (if ent
  12.       (progn
  13.         (if (= (TYPE ent) 'ENAME)
  14.     (SETQ OBJ (vlax-ename->vla-object ent))
  15.         )
  16.         (setq oldname (vl-catch-all-apply
  17.             'vla-get-effectivename
  18.             (list obj)
  19.           )
  20.         )
  21.         (if (vl-catch-all-error-p oldname)
  22.     (setq
  23.       oldname
  24.        (vl-catch-all-apply 'vla-get-name (list obj))
  25.     )
  26.         )
  27.         (if (vl-catch-all-error-p oldname)
  28.     (setq oldname nil)
  29.         )
  30.       )
  31.     )
  32.   )
  33.   (if newname
  34.     (progn
  35.       (setq
  36.         blocks (vla-get-blocks
  37.            (vla-get-activeDocument (vlax-get-acad-object))
  38.          )
  39.       )
  40.       (setq
  41.         blk (vl-catch-all-apply 'vla-item (list blocks oldname))
  42.       )
  43.       (IF  (VL-CATCH-ALL-ERROR-P blk)
  44.         (SETQ blk NIL)
  45.       )
  46.       (IF  blk
  47.         (PROGN
  48.     (vl-catch-all-apply 'vla-put-name (list blk newname))
  49.     (setq rename (vla-get-name blk))
  50.         )
  51.       )
  52.       (vl-catch-all-apply 'vlax-release-object (list blocks))
  53.       (vl-catch-all-apply 'vlax-release-object (list blK))
  54.     )
  55.   )
  56.       )
  57.     )
  58.     rename        ;返回
  59.   )
  60.   (and
  61.     ent
  62.     (= (type ent) 'ename)
  63.     (entget ent)
  64.     (setq name2  (vl-catch-all-apply
  65.       'vla-get-name
  66.       (list (VLAX-ENAME->VLA-OBJECT ent))
  67.     )
  68.     )
  69.     (progn
  70.       (AND (and name2 (wcmatch name2 "[,`**,]"))
  71.      (setq name2 (strcat "`" name2))
  72.       )
  73.       t
  74.     )
  75.     (SETQ SS (SSGET "X" (LIST (CONS 2 name2))))
  76.     (setq ents (vl-remove-if
  77.      (function listp)
  78.      (mapcar (function cadr) (ssnamex SS))
  79.          )
  80.     )
  81.     (> (length ents) 1)
  82.     (progn
  83.       (or km-new-str (setq km-new-str "秦始皇"))
  84.       (setq ss nil)
  85.       ($block-rename$ ent nil "*w" nil)
  86.       (and ent
  87.      (progn
  88.        (setq pt (cdr (assoc 10 (entget ent))))
  89.        (vl-cmdf "copybase" pt ent "" "" pt) ;基点复制
  90.        (setq
  91.          mark (VLAX-VLA-OBJECT->ENAME
  92.           (VLA-ADDPOINT
  93.       (vla-get-ModelSpace
  94.         (vla-get-ActiveDocument
  95.           (vlax-get-acad-object)
  96.         )
  97.       )
  98.       (VLAX-3D-POINT (LIST 0 0 0))
  99.           )
  100.         )
  101.        )
  102.        (VL-CMDF "_pasteclip" pt)  ;基点粘贴
  103.        (entdel ent)
  104.        (setq ent-new (entnext mark))
  105.        (ENTDEL mark)
  106.        (SETQ ENT ent-new)
  107.      )
  108.       )
  109.       (and
  110.   ent-new
  111.   (progn
  112.     (setq i 0)
  113.     (WHILE
  114.       (SETQ km-new (STRCAT km-new-str "_" (itoa (setq i (1+ i)))))
  115.     )
  116.     ($block-rename$ ent-new nil km-new nil)
  117.   )
  118.       )
  119.       (MAPCAR
  120.   (FUNCTION (LAMBDA (A / KM)
  121.         (and a
  122.        (entget a)
  123.        (progn
  124.          (WHILE
  125.            (SETQ km-new (STRCAT km-new-str
  126.               "_"
  127.               (itoa (setq i (1+ i)))
  128.             )
  129.            )
  130.          )
  131.          ($block-rename$ A nil km-new nil)
  132.        )
  133.         )
  134.       )
  135.   )
  136.   ents
  137.       )
  138.     )
  139.   )
  140.   ENT
  141. )

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2025-1-1 16:11:56 | 显示全部楼层
2025年希望lisp这个行业继续发扬光大
回复 支持 反对

使用道具 举报

发表于 2025-1-1 17:50:51 | 显示全部楼层
主要是CASS高程点问题
回复 支持 反对

使用道具 举报

发表于 2025-1-2 08:42:50 | 显示全部楼层
我爱lisp 发表于 2025-1-1 16:11
2025年希望lisp这个行业继续发扬光大

这是老鸟,请收下我的膝盖
回复 支持 反对

使用道具 举报

发表于 2025-1-2 15:57:09 | 显示全部楼层
执行后,不能用。
命令: ($kuai-chong-fu-rename-copy-insert$ (car (entsel))  "dx777" nil)
选择对象:
*无效选择*
需要点或 窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)/子对象(SU)/对象(O)
参数类型错误: numberp: nil
选择对象: *取消*

----还有一个问题-----------
还有一个问题,楼主的程序,为什么总带一个lst,没有用的参数。这在写程序上这个lst参数用什么用处呢,我一直很困惑。
回复 支持 反对

使用道具 举报

发表于 2025-1-2 21:53:35 | 显示全部楼层
搞完后好象各个参照所引用的块名称都不一样了吧?
回复 支持 反对

使用道具 举报

发表于 2025-1-2 22:25:18 | 显示全部楼层
他这个本质上就是个块名克隆。简单几行代码的事搞100多行。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-22 18:44 , Processed in 0.214881 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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