diff --git a/src/app/commands.rs b/src/app/commands.rs index b49f6f75e..a83fe64d8 100644 --- a/src/app/commands.rs +++ b/src/app/commands.rs @@ -4104,7 +4104,12 @@ fn entity_list_details(entity: &acadrust::EntityType) -> String { ), acadrust::EntityType::Arc(a) => format!( "center ({:.4},{:.4},{:.4}) r={:.4} start={:.2}° end={:.2}°", - a.center.x, a.center.y, a.center.z, a.radius, a.start_angle, a.end_angle + a.center.x, + a.center.y, + a.center.z, + a.radius, + a.start_angle.to_degrees(), + a.end_angle.to_degrees() ), acadrust::EntityType::LwPolyline(p) => format!( "{} vertices closed={} elevation={:.4}", @@ -4266,15 +4271,14 @@ fn massprop_entity(entity: &acadrust::EntityType) -> Option { acadrust::EntityType::Arc(a) => { let r = a.radius; let span = { - let s = ((a.end_angle - a.start_angle) + 360.0) % 360.0; - if s < 1e-6 { 360.0 } else { s } + let s = (a.end_angle - a.start_angle).rem_euclid(TAU); + if s < 1e-6 { TAU } else { s } }; - let span_rad = span.to_radians(); // Sector area (pie slice) - let area = 0.5 * r * r * span_rad; - let arc_len = r * span_rad; + let area = 0.5 * r * r * span; + let arc_len = r * span; // Centroid of arc (chord midpoint direction) - let mid_rad = (a.start_angle + span / 2.0).to_radians(); + let mid_rad = a.start_angle + span / 2.0; Some(MassProps { area, perimeter: arc_len, @@ -4449,7 +4453,11 @@ fn entity_extra_info(entity: &acadrust::EntityType) -> String { ), EntityType::Arc(e) => format!( "C({:.3},{:.3}) R={:.3} {:.1}°-{:.1}°", - e.center.x, e.center.y, e.radius, e.start_angle, e.end_angle + e.center.x, + e.center.y, + e.radius, + e.start_angle.to_degrees(), + e.end_angle.to_degrees() ), EntityType::Text(e) => e.value.clone(), EntityType::MText(e) => e.value.chars().take(60).collect(), diff --git a/src/entities/arc.rs b/src/entities/arc.rs index b7f1564ff..d6dd483f6 100644 --- a/src/entities/arc.rs +++ b/src/entities/arc.rs @@ -138,8 +138,8 @@ fn properties(arc: &Arc) -> PropSection { edit("Center Y", "center_y", arc.center.y), edit("Center Z", "center_z", arc.center.z), edit("Radius", "radius", arc.radius), - edit("Start Angle", "start_angle", arc.start_angle), - edit("End Angle", "end_angle", arc.end_angle), + edit("Start Angle (deg)", "start_angle", arc.start_angle.to_degrees()), + edit("End Angle (deg)", "end_angle", arc.end_angle.to_degrees()), ], } } @@ -153,8 +153,8 @@ fn apply_geom_prop(arc: &mut Arc, field: &str, value: &str) { "center_y" => arc.center.y = v, "center_z" => arc.center.z = v, "radius" if v > 0.0 => arc.radius = v, - "start_angle" => arc.start_angle = v, - "end_angle" => arc.end_angle = v, + "start_angle" => arc.start_angle = v.to_radians(), + "end_angle" => arc.end_angle = v.to_radians(), _ => {} } } diff --git a/src/modules/home/draw/arc.rs b/src/modules/home/draw/arc.rs index 7967b2e1c..4f6675a22 100644 --- a/src/modules/home/draw/arc.rs +++ b/src/modules/home/draw/arc.rs @@ -96,8 +96,8 @@ fn make_arc(center: Vec3, radius: f32, start_angle: f32, end_angle: f32) -> Enti EntityType::Arc(CadArc { center: Vector3::new(center.x as f64, center.y as f64, center.z as f64), radius: radius as f64, - start_angle: start_angle.to_degrees() as f64, - end_angle: end_angle.to_degrees() as f64, + start_angle: start_angle as f64, + end_angle: end_angle as f64, ..Default::default() }) } @@ -156,8 +156,8 @@ fn arc_from_sagitta(s: Vec3, e: Vec3, cursor: Vec3) -> Option<(Vec3, f32)> { if chord_len < 1e-6 { return None; } - let unit_chord = Vec3::new(chord_vec.x / chord_len, 0.0, chord_vec.y / chord_len); - let perp = Vec3::new(-unit_chord.y, 0.0, unit_chord.x); + let unit_chord = Vec3::new(chord_vec.x / chord_len, chord_vec.y / chord_len, 0.0); + let perp = Vec3::new(-unit_chord.y, unit_chord.x, 0.0); let mid = (s + e) * 0.5; let h = (cursor - mid).dot(perp); // signed sagitta if h.abs() < 1e-3 {