broncos15 发表于 2022-7-5 18:03:59

透镜型零误差

因此,我有一个快速的问题,为什么我在这段代码中点击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)
)

Jef! 发表于 2022-7-5 18:41:28

嗨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)
)
 
干杯
杰夫!

broncos15 发表于 2022-7-5 18:45:08

谢谢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)
)

Jef! 发表于 2022-7-5 19:20:50

我很高兴能帮上忙。
 
关于最后发布的代码的一点评论。。。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]
查看完整版本: 透镜型零误差