fix: store arc angles in radians
This commit is contained in:
parent
1b4c5e13e5
commit
d7422b9396
3 changed files with 24 additions and 16 deletions
|
|
@ -4104,7 +4104,12 @@ fn entity_list_details(entity: &acadrust::EntityType) -> String {
|
||||||
),
|
),
|
||||||
acadrust::EntityType::Arc(a) => format!(
|
acadrust::EntityType::Arc(a) => format!(
|
||||||
"center ({:.4},{:.4},{:.4}) r={:.4} start={:.2}° end={:.2}°",
|
"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!(
|
acadrust::EntityType::LwPolyline(p) => format!(
|
||||||
"{} vertices closed={} elevation={:.4}",
|
"{} vertices closed={} elevation={:.4}",
|
||||||
|
|
@ -4266,15 +4271,14 @@ fn massprop_entity(entity: &acadrust::EntityType) -> Option<MassProps> {
|
||||||
acadrust::EntityType::Arc(a) => {
|
acadrust::EntityType::Arc(a) => {
|
||||||
let r = a.radius;
|
let r = a.radius;
|
||||||
let span = {
|
let span = {
|
||||||
let s = ((a.end_angle - a.start_angle) + 360.0) % 360.0;
|
let s = (a.end_angle - a.start_angle).rem_euclid(TAU);
|
||||||
if s < 1e-6 { 360.0 } else { s }
|
if s < 1e-6 { TAU } else { s }
|
||||||
};
|
};
|
||||||
let span_rad = span.to_radians();
|
|
||||||
// Sector area (pie slice)
|
// Sector area (pie slice)
|
||||||
let area = 0.5 * r * r * span_rad;
|
let area = 0.5 * r * r * span;
|
||||||
let arc_len = r * span_rad;
|
let arc_len = r * span;
|
||||||
// Centroid of arc (chord midpoint direction)
|
// 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 {
|
Some(MassProps {
|
||||||
area,
|
area,
|
||||||
perimeter: arc_len,
|
perimeter: arc_len,
|
||||||
|
|
@ -4449,7 +4453,11 @@ fn entity_extra_info(entity: &acadrust::EntityType) -> String {
|
||||||
),
|
),
|
||||||
EntityType::Arc(e) => format!(
|
EntityType::Arc(e) => format!(
|
||||||
"C({:.3},{:.3}) R={:.3} {:.1}°-{:.1}°",
|
"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::Text(e) => e.value.clone(),
|
||||||
EntityType::MText(e) => e.value.chars().take(60).collect(),
|
EntityType::MText(e) => e.value.chars().take(60).collect(),
|
||||||
|
|
|
||||||
|
|
@ -138,8 +138,8 @@ fn properties(arc: &Arc) -> PropSection {
|
||||||
edit("Center Y", "center_y", arc.center.y),
|
edit("Center Y", "center_y", arc.center.y),
|
||||||
edit("Center Z", "center_z", arc.center.z),
|
edit("Center Z", "center_z", arc.center.z),
|
||||||
edit("Radius", "radius", arc.radius),
|
edit("Radius", "radius", arc.radius),
|
||||||
edit("Start Angle", "start_angle", arc.start_angle),
|
edit("Start Angle (deg)", "start_angle", arc.start_angle.to_degrees()),
|
||||||
edit("End Angle", "end_angle", arc.end_angle),
|
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_y" => arc.center.y = v,
|
||||||
"center_z" => arc.center.z = v,
|
"center_z" => arc.center.z = v,
|
||||||
"radius" if v > 0.0 => arc.radius = v,
|
"radius" if v > 0.0 => arc.radius = v,
|
||||||
"start_angle" => arc.start_angle = v,
|
"start_angle" => arc.start_angle = v.to_radians(),
|
||||||
"end_angle" => arc.end_angle = v,
|
"end_angle" => arc.end_angle = v.to_radians(),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,8 +96,8 @@ fn make_arc(center: Vec3, radius: f32, start_angle: f32, end_angle: f32) -> Enti
|
||||||
EntityType::Arc(CadArc {
|
EntityType::Arc(CadArc {
|
||||||
center: Vector3::new(center.x as f64, center.y as f64, center.z as f64),
|
center: Vector3::new(center.x as f64, center.y as f64, center.z as f64),
|
||||||
radius: radius as f64,
|
radius: radius as f64,
|
||||||
start_angle: start_angle.to_degrees() as f64,
|
start_angle: start_angle as f64,
|
||||||
end_angle: end_angle.to_degrees() as f64,
|
end_angle: end_angle as f64,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -156,8 +156,8 @@ fn arc_from_sagitta(s: Vec3, e: Vec3, cursor: Vec3) -> Option<(Vec3, f32)> {
|
||||||
if chord_len < 1e-6 {
|
if chord_len < 1e-6 {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let unit_chord = Vec3::new(chord_vec.x / chord_len, 0.0, chord_vec.y / chord_len);
|
let unit_chord = Vec3::new(chord_vec.x / chord_len, chord_vec.y / chord_len, 0.0);
|
||||||
let perp = Vec3::new(-unit_chord.y, 0.0, unit_chord.x);
|
let perp = Vec3::new(-unit_chord.y, unit_chord.x, 0.0);
|
||||||
let mid = (s + e) * 0.5;
|
let mid = (s + e) * 0.5;
|
||||||
let h = (cursor - mid).dot(perp); // signed sagitta
|
let h = (cursor - mid).dot(perp); // signed sagitta
|
||||||
if h.abs() < 1e-3 {
|
if h.abs() < 1e-3 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue