guitarguy1685 发表于 2022-7-5 15:57:22

使用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
 
我错过了什么?

Roy_043 发表于 2022-7-5 16:01:56

没有名为newname的块定义。

rlx 发表于 2022-7-5 16:04:10

有效的blockname属性可用于动态块。如果要修改对象的属性,最好/最安全的方法是首先检查属性是否可用。从我的一个应用程序中随机抽取几行:
 
如果修改块(块定义),所有块都将更新。为了防止动态块出现这种情况,每个块都有一种临时值。名称以*U开头。
 
另请参见http://www.lee-mac.com/dynamicblockfunctions.html
 
gr.Rlx

Grrr 发表于 2022-7-5 16:10:13

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))
)

ronjonp 发表于 2022-7-5 16:12:40

下面是不使用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)
)

Tharwat 发表于 2022-7-5 16:14:03

您好,Grrr,
 
如果用户没有选择任何内容,并且不会传递该内容,则您的and函数将出错。

Grrr 发表于 2022-7-5 16:18:36

嗨,塔瓦,
我知道,只是想提供一个简单的例子,没有太多的错误检查-例子纠正了一点。

guitarguy1685 发表于 2022-7-5 16:22:00

感谢您提供有关EffectiveName的信息。很高兴知道,我以后会需要这个。
 
我还是不明白为什么
(vlax-put-property BlockObject 'Name "test name")
重新调整
 
如果我写信
(vlax-put-property BlockObject 'Rotation 45)
这是可行的。
 
我错过了什么?

rlx 发表于 2022-7-5 16:25:26

 
您错过了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)

Roy_043 发表于 2022-7-5 16:30:35

@rlx:
你说的不对。块参照的名称特性不是只读的。但是,如果要更改它,则必须已经存在具有新名称的块定义。
页: [1] 2
查看完整版本: 使用vlisp questi重命名块