乐筑天下

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

[编程交流] 检查是否可以删除块

[复制链接]

3

主题

19

帖子

16

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 12:07:49 | 显示全部楼层 |阅读模式
嗨,这是我的第一篇帖子,刚刚发现这个论坛。
 
我在工作中使用AutoCAD 2008,在家中使用AutoCAD 14。
 
谁能告诉我如何使用AutoLisp确定块(在AutoCAD14中)是否可用于清除?
 
我使用“tblsearch”检查图形数据库中是否存在块,并使用“ssget”确定块是否直接插入图形中。
 
(如果(和(tblsearch“BLOCK”bname)
(非(ssget“X”(cons“(0。“INSERT”)(list(cons 2 bname)1070;)Ю)
)
(命令“PURGE”“B”bname)
)
 
不幸的是,如果块作为嵌套(嵌入)块插入到图形中,lisp例程错误报告将失败,因为“ssget”没有找到它。例程认为可以清除该块,但实际上无法清除,因为它是嵌套的。
 
基本上,我想知道块是直接插入到图形中,还是作为嵌套(嵌入)块间接插入到图形中。是否有实体代码或类似代码会告诉我这一点,这样我就不会发出无意义的清除命令?
 
TIA,
--
拉祖
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:12:07 | 显示全部楼层
嗨,Razoo,
 
假设您需要与R14兼容,这意味着不再使用Visual LISP。
 
因此,使用Vanilla AutoLISP,
 
可以使用以下命令在图形中循环执行块定义:
 
  1. (defun GetObj  (bObj)
  2. (if (setq bObj (entnext bObj))
  3.    (cons bObj (GetObj bObj))))
  4. (GetObj (tblobjname "BLOCK" "Block_Name"))

 
并查看在其他块定义中是否有任何对问题块的引用。
 
但是,对于所有这些问题,清除调用肯定只返回“没有找到未引用的块”不是吗?
 
希望这有帮助,
 
回复

使用道具 举报

3

主题

19

帖子

16

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 12:16:41 | 显示全部楼层
嗨,李,
 
感谢您的快速回复。
 
我曾考虑过在图纸中跨越障碍,但正如你所说,这是一个很大的麻烦。
 
purge命令确实返回“未找到未引用的块”,但我找不到在lisp例程中使用此信息的方法。
 
我可以再次使用tblsearch来查看该块是否仍然存在,如果存在,我可以断定它没有清除:-)
 
我希望发出一条错误消息,指出块未能清除的原因(例如,因为它是嵌套的)。
 
我想如果ssget没有找到块,然后它无法清除,我可以断定它是作为嵌套块插入的。我希望可以找到一个简单的实体代码或类似代码来指示将块作为嵌套块插入。
 
拉祖
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:19:11 | 显示全部楼层
我不久前写了这段代码的一部分,它应该可以满足您的需要-虽然它使用Visual LISP,因此与R14不兼容,但它将在2008年工作。
 
如果可以清除块,则返回T:
 
  1. [i][color=#990099];; Check Purge  --  by Lee McDonnell (Lee Mac) ~ 27.11.2009[/color][/i]
  2. [i][color=#990099];; Returns T if Block can be Purged.[/color][/i]
  3. [i][color=#990099];; Arguments:  bNme - Block Name [string][/color][/i]
  4. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] CheckPurge [b][color=RED]([/color][/b]bNme[b][color=RED])[/color][/b]
  5. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] BlkCount [b][color=RED]([/color][/b]Blk [b][color=BLUE]/[/color][/b] GetNest i j ss *blk[b][color=RED])[/color][/b]
  6. [i][color=#990099];; Block Counter by Lee McDonnell (Lee Mac) ~ 22.08.2009[/color][/i]
  7. [i][color=#990099];; Copyright © August 2009[/color][/i]
  8. [i][color=#990099];; Will Count all instances of a block, including nested.[/color][/i]
  9.    
  10.    [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b]
  11.    [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=#009900]0[/color][/b] Blk [b][color=RED]([/color][/b][b][color=BLUE]strcase[/color][/b] Blk[b][color=RED])[/color][/b] j [b][color=#009900]-1[/color][/b]
  12.          *blk [b][color=RED]([/color][/b][b][color=BLUE]vla-get-Blocks[/color][/b]
  13.                 [b][color=RED]([/color][/b][b][color=BLUE]vla-get-ActiveDocument[/color][/b]
  14.                   [b][color=RED]([/color][/b][b][color=BLUE]vlax-get-acad-object[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  15.    [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] GetNest [b][color=RED]([/color][/b]Obj Nme[b][color=RED])[/color][/b]
  16.      [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcase[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-Name[/color][/b] Obj[b][color=RED])[/color][/b][b][color=RED])[/color][/b] Nme[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] i[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  17.      [b][color=RED]([/color][/b][b][color=BLUE]vlax-for[/color][/b] Sub Obj
  18.        [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#ff00ff]"AcDbBlockReference"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vla-get-ObjectName[/color][/b] Sub[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  19.          [b][color=RED]([/color][/b]GetNest [b][color=RED]([/color][/b][b][color=BLUE]vla-item[/color][/b] *blk [b][color=RED]([/color][/b][b][color=BLUE]vla-get-EffectiveName[/color][/b] Sub[b][color=RED])[/color][/b][b][color=RED])[/color][/b] Nme[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  20.    [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]ssget[/color][/b] [b][color=#ff00ff]"_X"[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=RED]([/color][/b][b][color=#009900]0[/color][/b] . [b][color=#ff00ff]"INSERT"[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  21.      [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]ssname[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] j [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] j[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  22.        [b][color=RED]([/color][/b]GetNest
  23.          [b][color=RED]([/color][/b][b][color=BLUE]vla-item[/color][/b] *blk
  24.            [b][color=RED]([/color][/b][b][color=BLUE]vla-get-EffectiveName[/color][/b]
  25.              [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] ent[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] Blk[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  26.    
  27.    i[b][color=RED])[/color][/b]
  28. [b][color=RED]([/color][/b][b][color=BLUE]zerop[/color][/b] [b][color=RED]([/color][/b]BlkCount bNme[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
回复

使用道具 举报

3

主题

19

帖子

16

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 12:22:48 | 显示全部楼层
 
谢谢李,
 
我将在周一的工作中试穿2008款。
 
拉祖
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:28:59 | 显示全部楼层
不客气,Razoo-但我要警告您,代码迭代整个块集合,并且递归迭代每个块中的每个对象-因此,这不是一个快速的检查过程。
 
我倾向于将NOMUTT设置为1,然后尝试清除(因此不会出现消息),然后检查块集合。
 
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-6 12:30:37 | 显示全部楼层
此外,如果不需要检查:
 
  1. (if (tblsearch "BLOCK" bname)
  2.    (vl-catch-all-apply
  3.        '(lambda ()
  4.             (command "PURGE" "B" bname)
  5.         )
  6.    )
  7. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:34:31 | 显示全部楼层
好主意Wizman-但如果清除失败,清除不会抛出错误,只是一条消息。
 
您也可以将您的内容改写为:
 
  1. (if (tblsearch "BLOCK" bname)
  2.    (vl-catch-all-apply 'vl-cmdf (list "_.-purge" "_b" bname "_n")))

 
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:39:05 | 显示全部楼层
您可以检查组70标志块表定义的64位。它应该显示是否引用了块-大卫
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-6 12:41:00 | 显示全部楼层
我明白你的意思了,李,清除只返回一个错误消息,我也尝试了清除或(成员'(102.{BLKREFS“)EntData)的vla delete,但无法找到嵌套块的链接。我快速尝试了david的想法,但可能我做错了,或者它只是用于外部参照david?。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 07:04 , Processed in 0.436037 second(s), 72 queries .

© 2020-2025 乐筑天下

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