计算特定位置的块(autolisp)

Counting blocks in a specific location (autolisp)

所以我在 autolisp 中做了一个简单的函数来计算图形中特定块的数量,它看起来像这样:

(defun c:contarblocos()
    (setq ss (ssget "x" ' ((0. "INSERT") (2. "Nome do bloco"))))
    (setq count (sslength ss))
    (alert(strcat "Total de blocos no desenho: " (itoa count)))
)

现在,我真正想要的是计算用户定义的特定区域中的块数。换句话说,用户将调用该函数,然后该函数将请求一个特定的区域,在那里它会寻找特定的块并计算它们,而不计算所选区域之外的任何块。

而不是使用 ssget 函数的 x 模式字符串(它在整个绘图数据库中搜索满足过滤列表参数条件的所有实体),只需省略此参数即可允许用户使用任何有效的选择方法进行选择,例如:

(defun c:contarblocos ( / sel )
    (if (setq sel (ssget '((0 . "INSERT") (2 . "Nome do bloco"))))
        (alert (strcat "Total de blocos no desenho: " (itoa (sslength sel))))
    )
    (princ)
)

您当前的代码还有一些其他问题:

  • 始终声明作用域为函数局部的变量:在我上面的示例中,您会注意到 sel 符号在 [=16= 内的变量列表中声明] 表达。关于为什么这很重要的更多信息,您不妨参考我的教程here.

  • 你应该在调用sslength函数获取集合中的项目数之前测试ssgetreturn是否是一个有效的选择集,因为(sslength nil) 会报错。您会看到我在代码中使用 if 语句来完成此操作。

  • ssget过滤列表参数应该是点对的关联列表,因此,keykey之间应该有一个space value 在每个列表项中,因此:

    (0. "INSERT")
    

    应该变成:

    (0 . "INSERT")
    
  • 您应该在 defun 表达式中包含最终的 (princ)(prin1) 表达式,以便函数 return 是命令的空符号行,而不是 returning 由最后计算的表达式(即 alert 表达式,它将 return nil 编辑的值 return。在我的示例中包含一个 (princ) 表达式将确保函数退出 'cleanly'.