块与块参照(块引用),是很容易混淆的两个概念,好多人都搞不清楚, 常常把块参照说成块甚至是当作块本身了。

这个问题,我猜测有两方面的原因:

  1. 很大程度上是翻译不当造成的,或者说,早期的翻译不够用心过于随意导致的。
  2. 大家口语表述的时候过于随意,有意无意地做了省略,块参照就慢慢变成了块。

块对应的英文说法是block,它就相当于一个模子、一个印章。而块参照, 对应的英文说法是block referencereference也可以翻译为引用, 块参照就相当于模子做出来的东西、印章盖出来的章。

参照当作名词来用,弄出来的块参照外部参照大概是学习AutoCAD初期比较难以理解的两个概念。

言归正传,对于熟悉了autolisp的人来说,删除块应该有3种方法:

  1. 通过 command 函数使用 purge 命令来删除;
  2. 使用 entdel 函数删除;
  3. 使用 vla-delete 函数删除;

我之前也是这么认为的,直到用entdel尝试了很多遍之后,之后我就改变了想法。

在花费了几个小时去尝试试验之后,我发现删除块只能用上面的1、3两种方法, 第2种方法无法奏效,无法奏效的原因目前仍然没有搞清楚。

在上述两种方法中,推荐采用第3种方法,因为第1种方法会有命令行回显, 这个回显是没有办法通过 cmdecho 变量去关掉的。

除了无法关掉 purge 命令的命令行回显,vla-delete 也有1个坑, 它不能删除由图元名转换而来的block对象,它只能删除直接获取到的vla对象。 比如,下面的代码运行之后会报错,块也不会成功删除,

1
2
3
(vla-delete 
  (vlax-ename->vla-object 
    (tblobjname "block" "xxx")))

只有写成下面这样才能运行成功,

1
2
3
4
5
6
(vla-delete 
  (vla-item 
    (vla-get-blocks 
      (vla-get-activedocument 
        (vlax-get-acad-object))) 
    "xxx"))

真的的很奇怪!

不得不说,活到老学到老有时也是刚需。