因为动态块的 vla对象 有effectivename 和 name 两个属性,
而dxf群码的 (2 . "块名") 对应的是 name 不是effectivename,
而动态块的name又可能是 "*U89" 不是真正的块名!
例如某动态块 vla对象 effectivename 为"桌子" name 为 "*U89"
dxf群码为 (2 . "*U89")
CAD 里CTRL+1 特性面板显示该块名为"桌子"
想替换这个动态块就出问题了。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
以下代码对普通块没任何问题,但是操作动态块的话就会出现块名不正确的情况,不知该如何修改才行,
哪位大侠解救一下吧!
- (defun C:tt (/ old-osmode e1 e2 BlkName1 e2 BlkName2 keyword ss ents i)
- (setq old-osmode (getvar "osmode"))
- (setvar "osmode" 0)
- (while (= e1 nil)
- (setq e1 (entsel "\n点选作为源块的图块:"))
- )
- (while (= e2 nil)
- (setq e2 (entsel "\n点选被替换块的图块:"))
- )
- (setq BlkName1 (cdr (assoc 2 (entget (car e1)))))
- (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 BlkName2))))
- (setq ss (ssget "_x" (list '(0 . "INSERT") (cons 2 BlkName2))))
- )
- (if ss
- (progn
- (setq i 0)
- (repeat (sslength ss)
- (setq ents (entget (ssname ss i)))
- (setq ents (subst (cons 2 BlkName1) (assoc 2 ents) ents))
- (entmod ents)
- (setq i (1+ i))
- )
- )
- )
- (setvar "osmode" old-osmode)
- (princ "\n共替换:" )
- (princ (sslength ss) )
- (princ " 个块" )
- (princ)
- )
|