From 5cef59227ab02be05583235754988f4354e132f8 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 10 Apr 2024 22:13:45 +0000 Subject: [PATCH] geometry: expose grouping management via new trait --- src/drawing/drawing.rs | 1 + src/geometry/geometry.rs | 54 +++++++++++++++++++++++--------------- src/geometry/grouping.rs | 7 +++++ src/geometry/mod.rs | 1 + src/geometry/with_rtree.rs | 36 ++++++++++++++++++++----- 5 files changed, 72 insertions(+), 27 deletions(-) create mode 100644 src/geometry/grouping.rs diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index 2058619..78fe9ce 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -28,6 +28,7 @@ use crate::drawing::{ }, zone::{PourZoneIndex, SolidZoneIndex, ZoneIndex, ZoneWeight}, }; +use crate::geometry::grouping::GroupingManagerTrait; use crate::geometry::Node; use crate::geometry::{ primitive::{PrimitiveShape, PrimitiveShapeTrait}, diff --git a/src/geometry/geometry.rs b/src/geometry/geometry.rs index 241166c..878a191 100644 --- a/src/geometry/geometry.rs +++ b/src/geometry/geometry.rs @@ -17,7 +17,10 @@ use crate::{ rules::RulesTrait, seg::{FixedSegWeight, LoneLooseSegWeight, SegWeight, SeqLooseSegWeight}, }, - geometry::primitive::{BendShape, DotShape, PrimitiveShape, SegShape}, + geometry::{ + grouping::GroupingManagerTrait, + primitive::{BendShape, DotShape, PrimitiveShape, SegShape}, + }, graph::{GenericIndex, GetNodeIndex}, math::Circle, }; @@ -155,30 +158,10 @@ impl< bend } - pub fn add_grouping(&mut self, weight: GW) -> GenericIndex { - GenericIndex::::new(self.graph.add_node(Node::Grouping(weight))) - } - - pub fn assign_to_grouping( - &mut self, - primitive: GenericIndex, - grouping: GenericIndex, - ) { - self.graph.update_edge( - primitive.node_index(), - grouping.node_index(), - GeometryLabel::Grouping, - ); - } - pub fn remove_primitive(&mut self, primitive: PI) { self.graph.remove_node(primitive.node_index()); } - pub fn remove_grouping(&mut self, grouping: GenericIndex) { - self.graph.remove_node(grouping.node_index()); - } - pub fn move_dot(&mut self, dot: DI, to: Point) { let mut weight = self.dot_weight(dot); weight.set_pos(to); @@ -489,3 +472,32 @@ impl< &self.graph } } + +impl< + PW: GetWidth + TryInto + TryInto + TryInto + Retag + Copy, + DW: DotWeightTrait, + SW: SegWeightTrait, + BW: BendWeightTrait, + GW: Copy, + PI: GetNodeIndex + TryInto + TryInto + TryInto + Copy, + DI: GetNodeIndex + Into + Copy, + SI: GetNodeIndex + Into + Copy, + BI: GetNodeIndex + Into + Copy, + > GroupingManagerTrait> for Geometry +{ + fn add_grouping(&mut self, weight: GW) -> GenericIndex { + GenericIndex::::new(self.graph.add_node(Node::Grouping(weight))) + } + + fn remove_grouping(&mut self, grouping: GenericIndex) { + self.graph.remove_node(grouping.node_index()); + } + + fn assign_to_grouping(&mut self, primitive: GenericIndex, grouping: GenericIndex) { + self.graph.update_edge( + primitive.node_index(), + grouping.node_index(), + GeometryLabel::Grouping, + ); + } +} diff --git a/src/geometry/grouping.rs b/src/geometry/grouping.rs new file mode 100644 index 0000000..e779995 --- /dev/null +++ b/src/geometry/grouping.rs @@ -0,0 +1,7 @@ +use crate::graph::{GenericIndex, GetNodeIndex}; + +pub trait GroupingManagerTrait { + fn add_grouping(&mut self, weight: GW) -> GenericIndex; + fn remove_grouping(&mut self, grouping: GenericIndex); + fn assign_to_grouping(&mut self, node: GenericIndex, grouping: GenericIndex); +} diff --git a/src/geometry/mod.rs b/src/geometry/mod.rs index 405c06d..37c50dc 100644 --- a/src/geometry/mod.rs +++ b/src/geometry/mod.rs @@ -1,5 +1,6 @@ #[macro_use] mod geometry; +pub mod grouping; pub mod primitive; mod shape; pub mod with_rtree; diff --git a/src/geometry/with_rtree.rs b/src/geometry/with_rtree.rs index 1e7a4ef..851ebc1 100644 --- a/src/geometry/with_rtree.rs +++ b/src/geometry/with_rtree.rs @@ -8,6 +8,7 @@ use rstar::{primitives::GeomWithData, Envelope, RTree, RTreeObject, AABB}; use crate::{ drawing::graph::{GetLayer, Retag}, geometry::{ + grouping::GroupingManagerTrait, primitive::{PrimitiveShape, PrimitiveShapeTrait}, BendWeightTrait, DotWeightTrait, Geometry, GeometryLabel, GetWidth, Node, SegWeightTrait, }, @@ -148,12 +149,6 @@ impl< bend } - pub fn add_grouping(&mut self, weight: GW) -> GenericIndex { - let grouping = self.geometry.add_grouping(weight); - self.rtree.insert(self.make_grouping_bbox(grouping)); - grouping - } - pub fn assign_to_grouping( &mut self, primitive: GenericIndex, @@ -386,3 +381,32 @@ impl< }) } } + +impl< + PW: GetWidth + GetLayer + TryInto + TryInto + TryInto + Retag + Copy, + DW: DotWeightTrait + GetLayer, + SW: SegWeightTrait + GetLayer, + BW: BendWeightTrait + GetLayer, + GW: Copy, + PI: GetNodeIndex + TryInto + TryInto + TryInto + PartialEq + Copy, + DI: GetNodeIndex + Into + Copy, + SI: GetNodeIndex + Into + Copy, + BI: GetNodeIndex + Into + Copy, + > GroupingManagerTrait> + for GeometryWithRtree +{ + fn add_grouping(&mut self, weight: GW) -> GenericIndex { + let grouping = self.geometry.add_grouping(weight); + self.rtree.insert(self.make_grouping_bbox(grouping)); + grouping + } + + fn remove_grouping(&mut self, grouping: GenericIndex) { + self.rtree.remove(&self.make_grouping_bbox(grouping)); + self.geometry.remove_grouping(grouping); + } + + fn assign_to_grouping(&mut self, primitive: GenericIndex, grouping: GenericIndex) { + self.geometry.assign_to_grouping(primitive, grouping); + } +}