mirror of https://codeberg.org/topola/topola.git
draw: Fix on-fail cleanup when drawing segbend
This commit is contained in:
parent
05fc42aa38
commit
23311122b4
38
src/draw.rs
38
src/draw.rs
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue