mirror of https://codeberg.org/topola/topola.git
layout: fix apex detection - these can be joined with loose segs
This commit is contained in:
parent
452bcaf09d
commit
b3f36d22b4
|
|
@ -9,6 +9,7 @@ use crate::{
|
||||||
graph::{GetLayer, GetMaybeNet, MakePrimitive, PrimitiveIndex, PrimitiveWeight, Retag},
|
graph::{GetLayer, GetMaybeNet, MakePrimitive, PrimitiveIndex, PrimitiveWeight, Retag},
|
||||||
primitive::{GenericPrimitive, GetLimbs, Primitive},
|
primitive::{GenericPrimitive, GetLimbs, Primitive},
|
||||||
rules::RulesTrait,
|
rules::RulesTrait,
|
||||||
|
seg::SegIndex,
|
||||||
Drawing,
|
Drawing,
|
||||||
},
|
},
|
||||||
geometry::{compound::CompoundManagerTrait, poly::PolyShape, GetPos},
|
geometry::{compound::CompoundManagerTrait, poly::PolyShape, GetPos},
|
||||||
|
|
@ -36,6 +37,17 @@ impl<'a, R: RulesTrait> Zone<'a, R> {
|
||||||
pub fn new(index: GenericIndex<ZoneWeight>, layout: &'a Layout<R>) -> Self {
|
pub fn new(index: GenericIndex<ZoneWeight>, layout: &'a Layout<R>) -> Self {
|
||||||
Self { index, layout }
|
Self { index, layout }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_apex(&self, dot: FixedDotIndex) -> bool {
|
||||||
|
self.layout
|
||||||
|
.drawing()
|
||||||
|
.primitive(dot)
|
||||||
|
.segs()
|
||||||
|
.iter()
|
||||||
|
.find(|seg| matches!(seg, SegIndex::Fixed(..)))
|
||||||
|
.is_none()
|
||||||
|
&& self.layout.drawing().primitive(dot).bends().is_empty()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, R: RulesTrait> GetLayer for Zone<'a, R> {
|
impl<'a, R: RulesTrait> GetLayer for Zone<'a, R> {
|
||||||
|
|
@ -63,10 +75,20 @@ impl<'a, R: RulesTrait> MakePolyShape for Zone<'a, R> {
|
||||||
.geometry()
|
.geometry()
|
||||||
.compound_members(self.index)
|
.compound_members(self.index)
|
||||||
.filter_map(|primitive_node| {
|
.filter_map(|primitive_node| {
|
||||||
if let Ok(dot) = DotIndex::try_from(primitive_node) {
|
let PrimitiveIndex::FixedDot(dot) = primitive_node else {
|
||||||
Some(self.layout.drawing().geometry().dot_weight(dot).pos())
|
return None;
|
||||||
|
};
|
||||||
|
|
||||||
|
if self.is_apex(dot) {
|
||||||
|
return None;
|
||||||
} else {
|
} else {
|
||||||
None
|
Some(
|
||||||
|
self.layout
|
||||||
|
.drawing()
|
||||||
|
.geometry()
|
||||||
|
.dot_weight(dot.into())
|
||||||
|
.pos(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<Point>>(),
|
.collect::<Vec<Point>>(),
|
||||||
|
|
@ -85,9 +107,7 @@ impl<'a, R: RulesTrait> GetMaybeApex for Zone<'a, R> {
|
||||||
.compound_members(self.index)
|
.compound_members(self.index)
|
||||||
.find_map(|primitive_node| {
|
.find_map(|primitive_node| {
|
||||||
if let PrimitiveIndex::FixedDot(dot) = primitive_node {
|
if let PrimitiveIndex::FixedDot(dot) = primitive_node {
|
||||||
if self.layout.drawing().primitive(dot).segs().is_empty()
|
if self.is_apex(dot) {
|
||||||
&& self.layout.drawing().primitive(dot).bends().is_empty()
|
|
||||||
{
|
|
||||||
return Some(dot);
|
return Some(dot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue