mirror of https://codeberg.org/topola/topola.git
layout: terminology improvements
- "connected" is renamed to "joined" (more local term), - primitives whose clearance area neighbors another's are now called "abutters", - primitives whose geometries depend on a bend are now called "posteriors" of said bend.
This commit is contained in:
parent
e1f3d3ede4
commit
2197017f54
|
|
@ -19,27 +19,12 @@ impl<'a, R: RulesTrait> Collect<'a, R> {
|
||||||
Self { layout }
|
Self { layout }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner_bow_and_outer_bow(&self, bend: LooseBendIndex) -> Vec<GeometryIndex> {
|
pub fn bend_abutters_and_posteriors(&self, bend: LooseBendIndex) -> Vec<GeometryIndex> {
|
||||||
let bend_primitive = self.layout.primitive(bend);
|
// Bend's posteriors are the outer abutters and afterouter bows.
|
||||||
|
// Bend's afterouter bows are the bows of bend's afterouters.
|
||||||
|
// Bend's afterouters are the bends outer to the outer bend of said bend.
|
||||||
let mut v = vec![];
|
let mut v = vec![];
|
||||||
|
|
||||||
if let Some(inner) = bend_primitive.inner() {
|
|
||||||
v.append(&mut self.bow(inner.into()));
|
|
||||||
} else {
|
|
||||||
let core = bend_primitive.core();
|
|
||||||
v.push(core.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(outer) = bend_primitive.outer() {
|
|
||||||
v.append(&mut self.bow(outer.into()));
|
|
||||||
}
|
|
||||||
|
|
||||||
v
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn inner_bow_and_outer_bows(&self, bend: LooseBendIndex) -> Vec<GeometryIndex> {
|
|
||||||
let bend_primitive = self.layout.primitive(bend);
|
let bend_primitive = self.layout.primitive(bend);
|
||||||
let mut v = vec![];
|
|
||||||
|
|
||||||
if let Some(inner) = bend_primitive.inner() {
|
if let Some(inner) = bend_primitive.inner() {
|
||||||
v.append(&mut self.bow(inner.into()));
|
v.append(&mut self.bow(inner.into()));
|
||||||
|
|
@ -58,16 +43,32 @@ impl<'a, R: RulesTrait> Collect<'a, R> {
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn segbend_inner_and_outer_bibows(
|
pub fn bend_abutters(&self, bend: LooseBendIndex) -> Vec<GeometryIndex> {
|
||||||
|
let mut v = vec![];
|
||||||
|
let bend_primitive = self.layout.primitive(bend);
|
||||||
|
|
||||||
|
if let Some(inner) = bend_primitive.inner() {
|
||||||
|
v.append(&mut self.bow(inner.into()));
|
||||||
|
} else {
|
||||||
|
let core = bend_primitive.core();
|
||||||
|
v.push(core.into());
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(outer) = bend_primitive.outer() {
|
||||||
|
v.append(&mut self.bow(outer.into()));
|
||||||
|
}
|
||||||
|
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn potential_segbend_abutters(
|
||||||
&self,
|
&self,
|
||||||
from: DotIndex,
|
from: DotIndex,
|
||||||
around: WraparoundableIndex,
|
around: WraparoundableIndex,
|
||||||
) -> Vec<GeometryIndex> {
|
) -> Vec<GeometryIndex> {
|
||||||
let mut v = match from {
|
let mut v = match from {
|
||||||
DotIndex::Fixed(..) => vec![],
|
DotIndex::Fixed(..) => vec![],
|
||||||
DotIndex::Loose(dot) => {
|
DotIndex::Loose(dot) => self.bend_abutters(self.layout.primitive(dot).bend().into()),
|
||||||
self.inner_bow_and_outer_bow(self.layout.primitive(dot).bend().into())
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
v.append(&mut self.this_and_wraparound_bow(around));
|
v.append(&mut self.this_and_wraparound_bow(around));
|
||||||
v
|
v
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ pub trait SetOffset {
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum GeometryLabel {
|
pub enum GeometryLabel {
|
||||||
Connection,
|
Joined,
|
||||||
Outer,
|
Outer,
|
||||||
Core,
|
Core,
|
||||||
}
|
}
|
||||||
|
|
@ -114,13 +114,10 @@ impl<
|
||||||
) -> GenericIndex<W> {
|
) -> GenericIndex<W> {
|
||||||
let seg = GenericIndex::<W>::new(self.graph.add_node(weight.into()));
|
let seg = GenericIndex::<W>::new(self.graph.add_node(weight.into()));
|
||||||
|
|
||||||
self.graph.update_edge(
|
|
||||||
from.node_index(),
|
|
||||||
seg.node_index(),
|
|
||||||
GeometryLabel::Connection,
|
|
||||||
);
|
|
||||||
self.graph
|
self.graph
|
||||||
.update_edge(seg.node_index(), to.node_index(), GeometryLabel::Connection);
|
.update_edge(from.node_index(), seg.node_index(), GeometryLabel::Joined);
|
||||||
|
self.graph
|
||||||
|
.update_edge(seg.node_index(), to.node_index(), GeometryLabel::Joined);
|
||||||
|
|
||||||
seg
|
seg
|
||||||
}
|
}
|
||||||
|
|
@ -134,16 +131,10 @@ impl<
|
||||||
) -> GenericIndex<W> {
|
) -> GenericIndex<W> {
|
||||||
let bend = GenericIndex::<W>::new(self.graph.add_node(weight.into()));
|
let bend = GenericIndex::<W>::new(self.graph.add_node(weight.into()));
|
||||||
|
|
||||||
self.graph.update_edge(
|
self.graph
|
||||||
from.node_index(),
|
.update_edge(from.node_index(), bend.node_index(), GeometryLabel::Joined);
|
||||||
bend.node_index(),
|
self.graph
|
||||||
GeometryLabel::Connection,
|
.update_edge(bend.node_index(), to.node_index(), GeometryLabel::Joined);
|
||||||
);
|
|
||||||
self.graph.update_edge(
|
|
||||||
bend.node_index(),
|
|
||||||
to.node_index(),
|
|
||||||
GeometryLabel::Connection,
|
|
||||||
);
|
|
||||||
self.graph
|
self.graph
|
||||||
.update_edge(bend.node_index(), core.node_index(), GeometryLabel::Core);
|
.update_edge(bend.node_index(), core.node_index(), GeometryLabel::Core);
|
||||||
|
|
||||||
|
|
@ -381,7 +372,7 @@ impl<
|
||||||
.next()
|
.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn connecteds(&self, node: GI) -> impl Iterator<Item = GI> + '_ {
|
pub fn joineds(&self, node: GI) -> impl Iterator<Item = GI> + '_ {
|
||||||
self.graph
|
self.graph
|
||||||
.neighbors_undirected(node.node_index())
|
.neighbors_undirected(node.node_index())
|
||||||
.filter(move |ni| {
|
.filter(move |ni| {
|
||||||
|
|
@ -394,7 +385,7 @@ impl<
|
||||||
.0,
|
.0,
|
||||||
)
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
GeometryLabel::Connection
|
GeometryLabel::Joined
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.map(|ni| {
|
.map(|ni| {
|
||||||
|
|
@ -406,7 +397,7 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn seg_joints(&self, seg: SI) -> (DI, DI) {
|
pub fn seg_joints(&self, seg: SI) -> (DI, DI) {
|
||||||
let v: Vec<_> = self.connecteds(seg.into()).collect();
|
let v: Vec<_> = self.joineds(seg.into()).collect();
|
||||||
(
|
(
|
||||||
v[0].try_into().unwrap_or_else(|_| unreachable!()),
|
v[0].try_into().unwrap_or_else(|_| unreachable!()),
|
||||||
v[1].try_into().unwrap_or_else(|_| unreachable!()),
|
v[1].try_into().unwrap_or_else(|_| unreachable!()),
|
||||||
|
|
@ -414,21 +405,19 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn bend_joints(&self, bend: BI) -> (DI, DI) {
|
pub fn bend_joints(&self, bend: BI) -> (DI, DI) {
|
||||||
let v: Vec<_> = self.connecteds(bend.into()).collect();
|
let v: Vec<_> = self.joineds(bend.into()).collect();
|
||||||
(
|
(
|
||||||
v[0].try_into().unwrap_or_else(|_| unreachable!()),
|
v[0].try_into().unwrap_or_else(|_| unreachable!()),
|
||||||
v[1].try_into().unwrap_or_else(|_| unreachable!()),
|
v[1].try_into().unwrap_or_else(|_| unreachable!()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn connected_segs(&self, dot: DI) -> impl Iterator<Item = SI> + '_ {
|
pub fn joined_segs(&self, dot: DI) -> impl Iterator<Item = SI> + '_ {
|
||||||
self.connecteds(dot.into())
|
self.joineds(dot.into()).filter_map(|ni| ni.try_into().ok())
|
||||||
.filter_map(|ni| ni.try_into().ok())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn connected_bends(&self, dot: DI) -> impl Iterator<Item = BI> + '_ {
|
pub fn joined_bends(&self, dot: DI) -> impl Iterator<Item = BI> + '_ {
|
||||||
self.connecteds(dot.into())
|
self.joineds(dot.into()).filter_map(|ni| ni.try_into().ok())
|
||||||
.filter_map(|ni| ni.try_into().ok())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn graph(&self) -> &StableDiGraph<GW, GeometryLabel, usize> {
|
pub fn graph(&self) -> &StableDiGraph<GW, GeometryLabel, usize> {
|
||||||
|
|
|
||||||
|
|
@ -114,11 +114,11 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_dot(&mut self, dot: DI) -> Result<(), ()> {
|
pub fn remove_dot(&mut self, dot: DI) -> Result<(), ()> {
|
||||||
if self.geometry.connected_segs(dot).next().is_some() {
|
if self.geometry.joined_segs(dot).next().is_some() {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.geometry.connected_bends(dot).next().is_some() {
|
if self.geometry.joined_bends(dot).next().is_some() {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -138,11 +138,11 @@ impl<
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_dot(&mut self, dot: DI, to: Point) {
|
pub fn move_dot(&mut self, dot: DI, to: Point) {
|
||||||
for seg in self.geometry.connected_segs(dot) {
|
for seg in self.geometry.joined_segs(dot) {
|
||||||
self.rtree.remove(&self.make_seg_bbox(seg));
|
self.rtree.remove(&self.make_seg_bbox(seg));
|
||||||
}
|
}
|
||||||
|
|
||||||
for bend in self.geometry.connected_bends(dot) {
|
for bend in self.geometry.joined_bends(dot) {
|
||||||
self.rtree.remove(&self.make_bend_bbox(bend));
|
self.rtree.remove(&self.make_bend_bbox(bend));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,11 +150,11 @@ impl<
|
||||||
self.geometry.move_dot(dot, to);
|
self.geometry.move_dot(dot, to);
|
||||||
self.rtree.insert(self.make_dot_bbox(dot));
|
self.rtree.insert(self.make_dot_bbox(dot));
|
||||||
|
|
||||||
for bend in self.geometry.connected_bends(dot) {
|
for bend in self.geometry.joined_bends(dot) {
|
||||||
self.rtree.insert(self.make_bend_bbox(bend));
|
self.rtree.insert(self.make_bend_bbox(bend));
|
||||||
}
|
}
|
||||||
|
|
||||||
for seg in self.geometry.connected_segs(dot) {
|
for seg in self.geometry.joined_segs(dot) {
|
||||||
self.rtree.insert(self.make_seg_bbox(seg));
|
self.rtree.insert(self.make_seg_bbox(seg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -260,7 +260,7 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
cw: bool,
|
cw: bool,
|
||||||
) -> Result<Segbend, LayoutException> {
|
) -> Result<Segbend, LayoutException> {
|
||||||
let maybe_wraparound = self.wraparoundable(around).wraparound();
|
let maybe_wraparound = self.wraparoundable(around).wraparound();
|
||||||
let mut infringables = self.collect().segbend_inner_and_outer_bibows(from, around);
|
let mut infringables = self.collect().potential_segbend_abutters(from, around);
|
||||||
|
|
||||||
if let Some(wraparound) = maybe_wraparound {
|
if let Some(wraparound) = maybe_wraparound {
|
||||||
infringables.append(&mut self.collect().outer_bows(wraparound));
|
infringables.append(&mut self.collect().outer_bows(wraparound));
|
||||||
|
|
@ -345,18 +345,18 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
self.move_dot_infringably(
|
self.move_dot_infringably(
|
||||||
joints.0.into(),
|
joints.0.into(),
|
||||||
from,
|
from,
|
||||||
&self.collect().inner_bow_and_outer_bows(rail),
|
&self.collect().bend_abutters_and_posteriors(rail),
|
||||||
)?;
|
)?;
|
||||||
self.move_dot_infringably(
|
self.move_dot_infringably(
|
||||||
joints.1.into(),
|
joints.1.into(),
|
||||||
to,
|
to,
|
||||||
&self.collect().inner_bow_and_outer_bows(rail),
|
&self.collect().bend_abutters_and_posteriors(rail),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
self.shift_bend_infringably(
|
self.shift_bend_infringably(
|
||||||
rail.into(),
|
rail.into(),
|
||||||
offset,
|
offset,
|
||||||
&self.collect().inner_bow_and_outer_bows(rail),
|
&self.collect().bend_abutters_and_posteriors(rail),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// Update offsets in case the rule conditions changed.
|
// Update offsets in case the rule conditions changed.
|
||||||
|
|
@ -387,18 +387,18 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
self.move_dot_infringably(
|
self.move_dot_infringably(
|
||||||
joints.0.into(),
|
joints.0.into(),
|
||||||
from,
|
from,
|
||||||
&self.collect().inner_bow_and_outer_bows(rail),
|
&self.collect().bend_abutters_and_posteriors(rail),
|
||||||
)?;
|
)?;
|
||||||
self.move_dot_infringably(
|
self.move_dot_infringably(
|
||||||
joints.1.into(),
|
joints.1.into(),
|
||||||
to,
|
to,
|
||||||
&self.collect().inner_bow_and_outer_bows(rail),
|
&self.collect().bend_abutters_and_posteriors(rail),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
self.shift_bend_infringably(
|
self.shift_bend_infringably(
|
||||||
rail.into(),
|
rail.into(),
|
||||||
offset,
|
offset,
|
||||||
&self.collect().inner_bow_and_outer_bows(rail),
|
&self.collect().bend_abutters_and_posteriors(rail),
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -428,7 +428,7 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
seg_weight,
|
seg_weight,
|
||||||
bend_weight,
|
bend_weight,
|
||||||
cw,
|
cw,
|
||||||
&self.collect().segbend_inner_and_outer_bibows(from, around),
|
&self.collect().potential_segbend_abutters(from, around),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -522,7 +522,7 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
weight,
|
weight,
|
||||||
&self
|
&self
|
||||||
.collect()
|
.collect()
|
||||||
.inner_bow_and_outer_bow(self.primitive(to).bend().into()),
|
.bend_abutters(self.primitive(to).bend().into()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if let DotIndex::Fixed(dot) = from {
|
if let DotIndex::Fixed(dot) = from {
|
||||||
|
|
@ -742,9 +742,7 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
DotIndex::Loose(loose) => self.move_dot_infringably(
|
DotIndex::Loose(loose) => self.move_dot_infringably(
|
||||||
dot,
|
dot,
|
||||||
to,
|
to,
|
||||||
&self
|
&self.collect().bend_abutters(self.primitive(loose).bend()),
|
||||||
.collect()
|
|
||||||
.inner_bow_and_outer_bow(self.primitive(loose).bend()),
|
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -249,7 +249,7 @@ impl<'a, R: RulesTrait> FixedDot<'a, R> {
|
||||||
pub fn first_loose(&self, _band: BandIndex) -> Option<LooseIndex> {
|
pub fn first_loose(&self, _band: BandIndex) -> Option<LooseIndex> {
|
||||||
self.layout
|
self.layout
|
||||||
.geometry()
|
.geometry()
|
||||||
.connecteds(self.index.into())
|
.joineds(self.index.into())
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.find_map(|ni| {
|
.find_map(|ni| {
|
||||||
let weight = self
|
let weight = self
|
||||||
|
|
@ -279,14 +279,14 @@ impl<'a, R: RulesTrait> GetLimbs for FixedDot<'a, R> {
|
||||||
fn segs(&self) -> Vec<SegIndex> {
|
fn segs(&self) -> Vec<SegIndex> {
|
||||||
self.layout
|
self.layout
|
||||||
.geometry()
|
.geometry()
|
||||||
.connected_segs(self.index.into())
|
.joined_segs(self.index.into())
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bends(&self) -> Vec<BendIndex> {
|
fn bends(&self) -> Vec<BendIndex> {
|
||||||
self.layout
|
self.layout
|
||||||
.geometry()
|
.geometry()
|
||||||
.connected_bends(self.index.into())
|
.joined_bends(self.index.into())
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -300,7 +300,7 @@ impl<'a, R: RulesTrait> LooseDot<'a, R> {
|
||||||
pub fn seg(&self) -> Option<SeqLooseSegIndex> {
|
pub fn seg(&self) -> Option<SeqLooseSegIndex> {
|
||||||
self.layout
|
self.layout
|
||||||
.geometry()
|
.geometry()
|
||||||
.connected_segs(self.index.into())
|
.joined_segs(self.index.into())
|
||||||
.map(|ni| SeqLooseSegIndex::new(ni.node_index()))
|
.map(|ni| SeqLooseSegIndex::new(ni.node_index()))
|
||||||
.next()
|
.next()
|
||||||
}
|
}
|
||||||
|
|
@ -308,7 +308,7 @@ impl<'a, R: RulesTrait> LooseDot<'a, R> {
|
||||||
pub fn bend(&self) -> LooseBendIndex {
|
pub fn bend(&self) -> LooseBendIndex {
|
||||||
self.layout
|
self.layout
|
||||||
.geometry()
|
.geometry()
|
||||||
.connected_bends(self.index.into())
|
.joined_bends(self.index.into())
|
||||||
.map(|ni| LooseBendIndex::new(ni.node_index()))
|
.map(|ni| LooseBendIndex::new(ni.node_index()))
|
||||||
.next()
|
.next()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue