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>,
|
autorouter: &mut Autorouter<M>,
|
||||||
) -> Result<ControlFlow<Option<LayoutEdit>, AutorouteContinueStatus>, AutorouterError> {
|
) -> Result<ControlFlow<Option<LayoutEdit>, AutorouteContinueStatus>, AutorouterError> {
|
||||||
let Some(curr_ratline) = self.curr_ratline else {
|
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 {
|
let Some(ref mut route) = self.route else {
|
||||||
|
|
|
||||||
|
|
@ -184,7 +184,13 @@ impl<
|
||||||
) -> Result<(), ()> {
|
) -> Result<(), ()> {
|
||||||
let weight = self.geometry_with_rtree.geometry().dot_weight(dot);
|
let weight = self.geometry_with_rtree.geometry().dot_weight(dot);
|
||||||
self.geometry_with_rtree.remove_dot(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));
|
recorder.dots.insert(dot, (Some(weight), None));
|
||||||
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -196,8 +202,13 @@ impl<
|
||||||
let weight = self.geometry_with_rtree.geometry().seg_weight(seg);
|
let weight = self.geometry_with_rtree.geometry().seg_weight(seg);
|
||||||
let joints = self.geometry_with_rtree.geometry().seg_joints(seg);
|
let joints = self.geometry_with_rtree.geometry().seg_joints(seg);
|
||||||
self.geometry_with_rtree.remove_seg(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));
|
recorder.segs.insert(seg, (Some((joints, weight)), None));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn remove_bend(
|
pub fn remove_bend(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
@ -208,10 +219,15 @@ impl<
|
||||||
let joints = self.geometry_with_rtree.geometry().bend_joints(bend);
|
let joints = self.geometry_with_rtree.geometry().bend_joints(bend);
|
||||||
let core = self.geometry_with_rtree.geometry().core(bend);
|
let core = self.geometry_with_rtree.geometry().core(bend);
|
||||||
self.geometry_with_rtree.remove_bend(bend);
|
self.geometry_with_rtree.remove_bend(bend);
|
||||||
|
|
||||||
|
if let Some((None, Some(..))) = recorder.bends.get(&bend) {
|
||||||
|
recorder.bends.remove(&bend);
|
||||||
|
} else {
|
||||||
recorder
|
recorder
|
||||||
.bends
|
.bends
|
||||||
.insert(bend, (Some(((joints.0, joints.1, core), weight)), None));
|
.insert(bend, (Some(((joints.0, joints.1, core), weight)), None));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn remove_compound(
|
pub fn remove_compound(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
@ -228,10 +244,15 @@ impl<
|
||||||
.compound_members(compound)
|
.compound_members(compound)
|
||||||
.collect();
|
.collect();
|
||||||
self.geometry_with_rtree.remove_compound(compound);
|
self.geometry_with_rtree.remove_compound(compound);
|
||||||
|
|
||||||
|
if let Some((None, Some(..))) = recorder.compounds.get(&compound) {
|
||||||
|
recorder.compounds.remove(&compound);
|
||||||
|
} else {
|
||||||
recorder
|
recorder
|
||||||
.compounds
|
.compounds
|
||||||
.insert(compound, (Some((members, weight)), None));
|
.insert(compound, (Some((members, weight)), None));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn move_dot(
|
pub fn move_dot(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
|
||||||
|
|
@ -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_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()))]
|
#[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
|
let prev_dot = self
|
||||||
.layout
|
.layout
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(head.cane.seg)
|
.primitive(head.cane.seg)
|
||||||
.other_joint(head.cane.dot.into());
|
.other_joint(head.cane.dot.into());
|
||||||
|
|
||||||
self.layout
|
self.layout.remove_cane(recorder, &head.cane, head.face);
|
||||||
.remove_cane(&mut LayoutEdit::new(), &head.cane, head.face);
|
|
||||||
Some(self.guide().head(prev_dot))
|
Some(self.guide().head(prev_dot))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,9 @@ impl NavcordStepper {
|
||||||
navcorder: &mut Navcorder<'a, R>,
|
navcorder: &mut Navcorder<'a, R>,
|
||||||
) -> Result<(), NavcorderException> {
|
) -> Result<(), NavcorderException> {
|
||||||
if let Head::Cane(head) = self.head {
|
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 {
|
} else {
|
||||||
panic!();
|
panic!();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue