Merge pull request #752 from gianlucafiore/fix/dimension-style-behavior

Fix annotation scale sizing for non-paper drawing units
This commit is contained in:
gianlucafiore 2026-08-13 00:08:33 -03:00 • committed by GitHub
commit 2ae8da543f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 13 deletions

View file

@ -1144,13 +1144,16 @@ pub(super) fn on_open_file(&mut self) -> Task<Message> {
crate::scene::text::ttf_glyph::clear_fallback_cache(); crate::scene::text::ttf_glyph::clear_fallback_cache();
} }
// Current model-space annotation scale comes from the drawing's // Current model-space annotation scale comes from the drawing's
// CANNOSCALEVALUE (paper/drawing factor); the multiplier we use // CANNOSCALEVALUE (paper/drawing factor). Convert its inverse into
// for text/dim sizing is its inverse (1:50 -> 0.02 -> 50.0). // drawing units as well: metric annotation sizes are paper millimetres
// and imperial annotation sizes are paper inches.
let cannoscale_value = self.tabs[i].scene.document.header.annotation_scale_value; let cannoscale_value = self.tabs[i].scene.document.header.annotation_scale_value;
let unit_factor = self.tabs[i].scene.annotation_scale_unit_factor();
self.tabs[i].scene.annotation_scale = if cannoscale_value > 1e-9 { self.tabs[i].scene.annotation_scale = if cannoscale_value > 1e-9 {
(1.0 / cannoscale_value) as f32 ((1.0 / cannoscale_value) / unit_factor) as f32
} else { } else {
1.0 (1.0 / unit_factor) as f32
}; };
// Open-time breakdown so regressions are visible immediately. // Open-time breakdown so regressions are visible immediately.

View file

@ -872,10 +872,12 @@ pub fn prepare_open_geometry(
scene.local_center = caches.local_center; scene.local_center = caches.local_center;
scene.bg_color = model_bg; scene.bg_color = model_bg;
let cannoscale_value = scene.document.header.annotation_scale_value; let cannoscale_value = scene.document.header.annotation_scale_value;
let unit_factor = scene.annotation_scale_unit_factor();
scene.annotation_scale = if cannoscale_value > 1e-9 { scene.annotation_scale = if cannoscale_value > 1e-9 {
(1.0 / cannoscale_value) as f32 ((1.0 / cannoscale_value) / unit_factor) as f32
} else { } else {
1.0 (1.0 / unit_factor) as f32
}; };
scene.current_layout = "Model".to_string(); scene.current_layout = "Model".to_string();
let camera = scene.camera.borrow().clone(); let camera = scene.camera.borrow().clone();
@ -3553,7 +3555,7 @@ impl Scene {
/// The built-in scale factors are defined assuming model and paper use /// The built-in scale factors are defined assuming model and paper use
/// the same base unit. A drawing in metres therefore needs an extra /// the same base unit. A drawing in metres therefore needs an extra
/// factor of 1000 when its paper side is measured in millimetres. /// factor of 1000 when its paper side is measured in millimetres.
fn annotation_scale_unit_factor(&self) -> f64 { pub(crate) fn annotation_scale_unit_factor(&self) -> f64 {
let paper_unit = if self.prefers_imperial_scales() == Some(true) { let paper_unit = if self.prefers_imperial_scales() == Some(true) {
1 // Inches 1 // Inches
} else { } else {
@ -3836,14 +3838,25 @@ impl Scene {
pub fn set_annotation_scale_named(&mut self, name: &str) -> Option<Handle> { pub fn set_annotation_scale_named(&mut self, name: &str) -> Option<Handle> {
let handle = self.scale_handle_ensuring(name)?; let handle = self.scale_handle_ensuring(name)?;
let ObjectType::Scale(scale) = self.document.objects.get(&handle)? else { let unit_factor = self.annotation_scale_unit_factor();
return None;
let (scale_name, scale_factor, multiplier) = {
let ObjectType::Scale(scale) = self.document.objects.get(&handle)? else {
return None;
};
(
scale.name.clone(),
scale.factor(),
scale.inverse_factor() / unit_factor,
)
}; };
let multiplier = scale.inverse_factor();
self.annotation_scale = multiplier as f32; self.annotation_scale = multiplier as f32;
self.document.header.current_annotation_scale = scale.name.clone(); self.document.header.current_annotation_scale = scale_name;
self.document.header.annotation_scale_value = scale.factor(); self.document.header.annotation_scale_value = scale_factor;
self.invalidate_annotation_dependencies(); self.invalidate_annotation_dependencies();
Some(handle) Some(handle)
} }

View file

@ -3112,7 +3112,7 @@ impl Scene {
} }
let context_scale = match self.document.objects.get(&scale) { let context_scale = match self.document.objects.get(&scale) {
Some(acadrust::objects::ObjectType::Scale(value)) => { Some(acadrust::objects::ObjectType::Scale(value)) => {
value.inverse_factor() as f32 (value.inverse_factor() / self.annotation_scale_unit_factor()) as f32
} }
_ => annotation_scale, _ => annotation_scale,
}; };