diff --git a/src/app/update/command.rs b/src/app/update/command.rs index 97ba54799..f1f2ab6e7 100644 --- a/src/app/update/command.rs +++ b/src/app/update/command.rs @@ -165,6 +165,12 @@ pub(super) fn on_tab_close(&mut self, idx: usize) -> Task { { entity.apply_grip_menu_value(pending.grip_id, pending.action, v); } + // A typed grip-menu value reshapes dimensions too — drop a + // stale baked *D block (no-op for non-dims). (#398) + crate::modules::draw::modify::explode::invalidate_dim_block( + &mut self.tabs[i].scene.document, + pending.handle, + ); self.tabs[i].scene.bump_geometry(); self.tabs[i].dirty = true; self.refresh_selected_grips(); @@ -950,6 +956,12 @@ pub(super) fn on_tab_close(&mut self, idx: usize) -> Task { if let Some(entity) = self.tabs[i].scene.document.get_entity_mut(popup.handle) { entity.apply_grip_menu(popup.grip_id, item.action); } + // Menu actions reshape dimensions too — drop a stale baked *D + // block so the edit is visible (no-op for non-dims). (#398) + crate::modules::draw::modify::explode::invalidate_dim_block( + &mut self.tabs[i].scene.document, + popup.handle, + ); self.tabs[i].scene.bump_geometry(); self.tabs[i].dirty = true; self.refresh_selected_grips(); diff --git a/src/scene/modify.rs b/src/scene/modify.rs index 938e6893a..85efab741 100644 --- a/src/scene/modify.rs +++ b/src/scene/modify.rs @@ -391,6 +391,11 @@ impl Scene { if let Some(entity) = self.document.get_entity_mut(handle) { view::dispatch::apply_grip(entity, grip_id, apply); } + // A dimension loaded from a file renders through its baked *D block; + // the grip only moved a definition point, so the baked graphics are + // stale — drop them so tessellation falls back to the live geometry + // and the next save re-bakes (no-op for non-dimensions). (#398) + crate::modules::draw::modify::explode::invalidate_dim_block(&mut self.document, handle); // Translate MeshModel vertices by the same delta the grip applied. if let Some(old) = old_por {