AutoLISP编写FF命令批量插入块报错:参数类型错误(nil)
AutoLISP命令"FF"报错修复
报错原因拆解
你遇到的error: bad argument type: (or stringp symbolp): nil是由几个代码问题导致的:
- 错误使用
setvar:setvar是用来设置AutoCAD系统变量的,自定义变量aux应该用setq赋值,用setvar会因aux不是系统变量返回nil,触发参数类型错误。 - 字符串遍历方式错误:
getstring返回的是字符串,foreach遍历字符串时,每个元素是字符的ASCII码值,不是字符串,直接传给insert会导致参数不合法。 - 表达式语法错误:
(aux*2)不符合AutoLISP前缀表达式规则,应该写成(* aux 2)。 - 不存在的函数
incf:AutoLISP没有incf函数,变量递增需要用(setq aux (1+ aux))实现。
修复后的代码
(defun c:FF () (setq P (getpoint "Define origin:")) (setq aux 1) ; 用setq定义自定义变量 (setq seq (getstring "Define the sequence of blocks:")) (setq i 0) (while (< i (strlen seq)) ; 截取字符串中的单个字符作为块名 (setq str (subseq seq i (1+ i))) ; 按水平方向(0度)间隔2单位插入块 (command "insert" str (polar P 0.0 (* aux 2))) (setq i (1+ i)) (setq aux (1+ aux)) ; 递增间距变量 ) (princ) ; 清理命令行输出 )
关键修复说明
- 变量定义:用
setq替代setvar定义自定义变量aux,setvar仅用于"CMDECHO"这类AutoCAD系统变量。 - 字符串处理:通过
subseq按索引截取单个字符的字符串,确保传给insert的是合法的块名字符串。 - 语法修正:遵循AutoLISP前缀表达式规则,把
(aux*2)改为(* aux 2)。 - 变量递增:用
(setq aux (1+ aux))替代不存在的incf函数,实现变量自增。 - 命令行清理:最后添加
(princ),避免命令执行完毕后在命令行输出多余的变量值。
内容的提问来源于stack exchange,提问作者Loizm
相关产品推荐
相关产品推荐

