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)]
|
||||
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,
|
||||
}
|
||||
|
||||
|
|
|
|||
30
src/main.rs
30
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,
|
||||
|
|
|
|||
31
src/mesh.rs
31
src/mesh.rs
|
|
@ -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()))
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
18
src/rules.rs
18
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<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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue