透镜型零误差
因此,我有一个快速的问题,为什么我在这段代码中点击enter键时会出现错误“lentyp nil”。代码运行良好,但每次我通过点击空格键/回车退出代码时都会出现此错误。我已经看了很多遍了,但我找不到我的错误。我的代码是(defun c:hatchangle (/ hsel pt1 pt2 angr angd whilestop *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
))
(setq whilestop t)
(while whilestop
(setq hsel (car (entsel "\nSelect hatch: ")))
(cond
((= "HATCH" (cdr (assoc 0 (entget hsel))))
(if (and (setq pt1 (getpoint "\nSelect 1st point for angle: "))
(setq pt2 (getpoint "\nSelect 2nd point for angle: ")))
(progn
(setq angr (angle pt1 pt2))
(setq angd (/ (* angr 180) pi))
(command "._-hatchedit" hsel "" "" "" angd)
(princ)
)
(setq whilestop nil)
)
)
((= hsel nil)
(setq whilestop nil)
)
(princ "\n Not a hatch, try again.")
)
)
(princ)
) 嗨bronkos
您的错误来自这样一个事实,即当您不选择任何内容时,hsel为零。
当您的hsel为零时,您尝试做的第一件事是条件约束
(=“HATCH”(cdr(assoc 0(entget hsel)))
你无法获取它,它会导致你的错误。
只需将两个条件交换在一起,首先计算代码停止条件,然后立即退出例程
(defun c:hatchangle (/ hsel pt1 pt2 angr angd whilestop *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
)
(setq whilestop t)
(while whilestop
(setq hsel (car (entsel "\nSelect hatch: ")))
(cond
((= hsel nil)
(setq whilestop nil)
)
((= "HATCH" (cdr (assoc 0 (entget hsel))))
(if (and (setq pt1 (getpoint "\nSelect 1st point for angle: "))
(setq pt2 (getpoint "\nSelect 2nd point for angle: "))
)
(progn
(setq angr (angle pt1 pt2))
(setq angd (/ (* angr 180) pi))
(command "._-hatchedit" hsel "" "" "" angd)
(princ)
)
(setq whilestop nil)
)
)
(princ "\n Not a hatch, try again.")
)
)
(princ)
)
干杯
杰夫! 谢谢Jef!你的回答非常有用。最后,我对代码进行了一点修改,试图让while to exit循环仅在用户点击enter时退出,而不是在用户意外未选择任何内容时退出。此外,多亏了你,它工作得很好!我真的很感激,我确实学会了更仔细地检查条件句的顺序。
(defun c:hatchangle (/ hsel pt1 pt2 angr angd whilestop *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
)
(while (setq hsel (car (entsel "\nSelect hatch: ")))
(cond
((= hsel nil)
(princ "\nNothing selected.")
)
((= "HATCH" (cdr (assoc 0 (entget hsel))))
(if (and (setq pt1 (getpoint "\nSelect 1st point for reference angle: "))
(setq pt2 (getpoint "\nSelect 2nd point for reference angle: "))
)
(progn
(setq angr (angle pt1 pt2))
(setq angd (/ (* angr 180) pi))
(command "._-hatchedit" hsel "" "" "" angd)
(princ)
)
)
)
(t
(princ "\nNot a hatch, try again.")
)
)
)
(princ)
) 我很高兴能帮上忙。
关于最后发布的代码的一点评论。。。while语句只有在所包含的下一个表达式不是nil时才会继续。
如果你有
(while (setq hsel (car (entsel "\nSelect hatch: ")))
...这意味着,如果您误点击(和/或选择nothing),hsel将为零,并且while语句此时停止计算。这也意味着,事实上,您的第一个conditional(=hsel nil)没有用处,永远无法满足/执行。有时我使用一些标志变量作为while标准(有时与“and或”或“or”组合到任何其他标准以满足我的需要),对于每个可能的结果,我使用/更改标志来控制while。非常基本的示例
(defun c:hatchangle (/ hsel pt1 pt2 angr angd whilestop keepgoingflag *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
)
(setq keepgoingflag T)
(while (or (setq hsel (car (entsel "\nSelect hatch: "))); with a "or" if you misclick and select nothing...
keepgoingflag); ...the flag will prevent the while statement to stop being evaluated
(cond
((= hsel nil);now this cond can be evaluated
(princ "\nNothing selected. Try again or hit escape to end command"); and now escape is the only way out
)
((= "HATCH" (cdr (assoc 0 (entget hsel))))
(if (and (setq pt1 (getpoint "\nSelect 1st point for reference angle: "))
(setq pt2 (getpoint "\nSelect 2nd point for reference angle: "))
)
(progn
(setq angr (angle pt1 pt2))
(setq angd (/ (* angr 180) pi))
(command "._-hatchedit" hsel "" "" "" angd)
(princ)
)
)
)
(t
(princ "\nNot a hatch, try again.")
)
)
)
(princ)
)
有时候,简单的一段时间就足够了,有时候你需要绕着它转一圈。
快乐的编码!
杰夫!
页:
[1]