draw: Fix on-fail cleanup when drawing segbend

This commit is contained in:
Mikolaj Wielgus 2023-09-05 07:51:27 +02:00
parent 05fc42aa38
commit 23311122b4
1 changed files with 21 additions and 17 deletions

View File

@ -181,19 +181,22 @@ impl<'a> Draw<'a> {
let dot = head.dot; let dot = head.dot;
let bend_to = self let bend_to = self
.layout .layout
.add_dot(self.layout.primitive(head.dot).weight())?; .add_dot(self.layout.primitive(head.dot).weight())
.map_err(|err| {
self.undo_seg(head, seg);
err
})?;
let net = self.layout.primitive(head.dot).weight().net; let net = self.layout.primitive(head.dot).weight().net;
let bend = match self let bend = self
.layout .layout
.add_bend(head.dot, bend_to, around, BendWeight { net, cw }) .add_bend(head.dot, bend_to, around, BendWeight { net, cw })
{ .map_err(|err| {
Err(err) => {
self.layout.remove(bend_to); self.layout.remove(bend_to);
return Err(err); self.undo_seg(head, seg);
} err
Ok(bend) => bend, })?;
};
Ok(Head { Ok(Head {
dot: bend_to, dot: bend_to,
segbend: Some(Segbend { bend, dot, seg }), segbend: Some(Segbend { bend, dot, seg }),
@ -218,10 +221,9 @@ impl<'a> Draw<'a> {
} }
fn seg(&mut self, head: Head, to: Point, width: f64) -> Result<(Head, SegIndex), ()> { fn seg(&mut self, head: Head, to: Point, width: f64) -> Result<(Head, SegIndex), ()> {
let net = self.layout.primitive(head.dot).weight().net;
assert!(width <= self.layout.primitive(head.dot).weight().circle.r * 2.0); assert!(width <= self.layout.primitive(head.dot).weight().circle.r * 2.0);
let net = self.layout.primitive(head.dot).weight().net;
let to_index = self.layout.add_dot(DotWeight { let to_index = self.layout.add_dot(DotWeight {
net, net,
circle: Circle { circle: Circle {
@ -229,16 +231,13 @@ impl<'a> Draw<'a> {
r: width / 2.0, r: width / 2.0,
}, },
})?; })?;
let seg = match self let seg = self
.layout .layout
.add_seg(head.dot, to_index, SegWeight { net, width }) .add_seg(head.dot, to_index, SegWeight { net, width })
{ .map_err(|err| {
Err(err) => {
self.layout.remove(to_index); self.layout.remove(to_index);
return Err(err); err
} })?;
Ok(bend) => bend,
};
Ok(( Ok((
Head { Head {
dot: to_index, dot: to_index,
@ -248,6 +247,11 @@ impl<'a> Draw<'a> {
)) ))
} }
fn undo_seg(&mut self, head: Head, seg: SegIndex) {
self.layout.remove(seg);
self.layout.remove(head.dot);
}
fn guide(&'a self, conditions: &'a Conditions) -> Guide { fn guide(&'a self, conditions: &'a Conditions) -> Guide {
Guide::new(self.layout, self.rules, conditions) Guide::new(self.layout, self.rules, conditions)
} }