Don't collide with the same net

This commit is contained in:
Mikolaj Wielgus 2023-08-18 02:39:11 +02:00
parent 17d03bb9db
commit a077dfbca2
5 changed files with 69 additions and 37 deletions

View File

@ -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,
}

View File

@ -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,

View File

@ -52,12 +52,10 @@ impl Mesh {
pub fn add_dot(&mut self, weight: DotWeight) -> Result<DotIndex, ()> {
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<BendIndex, ()> {
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()))

View File

@ -148,6 +148,27 @@ impl<'a, Weight> Primitive<'a, Weight> {
.next()
}
pub fn connectable<W>(&self, index: Index<W>) -> 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<W>(&self, index: &Index<W>) -> 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())

View File

@ -2,19 +2,19 @@ use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub struct Conditions {
pub lower_net: Option<i32>,
pub higher_net: Option<i32>,
pub layer: Option<i32>,
pub zone: Option<i32>,
pub lower_net: Option<i64>,
pub higher_net: Option<i64>,
pub layer: Option<i64>,
pub zone: Option<i64>,
}
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
}
}