Lee Chu Chu 发表于 2022-7-5 22:45:20

尝试l时出现错误消息

我在autocad 2015中遇到了这个错误,但由于某种原因,2014年没有。
 
如果没有事先调用(*push error using command*),则无法从*error*调用(命令)。
建议将(命令)调用转换为(命令-s)。
 
谁能帮我理解这意味着什么?我一直在使用Afralisp的代码
 

(defun c:drawline ()                                        ;define function
(initerr)                                        ;intit error
(setvar "cmdecho" 0)                                ;reset variables
(setvar "osmode" 32)
(command "undo" "m")                                ;set mark
(setq pt1 (getpoint "\nPick First Point: "))        ;get points
(setq pt2 (getpoint pt1 "\nPick Second Point: "))
(command "LAYER" "M" "2" "")                        ;change layer
(command "Line" pt1 pt2 "")                        ;draw line
(setq pt3 (getpoint pt2 "\nPick Third Point: "));get 3rd point
(setvar "osmode" 0)                                ;reset snap
(command "Line" pt2 pt3 "")                        ;draw line
(reset)                                                ;reset variables
(princ)
)

(defun error()                                                ;load function
(prompt "\nGlobal Error Trap Loaded")                        ;inform user
(princ)
);defun
;;;*==========================================================
(defun initerr ()                                        ;init error
(setq oldlayer (getvar "clayer"))                        ;save settings
(setq oldsnap (getvar "osmode"))
(setq oldpick (getvar "pickbox"))
(setq temperr *error*)                                ;save *error*
(setq *error* trap)                                        ;reassign *error*
(princ)
);defun
;;;*===========================================================
(defun trap (errmsg)                                        ;define trap
(command nil nil nil)
(if (not (member errmsg '("console break" "Function Cancelled"))
   )
   (princ (strcat "\nError: " errmsg))                        ;print message
)               
(command "undo" "b")                                        ;undo back
(setvar "clayer" oldlayer)                                ;reset settings
(setvar "blipmode" 1)
(setvar "menuecho" 0)
(setvar "highlight" 1)
(setvar "osmode" oldsnap)
(setvar "pickbox" oldpick)
(princ "\nError Resetting Enviroment ")                ;inform user
(terpri)
(setq *error* temperr)                                ;restore *error*
(princ)
);defun
;;;*===========================================================
(defun reset ()                                                ;define reset
(setq *error* temperr)                                ;restore *error*
(setvar "clayer" oldlayer)                                ;reset settings
(setvar "blipmode" 1)
(setvar "menuecho" 0)
(setvar "highlight" 1)
(setvar "osmode" oldsnap)
(setvar "pickbox" oldpick)
(princ)
);defun

 
您可以在此处找到代码:http://www.afralisp.net/autolisp/tutorials/error-trapping.php

MSasu 发表于 2022-7-5 23:04:03

请尝试更换此部件
(defun trap (errmsg)   ;define trap
(command nil nil nil)
(if (not (member errmsg '("console break" "Function Cancelled"))
   )
   (princ (strcat "\nError: " errmsg))   ;print message
)               
(command "undo" "b")   ;undo back
使用:
(defun trap (errmsg)   ;define trap
(command-s)
(if (not (member errmsg '("console break" "Function Cancelled"))
   )
   (princ (strcat "\nError: " errmsg))   ;print message
)               
(command-s "undo" "b")   ;undo back
建议在错误陷阱中使用该函数,并且AutoCAD 2015似乎正在强制执行该规则;从帮助:

Lee Chu Chu 发表于 2022-7-5 23:30:10

谢谢,这似乎奏效了。如果你不介意的话,我还有一个问题。我将此用作测试,因此请确保您知道,如果此操作适用于此特定函数,那么它应该适用于我的其他函数。我似乎无法让错误捕捉工作。你能帮帮我吗?

(defun c: trec()
(initerr)
(setvar "clayer" "text_25")
(setvar "osmode" 2)
(command "undo" "m")
(command "rectang")
(reset)

(princ)
);defun

 
由于某些原因,当调用此函数时,变量不会设置,因此调用此命令之前的原始设置仍然存在。你能帮我弄清楚为什么clayer和osmode没有为此做好准备吗?

MSasu 发表于 2022-7-5 23:37:12

由于调用命令的方式,无法达到重置功能。这将确保AutoLISP恢复:
...
(command "_rectang")
(while (> (getvar "CMDACTIVE") 0)
(command pause)
)
(reset)
)

Lee Chu Chu 发表于 2022-7-5 23:58:13

非常感谢你的帮助。现在一切都好了。
页: [1]
查看完整版本: 尝试l时出现错误消息