我正在编写一个从所有多行文字中删除背景 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)
)
)
有什么想法吗?
最佳答案
您的代码存在许多问题:
如果
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)) ... ) )
您在
ssname
函数中引用了变量counter
,该变量未在c:bgm
函数的范围内定义:(ssname ss1 counter)
这应该是
sscount
,如您之前在代码中定义的那样。您似乎混淆了实体名称和 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/