drawing: move band length measurement to new band refobject

This commit is contained in:
Mikolaj Wielgus 2024-07-21 16:45:36 +02:00
parent 57c970e22e
commit ca27804c64
3 changed files with 67 additions and 36 deletions

View File

@ -1,4 +1,15 @@
use crate::drawing::seg::{LoneLooseSegIndex, SeqLooseSegIndex};
use crate::{
drawing::seg::{LoneLooseSegIndex, SeqLooseSegIndex},
geometry::shape::MeasureLength,
graph::MakeRef,
};
use super::{
dot::DotIndex,
primitive::{GetJoints, GetOtherJoint},
rules::AccessRules,
Drawing,
};
#[derive(Debug, Hash, Clone, Copy, Eq, PartialEq)]
pub enum BandFirstSegIndex {
@ -6,4 +17,55 @@ pub enum BandFirstSegIndex {
Bended(SeqLooseSegIndex),
}
pub struct BandRef {}
impl<'a, CW: Copy, R: AccessRules> MakeRef<'a, BandRef<'a, CW, R>, Drawing<CW, R>>
for BandFirstSegIndex
{
fn ref_(&self, drawing: &'a Drawing<CW, R>) -> BandRef<'a, CW, R> {
BandRef::new(*self, drawing)
}
}
pub struct BandRef<'a, CW: Copy, R: AccessRules> {
first_seg: BandFirstSegIndex,
drawing: &'a Drawing<CW, R>,
}
impl<'a, CW: Copy, R: AccessRules> BandRef<'a, CW, R> {
pub fn new(first_seg: BandFirstSegIndex, drawing: &'a Drawing<CW, R>) -> BandRef<'a, CW, R> {
Self { first_seg, drawing }
}
}
impl<'a, CW: Copy, R: AccessRules> MeasureLength for BandRef<'a, CW, R> {
fn length(&self) -> f64 {
match self.first_seg {
BandFirstSegIndex::Straight(seg) => {
self.drawing.geometry().seg_shape(seg.into()).length()
}
BandFirstSegIndex::Bended(start_seg) => {
let mut length = self.drawing.geometry().seg_shape(start_seg.into()).length();
let start_dot = self.drawing.primitive(start_seg).joints().1;
let bend = self.drawing.primitive(start_dot).bend();
length += self.drawing.geometry().bend_shape(bend.into()).length();
let mut prev_dot = self.drawing.primitive(bend).other_joint(start_dot.into());
let mut seg = self.drawing.primitive(prev_dot).seg().unwrap();
length += self.drawing.geometry().seg_shape(seg.into()).length();
while let DotIndex::Loose(dot) =
self.drawing.primitive(seg).other_joint(prev_dot.into())
{
let bend = self.drawing.primitive(dot).bend();
length += self.drawing.geometry().bend_shape(bend.into()).length();
prev_dot = self.drawing.primitive(bend).other_joint(dot);
seg = self.drawing.primitive(prev_dot).seg().unwrap();
length += self.drawing.geometry().seg_shape(seg.into()).length();
}
length
}
}
}
}

View File

@ -208,38 +208,6 @@ impl<R: AccessRules> Layout<R> {
self.drawing.remove_band(band);
}
pub fn band_length(&self, band: BandFirstSegIndex) -> f64 {
match band {
BandFirstSegIndex::Straight(seg) => {
self.drawing.geometry().seg_shape(seg.into()).length()
}
BandFirstSegIndex::Bended(start_seg) => {
let mut length = self.drawing.geometry().seg_shape(start_seg.into()).length();
let start_dot = self.drawing.primitive(start_seg).joints().1;
let bend = self.drawing.primitive(start_dot).bend();
length += self.drawing.geometry().bend_shape(bend.into()).length();
let mut prev_dot = self.drawing.primitive(bend).other_joint(start_dot.into());
let mut seg = self.drawing.primitive(prev_dot).seg().unwrap();
length += self.drawing.geometry().seg_shape(seg.into()).length();
while let DotIndex::Loose(dot) =
self.drawing.primitive(seg).other_joint(prev_dot.into())
{
let bend = self.drawing.primitive(dot).bend();
length += self.drawing.geometry().bend_shape(bend.into()).length();
prev_dot = self.drawing.primitive(bend).other_joint(dot);
seg = self.drawing.primitive(prev_dot).seg().unwrap();
length += self.drawing.geometry().seg_shape(seg.into()).length();
}
length
}
}
}
pub fn polys<W: 'static>(
&self,
node: GenericIndex<W>,

View File

@ -9,7 +9,8 @@ use topola::{
},
board::{mesadata::AccessMesadata, Board},
drawing::graph::{GetLayer, GetMaybeNet},
graph::GetPetgraphIndex,
geometry::shape::MeasureLength,
graph::{GetPetgraphIndex, MakeRef},
specctra::{design::SpecctraDesign, mesadata::SpecctraMesadata},
};
@ -148,7 +149,7 @@ pub fn assert_band_length(
epsilon: f64,
) {
let band = board.band_between_pins(source, target).unwrap();
let band_length = board.layout().band_length(band);
let band_length = band.ref_(board.layout().drawing()).length();
assert!((band_length - length).abs() < epsilon);
}