layout: alias `Node` to not require generic parameters

This commit is contained in:
Mikolaj Wielgus 2024-04-17 21:06:55 +02:00
parent 4c8f7cb804
commit f2569c5167
7 changed files with 80 additions and 57 deletions

View File

@ -10,7 +10,7 @@ use topola::{
dsn::{design::DsnDesign, rules::DsnRules}, dsn::{design::DsnDesign, rules::DsnRules},
geometry::{ geometry::{
primitive::{BendShape, DotShape, PrimitiveShape, SegShape}, primitive::{BendShape, DotShape, PrimitiveShape, SegShape},
Node, GenericNode,
}, },
layout::{zone::MakePolygon, Layout}, layout::{zone::MakePolygon, Layout},
math::Circle, math::Circle,
@ -154,7 +154,11 @@ impl eframe::App for App {
for node in layout.drawing().layer_primitive_nodes(1) { for node in layout.drawing().layer_primitive_nodes(1) {
let shape = node.primitive(layout.drawing()).shape(); let shape = node.primitive(layout.drawing()).shape();
let color = if self.overlay.selection().contains(&Node::Primitive(node)) { let color = if self
.overlay
.selection()
.contains(&GenericNode::Primitive(node))
{
egui::Color32::from_rgb(100, 100, 255) egui::Color32::from_rgb(100, 100, 255)
} else { } else {
egui::Color32::from_rgb(52, 52, 200) egui::Color32::from_rgb(52, 52, 200)
@ -172,7 +176,11 @@ impl eframe::App for App {
for node in layout.drawing().layer_primitive_nodes(0) { for node in layout.drawing().layer_primitive_nodes(0) {
let shape = node.primitive(layout.drawing()).shape(); let shape = node.primitive(layout.drawing()).shape();
let color = if self.overlay.selection().contains(&Node::Primitive(node)) { let color = if self
.overlay
.selection()
.contains(&GenericNode::Primitive(node))
{
egui::Color32::from_rgb(255, 100, 100) egui::Color32::from_rgb(255, 100, 100)
} else { } else {
egui::Color32::from_rgb(200, 52, 52) egui::Color32::from_rgb(200, 52, 52)

View File

@ -29,7 +29,7 @@ use crate::drawing::{
}; };
use crate::geometry::compound::CompoundManagerTrait; use crate::geometry::compound::CompoundManagerTrait;
use crate::geometry::with_rtree::BboxedIndex; use crate::geometry::with_rtree::BboxedIndex;
use crate::geometry::Node; use crate::geometry::GenericNode;
use crate::geometry::{ use crate::geometry::{
primitive::{PrimitiveShape, PrimitiveShapeTrait}, primitive::{PrimitiveShape, PrimitiveShapeTrait},
with_rtree::GeometryWithRtree, with_rtree::GeometryWithRtree,
@ -639,7 +639,7 @@ impl<CW: Copy, R: RulesTrait> Drawing<CW, R> {
.rtree() .rtree()
.iter() .iter()
.filter_map(|wrapper| { .filter_map(|wrapper| {
if let Node::Primitive(primitive_node) = wrapper.data { if let GenericNode::Primitive(primitive_node) = wrapper.data {
Some(primitive_node) Some(primitive_node)
} else { } else {
None None
@ -655,7 +655,7 @@ impl<CW: Copy, R: RulesTrait> Drawing<CW, R> {
[f64::INFINITY, f64::INFINITY, layer as f64], [f64::INFINITY, f64::INFINITY, layer as f64],
)) ))
.filter_map(|wrapper| { .filter_map(|wrapper| {
if let Node::Primitive(primitive_node) = wrapper.data { if let GenericNode::Primitive(primitive_node) = wrapper.data {
Some(primitive_node) Some(primitive_node)
} else { } else {
None None
@ -750,7 +750,7 @@ impl<CW: Copy, R: RulesTrait> Drawing<CW, R> {
.rtree() .rtree()
.locate_in_envelope_intersecting(&limiting_shape.full_height_envelope_3d(0.0, 2)) .locate_in_envelope_intersecting(&limiting_shape.full_height_envelope_3d(0.0, 2))
.filter_map(|wrapper| { .filter_map(|wrapper| {
if let Node::Primitive(primitive_node) = wrapper.data { if let GenericNode::Primitive(primitive_node) = wrapper.data {
Some(primitive_node) Some(primitive_node)
} else { } else {
None None
@ -785,7 +785,7 @@ impl<CW: Copy, R: RulesTrait> Drawing<CW, R> {
.rtree() .rtree()
.locate_in_envelope_intersecting(&shape.full_height_envelope_3d(0.0, 2)) .locate_in_envelope_intersecting(&shape.full_height_envelope_3d(0.0, 2))
.filter_map(|wrapper| { .filter_map(|wrapper| {
if let Node::Primitive(primitive_node) = wrapper.data { if let GenericNode::Primitive(primitive_node) = wrapper.data {
Some(primitive_node) Some(primitive_node)
} else { } else {
None None
@ -833,7 +833,7 @@ impl<CW: Copy, R: RulesTrait> Drawing<CW, R> {
#[debug_ensures(self.geometry_with_rtree.graph().node_count() == old(self.geometry_with_rtree.graph().node_count()))] #[debug_ensures(self.geometry_with_rtree.graph().node_count() == old(self.geometry_with_rtree.graph().node_count()))]
#[debug_ensures(self.geometry_with_rtree.graph().edge_count() == old(self.geometry_with_rtree.graph().edge_count()))] #[debug_ensures(self.geometry_with_rtree.graph().edge_count() == old(self.geometry_with_rtree.graph().edge_count()))]
pub fn rtree(&self) -> &RTree<BboxedIndex<Node<PrimitiveIndex, GenericIndex<CW>>>> { pub fn rtree(&self) -> &RTree<BboxedIndex<GenericNode<PrimitiveIndex, GenericIndex<CW>>>> {
self.geometry_with_rtree.rtree() self.geometry_with_rtree.rtree()
} }

View File

@ -20,7 +20,7 @@ use crate::{
}, },
Drawing, Drawing,
}, },
geometry::Node, geometry::GenericNode,
}; };
#[enum_dispatch] #[enum_dispatch]
@ -186,7 +186,7 @@ impl<'a, W, CW: Copy, R: RulesTrait> GenericPrimitive<'a, W, CW, R> {
} }
fn tagged_weight(&self) -> PrimitiveWeight { fn tagged_weight(&self) -> PrimitiveWeight {
if let Node::Primitive(weight) = *self if let GenericNode::Primitive(weight) = *self
.drawing .drawing
.geometry() .geometry()
.graph() .graph()
@ -262,9 +262,15 @@ impl<'a, CW: Copy, R: RulesTrait> FixedDot<'a, CW, R> {
.graph() .graph()
.node_weight(ni.node_index()) .node_weight(ni.node_index())
.unwrap(); .unwrap();
if matches!(weight, Node::Primitive(PrimitiveWeight::LoneLooseSeg(..))) { if matches!(
weight,
GenericNode::Primitive(PrimitiveWeight::LoneLooseSeg(..))
) {
Some(LoneLooseSegIndex::new(ni.node_index()).into()) Some(LoneLooseSegIndex::new(ni.node_index()).into())
} else if matches!(weight, Node::Primitive(PrimitiveWeight::SeqLooseSeg(..))) { } else if matches!(
weight,
GenericNode::Primitive(PrimitiveWeight::SeqLooseSeg(..))
) {
Some(SeqLooseSegIndex::new(ni.node_index()).into()) Some(SeqLooseSegIndex::new(ni.node_index()).into())
} else { } else {
None None

View File

@ -59,7 +59,7 @@ pub enum GeometryLabel {
} }
#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)]
pub enum Node<P, C> { pub enum GenericNode<P, C> {
Primitive(P), Primitive(P),
Compound(C), Compound(C),
} }
@ -80,7 +80,7 @@ pub struct Geometry<
SI: GetNodeIndex + Into<PI> + Copy, SI: GetNodeIndex + Into<PI> + Copy,
BI: GetNodeIndex + Into<PI> + Copy, BI: GetNodeIndex + Into<PI> + Copy,
> { > {
graph: StableDiGraph<Node<PW, CW>, GeometryLabel, usize>, graph: StableDiGraph<GenericNode<PW, CW>, GeometryLabel, usize>,
weight_marker: PhantomData<PW>, weight_marker: PhantomData<PW>,
dot_weight_marker: PhantomData<DW>, dot_weight_marker: PhantomData<DW>,
seg_weight_marker: PhantomData<SW>, seg_weight_marker: PhantomData<SW>,
@ -120,7 +120,7 @@ impl<
} }
pub fn add_dot<W: DotWeightTrait<PW>>(&mut self, weight: W) -> GenericIndex<W> { pub fn add_dot<W: DotWeightTrait<PW>>(&mut self, weight: W) -> GenericIndex<W> {
GenericIndex::<W>::new(self.graph.add_node(Node::Primitive(weight.into()))) GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())))
} }
pub fn add_seg<W: SegWeightTrait<PW>>( pub fn add_seg<W: SegWeightTrait<PW>>(
@ -129,7 +129,8 @@ impl<
to: DI, to: DI,
weight: W, weight: W,
) -> GenericIndex<W> { ) -> GenericIndex<W> {
let seg = GenericIndex::<W>::new(self.graph.add_node(Node::Primitive(weight.into()))); let seg =
GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())));
self.graph self.graph
.update_edge(from.node_index(), seg.node_index(), GeometryLabel::Joined); .update_edge(from.node_index(), seg.node_index(), GeometryLabel::Joined);
@ -146,7 +147,8 @@ impl<
core: DI, core: DI,
weight: W, weight: W,
) -> GenericIndex<W> { ) -> GenericIndex<W> {
let bend = GenericIndex::<W>::new(self.graph.add_node(Node::Primitive(weight.into()))); let bend =
GenericIndex::<W>::new(self.graph.add_node(GenericNode::Primitive(weight.into())));
self.graph self.graph
.update_edge(from.node_index(), bend.node_index(), GeometryLabel::Joined); .update_edge(from.node_index(), bend.node_index(), GeometryLabel::Joined);
@ -165,13 +167,15 @@ impl<
pub fn move_dot(&mut self, dot: DI, to: Point) { pub fn move_dot(&mut self, dot: DI, to: Point) {
let mut weight = self.dot_weight(dot); let mut weight = self.dot_weight(dot);
weight.set_pos(to); weight.set_pos(to);
*self.graph.node_weight_mut(dot.node_index()).unwrap() = Node::Primitive(weight.into()); *self.graph.node_weight_mut(dot.node_index()).unwrap() =
GenericNode::Primitive(weight.into());
} }
pub fn shift_bend(&mut self, bend: BI, offset: f64) { pub fn shift_bend(&mut self, bend: BI, offset: f64) {
let mut weight = self.bend_weight(bend); let mut weight = self.bend_weight(bend);
weight.set_offset(offset); weight.set_offset(offset);
*self.graph.node_weight_mut(bend.node_index()).unwrap() = Node::Primitive(weight.into()); *self.graph.node_weight_mut(bend.node_index()).unwrap() =
GenericNode::Primitive(weight.into());
} }
pub fn flip_bend(&mut self, bend: BI) { pub fn flip_bend(&mut self, bend: BI) {
@ -267,7 +271,7 @@ impl<
} }
fn primitive_weight(&self, index: NodeIndex<usize>) -> PW { fn primitive_weight(&self, index: NodeIndex<usize>) -> PW {
if let Node::Primitive(weight) = *self.graph.node_weight(index).unwrap() { if let GenericNode::Primitive(weight) = *self.graph.node_weight(index).unwrap() {
weight weight
} else { } else {
unreachable!() unreachable!()
@ -293,7 +297,9 @@ impl<
} }
pub fn compound_weight(&self, compound: GenericIndex<CW>) -> CW { pub fn compound_weight(&self, compound: GenericIndex<CW>) -> CW {
if let Node::Compound(weight) = *self.graph.node_weight(compound.node_index()).unwrap() { if let GenericNode::Compound(weight) =
*self.graph.node_weight(compound.node_index()).unwrap()
{
weight weight
} else { } else {
unreachable!() unreachable!()
@ -468,7 +474,7 @@ impl<
}) })
} }
pub fn graph(&self) -> &StableDiGraph<Node<PW, CW>, GeometryLabel, usize> { pub fn graph(&self) -> &StableDiGraph<GenericNode<PW, CW>, GeometryLabel, usize> {
&self.graph &self.graph
} }
} }
@ -486,7 +492,7 @@ impl<
> CompoundManagerTrait<CW, GenericIndex<CW>> for Geometry<PW, DW, SW, BW, CW, PI, DI, SI, BI> > CompoundManagerTrait<CW, GenericIndex<CW>> for Geometry<PW, DW, SW, BW, CW, PI, DI, SI, BI>
{ {
fn add_compound(&mut self, weight: CW) -> GenericIndex<CW> { fn add_compound(&mut self, weight: CW) -> GenericIndex<CW> {
GenericIndex::<CW>::new(self.graph.add_node(Node::Compound(weight))) GenericIndex::<CW>::new(self.graph.add_node(GenericNode::Compound(weight)))
} }
fn remove_compound(&mut self, compound: GenericIndex<CW>) { fn remove_compound(&mut self, compound: GenericIndex<CW>) {

View File

@ -10,7 +10,8 @@ use crate::{
geometry::{ geometry::{
compound::CompoundManagerTrait, compound::CompoundManagerTrait,
primitive::{PrimitiveShape, PrimitiveShapeTrait}, primitive::{PrimitiveShape, PrimitiveShapeTrait},
BendWeightTrait, DotWeightTrait, Geometry, GeometryLabel, GetWidth, Node, SegWeightTrait, BendWeightTrait, DotWeightTrait, GenericNode, Geometry, GeometryLabel, GetWidth,
SegWeightTrait,
}, },
graph::{GenericIndex, GetNodeIndex}, graph::{GenericIndex, GetNodeIndex},
}; };
@ -48,7 +49,7 @@ pub struct GeometryWithRtree<
BI: GetNodeIndex + Into<PI> + Copy, BI: GetNodeIndex + Into<PI> + Copy,
> { > {
geometry: Geometry<PW, DW, SW, BW, CW, PI, DI, SI, BI>, geometry: Geometry<PW, DW, SW, BW, CW, PI, DI, SI, BI>,
rtree: RTree<BboxedIndex<Node<PI, GenericIndex<CW>>>>, rtree: RTree<BboxedIndex<GenericNode<PI, GenericIndex<CW>>>>,
layer_count: u64, layer_count: u64,
weight_marker: PhantomData<PW>, weight_marker: PhantomData<PW>,
dot_weight_marker: PhantomData<DW>, dot_weight_marker: PhantomData<DW>,
@ -101,7 +102,7 @@ impl<
.dot_shape(dot.into().try_into().unwrap_or_else(|_| unreachable!())) .dot_shape(dot.into().try_into().unwrap_or_else(|_| unreachable!()))
.envelope_3d(0.0, weight.layer()), .envelope_3d(0.0, weight.layer()),
), ),
Node::Primitive(dot.into()), GenericNode::Primitive(dot.into()),
)); ));
dot dot
} }
@ -122,7 +123,7 @@ impl<
.seg_shape(seg.into().try_into().unwrap_or_else(|_| unreachable!())) .seg_shape(seg.into().try_into().unwrap_or_else(|_| unreachable!()))
.envelope_3d(0.0, weight.layer()), .envelope_3d(0.0, weight.layer()),
), ),
Node::Primitive(seg.into()), GenericNode::Primitive(seg.into()),
)); ));
seg seg
} }
@ -144,7 +145,7 @@ impl<
.bend_shape(bend.into().try_into().unwrap_or_else(|_| unreachable!())) .bend_shape(bend.into().try_into().unwrap_or_else(|_| unreachable!()))
.envelope_3d(0.0, weight.layer()), .envelope_3d(0.0, weight.layer()),
), ),
Node::Primitive(bend.into()), GenericNode::Primitive(bend.into()),
)); ));
bend bend
} }
@ -264,7 +265,7 @@ impl<
BI: GetNodeIndex + Into<PI> + Copy, BI: GetNodeIndex + Into<PI> + Copy,
> GeometryWithRtree<PW, DW, SW, BW, CW, PI, DI, SI, BI> > GeometryWithRtree<PW, DW, SW, BW, CW, PI, DI, SI, BI>
{ {
fn make_bbox(&self, primitive: PI) -> BboxedIndex<Node<PI, GenericIndex<CW>>> { fn make_bbox(&self, primitive: PI) -> BboxedIndex<GenericNode<PI, GenericIndex<CW>>> {
if let Ok(dot) = <PI as TryInto<DI>>::try_into(primitive) { if let Ok(dot) = <PI as TryInto<DI>>::try_into(primitive) {
self.make_dot_bbox(dot) self.make_dot_bbox(dot)
} else if let Ok(seg) = <PI as TryInto<SI>>::try_into(primitive) { } else if let Ok(seg) = <PI as TryInto<SI>>::try_into(primitive) {
@ -276,50 +277,50 @@ impl<
} }
} }
fn make_dot_bbox(&self, dot: DI) -> BboxedIndex<Node<PI, GenericIndex<CW>>> { fn make_dot_bbox(&self, dot: DI) -> BboxedIndex<GenericNode<PI, GenericIndex<CW>>> {
BboxedIndex::new( BboxedIndex::new(
Bbox::new( Bbox::new(
self.geometry self.geometry
.dot_shape(dot) .dot_shape(dot)
.envelope_3d(0.0, self.layer(dot.into())), .envelope_3d(0.0, self.layer(dot.into())),
), ),
Node::Primitive(dot.into()), GenericNode::Primitive(dot.into()),
) )
} }
fn make_seg_bbox(&self, seg: SI) -> BboxedIndex<Node<PI, GenericIndex<CW>>> { fn make_seg_bbox(&self, seg: SI) -> BboxedIndex<GenericNode<PI, GenericIndex<CW>>> {
BboxedIndex::new( BboxedIndex::new(
Bbox::new( Bbox::new(
self.geometry self.geometry
.seg_shape(seg) .seg_shape(seg)
.envelope_3d(0.0, self.layer(seg.into())), .envelope_3d(0.0, self.layer(seg.into())),
), ),
Node::Primitive(seg.into()), GenericNode::Primitive(seg.into()),
) )
} }
fn make_bend_bbox(&self, bend: BI) -> BboxedIndex<Node<PI, GenericIndex<CW>>> { fn make_bend_bbox(&self, bend: BI) -> BboxedIndex<GenericNode<PI, GenericIndex<CW>>> {
BboxedIndex::new( BboxedIndex::new(
Bbox::new( Bbox::new(
self.geometry self.geometry
.bend_shape(bend) .bend_shape(bend)
.envelope_3d(0.0, self.layer(bend.into())), .envelope_3d(0.0, self.layer(bend.into())),
), ),
Node::Primitive(bend.into()), GenericNode::Primitive(bend.into()),
) )
} }
fn make_compound_bbox( fn make_compound_bbox(
&self, &self,
compound: GenericIndex<CW>, compound: GenericIndex<CW>,
) -> BboxedIndex<Node<PI, GenericIndex<CW>>> { ) -> BboxedIndex<GenericNode<PI, GenericIndex<CW>>> {
let mut aabb = AABB::<[f64; 3]>::new_empty(); let mut aabb = AABB::<[f64; 3]>::new_empty();
for member in self.geometry.compound_members(compound) { for member in self.geometry.compound_members(compound) {
aabb.merge(&self.make_bbox(member).geom().aabb); aabb.merge(&self.make_bbox(member).geom().aabb);
} }
BboxedIndex::new(Bbox::new(aabb), Node::Compound(compound)) BboxedIndex::new(Bbox::new(aabb), GenericNode::Compound(compound))
} }
fn shape(&self, primitive: PI) -> PrimitiveShape { fn shape(&self, primitive: PI) -> PrimitiveShape {
@ -351,25 +352,25 @@ impl<
} }
// XXX: The type appears wrong? I don't think it should contain CW? // XXX: The type appears wrong? I don't think it should contain CW?
pub fn rtree(&self) -> &RTree<BboxedIndex<Node<PI, GenericIndex<CW>>>> { pub fn rtree(&self) -> &RTree<BboxedIndex<GenericNode<PI, GenericIndex<CW>>>> {
&self.rtree &self.rtree
} }
pub fn graph(&self) -> &StableDiGraph<Node<PW, CW>, GeometryLabel, usize> { pub fn graph(&self) -> &StableDiGraph<GenericNode<PW, CW>, GeometryLabel, usize> {
self.geometry.graph() self.geometry.graph()
} }
fn test_envelopes(&self) -> bool { fn test_envelopes(&self) -> bool {
!self.rtree.iter().any(|wrapper| { !self.rtree.iter().any(|wrapper| {
// TODO: Test envelopes of compounds too. // TODO: Test envelopes of compounds too.
let Node::Primitive(primitive_node) = wrapper.data else { let GenericNode::Primitive(primitive_node) = wrapper.data else {
return false; return false;
}; };
let shape = self.shape(primitive_node); let shape = self.shape(primitive_node);
let layer = self.layer(primitive_node); let layer = self.layer(primitive_node);
let wrapper = BboxedIndex::new( let wrapper = BboxedIndex::new(
Bbox::new(shape.envelope_3d(0.0, layer)), Bbox::new(shape.envelope_3d(0.0, layer)),
Node::Primitive(primitive_node), GenericNode::Primitive(primitive_node),
); );
!self !self
.rtree .rtree

View File

@ -6,7 +6,7 @@ use crate::{
drawing::{ drawing::{
bend::LooseBendWeight, bend::LooseBendWeight,
dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight}, dot::{DotIndex, FixedDotIndex, FixedDotWeight, LooseDotIndex, LooseDotWeight},
graph::{PrimitiveIndex, Retag}, graph::{PrimitiveIndex, PrimitiveWeight, Retag},
rules::RulesTrait, rules::RulesTrait,
seg::{ seg::{
FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex, FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SeqLooseSegIndex,
@ -17,8 +17,8 @@ use crate::{
Drawing, Infringement, LayoutException, Drawing, Infringement, LayoutException,
}, },
geometry::{ geometry::{
compound::CompoundManagerTrait, BendWeightTrait, DotWeightTrait, Geometry, GeometryLabel, compound::CompoundManagerTrait, BendWeightTrait, DotWeightTrait, GenericNode, Geometry,
GetWidth, Node, SegWeightTrait, GeometryLabel, GetWidth, SegWeightTrait,
}, },
graph::{GenericIndex, GetNodeIndex}, graph::{GenericIndex, GetNodeIndex},
layout::{ layout::{
@ -29,6 +29,8 @@ use crate::{
}, },
}; };
pub type NodeIndex = GenericNode<PrimitiveIndex, GenericIndex<ZoneWeight>>;
pub struct Layout<R: RulesTrait> { pub struct Layout<R: RulesTrait> {
drawing: Drawing<ZoneWeight, R>, // Shouldn't be public, but is for now because `Draw` needs it. drawing: Drawing<ZoneWeight, R>, // Shouldn't be public, but is for now because `Draw` needs it.
connectivity: StableDiGraph<ConnectivityWeight, ConnectivityLabel, usize>, connectivity: StableDiGraph<ConnectivityWeight, ConnectivityLabel, usize>,
@ -170,7 +172,7 @@ impl<R: RulesTrait> Layout<R> {
pub fn zones(&self) -> impl Iterator<Item = ZoneIndex> + '_ { pub fn zones(&self) -> impl Iterator<Item = ZoneIndex> + '_ {
self.drawing.rtree().iter().filter_map(|wrapper| { self.drawing.rtree().iter().filter_map(|wrapper| {
if let Node::Compound(zone) = wrapper.data { if let NodeIndex::Compound(zone) = wrapper.data {
Some(match self.drawing.geometry().compound_weight(zone) { Some(match self.drawing.geometry().compound_weight(zone) {
ZoneWeight::Solid(..) => { ZoneWeight::Solid(..) => {
ZoneIndex::Solid(SolidZoneIndex::new(zone.node_index())) ZoneIndex::Solid(SolidZoneIndex::new(zone.node_index()))
@ -191,7 +193,7 @@ impl<R: RulesTrait> Layout<R> {
[f64::INFINITY, f64::INFINITY, layer as f64], [f64::INFINITY, f64::INFINITY, layer as f64],
)) ))
.filter_map(|wrapper| { .filter_map(|wrapper| {
if let Node::Compound(zone) = wrapper.data { if let NodeIndex::Compound(zone) = wrapper.data {
Some(match self.drawing.geometry().compound_weight(zone) { Some(match self.drawing.geometry().compound_weight(zone) {
ZoneWeight::Solid(..) => { ZoneWeight::Solid(..) => {
ZoneIndex::Solid(SolidZoneIndex::new(zone.node_index())) ZoneIndex::Solid(SolidZoneIndex::new(zone.node_index()))

View File

@ -9,13 +9,13 @@ use crate::{
primitive::MakeShape, primitive::MakeShape,
rules::RulesTrait, rules::RulesTrait,
}, },
geometry::{shape::ShapeTrait, Node}, geometry::shape::ShapeTrait,
graph::GenericIndex, graph::GenericIndex,
layout::{zone::ZoneWeight, Layout}, layout::{zone::ZoneWeight, Layout, NodeIndex},
}; };
pub struct Overlay { pub struct Overlay {
selection: HashSet<Node<PrimitiveIndex, GenericIndex<ZoneWeight>>>, selection: HashSet<NodeIndex>,
active_layer: u64, active_layer: u64,
} }
@ -38,10 +38,10 @@ impl Overlay {
.collect(); .collect();
if let Some(geom) = geoms.iter().find(|&&geom| match geom.data { if let Some(geom) = geoms.iter().find(|&&geom| match geom.data {
Node::Primitive(primitive) => { NodeIndex::Primitive(primitive) => {
primitive.primitive(layout.drawing()).layer() == self.active_layer primitive.primitive(layout.drawing()).layer() == self.active_layer
} }
Node::Compound(compound) => false, NodeIndex::Compound(compound) => false,
}) { }) {
if self.toggle_selection_if_contains_point(layout, geom.data, at) { if self.toggle_selection_if_contains_point(layout, geom.data, at) {
return; return;
@ -58,11 +58,11 @@ impl Overlay {
fn toggle_selection_if_contains_point<R: RulesTrait>( fn toggle_selection_if_contains_point<R: RulesTrait>(
&mut self, &mut self,
layout: &Layout<R>, layout: &Layout<R>,
node: Node<PrimitiveIndex, GenericIndex<ZoneWeight>>, node: NodeIndex,
p: Point, p: Point,
) -> bool { ) -> bool {
match node { match node {
Node::Primitive(primitive) => { NodeIndex::Primitive(primitive) => {
if primitive if primitive
.primitive(layout.drawing()) .primitive(layout.drawing())
.shape() .shape()
@ -72,19 +72,19 @@ impl Overlay {
return true; return true;
} }
} }
Node::Compound(compound) => (), // TODO. NodeIndex::Compound(compound) => (), // TODO.
} }
false false
} }
fn toggle_selection(&mut self, node: Node<PrimitiveIndex, GenericIndex<ZoneWeight>>) { fn toggle_selection(&mut self, node: NodeIndex) {
if !self.selection.insert(node) { if !self.selection.insert(node) {
self.selection.remove(&node); self.selection.remove(&node);
} }
} }
pub fn selection(&self) -> &HashSet<Node<PrimitiveIndex, GenericIndex<ZoneWeight>>> { pub fn selection(&self) -> &HashSet<NodeIndex> {
&self.selection &self.selection
} }
} }