From d17a34c0f64bee4f837217a6d6a3b24423664e43 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 3 Dec 2024 00:39:02 +0100 Subject: [PATCH] fix(geometry,router,autorouter): some more fixes for edit recording --- src/autorouter/autoroute.rs | 9 ++++++- src/geometry/recording_with_rtree.rs | 37 ++++++++++++++++++++++------ src/router/draw.rs | 5 ++-- src/router/navcord.rs | 4 ++- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/autorouter/autoroute.rs b/src/autorouter/autoroute.rs index af72e85..7fbc112 100644 --- a/src/autorouter/autoroute.rs +++ b/src/autorouter/autoroute.rs @@ -83,7 +83,14 @@ impl Step, Option, AutorouteContinu autorouter: &mut Autorouter, ) -> Result, AutorouteContinueStatus>, AutorouterError> { let Some(curr_ratline) = self.curr_ratline else { - return Ok(ControlFlow::Break(None)); + let recorder = if let Some(taken_route) = self.route.take() { + let (_astar, navcord, ..) = taken_route.dissolve(); + navcord.recorder + } else { + LayoutEdit::new() + }; + + return Ok(ControlFlow::Break(Some(recorder))); }; let Some(ref mut route) = self.route else { diff --git a/src/geometry/recording_with_rtree.rs b/src/geometry/recording_with_rtree.rs index 50ed65c..ad3bb35 100644 --- a/src/geometry/recording_with_rtree.rs +++ b/src/geometry/recording_with_rtree.rs @@ -184,7 +184,13 @@ impl< ) -> Result<(), ()> { let weight = self.geometry_with_rtree.geometry().dot_weight(dot); self.geometry_with_rtree.remove_dot(dot)?; - recorder.dots.insert(dot, (Some(weight), None)); + + if let Some((None, Some(..))) = recorder.dots.get(&dot) { + recorder.dots.remove(&dot); + } else { + recorder.dots.insert(dot, (Some(weight), None)); + }; + Ok(()) } @@ -196,7 +202,12 @@ impl< let weight = self.geometry_with_rtree.geometry().seg_weight(seg); let joints = self.geometry_with_rtree.geometry().seg_joints(seg); self.geometry_with_rtree.remove_seg(seg); - recorder.segs.insert(seg, (Some((joints, weight)), None)); + + if let Some((None, Some(..))) = recorder.segs.get(&seg) { + recorder.segs.remove(&seg); + } else { + recorder.segs.insert(seg, (Some((joints, weight)), None)); + } } pub fn remove_bend( @@ -208,9 +219,14 @@ impl< let joints = self.geometry_with_rtree.geometry().bend_joints(bend); let core = self.geometry_with_rtree.geometry().core(bend); self.geometry_with_rtree.remove_bend(bend); - recorder - .bends - .insert(bend, (Some(((joints.0, joints.1, core), weight)), None)); + + if let Some((None, Some(..))) = recorder.bends.get(&bend) { + recorder.bends.remove(&bend); + } else { + recorder + .bends + .insert(bend, (Some(((joints.0, joints.1, core), weight)), None)); + } } pub fn remove_compound( @@ -228,9 +244,14 @@ impl< .compound_members(compound) .collect(); self.geometry_with_rtree.remove_compound(compound); - recorder - .compounds - .insert(compound, (Some((members, weight)), None)); + + if let Some((None, Some(..))) = recorder.compounds.get(&compound) { + recorder.compounds.remove(&compound); + } else { + recorder + .compounds + .insert(compound, (Some((members, weight)), None)); + } } pub fn move_dot( diff --git a/src/router/draw.rs b/src/router/draw.rs index b1a24c5..d9f5b7e 100644 --- a/src/router/draw.rs +++ b/src/router/draw.rs @@ -238,15 +238,14 @@ impl<'a, R: AccessRules> Draw<'a, R> { #[debug_ensures(ret.is_some() -> self.layout.drawing().node_count() == old(self.layout.drawing().node_count() - 4))] #[debug_ensures(ret.is_none() -> self.layout.drawing().node_count() == old(self.layout.drawing().node_count()))] - pub fn undo_cane(&mut self, head: CaneHead) -> Option { + pub fn undo_cane(&mut self, recorder: &mut LayoutEdit, head: CaneHead) -> Option { let prev_dot = self .layout .drawing() .primitive(head.cane.seg) .other_joint(head.cane.dot.into()); - self.layout - .remove_cane(&mut LayoutEdit::new(), &head.cane, head.face); + self.layout.remove_cane(recorder, &head.cane, head.face); Some(self.guide().head(prev_dot)) } diff --git a/src/router/navcord.rs b/src/router/navcord.rs index 620fc43..411e3eb 100644 --- a/src/router/navcord.rs +++ b/src/router/navcord.rs @@ -155,7 +155,9 @@ impl NavcordStepper { navcorder: &mut Navcorder<'a, R>, ) -> Result<(), NavcorderException> { if let Head::Cane(head) = self.head { - self.head = Draw::new(navcorder.layout).undo_cane(head).unwrap(); + self.head = Draw::new(navcorder.layout) + .undo_cane(&mut self.recorder, head) + .unwrap(); } else { panic!(); }