You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动