AutoCAD LISP程序处理多行属性时异常,请求排查
AutoCAD LISP 多行属性输入报错问题
我编写的AutoCAD LISP程序在处理多行属性时会报错,用pause等待用户输入时,程序返回“未知输入”并终止,但Diesel版本的程序运行完全正常。求解决思路?
相关代码
(defun c:P01 (/ *error* Date LayoutNew Initials Clayer) ;; Error handler (defun *error* (msg) (if (not (member msg '("Function cancelled" "quit / exit abort"))) (princ (strcat "\nError: " msg)) ) (princ) ) ;; Check for paperspace (if (/= (getvar "CVPORT") 1) ;; Throw custom error (*error* "Command not allowed in Model Space") ;; Continue normally (progn (setq Date (menucmd "m=$(edtime,0,dd.mo.yyyy)")) (setq Initials "SMS") (setq LayoutNew (strcat (substr (getvar "CTAB") 1 5) "P01" (substr (getvar "CTAB") 9))) (setq Clayer (getvar "CLAYER")) (command "_.layout" "r" "" LayoutNew) (command "_.REGEN") (command "-layer" "t" "0" "m" "0" "") (command "attdia" "0") (command "_.Insert" "REVNOTE" pause 1 1 0 "P01" Date Initials pause) (command "attdia" "1") (command "-layer" "S" Clayer "") (command "REA") ) ) (prin1) )
解决思路
- 问题核心原因:当
attdia设为0时,AutoCAD强制使用命令行输入属性,但命令行不支持多行属性的交互输入,导致程序无法解析用户输入的多行内容,抛出“未知输入”错误。Diesel版本依赖菜单触发,会自动调用多行属性编辑器,绕开了命令行的限制。 - 方案1:恢复属性对话框(推荐):删除
(command "attdia" "0")和(command "attdia" "1")这两行,让AutoCAD默认弹出属性输入对话框,用户可以在对话框里正常输入多行内容。修改后的插入命令为:
若必须临时控制对话框,可在插入前开启(command "_.Insert" "REVNOTE" pause 1 1 0 "P01" Date Initials)attdia为1,插入后再恢复,确保多行属性能通过对话框编辑。 - 方案2:命令行模式下处理多行属性:如果必须使用命令行输入,需将多行内容中的换行符替换为AutoCAD识别的
\P,提前把用户输入的多行文本转换为带\P的字符串再传入command函数。但这种方式需要额外处理输入,不如对话框直观。 - 错误处理优化:在
*error*函数中添加对“未知输入”的捕获,避免不必要的错误提示:(defun *error* (msg) (if (not (member msg '("Function cancelled" "quit / exit abort" "未知输入"))) (princ (strcat "\nError: " msg)) ) (princ) ) - 布局命名的健壮性优化:原代码中
substr截取依赖原布局名长度,若原布局名长度不足9会导致拼接错误,建议改用更安全的方式生成新布局名,比如:(setq LayoutNew (strcat (vl-string-left-trim "_" (getvar "CTAB")) "P01"))
内容的提问来源于stack exchange,提问作者Stephen Sillibourne




