mirror of https://codeberg.org/topola/topola.git
Don't collide with the same net
This commit is contained in:
parent
17d03bb9db
commit
a077dfbca2
|
|
@ -19,19 +19,19 @@ pub enum TaggedWeight {
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub struct DotWeight {
|
pub struct DotWeight {
|
||||||
pub net: i32,
|
pub net: i64,
|
||||||
pub circle: Circle,
|
pub circle: Circle,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub struct BendWeight {
|
pub struct BendWeight {
|
||||||
pub net: i32,
|
pub net: i64,
|
||||||
pub cw: bool,
|
pub cw: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub struct SegWeight {
|
pub struct SegWeight {
|
||||||
pub net: i32,
|
pub net: i64,
|
||||||
pub width: f64,
|
pub width: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
30
src/main.rs
30
src/main.rs
|
|
@ -105,7 +105,7 @@ fn main() {
|
||||||
|
|
||||||
let dot1_1 = layout
|
let dot1_1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 1,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (100.5, 400.5).into(),
|
pos: (100.5, 400.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -114,7 +114,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dot2_1 = layout
|
let dot2_1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 2,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (130.5, 430.5).into(),
|
pos: (130.5, 430.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -123,7 +123,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dot3_1 = layout
|
let dot3_1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 3,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (160.5, 460.5).into(),
|
pos: (160.5, 460.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -132,7 +132,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dot4_1 = layout
|
let dot4_1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 4,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (190.5, 490.5).into(),
|
pos: (190.5, 490.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -142,7 +142,7 @@ fn main() {
|
||||||
|
|
||||||
let dot1_2 = layout
|
let dot1_2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 1,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (700.5, 400.5).into(),
|
pos: (700.5, 400.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -151,7 +151,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dot2_2 = layout
|
let dot2_2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 2,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (670.5, 430.5).into(),
|
pos: (670.5, 430.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -160,7 +160,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dot3_2 = layout
|
let dot3_2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 3,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (640.5, 460.5).into(),
|
pos: (640.5, 460.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -169,7 +169,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let dot4_2 = layout
|
let dot4_2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 4,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (610.5, 490.5).into(),
|
pos: (610.5, 490.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -179,7 +179,7 @@ fn main() {
|
||||||
|
|
||||||
let dot5 = layout
|
let dot5 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 5,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (150.5, 100.5).into(),
|
pos: (150.5, 100.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -189,7 +189,7 @@ fn main() {
|
||||||
|
|
||||||
let dot6 = layout
|
let dot6 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 6,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (190.5, 200.5).into(),
|
pos: (190.5, 200.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -199,7 +199,7 @@ fn main() {
|
||||||
|
|
||||||
let dot7 = layout
|
let dot7 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 5,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (230.5, 70.5).into(),
|
pos: (230.5, 70.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -209,7 +209,7 @@ fn main() {
|
||||||
|
|
||||||
let barrier1_dot1 = layout
|
let barrier1_dot1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 10,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (250.5, 250.5).into(),
|
pos: (250.5, 250.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -218,7 +218,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let barrier1_dot2 = layout
|
let barrier1_dot2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 10,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (250.5, 700.5).into(),
|
pos: (250.5, 700.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -229,7 +229,7 @@ fn main() {
|
||||||
|
|
||||||
let barrier2_dot1 = layout
|
let barrier2_dot1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 20,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (420.5, 200.5).into(),
|
pos: (420.5, 200.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
@ -238,7 +238,7 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let barrier2_dot2 = layout
|
let barrier2_dot2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 20,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (480.5, 700.5).into(),
|
pos: (480.5, 700.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
|
|
|
||||||
31
src/mesh.rs
31
src/mesh.rs
|
|
@ -52,12 +52,10 @@ impl Mesh {
|
||||||
|
|
||||||
pub fn add_dot(&mut self, weight: DotWeight) -> Result<DotIndex, ()> {
|
pub fn add_dot(&mut self, weight: DotWeight) -> Result<DotIndex, ()> {
|
||||||
let dot = DotIndex::new(self.graph.add_node(TaggedWeight::Dot(weight)));
|
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.fail_and_remove_if_collides_except(dot, &[])?;
|
||||||
self.primitive(dot).shape(),
|
self.insert_into_rtree(dot.tag());
|
||||||
TaggedIndex::Dot(dot),
|
|
||||||
));
|
|
||||||
Ok(dot)
|
Ok(dot)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,8 +70,22 @@ impl Mesh {
|
||||||
self.graph.add_edge(from.index, seg.index, Label::End);
|
self.graph.add_edge(from.index, seg.index, Label::End);
|
||||||
self.graph.add_edge(seg.index, to.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.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)
|
Ok(seg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,12 +111,12 @@ impl Mesh {
|
||||||
weight: BendWeight,
|
weight: BendWeight,
|
||||||
) -> Result<BendIndex, ()> {
|
) -> Result<BendIndex, ()> {
|
||||||
let bend = BendIndex::new(self.graph.add_node(TaggedWeight::Bend(weight)));
|
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(from.index, bend.index, Label::End);
|
||||||
self.graph.add_edge(bend.index, to.index, Label::End);
|
self.graph.add_edge(bend.index, to.index, Label::End);
|
||||||
self.graph.add_edge(bend.index, core.index, Label::Core);
|
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());
|
self.insert_into_rtree(bend.tag());
|
||||||
Ok(bend)
|
Ok(bend)
|
||||||
}
|
}
|
||||||
|
|
@ -232,9 +244,8 @@ impl Mesh {
|
||||||
self.rtree
|
self.rtree
|
||||||
.locate_in_envelope_intersecting(&shape.envelope())
|
.locate_in_envelope_intersecting(&shape.envelope())
|
||||||
.filter(|wrapper| {
|
.filter(|wrapper| {
|
||||||
!primitive
|
let index = wrapper.data;
|
||||||
.neighbors()
|
!untag!(index, primitive.connectable(index))
|
||||||
.any(|neighbor| neighbor == wrapper.data)
|
|
||||||
})
|
})
|
||||||
.filter(|wrapper| !except.contains(&wrapper.data))
|
.filter(|wrapper| !except.contains(&wrapper.data))
|
||||||
.filter(|wrapper| shape.intersects(wrapper.geom()))
|
.filter(|wrapper| shape.intersects(wrapper.geom()))
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,27 @@ impl<'a, Weight> Primitive<'a, Weight> {
|
||||||
.next()
|
.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 {
|
pub fn tagged_index(&self) -> TaggedIndex {
|
||||||
self.index
|
self.index
|
||||||
.retag(self.graph.node_weight(self.index.index).unwrap())
|
.retag(self.graph.node_weight(self.index.index).unwrap())
|
||||||
|
|
|
||||||
18
src/rules.rs
18
src/rules.rs
|
|
@ -2,19 +2,19 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
|
||||||
pub struct Conditions {
|
pub struct Conditions {
|
||||||
pub lower_net: Option<i32>,
|
pub lower_net: Option<i64>,
|
||||||
pub higher_net: Option<i32>,
|
pub higher_net: Option<i64>,
|
||||||
pub layer: Option<i32>,
|
pub layer: Option<i64>,
|
||||||
pub zone: Option<i32>,
|
pub zone: Option<i64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Conditions {
|
impl Conditions {
|
||||||
pub fn priority(&self) -> i32 {
|
pub fn priority(&self) -> i64 {
|
||||||
let mut priority = 0;
|
let mut priority = 0;
|
||||||
priority += (self.lower_net.is_some() as i32) * 1;
|
priority += (self.lower_net.is_some() as i64) * 1;
|
||||||
priority += (self.higher_net.is_some() as i32) * 2;
|
priority += (self.higher_net.is_some() as i64) * 2;
|
||||||
priority += (self.layer.is_some() as i32) * 4;
|
priority += (self.layer.is_some() as i64) * 4;
|
||||||
priority += (self.zone.is_some() as i32) * 8;
|
priority += (self.zone.is_some() as i64) * 8;
|
||||||
priority
|
priority
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue