From 9ae1e6dd763309b711a76ab4fe3833b418b3e5fc Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 14 Sep 2026 12:30:51 +0200 Subject: [PATCH] Preserve valid grip preview when edits have no geometric solution --- src/app/update/viewport.rs | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/app/update/viewport.rs b/src/app/update/viewport.rs index 850047811..ef1c44f94 100644 --- a/src/app/update/viewport.rs +++ b/src/app/update/viewport.rs @@ -1687,16 +1687,36 @@ impl OpenCADStudio { snapped, ); if let Some(value) = value { + let origin_value = + crate::scene::view::dispatch::grip_menu_point_value( + &original, + grip.grip_id, + action, + grip.origin_world, + ); + let mut candidate = original.clone(); + crate::entities::traits::EntityTypeOps::apply_grip_menu_value( + &mut candidate, + grip.grip_id, + action, + value, + ); + let returns_to_origin = origin_value.is_some_and(|origin_value| { + (value - origin_value).abs() + <= 1.0e-9 * value.abs().max(origin_value.abs()).max(1.0) + }); if let Some(current) = self.tabs[i].scene.document.get_entity_mut(grip.handle) { - *current = original; - crate::entities::traits::EntityTypeOps::apply_grip_menu_value( - current, - grip.grip_id, - action, - value, - ); + // Some radius/parallel positions have no geometric + // solution. Their entity edit is deliberately a + // no-op; retain the last valid preview instead of + // flashing back to the drag-start geometry. The + // exact origin remains reachable when the cursor + // moves back there. + if candidate != original || returns_to_origin { + *current = candidate; + } } } }