From 2c59eb19c52a2adfa2df1b93ead4101a6f16725e Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sat, 24 Oct 2026 07:50:56 +0200 Subject: [PATCH] Fix LISP getangle subtracting ANGBASE in degrees from radians (#1883) Found while testing crates/engine/src/lisp/input.rs:256-258 (lisp_angbase, used at :127 and :183); cause is crates/engine/src/sysvars.rs:141 Co-authored-by: Claude Opus 5.5 --- crates/engine/src/lisp/input.rs | 2 +- crates/engine/src/lisp/tests.rs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/lisp/input.rs b/crates/engine/src/lisp/input.rs index d12dcbbc..e771abf0 100644 --- a/crates/engine/src/lisp/input.rs +++ b/crates/engine/src/lisp/input.rs @@ -260,7 +260,7 @@ fn keyword(keywords: &[String], t: &str) -> Option { impl Session { /// ANGBASE (radians). fn lisp_angbase(&self) -> f64 { - crate::sysvars::get(self, "ANGBASE").and_then(|v| v.as_f64()).unwrap_or(0.0) + self.doc().map(|d| d.header.f64("ANGBASE", 0.0)).unwrap_or(0.0) } } diff --git a/crates/engine/src/lisp/tests.rs b/crates/engine/src/lisp/tests.rs index 9b3b082c..b3a09e79 100644 --- a/crates/engine/src/lisp/tests.rs +++ b/crates/engine/src/lisp/tests.rs @@ -497,6 +497,24 @@ fn interactive_routine_waits_for_the_user() { assert!(s.doc().unwrap().model.iter().any(|e| matches!(&e.kind, cadcraft_doc::EntityKind::Circle(c) if c.center.x == 50.0 && c.radius == 2.0))); } +#[test] +fn getangle_is_relative_to_angbase() { + let mut s = session(); + s.cmdline("(setvar \"ANGBASE\" 90)").unwrap(); + // A picked point at 180° in world terms is 90° from ANGBASE. + s.cmdline("(setq a (getangle '(0 0)))").unwrap(); + s.input(crate::Input::Point(cadcraft_geom::Vec2::new(-1.0, 0.0))).unwrap(); + assert_eq!(to_text(&s.lisp_var("A"), true), "1.5708"); + // getorient ignores ANGBASE. + s.cmdline("(setq o (getorient '(0 0)))").unwrap(); + s.input(crate::Input::Point(cadcraft_geom::Vec2::new(-1.0, 0.0))).unwrap(); + assert_eq!(to_text(&s.lisp_var("O"), true), "3.14159"); + // A typed angle is already measured from ANGBASE. + s.cmdline("(setq t2 (getangle))").unwrap(); + s.cmdline("180").unwrap(); + assert_eq!(to_text(&s.lisp_var("T2"), true), "3.14159"); +} + #[test] fn appload_and_load() { let mut s = session();