From 5a7ebbbb38c7ba4f2aaf6f47d894ecdf0c081291 Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Sat, 2 May 2026 17:15:41 +0300 Subject: [PATCH] feat: add Node snap points to dimension defpoints Dimension measurement origin points (first_point, second_point, definition_point, angle_vertex, etc.) are now emitted as Node snap hints so OSNAP Node mode can locate them precisely without relying on the tessellated geometry wire alone. Co-Authored-By: Claude Sonnet 4.6 --- src/scene/tessellate.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/scene/tessellate.rs b/src/scene/tessellate.rs index 31b0c6c93..9abb82c3a 100644 --- a/src/scene/tessellate.rs +++ b/src/scene/tessellate.rs @@ -281,6 +281,8 @@ pub fn tessellate_dimension( .filter(|p| !(p[0].is_nan() || p[1].is_nan() || p[2].is_nan())) .collect(); + let snap_pts = dimension_snap_pts(dim, world_offset); + let mut wires = vec![WireModel { name: name.clone(), points, @@ -290,7 +292,7 @@ pub fn tessellate_dimension( pattern_length: 0.0, pattern: [0.0; 8], line_weight_px, - snap_pts: vec![], + snap_pts, tangent_geoms: vec![], key_vertices, aabb: WireModel::UNBOUNDED_AABB, @@ -956,6 +958,26 @@ fn add_polyline(points: &mut Vec<[f32; 3]>, polyline: &[Vec3]) { points.extend(polyline.iter().map(|p| [p.x, p.y, p.z])); } +fn dimension_snap_pts(dim: &Dimension, world_offset: [f64; 3]) -> Vec<(Vec3, SnapHint)> { + let lv = |v: acadrust::types::Vector3| { + Vec3::new( + (v.x - world_offset[0]) as f32, + (v.y - world_offset[1]) as f32, + (v.z - world_offset[2]) as f32, + ) + }; + let node = |v: acadrust::types::Vector3| (lv(v), SnapHint::Node); + match dim { + Dimension::Linear(d) => vec![node(d.first_point), node(d.second_point), node(d.definition_point)], + Dimension::Aligned(d) => vec![node(d.first_point), node(d.second_point), node(d.definition_point)], + Dimension::Radius(d) => vec![node(d.angle_vertex), node(d.definition_point)], + Dimension::Diameter(d) => vec![node(d.angle_vertex), node(d.definition_point)], + Dimension::Angular2Ln(d) => vec![node(d.angle_vertex), node(d.first_point), node(d.second_point), node(d.definition_point)], + Dimension::Angular3Pt(d) => vec![node(d.angle_vertex), node(d.first_point), node(d.second_point), node(d.definition_point)], + Dimension::Ordinate(d) => vec![node(d.definition_point), node(d.feature_location), node(d.leader_endpoint)], + } +} + fn dimension_text_entity(dim: &Dimension) -> Option { let value = dimension_text_value(dim)?; // Use f64 position directly to avoid f32 round-trip precision loss at large