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)
)
)
)
您的代码存在一些问题:
如果 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))
...
)
)
您在 ssname
函数中引用了变量 counter
,该变量未定义在 c:bgm
函数的范围内:
(ssname ss1 counter)
这应该是 sscount
,如您之前在代码中定义的那样。
您似乎混淆了实体名称和 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)
我正在编写一个从所有多行文字中删除背景遮罩的函数,但是,我在 运行 代码后收到 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)
)
)
)
您的代码存在一些问题:
如果
ssget
表达式未获得选择(即如果绘图中不存在满足选择条件的对象),则ssget
将 returnnil
,因此sslength
函数在提供空参数时会出错。为避免这种情况,在继续执行剩余代码之前,请使用
if
语句测试由ssget
函数编辑的值 return:(if (setq ss1 (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>")))) (progn (setq sscount (sslength ss1)) ... ) )
您在
ssname
函数中引用了变量counter
,该变量未定义在c:bgm
函数的范围内:(ssname ss1 counter)
这应该是
sscount
,如您之前在代码中定义的那样。您似乎混淆了实体名称和 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)