fix(drawing/drawing): Don't infringe upon wraparound limbs and its fillets' limbs

Sadly, this degrades performance considerably. But we will improve it later.
This commit is contained in:
Mikolaj Wielgus 2025-09-03 01:00:18 +02:00
parent c2cd565a9b
commit eb0ee25565
2 changed files with 27 additions and 3 deletions

View File

@ -771,7 +771,20 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
let to = self.add_dot_infringably(recorder, dot_weight); let to = self.add_dot_infringably(recorder, dot_weight);
let seg = self 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(|_| { .inspect_err(|_| {
self.recording_geometry_with_rtree self.recording_geometry_with_rtree
.remove_dot(recorder, to.into()); .remove_dot(recorder, to.into());

View File

@ -18,7 +18,7 @@ use crate::{
}, },
gear::GearIndex, gear::GearIndex,
graph::{GetMaybeNet, IsInLayer, MakePrimitive, PrimitiveIndex, PrimitiveWeight}, graph::{GetMaybeNet, IsInLayer, MakePrimitive, PrimitiveIndex, PrimitiveWeight},
primitive::MakePrimitiveShape, primitive::{GetLimbs, MakePrimitiveShape},
rules::AccessRules, rules::AccessRules,
seg::{ seg::{
FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegIndex, FixedSegIndex, FixedSegWeight, LoneLooseSegIndex, LoneLooseSegWeight, SegIndex,
@ -92,7 +92,18 @@ impl<R: AccessRules> Layout<R> {
seg_weight, seg_weight,
bend_weight, bend_weight,
sense, 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()
},
) )
} }