fix(geometry,router,autorouter): some more fixes for edit recording

This commit is contained in:
Mikolaj Wielgus 2024-12-03 00:39:02 +01:00
parent 5aae676fb8
commit d17a34c0f6
4 changed files with 42 additions and 13 deletions

View File

@ -83,7 +83,14 @@ impl<M: AccessMesadata> Step<Autorouter<M>, Option<LayoutEdit>, AutorouteContinu
autorouter: &mut Autorouter<M>,
) -> Result<ControlFlow<Option<LayoutEdit>, 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 {

View File

@ -184,7 +184,13 @@ impl<
) -> Result<(), ()> {
let weight = self.geometry_with_rtree.geometry().dot_weight(dot);
self.geometry_with_rtree.remove_dot(dot)?;
if let Some((None, Some(..))) = recorder.dots.get(&dot) {
recorder.dots.remove(&dot);
} else {
recorder.dots.insert(dot, (Some(weight), None));
};
Ok(())
}
@ -196,8 +202,13 @@ 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);
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(
&mut self,
@ -208,10 +219,15 @@ 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);
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(
&mut self,
@ -228,10 +244,15 @@ impl<
.compound_members(compound)
.collect();
self.geometry_with_rtree.remove_compound(compound);
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(
&mut self,

View File

@ -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<Head> {
pub fn undo_cane(&mut self, recorder: &mut LayoutEdit, head: CaneHead) -> Option<Head> {
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))
}

View File

@ -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!();
}