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

Lisp - bad argument type: numberp: nil

我正在编写一个从所有多行文字中删除背景遮罩的函数,但是,我在 运行 代码后收到 bad argument type: 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)
    )
)

知道为什么吗?

错误可能是由于:

(ssname ss1 counter)

其中计数器为零。 您应该改用 sscount。您还必须减少 sscount 值以循环访问选择集。

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

您的代码存在一些问题:

  1. 如果 ssget 表达式未获得选择(即如果绘图中不存在满足选择条件的对象),则 ssget 将 return nil,因此 sslength 函数在提供空参数时会出错。

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

    (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 return 是实体名称,但是,您将其传递给 vlax-vla-object->ename 函数,该函数将 vla 对象转换为实体名称.

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

    • 您正在使用 entmod 修改分配给变量的 DXF 数据 mtxtobj - 更改 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)