我正在编写一个从所有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)
)
)
有什么想法吗?
答案 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)
您的代码存在许多问题:
如果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))
...
)
)
您在counter
函数中引用了变量ssname
,该变量未在c:bgm
函数的范围内定义:
(ssname ss1 counter)
这应该是您代码前面定义的sscount
。
您似乎对实体名称和vla对象之间感到困惑:
ssname
返回实体名称,但是,您将其传递给vlax-vla-object->ename
函数,该函数将vla对象转换为实体名称。
您正在使用vla-put-backgroundfill
函数来更改vla对象的backgroundfill
属性,但是,您正在向该函数传递{{1}返回的值定义的变量},它是DXF数据列表,而不是vla对象。
您正在使用entget
修改分配给变量entmod
的DXF数据-更改vla对象的ActiveX属性时不需要这样做。
考虑到上述情况,我建议采取以下解决方案:
mtxtobj