需要帮助检测L中的错误
你好,我对当前的LISP项目有点迷茫。
通过这个程序,我确定一条线的角度,并将其与列表进行比较。如果此角度在此列表中,则应返回true,否则返回false。
然而,我似乎无法使代码的红色部分正常工作。当我使用一个数字时,它会正常工作,但当我使用“ang1”时,它失败了。然而,当我使用(princ ang1)时,它显示了我想要与列表进行比较的角度。
我认为错误在RtD计算中的某个地方,但我不确定。
如果你需要任何其他信息,请告诉我。
(defun c:OneBend ( / savesnap comech )
(initget 1 "Forward Backward")
(setq richting (getkword "Is this a Forward or a Backward bend? "))
(setq bend 90)
;;; DETERMINE ANGLE
(setq pt1 (getpoint "\nSelect point 1: "))
(setq pt2 (getpoint "\nSelect point 2: "))
(setq ang (angle pt1 pt2))
(setq ang0 (/ ang pi))
(setq ang1 (* ang0 180.0))
(if (>= ang1 180.0) (setq ang1 (- ang1 180.0)))
(if (>= ang1 90.0) (setq ang1 (- ang1 180.0)))
(setq ang1 (abs ang1))
(terpri)
(princ ang1)
(terpri)
(setq f90_list '(0.0 8.0 10.0 12.0 14.0 16.0 18.0 20.0 22.0 24.0 26.0 34.0))
(setq b90_list '(0.0 16.0 20.0 22.0 24.0 26.0 28.0 30.0 32.0 34.0 36.0 39.0 40.0 42.0
44.0 45.0 46.0 48.0
50.0 52.0 55.0 58.0 60.0 63.0 64.0 65.0))
(setq stnd_list '(0.0))
(cond
((and (= bend 90) (= richting "Forward"))
(setq angle_list f90_list))
; FOR FUTURE USE
((and (= bend 45) (= richting "Forward"))
(setq angle_list f45_list))
((and (= bend 90) (= richting "Backward"))
(setq angle_list b90_list))
; FOR FUTURE USE
((and (= bend 45) (= richting "Backward"))
(setq angle_list b45_list))
(t (setq angle_list stnd_list))
)
; ANGLE PART OF LIST
; (setq apol (member 20.0 angle_list)) ; This works
(setq apol (member ang1 angle_list)) ; This does not work ???
(if apol (princ "Success!") (princ "Fail!"))
; PROGRAM CONTINUES HERE
)
您需要舍入变量ang1以匹配角度列表中指定的角度值,以便成员函数能够检测其存在。。。另一种方法是使用vl位置函数而不是成员函数,因为它速度更快,但仍然需要进行舍入。实际上,最好的选择可能是具有足够lambda函数的vl成员if函数,在该函数中,您不必进行舍入,而是使用适当的模糊容差值指定相等的比较函数。。。 我认为他想说的是,你试图把20.0000和20.0匹配起来,但这不可行。 试试这个:
(setq apol (vl-some '(lambda (x) (equal ang1 x 1e-4)) angle_list))
非常感谢,这就成功了:-) 不客气 将所有弯曲变量设置为实数45.0 90.0
页:
[1]