csharp 发表于 2016-10-1 07:25:52

使用a/vlisp的图块重命名

tblobjname "block" 获取到的是类是 AcDbBlockBegin ,这个是不能用重命名的,对块定义重新 entmod ,需要获取到 AcDbSymbolTableRecord,下面的代码就是获取块定义,然后使用 entmod 重命名, 理论上应该支持匿名块互转(未测试)
**** Hidden Message *****

q3_2006 发表于 2016-10-1 07:38:27

只用过RENAME..学习了..

q3_2006 发表于 2016-10-1 07:44:14

匿名块互转..ok...已测试...

q3_2006 发表于 2016-10-1 07:54:22

本帖最后由 q3_2006 于 2016-10-1 08:02 编辑

太神奇了大师...我这个图...两个块同名了

iLisp 发表于 2016-10-1 07:58:38

aduit核查会自动处理的

q3_2006 发表于 2016-10-1 08:25:07

这两个也同名 ...

cable2004 发表于 2016-10-1 09:06:30

这两个也同名 ...?

HLCAD 发表于 2016-10-1 09:24:51

回复,向大侠学习程序

newer 发表于 2016-10-1 10:03:59

q3_2006 发表于 2016-10-1 07:54


匿名块新名字用 *U 试试。

不知道能不能改动态块的名字。

yoyoho 发表于 2016-10-1 10:32:55

回复,学习程序!!!!

newer 发表于 2016-10-1 10:59:26

本帖最后由 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)
)

q3_2006 发表于 2016-10-1 11:57:05

newer 发表于 2016-10-1 10:03


(vla-get-effectivename(vlax-ename->vla-object e))知道真实名称就能改...

iLisp 发表于 2016-10-1 15:13:34

newer 发表于 2016-10-1 10:59


一直没有注意这个330,只要有了AcDbBlockTableRecord能entget的组码就应该都可以entmod

newer 发表于 2016-10-1 18:29:33

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对象? 查函数库没找到。



iLisp 发表于 2016-10-1 19:25:09

vla 有get objectid方法,也有id->hamdle
页: [1] 2 3 4 5 6
查看完整版本: 使用a/vlisp的图块重命名