fix: review fixes for the metric template and the radial constraint

A new drawing (#1441) recorded ISO-25 as the current dimension style by
name only. Every other place that changes it sets the header's handle as
well, and a DWG carries the current style by handle alone, so a saved new
drawing reopened on Standard. The style's handle now comes back from the
helper that adds it.

A radius constraint (#1443) anchored the circle's centre from the shape of
its references — one whole entity — but a single whole reference is also a
line's length, whose start is what stays. The entity decides now.

The two tests that encoded the replaced rules follow them: a negative
radius validates by its magnitude, as a negative distance already did, and
only zero is refused; a new drawing's dimension text reads at ISO-25's
comma separator.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 5 committed 2026-09-22 13:46:49 +03:00
1 parent 6605a71fdd
commit 4bef410abb
5 files changed
+34 -10

No files matched your search

+3 -1
View File
@@ -63,7 +63,9 @@ fn ordinate_preview_matches_commit() {
assert!(app.dimension_preview_entities(i, DVec3::ZERO).is_none());
let _ = app.feed_command(StepInput::Point(DVec3::new(12.5, 40.0, 0.0)));
let entity = commit_and_compare(&mut app, i, DVec3::new(12.5, 90.0, 0.0));
assert_eq!(text(&app, &entity), "12.5");
// A new drawing is metric and current on ISO-25, whose decimal separator
// is a comma and whose trailing zeros are suppressed.
assert_eq!(text(&app, &entity), "12,5");
}
#[test]
+9 -5
View File
@@ -36,14 +36,16 @@ fn named_text_style(doc: &CadDocument, name: &str) -> Option<TextStyle> {
}
/// Adds the reference's ISO-25 dimension style (the current style of its
/// metric template) when the drawing has none of that name.
pub fn ensure_iso_dim_style(doc: &mut CadDocument) {
if doc
/// metric template) when the drawing has none of that name, and hands back its
/// handle: the header records the current dimension style by handle as well as
/// by name, and a DWG carries only the handle.
pub fn ensure_iso_dim_style(doc: &mut CadDocument) -> Handle {
if let Some(style) = doc
.dim_styles
.iter()
.any(|style| style.name.eq_ignore_ascii_case("ISO-25"))
.find(|style| style.name.eq_ignore_ascii_case("ISO-25"))
{
return;
return style.handle;
}
let mut style = DimStyle::new("ISO-25");
style.handle = doc.allocate_handle();
@@ -82,7 +84,9 @@ pub fn ensure_iso_dim_style(doc: &mut CadDocument) {
style.dimjogang = std::f64::consts::FRAC_PI_2;
style.dimmzf = 100.0;
style.dimaltmzf = 100.0;
let handle = style.handle;
let _ = doc.dim_styles.add(style);
handle
}
fn named_dim_style(doc: &CadDocument, name: &str) -> Option<DimStyle> {
+4 -1
View File
@@ -2733,8 +2733,11 @@ impl Scene {
// current. Standard stays available for imperial work.
self.document.header.measurement = 1;
self.document.header.insertion_units = 4;
crate::scene::creation_style::ensure_iso_dim_style(&mut self.document);
let iso = crate::scene::creation_style::ensure_iso_dim_style(&mut self.document);
self.document.header.current_dimstyle_name = "ISO-25".to_string();
// The name alone leaves the header pointing at the previous style, and
// a DWG writes the current style by handle only.
self.document.header.current_dimstyle_handle = iso;
for obj in self.document.objects.values_mut() {
if let acadrust::objects::ObjectType::Layout(l) = obj {
if l.name != "Model" {
+9 -2
View File
@@ -732,8 +732,15 @@ pub(crate) fn dimensional_anchor_refs(
return Vec::new();
};
// A whole circle or arc (a radius or diameter): its center stays and the
// value resizes it.
if refs.len() == 1 && first.marker.is_none() {
// value resizes it. A single whole reference can also be a line's length,
// whose start is what stays, so the entity decides.
if refs.len() == 1
&& first.marker.is_none()
&& matches!(
document.get_entity(first.entity),
Some(acadrust::EntityType::Circle(_) | acadrust::EntityType::Arc(_))
)
{
return vec![ParametricRef::center(first.entity)];
}
// Three point references: a three-point angle `[first, vertex, second]`.
+9 -1
View File
@@ -4152,7 +4152,8 @@ mod tests {
)));
let refs = [ParametricRef::point(line, 0), ParametricRef::point(line, 1)];
// A distance keeps a negative value's sign in the parameter and
// measures its magnitude (`d1=-50`); a radius has no such reading.
// measures its magnitude (`d1=-50`); a radius reads the same way
// (`rad1=-20` is a radius of 20), and only zero leaves no circle.
assert!(scene
.validate_parametric_constraint(
ConstraintKind::Distance,
@@ -4170,6 +4171,13 @@ mod tests {
&[ParametricRef::whole(circle)],
Some(&DrivingValue::Literal(-1.0)),
)
.is_ok());
assert!(scene
.validate_parametric_constraint(
ConstraintKind::Radius,
&[ParametricRef::whole(circle)],
Some(&DrivingValue::Literal(0.0)),
)
.is_err());
assert!(scene
.validate_parametric_constraint(