draw,layout: Move segbend construction to `Layout`

The method to add loose dots is now private.
This commit is contained in:
Mikolaj Wielgus 2023-10-29 16:07:43 +00:00
parent f0e2ba6e3a
commit 700ffb0096
2 changed files with 55 additions and 55 deletions

View File

@ -258,27 +258,23 @@ impl<'a> Draw<'a> {
cw: bool,
width: f64,
) -> Result<SegbendHead, ()> {
let (seg, dot) = self.seg(head, to, width)?;
let net = head.dot().primitive(&self.layout.graph).net();
let bend_to = self
.layout
.add_loose_dot(self.layout.primitive(dot).weight())
.map_err(|err| {
self.undo_seg(seg, dot);
err
})?;
let bend = self
.layout
.add_loose_bend(dot, bend_to, around, LooseBendWeight { net, cw })
.map_err(|err| {
self.layout.remove(bend_to.into());
self.undo_seg(seg, dot);
err
})?;
let segbend = self.layout.add_segbend(
head.dot(),
around,
LooseDotWeight {
net,
circle: Circle {
pos: to,
r: width / 2.0,
},
},
LooseSegWeight { net },
LooseBendWeight { net, cw },
)?;
Ok(SegbendHead {
dot: bend_to,
segbend: Segbend { seg, dot, bend },
dot: self.layout.primitive(segbend.bend).other_end(segbend.dot),
segbend,
})
}
@ -296,39 +292,6 @@ impl<'a> Draw<'a> {
Some(self.head(prev_dot.into()))
}
//#[debug_requires(width <= self.layout.primitive(head.dot()).weight().circle.r * 2.0)]
#[debug_ensures(ret.is_ok() -> self.layout.node_count() == old(self.layout.node_count() + 2))]
#[debug_ensures(ret.is_err() -> self.layout.node_count() == old(self.layout.node_count()))]
fn seg(
&mut self,
head: Head,
to: Point,
width: f64,
) -> Result<(LooseSegIndex, LooseDotIndex), ()> {
let net = head.dot().primitive(&self.layout.graph).net();
let to_index = self.layout.add_loose_dot(LooseDotWeight {
net,
circle: Circle {
pos: to,
r: width / 2.0,
},
})?;
let seg = self
.layout
.add_loose_seg(head.dot(), to_index, LooseSegWeight { net })
.map_err(|err| {
self.layout.remove(to_index.into());
err
})?;
Ok((seg, to_index))
}
#[debug_ensures(self.layout.node_count() == old(self.layout.node_count() - 2))]
fn undo_seg(&mut self, seg: LooseSegIndex, dot: LooseDotIndex) {
self.layout.remove(seg.into());
self.layout.remove(dot.into());
}
fn head(&self, dot: DotIndex) -> Head {
match dot {
DotIndex::Fixed(loose) => BareHead { dot: loose }.into(),

View File

@ -75,11 +75,12 @@ impl Layout {
#[debug_ensures(ret.is_ok() -> self.graph.node_count() == old(self.graph.node_count() + 1))]
#[debug_ensures(ret.is_err() -> self.graph.node_count() == old(self.graph.node_count()))]
#[debug_ensures(self.graph.edge_count() == old(self.graph.edge_count()))]
pub fn add_loose_dot(&mut self, weight: LooseDotWeight) -> Result<LooseDotIndex, ()> {
fn add_loose_dot(&mut self, weight: LooseDotWeight) -> Result<LooseDotIndex, ()> {
self.add_dot(weight)
}
#[debug_ensures(self.graph.node_count() == old(self.graph.node_count() + 1))]
#[debug_ensures(ret.is_ok() -> self.graph.node_count() == old(self.graph.node_count() + 1))]
#[debug_ensures(ret.is_err() -> self.graph.node_count() == old(self.graph.node_count()))]
fn add_dot<W: DotWeight>(&mut self, weight: W) -> Result<GenericIndex<W>, ()>
where
GenericIndex<W>: Into<Index> + Copy,
@ -105,6 +106,42 @@ impl Layout {
self.add_seg(from, to, weight)
}
#[debug_ensures(ret.is_ok() -> self.graph.node_count() == old(self.graph.node_count() + 4))]
#[debug_ensures(ret.is_ok() -> self.graph.edge_count() == old(self.graph.edge_count() + 5))]
#[debug_ensures(ret.is_err() -> self.graph.node_count() == old(self.graph.node_count()))]
#[debug_ensures(ret.is_err() -> self.graph.edge_count() == old(self.graph.edge_count()))]
pub fn add_segbend(
&mut self,
from: DotIndex,
around: Index,
dot_weight: LooseDotWeight,
seg_weight: LooseSegWeight,
bend_weight: LooseBendWeight,
) -> Result<Segbend, ()> {
let seg_to = self.add_loose_dot(dot_weight)?;
let seg = self.add_loose_seg(from, seg_to, seg_weight).map_err(|_| {
self.remove(seg_to.into());
})?;
let bend_to = self.add_loose_dot(dot_weight).map_err(|_| {
self.remove(seg.into());
self.remove(seg_to.into());
})?;
let bend = self
.add_loose_bend(seg_to, bend_to, around, bend_weight)
.map_err(|_| {
self.remove(bend_to.into());
self.remove(seg.into());
self.remove(seg_to.into());
})?;
Ok(Segbend {
seg,
dot: seg_to,
bend,
})
}
#[debug_ensures(ret.is_ok() -> self.graph.node_count() == old(self.graph.node_count() + 1))]
#[debug_ensures(ret.is_ok() -> self.graph.edge_count() == old(self.graph.edge_count() + 2))]
#[debug_ensures(ret.is_err() -> self.graph.node_count() == old(self.graph.node_count()))]
@ -173,7 +210,7 @@ impl Layout {
#[debug_ensures(ret.is_ok() -> self.graph.node_count() == old(self.graph.node_count() + 1))]
#[debug_ensures(ret.is_err() -> self.graph.node_count() == old(self.graph.node_count()))]
pub fn add_loose_bend(
fn add_loose_bend(
&mut self,
from: LooseDotIndex,
to: LooseDotIndex,