fix(router/draw): Undo modification of old cane head on failure

This commit is contained in:
Ellen Emilia Anna Zscheile 2025-05-20 01:05:05 +02:00
parent ee19ae934f
commit ded1ec8ece
1 changed files with 27 additions and 16 deletions

View File

@ -21,7 +21,7 @@ use crate::{
seg::{GeneralSegWeight, LoneLooseSegWeight, SeqLooseSegWeight}, seg::{GeneralSegWeight, LoneLooseSegWeight, SeqLooseSegWeight},
DrawingException, Guide, Infringement, DrawingException, Guide, Infringement,
}, },
geometry::GetLayer, geometry::{GetLayer, GetSetPos},
layout::{Layout, LayoutEdit}, layout::{Layout, LayoutEdit},
math::{Circle, NoTangents, RotationSense}, math::{Circle, NoTangents, RotationSense},
}; };
@ -87,15 +87,15 @@ impl<R: AccessRules> Draw for Layout<R> {
.drawing() .drawing()
.head_into_dot_segment(&head, into, width) .head_into_dot_segment(&head, into, width)
.map_err(Into::<DrawException>::into)?; .map_err(Into::<DrawException>::into)?;
let head = self let (head, prev_head_to) = self
.extend_head(recorder, head, tangent.start_point()) .extend_head(recorder, head, tangent.start_point())
.map_err(|err| DrawException::CannotFinishIn(into, err.into()))?; .map_err(|err| DrawException::CannotFinishIn(into, err.into()))?;
let layer = head.face().primitive(self.drawing()).layer(); let layer = head.face().primitive(self.drawing()).layer();
let maybe_net = head.face().primitive(self.drawing()).maybe_net(); let maybe_net = head.face().primitive(self.drawing()).maybe_net();
Ok(match head.face() { match head.face() {
DotIndex::Fixed(dot) => BandTermsegIndex::Straight( DotIndex::Fixed(dot) => self
self.add_lone_loose_seg( .add_lone_loose_seg(
recorder, recorder,
dot, dot,
into, into,
@ -105,10 +105,9 @@ impl<R: AccessRules> Draw for Layout<R> {
maybe_net, maybe_net,
}), }),
) )
.map_err(|err| DrawException::CannotFinishIn(into, err.into()))?, .map(BandTermsegIndex::Straight),
), DotIndex::Loose(dot) => self
DotIndex::Loose(dot) => BandTermsegIndex::Bended( .add_seq_loose_seg(
self.add_seq_loose_seg(
recorder, recorder,
into.into(), into.into(),
dot, dot,
@ -118,8 +117,12 @@ impl<R: AccessRules> Draw for Layout<R> {
maybe_net, maybe_net,
}), }),
) )
.map_err(|err| DrawException::CannotFinishIn(into, err.into()))?, .map(BandTermsegIndex::Bended),
), }
.map_err(|err| {
// move the head back to where it came from
self.extend_head(recorder, head, prev_head_to).unwrap();
DrawException::CannotFinishIn(into, err.into())
}) })
} }
@ -213,7 +216,7 @@ trait DrawPrivate {
recorder: &mut LayoutEdit, recorder: &mut LayoutEdit,
head: Head, head: Head,
to: Point, to: Point,
) -> Result<Head, Infringement>; ) -> Result<(Head, Point), Infringement>;
fn cane( fn cane(
&mut self, &mut self,
@ -243,8 +246,12 @@ impl<R: AccessRules> DrawPrivate for Layout<R> {
width: f64, width: f64,
offset: f64, offset: f64,
) -> Result<CaneHead, DrawingException> { ) -> Result<CaneHead, DrawingException> {
let head = self.extend_head(recorder, head, from)?; let (head, prev_head_to) = self.extend_head(recorder, head, from)?;
self.cane(recorder, head, around, to, sense, width, offset) self.cane(recorder, head, around, to, sense, width, offset)
.inspect_err(|_| {
// move the head back to where it came from
self.extend_head(recorder, head, prev_head_to).unwrap();
})
} }
#[debug_ensures(self.drawing().node_count() == old(self.drawing().node_count()))] #[debug_ensures(self.drawing().node_count() == old(self.drawing().node_count()))]
@ -253,12 +260,16 @@ impl<R: AccessRules> DrawPrivate for Layout<R> {
recorder: &mut LayoutEdit, recorder: &mut LayoutEdit,
head: Head, head: Head,
to: Point, to: Point,
) -> Result<Head, Infringement> { ) -> Result<(Head, Point), Infringement> {
if let Head::Cane(head) = head { if let Head::Cane(head) = head {
let old_pos = self.drawing().geometry().dot_weight(head.face.into()).pos();
self.move_dot(recorder, head.face.into(), to)?; self.move_dot(recorder, head.face.into(), to)?;
Ok(Head::Cane(head)) Ok((Head::Cane(head), old_pos))
} else { } else {
Ok(head) Ok((
head,
self.drawing().geometry().dot_weight(head.face()).pos(),
))
} }
} }