Razoo 发表于 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,
--
拉祖

Lee Mac 发表于 2022-7-6 12:12:07

嗨,Razoo,
 
假设您需要与R14兼容,这意味着不再使用Visual LISP。
 
因此,使用Vanilla AutoLISP,
 
可以使用以下命令在图形中循环执行块定义:
 

(defun GetObj(bObj)
(if (setq bObj (entnext bObj))
   (cons bObj (GetObj bObj))))

(GetObj (tblobjname "BLOCK" "Block_Name"))

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

Razoo 发表于 2022-7-6 12:16:41

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

Lee Mac 发表于 2022-7-6 12:19:11

我不久前写了这段代码的一部分,它应该可以满足您的需要-虽然它使用Visual LISP,因此与R14不兼容,但它将在2008年工作。
 
如果可以清除块,则返回T:
 

;; Check Purge--by Lee McDonnell (Lee Mac) ~ 27.11.2009

;; Returns T if Block can be Purged.
;; Arguments:bNme - Block Name

(defun CheckPurge (bNme)

(defun BlkCount (Blk / GetNest i j ss *blk)
;; Block Counter by Lee McDonnell (Lee Mac) ~ 22.08.2009
;; Copyright © August 2009
;; Will Count all instances of a block, including nested.
   
   (vl-load-com)
   (setq i 0 Blk (strcase Blk) j -1
         *blk (vla-get-Blocks
                (vla-get-ActiveDocument
                  (vlax-get-acad-object))))

   (defun GetNest (Obj Nme)
   (and (eq (strcase (vla-get-Name Obj)) Nme) (setq i (1+ i)))
   (vlax-for Sub Obj
       (if (eq "AcDbBlockReference" (vla-get-ObjectName Sub))
         (GetNest (vla-item *blk (vla-get-EffectiveName Sub)) Nme))))

   (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (while (setq ent (ssname ss (setq j (1+ j))))
       (GetNest
         (vla-item *blk
         (vla-get-EffectiveName
             (vlax-ename->vla-object ent))) Blk)))
   
   i)

(zerop (BlkCount bNme)))


Razoo 发表于 2022-7-6 12:22:48

 
谢谢李,
 
我将在周一的工作中试穿2008款。
 
拉祖

Lee Mac 发表于 2022-7-6 12:28:59

不客气,Razoo-但我要警告您,代码迭代整个块集合,并且递归迭代每个块中的每个对象-因此,这不是一个快速的检查过程。
 
我倾向于将NOMUTT设置为1,然后尝试清除(因此不会出现消息),然后检查块集合。
 

wizman 发表于 2022-7-6 12:30:37

此外,如果不需要检查:
 
(if (tblsearch "BLOCK" bname)
   (vl-catch-all-apply
       '(lambda ()
            (command "PURGE" "B" bname)
      )
   )
)

Lee Mac 发表于 2022-7-6 12:34:31

好主意Wizman-但如果清除失败,清除不会抛出错误,只是一条消息。
 
您也可以将您的内容改写为:
 

(if (tblsearch "BLOCK" bname)
   (vl-catch-all-apply 'vl-cmdf (list "_.-purge" "_b" bname "_n")))

 

David Bethel 发表于 2022-7-6 12:39:05

您可以检查组70标志块表定义的64位。它应该显示是否引用了块-大卫

wizman 发表于 2022-7-6 12:41:00

我明白你的意思了,李,清除只返回一个错误消息,我也尝试了清除或(成员'(102.{BLKREFS“)EntData)的vla delete,但无法找到嵌套块的链接。我快速尝试了david的想法,但可能我做错了,或者它只是用于外部参照david?。
页: [1] 2
查看完整版本: 检查是否可以删除块