明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5227|回复: 14

[已解答] [求助] 如何替换动态块A为动态块B

  [复制链接]
发表于 2013-3-27 21:35 | 显示全部楼层 |阅读模式
因为动态块的 vla对象 有effectivename 和 name 两个属性,
而dxf群码的 (2 . "块名") 对应的是 name 不是effectivename,
而动态块的name又可能是 "*U89" 不是真正的块名!

例如某动态块 vla对象 effectivename 为"桌子" name 为 "*U89"
dxf群码为 (2 . "*U89")

CAD 里CTRL+1 特性面板显示该块名为"桌子"

想替换这个动态块就出问题了。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

以下代码对普通块没任何问题,但是操作动态块的话就会出现块名不正确的情况,不知该如何修改才行,
哪位大侠解救一下吧!
  1. (defun C:tt (/ old-osmode e1 e2 BlkName1 e2 BlkName2 keyword ss ents i)
  2.   (setq old-osmode (getvar "osmode"))
  3.   (setvar "osmode" 0)
  4.   (while (= e1 nil)
  5.     (setq e1 (entsel "\n点选作为源块的图块:"))
  6.   )
  7.   (while (= e2 nil)
  8.     (setq e2 (entsel "\n点选被替换块的图块:"))
  9.   )
  10.   (setq BlkName1 (cdr (assoc 2 (entget (car e1)))))
  11.   (setq BlkName2 (cdr (assoc 2 (entget (car e2)))))
  12.   (initget 0 "1 2")
  13.   (setq  keyword   (getkword "\n键盘敲入要替换的方式: [1选择替换/2全部替换] 直接空格或回车选<1>:"))
  14.   (if (not keyword) (setq keyword "1"))  
  15.   (if (= "1" keyword)
  16.     (setq ss (ssget (list '(0 . "INSERT") (cons 2 BlkName2))))
  17.     (setq ss (ssget "_x" (list '(0 . "INSERT") (cons 2 BlkName2))))
  18.   )
  19.   (if ss
  20.   (progn
  21.     (setq i 0)
  22.     (repeat (sslength ss)
  23.       (setq ents (entget (ssname ss i)))
  24.       (setq ents (subst (cons 2 BlkName1) (assoc 2 ents) ents))
  25.       (entmod ents)
  26.       (setq i (1+ i))
  27.     )
  28.   )
  29.       )
  30.   (setvar "osmode" old-osmode)
  31.   (princ "\n共替换:" )
  32.   (princ (sslength ss) )
  33.   (princ " 个块" )
  34.   (princ)
  35. )

发表于 2019-11-4 11:47 | 显示全部楼层
本帖最后由 chinabigapple 于 2019-11-18 12:00 编辑

按照楼主提供的方法,初步修改代码,已经可以替代动态快,同时保存了属性,代码如下:
感谢楼主和相关帖主。

(defun C:tt (/ old-osmode e1 e2 EFBlkName1 e2 BlkName2 keyword ss ents i)
  (vl-load-com)
  (setq old-osmode (getvar "osmode"))
  (setvar "osmode" 0)

  (while (= e1 nil)
    (setq e1 (entsel "\n点选作为源块的图块:"))
  )
  (while (= e2 nil)
    (setq e2 (entsel "\n点选被替换块的图块:"))
  )


  (setq xents (VLAX-ENAME->vla-object (car e1)))   ;转换e1为vlax对象
  (setq EFBlkName1 (vla-get-effectivename xents))  ;获取动态块的effectivename

  (setq BlkName2 (cdr (assoc 2 (entget (car e2)))))
  (initget 0 "1 2")
  (setq  keyword   (getkword "\n键盘敲入要替换的方式: [1选择替换/2全部替换] 直接空格或回车选<1>:"))
  (if (not keyword) (setq keyword "1"))  
  (if (= "1" keyword)
    (setq ss (ssget (list '(0 . "INSERT") (cons 2 (strcat "`" BlkName2 )))))
    (setq ss (ssget "_x" (list '(0 . "INSERT") (cons 2 (strcat "`" BlkName2 )))))
  )
  (if ss
  (progn
    (setq i 0)
    (repeat (sslength ss)
      (setq ents (entget (ssname ss i)))
      (setq ents (subst (cons 2  EFBlkName1 ) (assoc 2 ents) ents)); 使用e1的effectivename
      (entmod ents)
      (setq i (1+ i))
    )
  )
      )
  (setvar "osmode" old-osmode)
  (princ "\n共替换:" )
  (princ (sslength ss) )
  (princ " 个块" )
  (princ)
)

回复 支持 1 反对 0

使用道具 举报

发表于 2019-11-4 11:52 | 显示全部楼层
wyl605 发表于 2013-5-26 19:38
能解决替换后位置不发生改变吗?

我替换后位置不发生改变
 楼主| 发表于 2013-3-28 00:13 | 显示全部楼层
问题解决了,用 effectivename  并且参考了这个:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=83220
2楼  xshrimp : (ssget '((0 . "INSERT")(2 . "`*U1677")))加个 ` 符号就可以选中了啊

发表于 2013-5-20 20:43 | 显示全部楼层
很好!多谢分享,我也碰到了这个问题。
发表于 2013-5-26 19:38 | 显示全部楼层
能解决替换后位置不发生改变吗?
发表于 2013-5-26 21:20 | 显示全部楼层
原来是这样,我也替换不了动态块而苦恼
发表于 2014-9-5 14:53 | 显示全部楼层
带属性的块,替换了,属性没了?
发表于 2015-1-29 09:36 | 显示全部楼层
请问修改后的代码是怎样的,不会弄,谢谢~
发表于 2019-11-4 12:30 | 显示全部楼层
替代后属性不见了,这个问题很严重
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 00:38 , Processed in 0.515319 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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