mirror of https://codeberg.org/topola/topola.git
feat(router/draw): Try to add canes before trying to squeeze them through
This commit is contained in:
parent
83285dde6d
commit
791291b82e
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue