feat: dimension arrow size from DIMASZ×DIMSCALE in dimstyle

Arrow size for all dimension types (linear, aligned, radius, diameter,
angular) is now read from the associated DimStyle's dimasz field scaled
by dimscale, instead of being hardcoded at 0.12. Falls back to 0.12
when the style isn't found in the document's dim_styles table.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Sonnet 4.6 committed 2026-04-27 02:28:48 +03:00
1 parent 0bb4209e2c
commit debc4b87a8
1 file changed
+27 -11
+27 -11
View File
@@ -228,7 +228,19 @@ pub fn tessellate_dimension(
entity_color
};
let name = handle.value().to_string();
let points = dimension_geometry(dim);
let style_name = &dim.base().style_name;
let arrow_size = document
.dim_styles
.iter()
.find(|s| s.name.eq_ignore_ascii_case(style_name)
|| (style_name.trim().is_empty() && s.name.eq_ignore_ascii_case("Standard")))
.map(|s| {
let scale = if s.dimscale > 1e-6 { s.dimscale } else { 1.0 };
(s.dimasz * scale) as f32
})
.unwrap_or(0.12)
.max(0.001);
let points = dimension_geometry(dim, arrow_size);
let key_vertices = points
.iter()
.copied()
@@ -671,7 +683,7 @@ fn solid_wire_fallback(entity: &EntityType) -> Vec<[f32; 3]> {
pts
}
fn dimension_geometry(dim: &Dimension) -> Vec<[f32; 3]> {
fn dimension_geometry(dim: &Dimension, arrow_size: f32) -> Vec<[f32; 3]> {
let mut points = Vec::new();
match dim {
Dimension::Aligned(d) => {
@@ -679,14 +691,14 @@ fn dimension_geometry(dim: &Dimension) -> Vec<[f32; 3]> {
let second = vec3(d.second_point);
let def = vec3(d.definition_point);
let axis = normalized_or(second - first, Vec3::X);
append_linear_dimension(&mut points, first, second, def, axis);
append_linear_dimension(&mut points, first, second, def, axis, arrow_size);
}
Dimension::Linear(d) => {
let first = vec3(d.first_point);
let second = vec3(d.second_point);
let def = vec3(d.definition_point);
let axis = Vec3::new(d.rotation.cos() as f32, d.rotation.sin() as f32, 0.0);
append_linear_dimension(&mut points, first, second, def, normalized_or(axis, Vec3::X));
append_linear_dimension(&mut points, first, second, def, normalized_or(axis, Vec3::X), arrow_size);
}
Dimension::Radius(d) => {
let center = vec3(d.angle_vertex);
@@ -694,14 +706,14 @@ fn dimension_geometry(dim: &Dimension) -> Vec<[f32; 3]> {
let text = dimension_text_position(dim);
add_segment(&mut points, center, point);
add_segment(&mut points, point, text);
append_arrow(&mut points, point, normalized_or(center - point, Vec3::X), 0.12);
append_arrow(&mut points, point, normalized_or(center - point, Vec3::X), arrow_size);
}
Dimension::Diameter(d) => {
let p1 = vec3(d.angle_vertex);
let p2 = vec3(d.definition_point);
add_segment(&mut points, p1, p2);
append_arrow(&mut points, p1, normalized_or(p2 - p1, Vec3::X), 0.12);
append_arrow(&mut points, p2, normalized_or(p1 - p2, Vec3::X), 0.12);
append_arrow(&mut points, p1, normalized_or(p2 - p1, Vec3::X), arrow_size);
append_arrow(&mut points, p2, normalized_or(p1 - p2, Vec3::X), arrow_size);
}
Dimension::Angular2Ln(d) => {
append_angular_dimension(
@@ -710,6 +722,7 @@ fn dimension_geometry(dim: &Dimension) -> Vec<[f32; 3]> {
vec3(d.first_point),
vec3(d.second_point),
vec3(d.dimension_arc),
arrow_size,
);
}
Dimension::Angular3Pt(d) => {
@@ -719,6 +732,7 @@ fn dimension_geometry(dim: &Dimension) -> Vec<[f32; 3]> {
vec3(d.first_point),
vec3(d.second_point),
vec3(d.definition_point),
arrow_size,
);
}
Dimension::Ordinate(d) => {
@@ -735,6 +749,7 @@ fn append_linear_dimension(
second: Vec3,
def: Vec3,
axis: Vec3,
arrow_size: f32,
) {
let perp = Vec3::new(-axis.y, axis.x, 0.0);
let dim_line_pos = def.dot(perp);
@@ -743,8 +758,8 @@ fn append_linear_dimension(
add_segment(points, first, d1);
add_segment(points, second, d2);
add_segment(points, d1, d2);
append_arrow(points, d1, normalized_or(d2 - d1, axis), 0.12);
append_arrow(points, d2, normalized_or(d1 - d2, -axis), 0.12);
append_arrow(points, d1, normalized_or(d2 - d1, axis), arrow_size);
append_arrow(points, d2, normalized_or(d1 - d2, -axis), arrow_size);
}
fn append_angular_dimension(
@@ -753,6 +768,7 @@ fn append_angular_dimension(
first: Vec3,
second: Vec3,
arc_point: Vec3,
arrow_size: f32,
) {
add_segment(points, vertex, first);
add_segment(points, vertex, second);
@@ -787,14 +803,14 @@ fn append_angular_dimension(
points,
arc_pts[0],
normalized_or(arc_pts[1] - arc_pts[0], Vec3::X),
0.1,
arrow_size,
);
let n = arc_pts.len();
append_arrow(
points,
arc_pts[n - 1],
normalized_or(arc_pts[n - 2] - arc_pts[n - 1], Vec3::X),
0.1,
arrow_size,
);
}
}