Lisp - 错误的参数类型 : numberp: nil

标签 lisp autocad autolisp

我正在编写一个从所有多行文字中删除背景 mask 的函数,但是,我在运行代码后收到了一个错误的参数类型:numberp: nil错误:

(defun c:bgm ()
    (vl-load-com)
    (setq ss1 (ssget "X" '((0 . "MTEXT")(-4 . "<OR")(90 . 1)(90 . 3)(-4 . "OR>")))); selects all mtext with background mask on
    (setq sscount (sslength ss1))
    (repeat sscount
        (setq mtxtobj (entget (vlax-vla-object->ename (ssname ss1 counter))))
        (vla-put-backgroundfill mtxtobj :vlax-false)
        (entmod mtxtobj)
    )
)

有什么想法吗?

最佳答案

您的代码存在许多问题:

  1. 如果 ssget 表达式没有获得选择(即如果绘图中没有满足选择条件的对象),那么 ssget 将返回 nil,因此 sslength 函数在提供空参数时会出错。

    为避免这种情况,在继续执行剩余代码之前,使用 if 语句测试 ssget 函数返回的值:

    (if (setq ss1 (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
        (progn
            (setq sscount (sslength ss1))
            ...
        )
    )
    
  2. 您在 ssname 函数中引用了变量 counter,该变量未在 c:bgm 函数的范围内定义:

    (ssname ss1 counter)
    

    这应该是 sscount,如您之前在代码中定义的那样。

  3. 您似乎混淆了实体名称和 vla 对象:

    • ssname 返回实体名称,但是,您将其传递给 vlax-vla-object->ename 函数,该函数将 vla 对象转换为实体名称。

    • 您正在使用 vla-put-backgroundfill 函数来更改 vla 对象的 backgroundfill 属性,但是,您正在将变量传递给此函数由 entget 返回的值定义,它是 DXF 数据列表,而不是 vla 对象。

    • 您正在使用 entmod 修改分配给变量 mtxtobj 的 DXF 数据 - 在更改 vla 对象的 ActiveX 属性时不需要这样做。


考虑到上述情况,我建议采用以下解决方案:

(defun c:bgm ( / cnt obj sel )
    (if (setq sel (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
        (repeat (setq cnt (sslength sel))
            (setq cnt (1- cnt)
                  obj (vlax-ename->vla-object (ssname sel cnt))
            )
            (vla-put-backgroundfill obj :vlax-false)
        )
    )
    (princ)
)
(vl-load-com) (princ)

关于Lisp - 错误的参数类型 : numberp: nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51001062/

相关文章:

python - python 中的 lisp 解释器

lisp - 列表中子列表的数量,具有偶数和,来自 Lisp 中的奇数级别

c# - 为近似相似的数字生成相同的哈希码

c# - 导入多个 DXF 文件时实体错误

lisp - 在闭合多段线上绘制多边形

lisp - 使用 autolisp 从表对象中提取数据

lisp - 使用 Lisp(或 AutoLisp),关联列表的性能有多好?

lisp - 设置全局变量恢复到最后一个值

function - 定义一个函数,scheme中调用 ‘CHECK’

autocad - Autolisp 例程仅有时有效