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:
Mikolaj Wielgus 2024-11-26 02:41:13 +01:00
parent 1f55e92026
commit f17c8ce756
2 changed files with 44 additions and 28 deletions

View File

@ -132,7 +132,11 @@ impl<
) -> GenericIndex<W> {
let seg =
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(
from.petgraph_index(),
seg.petgraph_index(),
@ -143,8 +147,6 @@ impl<
to.petgraph_index(),
GeometryLabel::Joined,
);
seg
}
pub fn add_bend<W: AccessBendWeight<PW>>(
@ -156,7 +158,17 @@ impl<
) -> GenericIndex<W> {
let bend =
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(
from.petgraph_index(),
bend.petgraph_index(),
@ -172,8 +184,6 @@ impl<
core.petgraph_index(),
GeometryLabel::Core,
);
bend
}
pub fn remove_primitive(&mut self, primitive: PI) {

View File

@ -79,17 +79,18 @@ impl<
GenericIndex<W>: Into<PI>,
{
let dot = self.geometry.add_dot(weight);
self.rtree.insert(BboxedIndex::new(
Bbox::new(
self.geometry
.dot_shape(dot.into().try_into().unwrap_or_else(|_| unreachable!()))
.envelope_3d(0.0, weight.layer()),
),
GenericNode::Primitive(dot.into()),
));
self.init_dot_bbox(dot, weight);
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>(
&mut self,
from: DI,
@ -100,17 +101,18 @@ impl<
GenericIndex<W>: Into<PI>,
{
let seg = self.geometry.add_seg(from, to, weight);
self.rtree.insert(BboxedIndex::new(
Bbox::new(
self.geometry
.seg_shape(seg.into().try_into().unwrap_or_else(|_| unreachable!()))
.envelope_3d(0.0, weight.layer()),
),
GenericNode::Primitive(seg.into()),
));
self.init_seg_bbox(seg, weight);
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>(
&mut self,
from: DI,
@ -122,17 +124,21 @@ impl<
GenericIndex<W>: Into<PI>,
{
let bend = self.geometry.add_bend(from, to, core, weight);
self.rtree.insert(BboxedIndex::new(
Bbox::new(
self.geometry
.bend_shape(bend.into().try_into().unwrap_or_else(|_| unreachable!()))
.envelope_3d(0.0, weight.layer()),
),
GenericNode::Primitive(bend.into()),
));
self.init_bend_bbox(bend, weight);
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>) {
self.rtree.remove(&self.make_compound_bbox(compound));
self.geometry.add_to_compound(primitive, compound);