使用vlisp questi重命名块
首先,我知道重命名块lisp已经以多种形式存在,我只是想自己尝试一下。第一个问题,块的名称和有效名称之间有什么区别?
我以为这个Lisp程序可以用,但我有个错误
(defun c:test ()
(setq Block (entsel)
BlockOBject (vlax-ename->vla-object (car Block))
BlockName (vlax-get-property BlockObject 'Name)
newname (getstring "\nEnter new name: ")
)
(vlax-put-property BlockObject 'Name newname)
(princ)
)
这给了我这个错误
; error: Automation Error. Key not found
我错过了什么? 没有名为newname的块定义。 有效的blockname属性可用于动态块。如果要修改对象的属性,最好/最安全的方法是首先检查属性是否可用。从我的一个应用程序中随机抽取几行:
如果修改块(块定义),所有块都将更新。为了防止动态块出现这种情况,每个块都有一种临时值。名称以*U开头。
另请参见http://www.lee-mac.com/dynamicblockfunctions.html
gr.Rlx EffectiveName属性为只读。此外,您还必须在尝试时更改块定义的“名称”特性,而不是块参照:
(and
(setq (car (entsel "\nSelect block to rename: ")))
(= "AcDbBlockReference" (vla-get-ObjectName (setq ref (vlax-ename->vla-object ref))))
(/= "" (setq newname (getstring T "\nEnter new name: ")))
(snvalid newname)
(not (tblsearch "BLOCK" newname))
(setq def (vla-item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-get-EffectiveName ref)))
(vl-catch-all-apply 'vlax-put-property (list def 'Name newname))
)
下面是不使用activex重命名块记录的另一种方法:
(defun c:foo (/ en)
(while (and (setq e (car (entsel "\nPick a block to change its name: ")))
(= "INSERT" (cdr (assoc 0 (entget e))))
(setq e (cdr (assoc 330 (entget (tblobjname "block" (cdr (assoc 2 (entget e))))))))
(setq n (getstring "\nEnter new name: "))
)
(if (tblobjname "block" n)
(alert (strcat "Block name " n " is already in use..."))
(entmod (subst (cons 2 n) (assoc 2 (entget e)) (entget e)))
)
)
(princ)
) 您好,Grrr,
如果用户没有选择任何内容,并且不会传递该内容,则您的and函数将出错。 嗨,塔瓦,
我知道,只是想提供一个简单的例子,没有太多的错误检查-例子纠正了一点。 感谢您提供有关EffectiveName的信息。很高兴知道,我以后会需要这个。
我还是不明白为什么
(vlax-put-property BlockObject 'Name "test name")
重新调整
如果我写信
(vlax-put-property BlockObject 'Rotation 45)
这是可行的。
我错过了什么?
您错过了post#4的要点(提示:只读属性)。你不能这样更改块的名称。。。
gr.Rlx
只能更改块定义的名称
如果您喜欢数字SM,请看:http://www.cadtutor.net/forum/showthread.php?100670-RlxBlk Replace重定义块可见性状态预览和链接属性&高亮显示=RlxBlk
在此lisp文件中,我将块(定义)重命名如下:
(defun rename_block_definition ( $bn / bn )
(if (and (not (void $bn)) (tblsearch "block" $bn))
(vla-put-name (Collection-Member $bn (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
(setq bn (create_unique_blockname $bn)))) bn)
@rlx:
你说的不对。块参照的名称特性不是只读的。但是,如果要更改它,则必须已经存在具有新名称的块定义。
页:
[1]
2