diff --git a/src/graph.rs b/src/graph.rs index 9f0b4a3..783d953 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -19,19 +19,19 @@ pub enum TaggedWeight { #[derive(Debug, Clone, Copy, PartialEq)] pub struct DotWeight { - pub net: i32, + pub net: i64, pub circle: Circle, } #[derive(Debug, Clone, Copy, PartialEq)] pub struct BendWeight { - pub net: i32, + pub net: i64, pub cw: bool, } #[derive(Debug, Clone, Copy, PartialEq)] pub struct SegWeight { - pub net: i32, + pub net: i64, pub width: f64, } diff --git a/src/main.rs b/src/main.rs index 0ca8152..4ceb0af 100644 --- a/src/main.rs +++ b/src/main.rs @@ -105,7 +105,7 @@ fn main() { let dot1_1 = layout .add_dot(DotWeight { - net: 0, + net: 1, circle: Circle { pos: (100.5, 400.5).into(), r: 8.0, @@ -114,7 +114,7 @@ fn main() { .unwrap(); let dot2_1 = layout .add_dot(DotWeight { - net: 0, + net: 2, circle: Circle { pos: (130.5, 430.5).into(), r: 8.0, @@ -123,7 +123,7 @@ fn main() { .unwrap(); let dot3_1 = layout .add_dot(DotWeight { - net: 0, + net: 3, circle: Circle { pos: (160.5, 460.5).into(), r: 8.0, @@ -132,7 +132,7 @@ fn main() { .unwrap(); let dot4_1 = layout .add_dot(DotWeight { - net: 0, + net: 4, circle: Circle { pos: (190.5, 490.5).into(), r: 8.0, @@ -142,7 +142,7 @@ fn main() { let dot1_2 = layout .add_dot(DotWeight { - net: 0, + net: 1, circle: Circle { pos: (700.5, 400.5).into(), r: 8.0, @@ -151,7 +151,7 @@ fn main() { .unwrap(); let dot2_2 = layout .add_dot(DotWeight { - net: 0, + net: 2, circle: Circle { pos: (670.5, 430.5).into(), r: 8.0, @@ -160,7 +160,7 @@ fn main() { .unwrap(); let dot3_2 = layout .add_dot(DotWeight { - net: 0, + net: 3, circle: Circle { pos: (640.5, 460.5).into(), r: 8.0, @@ -169,7 +169,7 @@ fn main() { .unwrap(); let dot4_2 = layout .add_dot(DotWeight { - net: 0, + net: 4, circle: Circle { pos: (610.5, 490.5).into(), r: 8.0, @@ -179,7 +179,7 @@ fn main() { let dot5 = layout .add_dot(DotWeight { - net: 0, + net: 5, circle: Circle { pos: (150.5, 100.5).into(), r: 8.0, @@ -189,7 +189,7 @@ fn main() { let dot6 = layout .add_dot(DotWeight { - net: 0, + net: 6, circle: Circle { pos: (190.5, 200.5).into(), r: 8.0, @@ -199,7 +199,7 @@ fn main() { let dot7 = layout .add_dot(DotWeight { - net: 0, + net: 5, circle: Circle { pos: (230.5, 70.5).into(), r: 8.0, @@ -209,7 +209,7 @@ fn main() { let barrier1_dot1 = layout .add_dot(DotWeight { - net: 0, + net: 10, circle: Circle { pos: (250.5, 250.5).into(), r: 8.0, @@ -218,7 +218,7 @@ fn main() { .unwrap(); let barrier1_dot2 = layout .add_dot(DotWeight { - net: 0, + net: 10, circle: Circle { pos: (250.5, 700.5).into(), r: 8.0, @@ -229,7 +229,7 @@ fn main() { let barrier2_dot1 = layout .add_dot(DotWeight { - net: 0, + net: 20, circle: Circle { pos: (420.5, 200.5).into(), r: 8.0, @@ -238,7 +238,7 @@ fn main() { .unwrap(); let barrier2_dot2 = layout .add_dot(DotWeight { - net: 0, + net: 20, circle: Circle { pos: (480.5, 700.5).into(), r: 8.0, diff --git a/src/mesh.rs b/src/mesh.rs index 99ab0e1..a234cea 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -52,12 +52,10 @@ impl Mesh { pub fn add_dot(&mut self, weight: DotWeight) -> Result { let dot = DotIndex::new(self.graph.add_node(TaggedWeight::Dot(weight))); - //self.fail_and_remove_if_collides_except(dot, &[])?; - self.rtree.insert(RTreeWrapper::new( - self.primitive(dot).shape(), - TaggedIndex::Dot(dot), - )); + self.fail_and_remove_if_collides_except(dot, &[])?; + self.insert_into_rtree(dot.tag()); + Ok(dot) } @@ -72,8 +70,22 @@ impl Mesh { self.graph.add_edge(from.index, seg.index, Label::End); self.graph.add_edge(seg.index, to.index, Label::End); - //self.fail_and_remove_if_collides_except(seg, &[from.tag(), to.tag()])?; + self.fail_and_remove_if_collides_except(seg, &[from.tag(), to.tag()])?; self.insert_into_rtree(seg.tag()); + + self.graph + .node_weight_mut(from.index) + .unwrap() + .as_dot_mut() + .unwrap() + .net = weight.net; + self.graph + .node_weight_mut(to.index) + .unwrap() + .as_dot_mut() + .unwrap() + .net = weight.net; + Ok(seg) } @@ -99,12 +111,12 @@ impl Mesh { weight: BendWeight, ) -> Result { let bend = BendIndex::new(self.graph.add_node(TaggedWeight::Bend(weight))); - //self.fail_and_remove_if_collides_except(bend, &[from.tag(), to.tag(), core.tag()])?; self.graph.add_edge(from.index, bend.index, Label::End); self.graph.add_edge(bend.index, to.index, Label::End); self.graph.add_edge(bend.index, core.index, Label::Core); + self.fail_and_remove_if_collides_except(bend, &[from.tag(), to.tag(), core.tag()])?; self.insert_into_rtree(bend.tag()); Ok(bend) } @@ -232,9 +244,8 @@ impl Mesh { self.rtree .locate_in_envelope_intersecting(&shape.envelope()) .filter(|wrapper| { - !primitive - .neighbors() - .any(|neighbor| neighbor == wrapper.data) + let index = wrapper.data; + !untag!(index, primitive.connectable(index)) }) .filter(|wrapper| !except.contains(&wrapper.data)) .filter(|wrapper| shape.intersects(wrapper.geom())) diff --git a/src/primitive.rs b/src/primitive.rs index c8eae18..d38f8f6 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -148,6 +148,27 @@ impl<'a, Weight> Primitive<'a, Weight> { .next() } + pub fn connectable(&self, index: Index) -> bool { + let this = self.net(&self.index); + let other = self.net(&index); + + if this == -1 || other == -1 { + true + } else if this == -2 || other == -2 { + false + } else { + this == other + } + } + + fn net(&self, index: &Index) -> i64 { + match self.graph.node_weight(index.index).unwrap() { + TaggedWeight::Dot(dot) => dot.net, + TaggedWeight::Seg(seg) => seg.net, + TaggedWeight::Bend(bend) => bend.net, + } + } + pub fn tagged_index(&self) -> TaggedIndex { self.index .retag(self.graph.node_weight(self.index.index).unwrap()) diff --git a/src/rules.rs b/src/rules.rs index f33634c..ccec0ec 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -2,19 +2,19 @@ use std::collections::HashMap; #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] pub struct Conditions { - pub lower_net: Option, - pub higher_net: Option, - pub layer: Option, - pub zone: Option, + pub lower_net: Option, + pub higher_net: Option, + pub layer: Option, + pub zone: Option, } impl Conditions { - pub fn priority(&self) -> i32 { + pub fn priority(&self) -> i64 { let mut priority = 0; - priority += (self.lower_net.is_some() as i32) * 1; - priority += (self.higher_net.is_some() as i32) * 2; - priority += (self.layer.is_some() as i32) * 4; - priority += (self.zone.is_some() as i32) * 8; + priority += (self.lower_net.is_some() as i64) * 1; + priority += (self.higher_net.is_some() as i64) * 2; + priority += (self.layer.is_some() as i64) * 4; + priority += (self.zone.is_some() as i64) * 8; priority } }