mirror of https://codeberg.org/topola/topola.git
refactor(drawing/drawing): Rename `.primitive(...)` to `.primitive_ref(...)`
This commit is contained in:
parent
2c94b50290
commit
62a4d6c413
|
|
@ -579,7 +579,12 @@ impl<'a> Displayer<'a> {
|
||||||
let (origin, destination) = (navmesh.origin(), navmesh.destination());
|
let (origin, destination) = (navmesh.origin(), navmesh.destination());
|
||||||
self.painter.paint_solid_circle(
|
self.painter.paint_solid_circle(
|
||||||
Circle {
|
Circle {
|
||||||
pos: board.layout().drawing().primitive(origin).shape().center(),
|
pos: board
|
||||||
|
.layout()
|
||||||
|
.drawing()
|
||||||
|
.primitive_ref(origin)
|
||||||
|
.shape()
|
||||||
|
.center(),
|
||||||
r: 150.0,
|
r: 150.0,
|
||||||
},
|
},
|
||||||
egui::Color32::from_rgb(255, 255, 100),
|
egui::Color32::from_rgb(255, 255, 100),
|
||||||
|
|
@ -589,7 +594,7 @@ impl<'a> Displayer<'a> {
|
||||||
pos: board
|
pos: board
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(destination)
|
.primitive_ref(destination)
|
||||||
.shape()
|
.shape()
|
||||||
.center(),
|
.center(),
|
||||||
r: 150.0,
|
r: 150.0,
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ impl Anterouter {
|
||||||
.board()
|
.board()
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(source_dot)
|
.primitive_ref(source_dot)
|
||||||
.shape()
|
.shape()
|
||||||
.envelope()
|
.envelope()
|
||||||
};
|
};
|
||||||
|
|
@ -400,20 +400,20 @@ impl Anterouter {
|
||||||
.board()
|
.board()
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(source_dot)
|
.primitive_ref(source_dot)
|
||||||
.layer();
|
.layer();
|
||||||
let pin_maybe_net = autorouter
|
let pin_maybe_net = autorouter
|
||||||
.board()
|
.board()
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(source_dot)
|
.primitive_ref(source_dot)
|
||||||
.maybe_net();
|
.maybe_net();
|
||||||
let bbox_center = point! {x: bbox.center()[0], y: bbox.center()[1]};
|
let bbox_center = point! {x: bbox.center()[0], y: bbox.center()[1]};
|
||||||
let center = autorouter
|
let center = autorouter
|
||||||
.board()
|
.board()
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(source_dot)
|
.primitive_ref(source_dot)
|
||||||
.shape()
|
.shape()
|
||||||
.center();
|
.center();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,27 +78,27 @@ impl ConnectedComponents {
|
||||||
) {
|
) {
|
||||||
match primitive {
|
match primitive {
|
||||||
PrimitiveIndex::FixedSeg(seg) => {
|
PrimitiveIndex::FixedSeg(seg) => {
|
||||||
let joints = board.layout().drawing().primitive(seg).joints();
|
let joints = board.layout().drawing().primitive_ref(seg).joints();
|
||||||
dot_unionfind.union(joints.0.index(), joints.1.index());
|
dot_unionfind.union(joints.0.index(), joints.1.index());
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
||||||
}
|
}
|
||||||
PrimitiveIndex::LoneLooseSeg(seg) => {
|
PrimitiveIndex::LoneLooseSeg(seg) => {
|
||||||
let joints = board.layout().drawing().primitive(seg).joints();
|
let joints = board.layout().drawing().primitive_ref(seg).joints();
|
||||||
dot_unionfind.union(joints.0.index(), joints.1.index());
|
dot_unionfind.union(joints.0.index(), joints.1.index());
|
||||||
}
|
}
|
||||||
PrimitiveIndex::SeqLooseSeg(seg) => {
|
PrimitiveIndex::SeqLooseSeg(seg) => {
|
||||||
let joints = board.layout().drawing().primitive(seg).joints();
|
let joints = board.layout().drawing().primitive_ref(seg).joints();
|
||||||
dot_unionfind.union(joints.0.index(), joints.1.index());
|
dot_unionfind.union(joints.0.index(), joints.1.index());
|
||||||
}
|
}
|
||||||
PrimitiveIndex::FixedBend(bend) => {
|
PrimitiveIndex::FixedBend(bend) => {
|
||||||
let joints = board.layout().drawing().primitive(bend).joints();
|
let joints = board.layout().drawing().primitive_ref(bend).joints();
|
||||||
dot_unionfind.union(joints.0.index(), joints.1.index());
|
dot_unionfind.union(joints.0.index(), joints.1.index());
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
||||||
}
|
}
|
||||||
PrimitiveIndex::LooseBend(bend) => {
|
PrimitiveIndex::LooseBend(bend) => {
|
||||||
let joints = board.layout().drawing().primitive(bend).joints();
|
let joints = board.layout().drawing().primitive_ref(bend).joints();
|
||||||
dot_unionfind.union(joints.0.index(), joints.1.index());
|
dot_unionfind.union(joints.0.index(), joints.1.index());
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
|
|
@ -143,31 +143,31 @@ impl ConnectedComponents {
|
||||||
dot_unionfind.union(common.index(), dot.index());
|
dot_unionfind.union(common.index(), dot.index());
|
||||||
}
|
}
|
||||||
PrimitiveIndex::FixedSeg(seg) => {
|
PrimitiveIndex::FixedSeg(seg) => {
|
||||||
let joints = board.layout().drawing().primitive(seg).joints();
|
let joints = board.layout().drawing().primitive_ref(seg).joints();
|
||||||
dot_unionfind.union(common.index(), joints.0.index());
|
dot_unionfind.union(common.index(), joints.0.index());
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
||||||
dot_unionfind.union(common.index(), joints.1.index());
|
dot_unionfind.union(common.index(), joints.1.index());
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
||||||
}
|
}
|
||||||
PrimitiveIndex::LoneLooseSeg(seg) => {
|
PrimitiveIndex::LoneLooseSeg(seg) => {
|
||||||
let joints = board.layout().drawing().primitive(seg).joints();
|
let joints = board.layout().drawing().primitive_ref(seg).joints();
|
||||||
dot_unionfind.union(common.index(), joints.0.index());
|
dot_unionfind.union(common.index(), joints.0.index());
|
||||||
dot_unionfind.union(common.index(), joints.1.index());
|
dot_unionfind.union(common.index(), joints.1.index());
|
||||||
}
|
}
|
||||||
PrimitiveIndex::SeqLooseSeg(seg) => {
|
PrimitiveIndex::SeqLooseSeg(seg) => {
|
||||||
let joints = board.layout().drawing().primitive(seg).joints();
|
let joints = board.layout().drawing().primitive_ref(seg).joints();
|
||||||
dot_unionfind.union(common.index(), joints.0.index());
|
dot_unionfind.union(common.index(), joints.0.index());
|
||||||
dot_unionfind.union(common.index(), joints.1.index());
|
dot_unionfind.union(common.index(), joints.1.index());
|
||||||
}
|
}
|
||||||
PrimitiveIndex::FixedBend(bend) => {
|
PrimitiveIndex::FixedBend(bend) => {
|
||||||
let joints = board.layout().drawing().primitive(bend).joints();
|
let joints = board.layout().drawing().primitive_ref(bend).joints();
|
||||||
dot_unionfind.union(common.index(), joints.0.index());
|
dot_unionfind.union(common.index(), joints.0.index());
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.0);
|
||||||
dot_unionfind.union(common.index(), joints.1.index());
|
dot_unionfind.union(common.index(), joints.1.index());
|
||||||
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
Self::unionize_fixed_dot_via(board, dot_unionfind, joints.1);
|
||||||
}
|
}
|
||||||
PrimitiveIndex::LooseBend(bend) => {
|
PrimitiveIndex::LooseBend(bend) => {
|
||||||
let joints = board.layout().drawing().primitive(bend).joints();
|
let joints = board.layout().drawing().primitive_ref(bend).joints();
|
||||||
dot_unionfind.union(common.index(), joints.0.index());
|
dot_unionfind.union(common.index(), joints.0.index());
|
||||||
dot_unionfind.union(common.index(), joints.1.index());
|
dot_unionfind.union(common.index(), joints.1.index());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ impl Ratsnest {
|
||||||
// should only go to their centerpoints.
|
// should only go to their centerpoints.
|
||||||
if board.layout().drawing().compounds(dot).next().is_none() {
|
if board.layout().drawing().compounds(dot).next().is_none() {
|
||||||
handle_ratvertex_weight(
|
handle_ratvertex_weight(
|
||||||
board.layout().drawing().primitive(dot).maybe_net(),
|
board.layout().drawing().primitive_ref(dot).maybe_net(),
|
||||||
RatvertexNodeIndex::FixedDot(dot),
|
RatvertexNodeIndex::FixedDot(dot),
|
||||||
node.primitive_ref(board.layout().drawing())
|
node.primitive_ref(board.layout().drawing())
|
||||||
.shape()
|
.shape()
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,7 @@ impl<CW, Cel, R> Drawing<CW, Cel, R> {
|
||||||
&mut self.rules
|
&mut self.rules
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn primitive<W>(&self, index: GenericIndex<W>) -> GenericPrimitive<'_, W, CW, Cel, R> {
|
pub fn primitive_ref<W>(&self, index: GenericIndex<W>) -> GenericPrimitive<'_, W, CW, Cel, R> {
|
||||||
GenericPrimitive::new(index, self)
|
GenericPrimitive::new(index, self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -260,10 +260,10 @@ 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 bend_primitive = self.primitive_ref(bend);
|
||||||
let inner = bend_primitive.inner();
|
let inner = bend_primitive.inner();
|
||||||
|
|
||||||
for outer in self.primitive(bend).outers().collect::<Vec<_>>() {
|
for outer in self.primitive_ref(bend).outers().collect::<Vec<_>>() {
|
||||||
outers.push(outer);
|
outers.push(outer);
|
||||||
self.reattach_bend(recorder, outer, inner);
|
self.reattach_bend(recorder, outer, inner);
|
||||||
}
|
}
|
||||||
|
|
@ -555,8 +555,8 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
filter: &impl Fn(&Self, PrimitiveIndex, PrimitiveIndex) -> bool,
|
filter: &impl Fn(&Self, PrimitiveIndex, PrimitiveIndex) -> bool,
|
||||||
) -> Result<GenericIndex<LooseBendWeight>, Infringement> {
|
) -> Result<GenericIndex<LooseBendWeight>, Infringement> {
|
||||||
let core = match inner {
|
let core = match inner {
|
||||||
BendIndex::Fixed(bend) => self.primitive(bend).core(),
|
BendIndex::Fixed(bend) => self.primitive_ref(bend).core(),
|
||||||
BendIndex::Loose(bend) => self.primitive(bend).core(),
|
BendIndex::Loose(bend) => self.primitive_ref(bend).core(),
|
||||||
};
|
};
|
||||||
let bend = self.recording_geometry_with_rtree.add_bend(
|
let bend = self.recording_geometry_with_rtree.add_bend(
|
||||||
recorder,
|
recorder,
|
||||||
|
|
@ -621,10 +621,10 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
self.reattach_bend(recorder, gear, Some(cane.bend));
|
self.reattach_bend(recorder, gear, Some(cane.bend));
|
||||||
}
|
}
|
||||||
|
|
||||||
for outer in self.primitive(cane.bend).outers().collect::<Vec<_>>() {
|
for outer in self.primitive_ref(cane.bend).outers().collect::<Vec<_>>() {
|
||||||
self.update_this_and_outward_bows(recorder, outer)
|
self.update_this_and_outward_bows(recorder, outer)
|
||||||
.inspect_err(|_| {
|
.inspect_err(|_| {
|
||||||
let joint = self.primitive(cane.bend).other_joint(cane.dot);
|
let joint = self.primitive_ref(cane.bend).other_joint(cane.dot);
|
||||||
self.remove_cane(recorder, &cane, joint);
|
self.remove_cane(recorder, &cane, joint);
|
||||||
})?;
|
})?;
|
||||||
}
|
}
|
||||||
|
|
@ -640,7 +640,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
) -> Result<(), DrawingException> {
|
) -> Result<(), DrawingException> {
|
||||||
self.update_bow(recorder, around)?;
|
self.update_bow(recorder, around)?;
|
||||||
|
|
||||||
let mut outwards = self.primitive(around).outwards();
|
let mut outwards = self.primitive_ref(around).outwards();
|
||||||
while let Some(rail) = outwards.walk_next(self) {
|
while let Some(rail) = outwards.walk_next(self) {
|
||||||
self.update_bow(recorder, rail)?;
|
self.update_bow(recorder, rail)?;
|
||||||
}
|
}
|
||||||
|
|
@ -653,7 +653,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
recorder: &mut DrawingEdit<CW, Cel>,
|
recorder: &mut DrawingEdit<CW, Cel>,
|
||||||
rail: LooseBendIndex,
|
rail: LooseBendIndex,
|
||||||
) -> Result<(), DrawingException> {
|
) -> Result<(), DrawingException> {
|
||||||
let rail_primitive = self.primitive(rail);
|
let rail_primitive = self.primitive_ref(rail);
|
||||||
let joints = rail_primitive.joints();
|
let joints = rail_primitive.joints();
|
||||||
let width = rail_primitive.width();
|
let width = rail_primitive.width();
|
||||||
|
|
||||||
|
|
@ -786,11 +786,11 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
cane: &Cane,
|
cane: &Cane,
|
||||||
face: LooseDotIndex,
|
face: LooseDotIndex,
|
||||||
) {
|
) {
|
||||||
let outers = self.primitive(cane.bend).outers().collect::<Vec<_>>();
|
let outers = self.primitive_ref(cane.bend).outers().collect::<Vec<_>>();
|
||||||
|
|
||||||
// Removing a loose bend affects its outer bends.
|
// Removing a loose bend affects its outer bends.
|
||||||
for outer in &outers {
|
for outer in &outers {
|
||||||
self.reattach_bend(recorder, *outer, self.primitive(cane.bend).inner());
|
self.reattach_bend(recorder, *outer, self.primitive_ref(cane.bend).inner());
|
||||||
}
|
}
|
||||||
|
|
||||||
self.recording_geometry_with_rtree
|
self.recording_geometry_with_rtree
|
||||||
|
|
|
||||||
|
|
@ -63,9 +63,9 @@ pub enum GearRef<'a, CW, Cel, R> {
|
||||||
impl<'a, CW, Cel, R> GearRef<'a, CW, Cel, R> {
|
impl<'a, CW, Cel, R> GearRef<'a, CW, Cel, R> {
|
||||||
pub fn new(index: GearIndex, drawing: &'a Drawing<CW, Cel, R>) -> Self {
|
pub fn new(index: GearIndex, drawing: &'a Drawing<CW, Cel, R>) -> Self {
|
||||||
match index {
|
match index {
|
||||||
GearIndex::FixedDot(dot) => drawing.primitive(dot).into(),
|
GearIndex::FixedDot(dot) => drawing.primitive_ref(dot).into(),
|
||||||
GearIndex::FixedBend(bend) => drawing.primitive(bend).into(),
|
GearIndex::FixedBend(bend) => drawing.primitive_ref(bend).into(),
|
||||||
GearIndex::LooseBend(bend) => drawing.primitive(bend).into(),
|
GearIndex::LooseBend(bend) => drawing.primitive_ref(bend).into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -102,7 +102,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Walker<&Drawing<CW, Cel, R>> for Draw
|
||||||
|
|
||||||
fn walk_next(&mut self, drawing: &Drawing<CW, Cel, R>) -> Option<Self::Item> {
|
fn walk_next(&mut self, drawing: &Drawing<CW, Cel, R>) -> Option<Self::Item> {
|
||||||
let front = self.frontier.pop_front()?;
|
let front = self.frontier.pop_front()?;
|
||||||
self.frontier.extend(drawing.primitive(front).outers());
|
self.frontier.extend(drawing.primitive_ref(front).outers());
|
||||||
|
|
||||||
Some(front)
|
Some(front)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
) -> Result<Line, NoBitangents> {
|
) -> Result<Line, NoBitangents> {
|
||||||
let from_circle = self.head_circle(head, width);
|
let from_circle = self.head_circle(head, width);
|
||||||
let to_circle = Circle {
|
let to_circle = Circle {
|
||||||
pos: self.primitive(into).weight().0.circle.pos,
|
pos: self.primitive_ref(into).weight().0.circle.pos,
|
||||||
r: 0.0,
|
r: 0.0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
|
|
||||||
pub fn head_sense(&self, head: &Head) -> Option<RotationSense> {
|
pub fn head_sense(&self, head: &Head) -> Option<RotationSense> {
|
||||||
if let Head::Cane(head) = head {
|
if let Head::Cane(head) = head {
|
||||||
let joints = self.primitive(head.cane.bend).joints();
|
let joints = self.primitive_ref(head.cane.bend).joints();
|
||||||
|
|
||||||
if head.face() == joints.0.into() {
|
if head.face() == joints.0.into() {
|
||||||
Some(RotationSense::Counterclockwise)
|
Some(RotationSense::Counterclockwise)
|
||||||
|
|
@ -206,7 +206,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
r: 0.0,
|
r: 0.0,
|
||||||
},
|
},
|
||||||
Head::Cane(head) => {
|
Head::Cane(head) => {
|
||||||
if let Some(inner) = self.primitive(head.cane.bend).inner() {
|
if let Some(inner) = self.primitive_ref(head.cane.bend).inner() {
|
||||||
self.bend_circle(
|
self.bend_circle(
|
||||||
inner.into(),
|
inner.into(),
|
||||||
width,
|
width,
|
||||||
|
|
@ -214,7 +214,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
self.dot_circle(
|
self.dot_circle(
|
||||||
self.primitive(head.cane.bend).core().into(),
|
self.primitive_ref(head.cane.bend).core().into(),
|
||||||
width,
|
width,
|
||||||
self.conditions(head.face().into()).as_ref(),
|
self.conditions(head.face().into()).as_ref(),
|
||||||
)
|
)
|
||||||
|
|
@ -224,7 +224,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rear(&self, head: CaneHead) -> DotIndex {
|
fn rear(&self, head: CaneHead) -> DotIndex {
|
||||||
self.primitive(head.cane.seg)
|
self.primitive_ref(head.cane.seg)
|
||||||
.other_joint(head.cane.dot.into())
|
.other_joint(head.cane.dot.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -103,8 +103,15 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> MeasureLength for HeadRef<'_, CW, Cel
|
||||||
match self.head {
|
match self.head {
|
||||||
Head::Bare(..) => 0.0,
|
Head::Bare(..) => 0.0,
|
||||||
Head::Cane(cane_head) => {
|
Head::Cane(cane_head) => {
|
||||||
self.drawing.primitive(cane_head.cane.seg).shape().length()
|
self.drawing
|
||||||
+ self.drawing.primitive(cane_head.cane.bend).shape().length()
|
.primitive_ref(cane_head.cane.seg)
|
||||||
|
.shape()
|
||||||
|
.length()
|
||||||
|
+ self
|
||||||
|
.drawing
|
||||||
|
.primitive_ref(cane_head.cane.bend)
|
||||||
|
.shape()
|
||||||
|
.length()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,10 +81,10 @@ pub enum Loose<'a, CW, Cel, R> {
|
||||||
impl<'a, CW, Cel, R> Loose<'a, CW, Cel, R> {
|
impl<'a, CW, Cel, R> Loose<'a, CW, Cel, R> {
|
||||||
pub fn new(index: LooseIndex, drawing: &'a Drawing<CW, Cel, R>) -> Self {
|
pub fn new(index: LooseIndex, drawing: &'a Drawing<CW, Cel, R>) -> Self {
|
||||||
match index {
|
match index {
|
||||||
LooseIndex::Dot(dot) => drawing.primitive(dot).into(),
|
LooseIndex::Dot(dot) => drawing.primitive_ref(dot).into(),
|
||||||
LooseIndex::LoneSeg(seg) => drawing.primitive(seg).into(),
|
LooseIndex::LoneSeg(seg) => drawing.primitive_ref(seg).into(),
|
||||||
LooseIndex::SeqSeg(seg) => drawing.primitive(seg).into(),
|
LooseIndex::SeqSeg(seg) => drawing.primitive_ref(seg).into(),
|
||||||
LooseIndex::Bend(bend) => drawing.primitive(bend).into(),
|
LooseIndex::Bend(bend) => drawing.primitive_ref(bend).into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
pub fn collect_bend_outward_bows(&self, bend: LooseBendIndex) -> Vec<PrimitiveIndex> {
|
pub fn collect_bend_outward_bows(&self, bend: LooseBendIndex) -> Vec<PrimitiveIndex> {
|
||||||
let mut v = vec![];
|
let mut v = vec![];
|
||||||
|
|
||||||
let mut outwards = self.primitive(bend).outwards();
|
let mut outwards = self.primitive_ref(bend).outwards();
|
||||||
while let Some(next) = outwards.walk_next(self) {
|
while let Some(next) = outwards.walk_next(self) {
|
||||||
v.append(&mut self.collect_bend_bow(next));
|
v.append(&mut self.collect_bend_bow(next));
|
||||||
}
|
}
|
||||||
|
|
@ -102,7 +102,7 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
let mut v: Vec<PrimitiveIndex> = vec![];
|
let mut v: Vec<PrimitiveIndex> = vec![];
|
||||||
v.push(bend.into());
|
v.push(bend.into());
|
||||||
|
|
||||||
let joints = self.primitive(bend).joints();
|
let joints = self.primitive_ref(bend).joints();
|
||||||
v.push(joints.0.into());
|
v.push(joints.0.into());
|
||||||
v.push(joints.1.into());
|
v.push(joints.1.into());
|
||||||
|
|
||||||
|
|
@ -117,11 +117,11 @@ impl<CW: Clone, Cel: Copy, R: AccessRules> Drawing<CW, Cel, R> {
|
||||||
&self,
|
&self,
|
||||||
bend: LooseBendIndex,
|
bend: LooseBendIndex,
|
||||||
) -> impl Iterator<Item = SeqLooseSegIndex> {
|
) -> impl Iterator<Item = SeqLooseSegIndex> {
|
||||||
let joints = self.primitive(bend).joints();
|
let joints = self.primitive_ref(bend).joints();
|
||||||
self.primitive(joints.0)
|
self.primitive_ref(joints.0)
|
||||||
.seg()
|
.seg()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.chain(self.primitive(joints.1).seg().into_iter())
|
.chain(self.primitive_ref(joints.1).seg().into_iter())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cut(
|
pub fn cut(
|
||||||
|
|
|
||||||
|
|
@ -150,11 +150,11 @@ fn is_apex<R>(
|
||||||
dot: FixedDotIndex,
|
dot: FixedDotIndex,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
!drawing
|
!drawing
|
||||||
.primitive(dot)
|
.primitive_ref(dot)
|
||||||
.segs()
|
.segs()
|
||||||
.iter()
|
.iter()
|
||||||
.any(|seg| matches!(seg, SegIndex::Fixed(..)))
|
.any(|seg| matches!(seg, SegIndex::Fixed(..)))
|
||||||
&& drawing.primitive(dot).bends().is_empty()
|
&& drawing.primitive_ref(dot).bends().is_empty()
|
||||||
// FIXME: Only the following should be needed to make sure dot is an apex.
|
// FIXME: Only the following should be needed to make sure dot is an apex.
|
||||||
// But for some reason I had to keep the above part.
|
// But for some reason I had to keep the above part.
|
||||||
|| drawing
|
|| drawing
|
||||||
|
|
|
||||||
|
|
@ -192,7 +192,7 @@ impl<R: AccessRules> Draw for Layout<R> {
|
||||||
fn undo_cane(&mut self, recorder: &mut LayoutEdit, head: CaneHead) -> Option<Head> {
|
fn undo_cane(&mut self, recorder: &mut LayoutEdit, head: CaneHead) -> Option<Head> {
|
||||||
let prev_dot = self
|
let prev_dot = self
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(head.cane.seg)
|
.primitive_ref(head.cane.seg)
|
||||||
.other_joint(head.cane.dot.into());
|
.other_joint(head.cane.dot.into());
|
||||||
|
|
||||||
self.remove_cane(recorder, &head.cane, head.face);
|
self.remove_cane(recorder, &head.cane, head.face);
|
||||||
|
|
@ -337,7 +337,10 @@ impl<R: AccessRules> DrawPrivate for Layout<R> {
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(CaneHead {
|
Ok(CaneHead {
|
||||||
face: self.drawing().primitive(cane.bend).other_joint(cane.dot),
|
face: self
|
||||||
|
.drawing()
|
||||||
|
.primitive_ref(cane.bend)
|
||||||
|
.other_joint(cane.dot),
|
||||||
cane,
|
cane,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ impl Navcord {
|
||||||
let bend_length = match self.head {
|
let bend_length = match self.head {
|
||||||
Head::Cane(old_cane_head) => layout
|
Head::Cane(old_cane_head) => layout
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(old_cane_head.cane.bend)
|
.primitive_ref(old_cane_head.cane.bend)
|
||||||
.shape()
|
.shape()
|
||||||
.length(),
|
.length(),
|
||||||
Head::Bare(..) => 0.0,
|
Head::Bare(..) => 0.0,
|
||||||
|
|
@ -148,7 +148,7 @@ impl Navcord {
|
||||||
let prev_bend_length = match old_head {
|
let prev_bend_length = match old_head {
|
||||||
Head::Cane(old_cane_head) => layout
|
Head::Cane(old_cane_head) => layout
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(old_cane_head.cane.bend)
|
.primitive_ref(old_cane_head.cane.bend)
|
||||||
.shape()
|
.shape()
|
||||||
.length(),
|
.length(),
|
||||||
Head::Bare(..) => 0.0,
|
Head::Bare(..) => 0.0,
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ use std::collections::BTreeMap;
|
||||||
|
|
||||||
use derive_getters::Getters;
|
use derive_getters::Getters;
|
||||||
use enum_dispatch::enum_dispatch;
|
use enum_dispatch::enum_dispatch;
|
||||||
|
use geo::Point;
|
||||||
use petgraph::{
|
use petgraph::{
|
||||||
data::DataMap,
|
data::DataMap,
|
||||||
graph::UnGraph,
|
graph::UnGraph,
|
||||||
|
|
@ -25,10 +26,10 @@ use crate::{
|
||||||
dot::FixedDotIndex,
|
dot::FixedDotIndex,
|
||||||
gear::{GearIndex, GetOuterGears, WalkOutwards},
|
gear::{GearIndex, GetOuterGears, WalkOutwards},
|
||||||
graph::{MakePrimitiveRef, PrimitiveIndex},
|
graph::{MakePrimitiveRef, PrimitiveIndex},
|
||||||
primitive::GetJoints,
|
primitive::{GetJoints, MakePrimitiveShape},
|
||||||
rules::AccessRules,
|
rules::AccessRules,
|
||||||
},
|
},
|
||||||
geometry::GetLayer,
|
geometry::{primitive::PrimitiveShape, shape::AccessShape, GetLayer},
|
||||||
graph::{GenericIndex, GetIndex, MakeRef},
|
graph::{GenericIndex, GetIndex, MakeRef},
|
||||||
layout::{CompoundEntryLabel, Layout},
|
layout::{CompoundEntryLabel, Layout},
|
||||||
math::RotationSense,
|
math::RotationSense,
|
||||||
|
|
@ -36,7 +37,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
prenavmesh::{Prenavmesh, PrenavmeshNodeIndex},
|
prenavmesh::{Prenavmesh, PrenavnodeNodeIndex},
|
||||||
RouterOptions,
|
RouterOptions,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -66,11 +67,11 @@ pub enum BinavnodeNodeIndex {
|
||||||
LooseBend(LooseBendIndex),
|
LooseBend(LooseBendIndex),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<PrenavmeshNodeIndex> for BinavnodeNodeIndex {
|
impl From<PrenavnodeNodeIndex> for BinavnodeNodeIndex {
|
||||||
fn from(node: PrenavmeshNodeIndex) -> Self {
|
fn from(node: PrenavnodeNodeIndex) -> Self {
|
||||||
match node {
|
match node {
|
||||||
PrenavmeshNodeIndex::FixedDot(dot) => BinavnodeNodeIndex::FixedDot(dot),
|
PrenavnodeNodeIndex::FixedDot(dot) => BinavnodeNodeIndex::FixedDot(dot),
|
||||||
PrenavmeshNodeIndex::FixedBend(bend) => BinavnodeNodeIndex::FixedBend(bend),
|
PrenavnodeNodeIndex::FixedBend(bend) => BinavnodeNodeIndex::FixedBend(bend),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -224,7 +225,7 @@ impl Navmesh {
|
||||||
while let Some(outward) = outwards.walk_next(layout.drawing()) {
|
while let Some(outward) = outwards.walk_next(layout.drawing()) {
|
||||||
if layout
|
if layout
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(outward)
|
.primitive_ref(outward)
|
||||||
.outers()
|
.outers()
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.is_empty()
|
.is_empty()
|
||||||
|
|
@ -280,7 +281,7 @@ impl Navmesh {
|
||||||
// Copy prenavedges of prenavnodes union representatives to all elements
|
// Copy prenavedges of prenavnodes union representatives to all elements
|
||||||
// for each union.
|
// for each union.
|
||||||
for prenavnode in prenavmesh.triangulation().node_identifiers() {
|
for prenavnode in prenavmesh.triangulation().node_identifiers() {
|
||||||
let repr = PrenavmeshNodeIndex::FixedDot(GenericIndex::new(
|
let repr = PrenavnodeNodeIndex::FixedDot(GenericIndex::new(
|
||||||
overlapping_prenavnodes_unions.find(prenavnode.index()),
|
overlapping_prenavnodes_unions.find(prenavnode.index()),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
@ -330,7 +331,7 @@ impl Navmesh {
|
||||||
fn unionize_with_overlapees(
|
fn unionize_with_overlapees(
|
||||||
layout: &Layout<impl AccessRules>,
|
layout: &Layout<impl AccessRules>,
|
||||||
overlapping_prenavnodes_unions: &mut UnionFind<usize>,
|
overlapping_prenavnodes_unions: &mut UnionFind<usize>,
|
||||||
prenavnode: PrenavmeshNodeIndex,
|
prenavnode: PrenavnodeNodeIndex,
|
||||||
) {
|
) {
|
||||||
// Ignore overlaps of a fillet.
|
// Ignore overlaps of a fillet.
|
||||||
if layout
|
if layout
|
||||||
|
|
@ -364,10 +365,10 @@ impl Navmesh {
|
||||||
fn add_prenavnode_as_binavnode(
|
fn add_prenavnode_as_binavnode(
|
||||||
graph: &mut UnGraph<NavnodeWeight, (), usize>,
|
graph: &mut UnGraph<NavnodeWeight, (), usize>,
|
||||||
prenavnode_to_navnodes: &mut BTreeMap<
|
prenavnode_to_navnodes: &mut BTreeMap<
|
||||||
PrenavmeshNodeIndex,
|
PrenavnodeNodeIndex,
|
||||||
Vec<(NodeIndex<usize>, NodeIndex<usize>)>,
|
Vec<(NodeIndex<usize>, NodeIndex<usize>)>,
|
||||||
>,
|
>,
|
||||||
prenavnode: PrenavmeshNodeIndex,
|
prenavnode: PrenavnodeNodeIndex,
|
||||||
binavnode: BinavnodeNodeIndex,
|
binavnode: BinavnodeNodeIndex,
|
||||||
) {
|
) {
|
||||||
let navnode1 = graph.add_node(NavnodeWeight {
|
let navnode1 = graph.add_node(NavnodeWeight {
|
||||||
|
|
@ -390,19 +391,19 @@ impl Navmesh {
|
||||||
layout: &Layout<impl AccessRules>,
|
layout: &Layout<impl AccessRules>,
|
||||||
graph: &mut UnGraph<NavnodeWeight, (), usize>,
|
graph: &mut UnGraph<NavnodeWeight, (), usize>,
|
||||||
prenavnode_to_navnodes: &BTreeMap<
|
prenavnode_to_navnodes: &BTreeMap<
|
||||||
PrenavmeshNodeIndex,
|
PrenavnodeNodeIndex,
|
||||||
Vec<(NodeIndex<usize>, NodeIndex<usize>)>,
|
Vec<(NodeIndex<usize>, NodeIndex<usize>)>,
|
||||||
>,
|
>,
|
||||||
overlapping_prenavnodes_unions: &UnionFind<usize>,
|
overlapping_prenavnodes_unions: &UnionFind<usize>,
|
||||||
from_prenavnode: PrenavmeshNodeIndex,
|
from_prenavnode: PrenavnodeNodeIndex,
|
||||||
to_prenavnode: PrenavmeshNodeIndex,
|
to_prenavnode: PrenavnodeNodeIndex,
|
||||||
) {
|
) {
|
||||||
// We assume prenavmesh nodes are fixed dots. This is an ugly shortcut,
|
// We assume prenavmesh nodes are fixed dots. This is an ugly shortcut,
|
||||||
// since fixed bends also can be prenavnodes, but it works for now.
|
// since fixed bends also can be prenavnodes, but it works for now.
|
||||||
let from_prenavnode_repr = PrenavmeshNodeIndex::FixedDot(GenericIndex::new(
|
let from_prenavnode_repr = PrenavnodeNodeIndex::FixedDot(GenericIndex::new(
|
||||||
overlapping_prenavnodes_unions.find(from_prenavnode.index().into()),
|
overlapping_prenavnodes_unions.find(from_prenavnode.index().into()),
|
||||||
));
|
));
|
||||||
let to_prenavnode_repr = PrenavmeshNodeIndex::FixedDot(GenericIndex::new(
|
let to_prenavnode_repr = PrenavnodeNodeIndex::FixedDot(GenericIndex::new(
|
||||||
overlapping_prenavnodes_unions.find(to_prenavnode.index().into()),
|
overlapping_prenavnodes_unions.find(to_prenavnode.index().into()),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
@ -419,11 +420,11 @@ impl Navmesh {
|
||||||
layout: &Layout<impl AccessRules>,
|
layout: &Layout<impl AccessRules>,
|
||||||
graph: &mut UnGraph<NavnodeWeight, (), usize>,
|
graph: &mut UnGraph<NavnodeWeight, (), usize>,
|
||||||
prenavnode_to_navnodes: &BTreeMap<
|
prenavnode_to_navnodes: &BTreeMap<
|
||||||
PrenavmeshNodeIndex,
|
PrenavnodeNodeIndex,
|
||||||
Vec<(NodeIndex<usize>, NodeIndex<usize>)>,
|
Vec<(NodeIndex<usize>, NodeIndex<usize>)>,
|
||||||
>,
|
>,
|
||||||
from_prenavnode: PrenavmeshNodeIndex,
|
from_prenavnode: PrenavnodeNodeIndex,
|
||||||
to_prenavnode: PrenavmeshNodeIndex,
|
to_prenavnode: PrenavnodeNodeIndex,
|
||||||
) {
|
) {
|
||||||
let mut maybe_lowest_join: Option<(usize, usize)> = None;
|
let mut maybe_lowest_join: Option<(usize, usize)> = None;
|
||||||
|
|
||||||
|
|
@ -507,12 +508,22 @@ impl Navmesh {
|
||||||
// Besides checking if binavnodes are joined, we make sure that they
|
// Besides checking if binavnodes are joined, we make sure that they
|
||||||
// have the same rotation sense.
|
// have the same rotation sense.
|
||||||
|
|
||||||
let from_bend_joints = layout.drawing().primitive(from_bend).joints();
|
let from_bend_joints = layout.drawing().primitive_ref(from_bend).joints();
|
||||||
let to_bend_joints = layout.drawing().primitive(to_bend).joints();
|
let to_bend_joints = layout.drawing().primitive_ref(to_bend).joints();
|
||||||
|
|
||||||
let (from_joints, to_joints) = if layout.drawing().primitive(*common_seg).joints().0.index()
|
let (from_joints, to_joints) = if layout
|
||||||
|
.drawing()
|
||||||
|
.primitive_ref(*common_seg)
|
||||||
|
.joints()
|
||||||
|
.0
|
||||||
|
.index()
|
||||||
== from_bend_joints.0.index()
|
== from_bend_joints.0.index()
|
||||||
|| layout.drawing().primitive(*common_seg).joints().0.index()
|
|| layout
|
||||||
|
.drawing()
|
||||||
|
.primitive_ref(*common_seg)
|
||||||
|
.joints()
|
||||||
|
.0
|
||||||
|
.index()
|
||||||
== from_bend_joints.1.index()
|
== from_bend_joints.1.index()
|
||||||
{
|
{
|
||||||
(from_bend_joints, to_bend_joints)
|
(from_bend_joints, to_bend_joints)
|
||||||
|
|
@ -521,9 +532,21 @@ impl Navmesh {
|
||||||
};
|
};
|
||||||
|
|
||||||
[from_joints.0, from_joints.1].iter().position(|joint| {
|
[from_joints.0, from_joints.1].iter().position(|joint| {
|
||||||
joint.index() == layout.drawing().primitive(*common_seg).joints().0.index()
|
joint.index()
|
||||||
|
== layout
|
||||||
|
.drawing()
|
||||||
|
.primitive_ref(*common_seg)
|
||||||
|
.joints()
|
||||||
|
.0
|
||||||
|
.index()
|
||||||
}) != [to_joints.0, to_joints.1].iter().position(|joint| {
|
}) != [to_joints.0, to_joints.1].iter().position(|joint| {
|
||||||
joint.index() == layout.drawing().primitive(*common_seg).joints().1.index()
|
joint.index()
|
||||||
|
== layout
|
||||||
|
.drawing()
|
||||||
|
.primitive_ref(*common_seg)
|
||||||
|
.joints()
|
||||||
|
.1
|
||||||
|
.index()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,28 +31,28 @@ use super::{navmesh::NavmeshError, RouterOptions};
|
||||||
/// of the prenavmesh nodes into more nodes, called navnodes.
|
/// of the prenavmesh nodes into more nodes, called navnodes.
|
||||||
#[enum_dispatch(GetIndex, MakePrimitive)]
|
#[enum_dispatch(GetIndex, MakePrimitive)]
|
||||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
|
||||||
pub enum PrenavmeshNodeIndex {
|
pub enum PrenavnodeNodeIndex {
|
||||||
FixedDot(FixedDotIndex),
|
FixedDot(FixedDotIndex),
|
||||||
FixedBend(FixedBendIndex),
|
FixedBend(FixedBendIndex),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<PrenavmeshNodeIndex> for PrimitiveIndex {
|
impl From<PrenavnodeNodeIndex> for PrimitiveIndex {
|
||||||
fn from(node: PrenavmeshNodeIndex) -> Self {
|
fn from(node: PrenavnodeNodeIndex) -> Self {
|
||||||
match node {
|
match node {
|
||||||
PrenavmeshNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot),
|
PrenavnodeNodeIndex::FixedDot(dot) => PrimitiveIndex::FixedDot(dot),
|
||||||
PrenavmeshNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend),
|
PrenavnodeNodeIndex::FixedBend(bend) => PrimitiveIndex::FixedBend(bend),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
pub struct PrenavmeshWeight {
|
pub struct PrenavmeshWeight {
|
||||||
pub node: PrenavmeshNodeIndex,
|
pub node: PrenavnodeNodeIndex,
|
||||||
pub pos: Point,
|
pub pos: Point,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GetTrianvertexNodeIndex<PrenavmeshNodeIndex> for PrenavmeshWeight {
|
impl GetTrianvertexNodeIndex<PrenavnodeNodeIndex> for PrenavmeshWeight {
|
||||||
fn node_index(&self) -> PrenavmeshNodeIndex {
|
fn node_index(&self) -> PrenavnodeNodeIndex {
|
||||||
self.node
|
self.node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +99,7 @@ impl PrenavmeshConstraint {
|
||||||
layout: &Layout<impl AccessRules>,
|
layout: &Layout<impl AccessRules>,
|
||||||
seg: LoneLooseSegIndex,
|
seg: LoneLooseSegIndex,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let (from_dot, to_dot) = layout.drawing().primitive(seg).joints();
|
let (from_dot, to_dot) = layout.drawing().primitive_ref(seg).joints();
|
||||||
Self::new_from_fixed_dot_pair(layout, from_dot, to_dot)
|
Self::new_from_fixed_dot_pair(layout, from_dot, to_dot)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -107,24 +107,24 @@ impl PrenavmeshConstraint {
|
||||||
layout: &Layout<impl AccessRules>,
|
layout: &Layout<impl AccessRules>,
|
||||||
seg: SeqLooseSegIndex,
|
seg: SeqLooseSegIndex,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let (from_joint, to_joint) = layout.drawing().primitive(seg).joints();
|
let (from_joint, to_joint) = layout.drawing().primitive_ref(seg).joints();
|
||||||
|
|
||||||
let from_dot = match from_joint {
|
let from_dot = match from_joint {
|
||||||
DotIndex::Fixed(dot) => dot,
|
DotIndex::Fixed(dot) => dot,
|
||||||
DotIndex::Loose(dot) => {
|
DotIndex::Loose(dot) => {
|
||||||
let bend = layout.drawing().primitive(dot).bend();
|
let bend = layout.drawing().primitive_ref(dot).bend();
|
||||||
|
|
||||||
layout.drawing().primitive(bend).core()
|
layout.drawing().primitive_ref(bend).core()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let to_bend = layout.drawing().primitive(to_joint).bend();
|
let to_bend = layout.drawing().primitive_ref(to_joint).bend();
|
||||||
let to_dot = layout.drawing().primitive(to_bend).core();
|
let to_dot = layout.drawing().primitive_ref(to_bend).core();
|
||||||
Self::new_from_fixed_dot_pair(layout, from_dot, to_dot)
|
Self::new_from_fixed_dot_pair(layout, from_dot, to_dot)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_from_fixed_seg(layout: &Layout<impl AccessRules>, seg: FixedSegIndex) -> Self {
|
pub fn new_from_fixed_seg(layout: &Layout<impl AccessRules>, seg: FixedSegIndex) -> Self {
|
||||||
let (from_dot, to_dot) = layout.drawing().primitive(seg).joints();
|
let (from_dot, to_dot) = layout.drawing().primitive_ref(seg).joints();
|
||||||
Self::new_from_fixed_dot_pair(layout, from_dot, to_dot)
|
Self::new_from_fixed_dot_pair(layout, from_dot, to_dot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -144,29 +144,29 @@ impl PrenavnodeToHandleMap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Index<PrenavmeshNodeIndex> for PrenavnodeToHandleMap {
|
impl Index<PrenavnodeNodeIndex> for PrenavnodeToHandleMap {
|
||||||
type Output = Option<FixedVertexHandle>;
|
type Output = Option<FixedVertexHandle>;
|
||||||
|
|
||||||
fn index(&self, prenavnode: PrenavmeshNodeIndex) -> &Self::Output {
|
fn index(&self, prenavnode: PrenavnodeNodeIndex) -> &Self::Output {
|
||||||
match prenavnode {
|
match prenavnode {
|
||||||
PrenavmeshNodeIndex::FixedDot(dot) => &self.fixed_dot_to_handle[dot.index()],
|
PrenavnodeNodeIndex::FixedDot(dot) => &self.fixed_dot_to_handle[dot.index()],
|
||||||
PrenavmeshNodeIndex::FixedBend(bend) => &self.fixed_bend_to_handle[bend.index()],
|
PrenavnodeNodeIndex::FixedBend(bend) => &self.fixed_bend_to_handle[bend.index()],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IndexMut<PrenavmeshNodeIndex> for PrenavnodeToHandleMap {
|
impl IndexMut<PrenavnodeNodeIndex> for PrenavnodeToHandleMap {
|
||||||
fn index_mut(&mut self, prenavnode: PrenavmeshNodeIndex) -> &mut Self::Output {
|
fn index_mut(&mut self, prenavnode: PrenavnodeNodeIndex) -> &mut Self::Output {
|
||||||
match prenavnode {
|
match prenavnode {
|
||||||
PrenavmeshNodeIndex::FixedDot(dot) => &mut self.fixed_dot_to_handle[dot.index()],
|
PrenavnodeNodeIndex::FixedDot(dot) => &mut self.fixed_dot_to_handle[dot.index()],
|
||||||
PrenavmeshNodeIndex::FixedBend(bend) => &mut self.fixed_bend_to_handle[bend.index()],
|
PrenavnodeNodeIndex::FixedBend(bend) => &mut self.fixed_bend_to_handle[bend.index()],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Getters)]
|
#[derive(Clone, Getters)]
|
||||||
pub struct Prenavmesh {
|
pub struct Prenavmesh {
|
||||||
triangulation: Triangulation<PrenavmeshNodeIndex, PrenavnodeToHandleMap, PrenavmeshWeight, ()>,
|
triangulation: Triangulation<PrenavnodeNodeIndex, PrenavnodeToHandleMap, PrenavmeshWeight, ()>,
|
||||||
constraints: Vec<PrenavmeshConstraint>,
|
constraints: Vec<PrenavmeshConstraint>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -185,8 +185,8 @@ impl Prenavmesh {
|
||||||
constraints: vec![],
|
constraints: vec![],
|
||||||
};
|
};
|
||||||
|
|
||||||
let layer = layout.drawing().primitive(origin).layer();
|
let layer = layout.drawing().primitive_ref(origin).layer();
|
||||||
let maybe_net = layout.drawing().primitive(origin).maybe_net();
|
let maybe_net = layout.drawing().primitive_ref(origin).maybe_net();
|
||||||
|
|
||||||
for node in layout.drawing().layer_primitive_nodes(layer) {
|
for node in layout.drawing().layer_primitive_nodes(layer) {
|
||||||
let primitive = node.primitive_ref(layout.drawing());
|
let primitive = node.primitive_ref(layout.drawing());
|
||||||
|
|
@ -270,7 +270,7 @@ impl Prenavmesh {
|
||||||
// fixed segs that do not cause an intersection.
|
// fixed segs that do not cause an intersection.
|
||||||
match node {
|
match node {
|
||||||
PrimitiveIndex::FixedSeg(seg) => {
|
PrimitiveIndex::FixedSeg(seg) => {
|
||||||
let (from_dot, to_dot) = layout.drawing().primitive(seg).joints();
|
let (from_dot, to_dot) = layout.drawing().primitive_ref(seg).joints();
|
||||||
|
|
||||||
if Self::is_fixed_dot_filleted(layout, from_dot)
|
if Self::is_fixed_dot_filleted(layout, from_dot)
|
||||||
&& Self::is_fixed_dot_filleted(layout, to_dot)
|
&& Self::is_fixed_dot_filleted(layout, to_dot)
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,7 @@ impl<R: AccessRules> ThetastarStrategy<Navmesh, f64, BandTermsegIndex>
|
||||||
let end_point = self
|
let end_point = self
|
||||||
.layout
|
.layout
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(self.destination)
|
.primitive_ref(self.destination)
|
||||||
.shape()
|
.shape()
|
||||||
.center();
|
.center();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -199,13 +199,13 @@ pub fn assert_that_all_ratlines_besides_gnd_are_autorouted(
|
||||||
.board()
|
.board()
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(origin_dot)
|
.primitive_ref(origin_dot)
|
||||||
.maybe_net();
|
.maybe_net();
|
||||||
let destination_net = autorouter
|
let destination_net = autorouter
|
||||||
.board()
|
.board()
|
||||||
.layout()
|
.layout()
|
||||||
.drawing()
|
.drawing()
|
||||||
.primitive(destination_dot)
|
.primitive_ref(destination_dot)
|
||||||
.maybe_net();
|
.maybe_net();
|
||||||
assert_eq!(origin_net, destination_net);
|
assert_eq!(origin_net, destination_net);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue