mirror of https://codeberg.org/topola/topola.git
fix(geometry,router,autorouter): some more fixes for edit recording
This commit is contained in:
parent
5aae676fb8
commit
d17a34c0f6
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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!();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue