乐筑天下

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

[编程交流] 重命名块问题(自动

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:05:25 | 显示全部楼层 |阅读模式
你好
 
今天,我在这个论坛和互联网上搜索了一个解决方案,但没有成功。。
 
我借用了一个“重命名块函数”,并试图用它修改块名,但重命名步骤失败:
 
;错误:自动化错误。未找到密钥
 
可能有什么问题?请参阅下面的代码。
 
(此外,代码甚至没有“找到”其他一些块,但至少找到了“ballod1”,但无论如何都无法重命名。这可能是什么原因造成的,这是我的第二个问题。可能有些块是“错误类型的”?可以改进函数以捕捉其他类型的块吗?)
 
  1. (defun c:wbout(/ dn pa pawbdn doc bn nn layout i)
  2. (vl-load-com)
  3. (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))       
  4. (setq dn (getvar "dwgname"))
  5. (setq pa (getvar "dwgprefix"))
  6. (setq pawbdn (strcat pa "wb\" dn))
  7. (setq bn "Balloon1")
  8. (setq nn "Raaaaverad")
  9. (vlax-for layout (vla-get-layouts doc)
  10.                    (vlax-for i (vla-get-block layout)
  11.                              (if (and
  12.                                   (= (vla-get-objectname i) "AcDbBlockReference")
  13.                                    (= (strcase (vla-get-name i)) (strcase bn))
  14.                               )
  15.                   
  16.                
  17.                    ;;;(princ "\nHELLO\n")
  18.                           (vla-put-name i nn)
  19.                              )
  20.                    )
  21.         )
  22. (princ "\nGOODBAJ\n")
  23. (command "SAVE" pawbdn)
  24. )
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 20:15:25 | 显示全部楼层
这可能有助于为您指明正确的方向。
 
  1. (defun c:List-Blocks ()
  2. (vl-load-com)
  3. (setq doc (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
  4. (setq blks (vlax-get-property doc 'Blocks))
  5. (setq cnt 0)
  6. (vlax-for b blks
  7.    (princ (strcat "\nBlock Name: " (vlax-get-property b 'Name) "  -  Count: " (rtos cnt 2 0)))
  8.    (setq cnt (+ 1 cnt)))
  9. (princ)
  10. )

 
注意到我在哪里抓取积木集合了吗?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 20:28:11 | 显示全部楼层
欢迎来到CADTutor。
 
1-不能从块参照重命名块定义。
2-您需要确保图形中不存在块的新名称。
3-如果目标块名称是动态块,则需要通过函数vla get effectivename获取其名称,因为DXF或vla get name无法检索真实名称。
4-无需遍历图形中的所有块,只需使用vla项实名来重命名块。
 
祝你好运
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 20:37:19 | 显示全部楼层
重命名块最简单的方法是使用“rename”命令,但这里有一个快速的例子,展示了如何通过选择块来完成。
 
我对每个行项目进行注释以向您展示过程,并指出Tharwat对effectivename属性的看法。
 
  1. (defun c:rename-block ()
  2. ;Get the Block Definition Collection from the Active Document - Get the Active Document from the Acad Object
  3. (setq blks (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'Blocks))
  4. ;Prompt the User to Select the Block to Rename
  5. (princ "\Select Block to Rename: ")
  6. (setq ss (ssget ":s" '(( 0 . "INSERT"))))
  7. ;If a Block was selected then proceed
  8. (if ss
  9.    (progn
  10.      ;Get the Block Reference form the Selection Set
  11.      (setq blk-ref (vlax-ename->vla-object (ssname ss 0)))
  12.      ;Get the Name of the Block - Must use EffectiveName is case it's a Dynamic Block
  13.      (setq eff-name (vlax-get-property blk-ref 'EffectiveName))
  14.      ;Prompt User for New Name and check if the Name Exists - See get-new-name Below
  15.      (setq new-name (get-new-name eff-name blks))
  16.      ;Get the Block Definition from the Block Collection
  17.      (setq blk-def (vla-item blks eff-name))
  18.      ;Catch any unhandled exceptions
  19.      (setq msg (vl-catch-all-apply 'vlax-put-property (list blk-def 'Name new-name)))
  20.      ;If msg is an error Display the error
  21.      (if (vl-catch-all-error-p msg)
  22. (alert (vl-catch-all-error-message msg))
  23. (princ (strcat "\nBlock " eff-name " has been renamed to " new-name "."))
  24. )
  25.      )
  26.    )
  27. (princ)
  28. )
  29. (defun get-new-name (eff-name blks / new-name msg)
  30. ;Display the Current Name of the Block
  31. (princ (strcat "\nCurrent Name: " eff-name))
  32. ;Prompt for a New Name
  33. (setq new-name (getstring T "\nEnter New Name for Block: "))
  34. ;Catch any unhandled exceptions
  35. (setq msg (vl-catch-all-apply 'vla-item (list blks new-name)))
  36. ;If an error is not produced then the block name already exists
  37. (if (vl-catch-all-error-p msg)
  38.    new-name
  39.    (progn
  40.      ;Let user know that the new name already exists as a block name
  41.      (princ (strcat "\n" new-name " already exists."))
  42.      ;Pompt the user to select a new name
  43.      (get-new-name eff-name blks)
  44.      )
  45.    )
  46. )
回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:45:38 | 显示全部楼层
嗨,谢谢大家!
 
Hippe013,你的代码非常有用和有效,我只需要为我的目的做一些修改!我用这个和我从Tharwat找到的一些其他代码来选择一个块(https://autocadtips.wordpress.com/2012/09/19/autolisp-select-block-by-name/)
 
有了所有这些,我能够在脚本和批处理文件的帮助下创建一个非常好的函数,它完全满足了我的需要!再次感谢你的帮助!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 20:56:15 | 显示全部楼层
祝你好运Vrekmat,我真的很惊讶地看到我的一个退出旧套路被公布在公众面前
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 21:03:33 | 显示全部楼层
我很高兴能帮上忙!
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 21:13:18 | 显示全部楼层
FWIW-我只需选择要重命名的块,然后右键单击:
 
210529nvy02yv5y8mdyyrh.png
 
 
 
干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 09:06 , Processed in 0.508865 second(s), 70 queries .

© 2020-2025 乐筑天下

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