From eb0ee2556522bce871c4d967f6c968d14058aad6 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 3 Sep 2025 01:00:18 +0200 Subject: [PATCH] fix(drawing/drawing): Don't infringe upon wraparound limbs and its fillets' limbs Sadly, this degrades performance considerably. But we will improve it later. --- src/drawing/drawing.rs | 15 ++++++++++++++- src/layout/layout.rs | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/drawing/drawing.rs b/src/drawing/drawing.rs index 182594c..20ec6d4 100644 --- a/src/drawing/drawing.rs +++ b/src/drawing/drawing.rs @@ -771,7 +771,20 @@ impl Drawing { let to = self.add_dot_infringably(recorder, dot_weight); let seg = self - .add_seg(recorder, from, seg_to.into(), seg_weight, filter) + .add_seg( + recorder, + from, + seg_to.into(), + seg_weight, + &|drawing, infringer, infringee| { + filter(drawing, infringer, infringee) + // Don't infringe upon limbs of the current wraparound. + && !PrimitiveIndex::from(around) + .primitive(drawing) + .limbs() + .contains(&infringee) + }, + ) .inspect_err(|_| { self.recording_geometry_with_rtree .remove_dot(recorder, to.into()); diff --git a/src/layout/layout.rs b/src/layout/layout.rs index cdba70d..d5db9d1 100644 --- a/src/layout/layout.rs +++ b/src/layout/layout.rs @@ -18,7 +18,7 @@ use crate::{ }, gear::GearIndex, graph::{GetMaybeNet, IsInLayer, MakePrimitive, PrimitiveIndex, PrimitiveWeight}, - primitive::MakePrimitiveShape, + primitive::{GetLimbs, MakePrimitiveShape}, rules::AccessRules, seg::{ FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegIndex, @@ -92,7 +92,18 @@ impl Layout { seg_weight, bend_weight, sense, - &|_drawing, _infringer, _infringee| true, + &|drawing, _infringer, infringee| { + // Don't infringe upon limbs of wraparound's filleteds. + !drawing + .overlapees(around.into()) + .find(|overlapee| { + PrimitiveIndex::from(overlapee.1) + .primitive(drawing) + .limbs() + .contains(&infringee) + }) + .is_some() + }, ) }