使用a/vlisp的图块重命名
tblobjname "block" 获取到的是类是 AcDbBlockBegin ,这个是不能用重命名的,对块定义重新 entmod ,需要获取到 AcDbSymbolTableRecord,下面的代码就是获取块定义,然后使用 entmod 重命名, 理论上应该支持匿名块互转(未测试)**** Hidden Message ***** 只用过RENAME..学习了.. 匿名块互转..ok...已测试... 本帖最后由 q3_2006 于 2016-10-1 08:02 编辑
太神奇了大师...我这个图...两个块同名了 aduit核查会自动处理的 这两个也同名 ... 这两个也同名 ...? 回复,向大侠学习程序 q3_2006 发表于 2016-10-1 07:54
匿名块新名字用 *U 试试。
不知道能不能改动态块的名字。
回复,学习程序!!!! 本帖最后由 newer 于 2016-10-1 11:00 编辑
其实,没必要通过VLAX-FOR得到块的对象的,其实通过tblobjname的ENTGET数据的组码 330 ,就能直接得到块定义对象的实体名
命令: (setq o (tblobjname "block" "dd"))
<图元名: -250ae8>
命令: (entget o)
((-1 . <图元名: -250ae8>) (0 . "BLOCK") (330 . <图元名: -250af0>) (5 . "1DB") (100 .
"AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockBegin") (70 . 0) (10 0.0 0.0
0.0) (-2 . <图元名: -250ad8>) (2 . "dd") (1 . ""))
命令: (cdr (assoc 330 (entget o)))
<图元名: -250af0>
下面是测试代码
(defun blk:rename (oldname newname)
(setq o (tblobjname "block" oldname))
(setqed (entget o)
eblk (cdr (assoc 330 ed))
ed (entget eblk)
ed (subst (cons 2 newname) (cons 2 oldname) ed)
)
(entmod ed)
)
(defun c:tt ()
(if (and (setq e (ssget ":E:S" '((0 . "INSERT"))))
(setq e(ssname e 0)
ed (entget e)
)
(progn
(prompt (strcat "\n选择的块名是:" (setq oldname(cdr (assoc 2 ed)))))
(/= "" (setq newname (getstring "\n输入新块名:")))
(not (tblsearch "block" newname))
)
)
(progn
(blk:rename oldname newname)
)
(prompt "\n改名没成功,输入块名已经存在或者无效的输入。")
)
(princ)
)
newer 发表于 2016-10-1 10:03
(vla-get-effectivename(vlax-ename->vla-object e))知道真实名称就能改... newer 发表于 2016-10-1 10:59
一直没有注意这个330,只要有了AcDbBlockTableRecord能entget的组码就应该都可以entmod iLisp 发表于 2016-10-1 15:13
组码330,应该是本实体的owner
命令: (setq a (tblobjname "block" "a"))
<图元名: -250bf0>
命令: (entget a)
((-1 . <图元名: -250bf0>) (0 . "BLOCK") (330 . <图元名: -250bf8>) (5 . "1BA") (100 .
"AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockBegin") (70 . 0) (10 0.0 0.0
0.0) (-2 . <图元名: -250be0>) (2 . "a") (1 . ""))
命令: (setq b (xdrx_object_owner a))
<图元名: -250bf8>
命令: (setq id (xdrx_getpropertyvalue b "objectid"))
-2427896
命令: (vla-get-ownerid (vlax-ename->vla-object a))
-2427896
只是不知道VLAX知道了这个ID后,有哪个VLA函数能得到对应的VLA对象? 查函数库没找到。
vla 有get objectid方法,也有id->hamdle