mirror of https://codeberg.org/topola/topola.git
refactor(geometry): split out some initialization from node creation
This code will be shared with the routines implementing edit application, which I will be implementing soon.
This commit is contained in:
parent
1f55e92026
commit
f17c8ce756
|
|
@ -132,7 +132,11 @@ impl<
|
||||||
) -> GenericIndex<W> {
|
) -> GenericIndex<W> {
|
||||||
let seg =
|
let seg =
|
||||||
GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())));
|
GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())));
|
||||||
|
self.init_seg_joints(seg, from, to);
|
||||||
|
seg
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_seg_joints<W: AccessSegWeight<PW>>(&mut self, seg: GenericIndex<W>, from: DI, to: DI) {
|
||||||
self.graph.update_edge(
|
self.graph.update_edge(
|
||||||
from.petgraph_index(),
|
from.petgraph_index(),
|
||||||
seg.petgraph_index(),
|
seg.petgraph_index(),
|
||||||
|
|
@ -143,8 +147,6 @@ impl<
|
||||||
to.petgraph_index(),
|
to.petgraph_index(),
|
||||||
GeometryLabel::Joined,
|
GeometryLabel::Joined,
|
||||||
);
|
);
|
||||||
|
|
||||||
seg
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_bend<W: AccessBendWeight<PW>>(
|
pub fn add_bend<W: AccessBendWeight<PW>>(
|
||||||
|
|
@ -156,7 +158,17 @@ impl<
|
||||||
) -> GenericIndex<W> {
|
) -> GenericIndex<W> {
|
||||||
let bend =
|
let bend =
|
||||||
GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())));
|
GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())));
|
||||||
|
self.init_bend_joints_and_core(bend, from, to, core);
|
||||||
|
bend
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_bend_joints_and_core<W: AccessBendWeight<PW>>(
|
||||||
|
&mut self,
|
||||||
|
bend: GenericIndex<W>,
|
||||||
|
from: DI,
|
||||||
|
to: DI,
|
||||||
|
core: DI,
|
||||||
|
) {
|
||||||
self.graph.update_edge(
|
self.graph.update_edge(
|
||||||
from.petgraph_index(),
|
from.petgraph_index(),
|
||||||
bend.petgraph_index(),
|
bend.petgraph_index(),
|
||||||
|
|
@ -172,8 +184,6 @@ impl<
|
||||||
core.petgraph_index(),
|
core.petgraph_index(),
|
||||||
GeometryLabel::Core,
|
GeometryLabel::Core,
|
||||||
);
|
);
|
||||||
|
|
||||||
bend
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_primitive(&mut self, primitive: PI) {
|
pub fn remove_primitive(&mut self, primitive: PI) {
|
||||||
|
|
|
||||||
|
|
@ -79,17 +79,18 @@ impl<
|
||||||
GenericIndex<W>: Into<PI>,
|
GenericIndex<W>: Into<PI>,
|
||||||
{
|
{
|
||||||
let dot = self.geometry.add_dot(weight);
|
let dot = self.geometry.add_dot(weight);
|
||||||
self.rtree.insert(BboxedIndex::new(
|
self.init_dot_bbox(dot, weight);
|
||||||
Bbox::new(
|
|
||||||
self.geometry
|
|
||||||
.dot_shape(dot.into().try_into().unwrap_or_else(|_| unreachable!()))
|
|
||||||
.envelope_3d(0.0, weight.layer()),
|
|
||||||
),
|
|
||||||
GenericNode::Primitive(dot.into()),
|
|
||||||
));
|
|
||||||
dot
|
dot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_dot_bbox<W: AccessDotWeight<PW> + GetLayer>(&mut self, dot: GenericIndex<W>, weight: W)
|
||||||
|
where
|
||||||
|
GenericIndex<W>: Into<PI>,
|
||||||
|
{
|
||||||
|
self.rtree
|
||||||
|
.insert(self.make_dot_bbox(dot.into().try_into().unwrap_or_else(|_| unreachable!())));
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_seg<W: AccessSegWeight<PW> + GetLayer>(
|
pub fn add_seg<W: AccessSegWeight<PW> + GetLayer>(
|
||||||
&mut self,
|
&mut self,
|
||||||
from: DI,
|
from: DI,
|
||||||
|
|
@ -100,17 +101,18 @@ impl<
|
||||||
GenericIndex<W>: Into<PI>,
|
GenericIndex<W>: Into<PI>,
|
||||||
{
|
{
|
||||||
let seg = self.geometry.add_seg(from, to, weight);
|
let seg = self.geometry.add_seg(from, to, weight);
|
||||||
self.rtree.insert(BboxedIndex::new(
|
self.init_seg_bbox(seg, weight);
|
||||||
Bbox::new(
|
|
||||||
self.geometry
|
|
||||||
.seg_shape(seg.into().try_into().unwrap_or_else(|_| unreachable!()))
|
|
||||||
.envelope_3d(0.0, weight.layer()),
|
|
||||||
),
|
|
||||||
GenericNode::Primitive(seg.into()),
|
|
||||||
));
|
|
||||||
seg
|
seg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_seg_bbox<W: AccessSegWeight<PW> + GetLayer>(&mut self, seg: GenericIndex<W>, weight: W)
|
||||||
|
where
|
||||||
|
GenericIndex<W>: Into<PI>,
|
||||||
|
{
|
||||||
|
self.rtree
|
||||||
|
.insert(self.make_seg_bbox(seg.into().try_into().unwrap_or_else(|_| unreachable!())));
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_bend<W: AccessBendWeight<PW> + GetLayer>(
|
pub fn add_bend<W: AccessBendWeight<PW> + GetLayer>(
|
||||||
&mut self,
|
&mut self,
|
||||||
from: DI,
|
from: DI,
|
||||||
|
|
@ -122,17 +124,21 @@ impl<
|
||||||
GenericIndex<W>: Into<PI>,
|
GenericIndex<W>: Into<PI>,
|
||||||
{
|
{
|
||||||
let bend = self.geometry.add_bend(from, to, core, weight);
|
let bend = self.geometry.add_bend(from, to, core, weight);
|
||||||
self.rtree.insert(BboxedIndex::new(
|
self.init_bend_bbox(bend, weight);
|
||||||
Bbox::new(
|
|
||||||
self.geometry
|
|
||||||
.bend_shape(bend.into().try_into().unwrap_or_else(|_| unreachable!()))
|
|
||||||
.envelope_3d(0.0, weight.layer()),
|
|
||||||
),
|
|
||||||
GenericNode::Primitive(bend.into()),
|
|
||||||
));
|
|
||||||
bend
|
bend
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_bend_bbox<W: AccessBendWeight<PW> + GetLayer>(
|
||||||
|
&mut self,
|
||||||
|
bend: GenericIndex<W>,
|
||||||
|
weight: W,
|
||||||
|
) where
|
||||||
|
GenericIndex<W>: Into<PI>,
|
||||||
|
{
|
||||||
|
self.rtree
|
||||||
|
.insert(self.make_bend_bbox(bend.into().try_into().unwrap_or_else(|_| unreachable!())));
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_to_compound<W>(&mut self, primitive: GenericIndex<W>, compound: GenericIndex<CW>) {
|
pub fn add_to_compound<W>(&mut self, primitive: GenericIndex<W>, compound: GenericIndex<CW>) {
|
||||||
self.rtree.remove(&self.make_compound_bbox(compound));
|
self.rtree.remove(&self.make_compound_bbox(compound));
|
||||||
self.geometry.add_to_compound(primitive, compound);
|
self.geometry.add_to_compound(primitive, compound);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue