diff --git a/src/app/view.rs b/src/app/view.rs index 3c9a1824c..a1997a9c4 100644 --- a/src/app/view.rs +++ b/src/app/view.rs @@ -1458,7 +1458,7 @@ fn viewport_context_menu_overlay( items.push(item("Quick Select...".to_string(), Message::QSelectOpen)); items.push(item( "Zoom Extents".to_string(), - Message::Command("ZOOM".to_string()), + Message::Command("ZOOM EXTENTS".to_string()), )); } diff --git a/src/scene/mod.rs b/src/scene/mod.rs index 60220212b..dc99dc21e 100644 --- a/src/scene/mod.rs +++ b/src/scene/mod.rs @@ -4948,7 +4948,17 @@ impl Scene { } pub fn fit_all(&mut self) { - let wires = self.entity_wires(); + // Use the FULL, un-culled wire set — not `entity_wires()`, which is + // frustum-culled to the current view. Culled input would fit only the + // entities already on screen, so each call would zoom out a little and + // reveal more, converging on the true extent only after several uses + // (issue #51). `wpp = None` also tessellates at a fixed tolerance so + // the bounds don't drift with zoom-adaptive curve sampling. + let layout_block = self.current_layout_block_handle(); + let mut wires = self.wires_for_block_culled(layout_block, None, None, None, None); + if self.current_layout != "Model" { + wires.extend(self.viewport_content_wires(layout_block, None, None)); + } if wires.is_empty() { return; }