layout: fix apex detection - these can be joined with loose segs

This commit is contained in:
Mikolaj Wielgus 2024-05-11 02:39:50 +02:00
parent 452bcaf09d
commit b3f36d22b4
1 changed files with 26 additions and 6 deletions

View File

@ -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);
} }
} }