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

时间:2018-06-23 12:13:32

标签: lisp autocad autolisp

我正在编写一个从所有mtext中删除背景遮罩的函数,但是,在运行代码后,我遇到了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)
    )
)

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

该错误可能是由于:

(ssname ss1 counter)

其中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 :(得分:2)

您的代码存在许多问题:

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

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

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

    (ssname ss1 counter)
    

    这应该是您代码前面定义的sscount

  3. 您似乎对实体名称和vla对象之间感到困惑:

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

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

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


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

mtxtobj