乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 18|回复: 18

[编程交流] 使用vlisp questi重命名块

[复制链接]

78

主题

207

帖子

129

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
395
发表于 2022-7-5 15:57:22 | 显示全部楼层 |阅读模式
首先,我知道重命名块lisp已经以多种形式存在,我只是想自己尝试一下。
 
第一个问题,块的名称和有效名称之间有什么区别?
 
我以为这个Lisp程序可以用,但我有个错误
  1. (defun c:test ()
  2. (setq Block (entsel)
  3. BlockOBject (vlax-ename->vla-object (car Block))
  4. BlockName (vlax-get-property BlockObject 'Name)
  5. newname (getstring "\nEnter new name: ")
  6. )
  7. (vlax-put-property BlockObject 'Name newname)
  8. (princ)
  9. )

 
这给了我这个错误
  1. ; error: Automation Error. Key not found

 
我错过了什么?
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:01:56 | 显示全部楼层
没有名为newname的块定义。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:10:13 | 显示全部楼层
EffectiveName属性为只读。此外,您还必须在尝试时更改块定义的“名称”特性,而不是块参照:
 
  1. (and
  2. (setq (car (entsel "\nSelect block to rename: ")))
  3. (= "AcDbBlockReference" (vla-get-ObjectName (setq ref (vlax-ename->vla-object ref))))
  4. (/= "" (setq newname (getstring T "\nEnter new name: ")))
  5. (snvalid newname)
  6. (not (tblsearch "BLOCK" newname))
  7. (setq def (vla-item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-get-EffectiveName ref)))
  8. (vl-catch-all-apply 'vlax-put-property (list def 'Name newname))
  9. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:12:40 | 显示全部楼层
下面是不使用activex重命名块记录的另一种方法:
  1. (defun c:foo (/ en)
  2. (while (and (setq e (car (entsel "\nPick a block to change its name: ")))
  3.       (= "INSERT" (cdr (assoc 0 (entget e))))
  4.       (setq e (cdr (assoc 330 (entget (tblobjname "block" (cdr (assoc 2 (entget e))))))))
  5.       (setq n (getstring "\nEnter new name: "))
  6. )
  7.    (if        (tblobjname "block" n)
  8.      (alert (strcat "Block name " n " is already in use..."))
  9.      (entmod (subst (cons 2 n) (assoc 2 (entget e)) (entget e)))
  10.    )
  11. )
  12. (princ)
  13. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 16:14:03 | 显示全部楼层
您好,Grrr,
 
如果用户没有选择任何内容,并且不会传递该内容,则您的and函数将出错。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:18:36 | 显示全部楼层
嗨,塔瓦,
我知道,只是想提供一个简单的例子,没有太多的错误检查-例子纠正了一点。
回复

使用道具 举报

78

主题

207

帖子

129

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
395
发表于 2022-7-5 16:22:00 | 显示全部楼层
感谢您提供有关EffectiveName的信息。很高兴知道,我以后会需要这个。
 
我还是不明白为什么
  1. (vlax-put-property BlockObject 'Name "test name")

重新调整
 
如果我写信
  1. (vlax-put-property BlockObject 'Rotation 45)

这是可行的。
 
我错过了什么?
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:25:26 | 显示全部楼层
 
您错过了post#4的要点(提示:只读属性)。你不能这样更改块的名称。。。
 
gr.Rlx
 
只能更改块定义的名称
 
如果您喜欢数字SM,请看:http://www.cadtutor.net/forum/showthread.php?100670-RlxBlk Replace重定义块可见性状态预览和链接属性&高亮显示=RlxBlk
 
在此lisp文件中,我将块(定义)重命名如下:
 
  1. (defun rename_block_definition ( $bn / bn )
  2. (if (and (not (void $bn)) (tblsearch "block" $bn))
  3.    (vla-put-name (Collection-Member $bn (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
  4.      (setq bn (create_unique_blockname $bn)))) bn)
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:30:35 | 显示全部楼层
@rlx:
你说的不对。块参照的名称特性不是只读的。但是,如果要更改它,则必须已经存在具有新名称的块定义。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 21:00 , Processed in 0.443931 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表