feat(router/draw): Try to add canes before trying to squeeze them through

This commit is contained in:
Mikolaj Wielgus 2025-07-22 12:56:21 +02:00 committed by mikolaj
parent 83285dde6d
commit 791291b82e
3 changed files with 68 additions and 23 deletions

View File

@ -258,9 +258,12 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
LooseIndex::Bend(bend) => { LooseIndex::Bend(bend) => {
bends.push(bend); bends.push(bend);
let bend_primitive = self.primitive(bend);
let inner = bend_primitive.inner();
for outer in self.primitive(bend).outers().collect::<Vec<_>>() { for outer in self.primitive(bend).outers().collect::<Vec<_>>() {
outers.push(outer); outers.push(outer);
self.reattach_bend(recorder, outer, self.primitive(bend).inner()); self.reattach_bend(recorder, outer, inner);
} }
} }
} }

View File

@ -73,7 +73,27 @@ impl<R> Layout<R> {
} }
impl<R: AccessRules> Layout<R> { impl<R: AccessRules> Layout<R> {
/// Insert [`Cane`] object into the [`Layout`] pub fn add_cane(
&mut self,
recorder: &mut LayoutEdit,
from: DotIndex,
around: GearIndex,
dot_weight: LooseDotWeight,
seg_weight: SeqLooseSegWeight,
bend_weight: LooseBendWeight,
sense: RotationSense,
) -> Result<Cane, DrawingException> {
self.drawing.add_cane(
recorder,
from,
around,
dot_weight,
seg_weight,
bend_weight,
sense,
)
}
pub fn insert_cane( pub fn insert_cane(
&mut self, &mut self,
recorder: &mut LayoutEdit, recorder: &mut LayoutEdit,

View File

@ -288,31 +288,53 @@ impl<R: AccessRules> DrawPrivate for Layout<R> {
) -> Result<CaneHead, DrawingException> { ) -> Result<CaneHead, DrawingException> {
let layer = head.face().primitive(self.drawing()).layer(); let layer = head.face().primitive(self.drawing()).layer();
let maybe_net = head.face().primitive(self.drawing()).maybe_net(); let maybe_net = head.face().primitive(self.drawing()).maybe_net();
let cane = self.insert_cane(
let dot_weight = LooseDotWeight(GeneralDotWeight {
circle: Circle {
pos: to,
r: width / 2.0,
},
layer,
maybe_net,
});
let seg_weight = SeqLooseSegWeight(GeneralSegWeight {
width,
layer,
maybe_net,
});
let bend_weight = LooseBendWeight(GeneralBendWeight {
width,
offset,
layer,
maybe_net,
});
// We first try to add cane. If this fails, we try to insert it instead.
// These two operations differ simply: cane insertion squeezes through
// under bends, cane addition does not.
let cane = if let Ok(cane) = self.add_cane(
recorder, recorder,
head.face(), head.face(),
around, around,
LooseDotWeight(GeneralDotWeight { dot_weight,
circle: Circle { seg_weight,
pos: to, bend_weight,
r: width / 2.0,
},
layer,
maybe_net,
}),
SeqLooseSegWeight(GeneralSegWeight {
width,
layer,
maybe_net,
}),
LooseBendWeight(GeneralBendWeight {
width,
offset,
layer,
maybe_net,
}),
sense, sense,
)?; ) {
cane
} else {
self.insert_cane(
recorder,
head.face(),
around,
dot_weight,
seg_weight,
bend_weight,
sense,
)?
};
Ok(CaneHead { Ok(CaneHead {
face: self.drawing().primitive(cane.bend).other_joint(cane.dot), face: self.drawing().primitive(cane.bend).other_joint(cane.dot),
cane, cane,