mirror of https://codeberg.org/topola/topola.git
drawing: move band length measurement to new band refobject
This commit is contained in:
parent
57c970e22e
commit
ca27804c64
|
|
@ -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)]
|
#[derive(Debug, Hash, Clone, Copy, Eq, PartialEq)]
|
||||||
pub enum BandFirstSegIndex {
|
pub enum BandFirstSegIndex {
|
||||||
|
|
@ -6,4 +17,55 @@ pub enum BandFirstSegIndex {
|
||||||
Bended(SeqLooseSegIndex),
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -208,38 +208,6 @@ impl<R: AccessRules> Layout<R> {
|
||||||
self.drawing.remove_band(band);
|
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>(
|
pub fn polys<W: 'static>(
|
||||||
&self,
|
&self,
|
||||||
node: GenericIndex<W>,
|
node: GenericIndex<W>,
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@ use topola::{
|
||||||
},
|
},
|
||||||
board::{mesadata::AccessMesadata, Board},
|
board::{mesadata::AccessMesadata, Board},
|
||||||
drawing::graph::{GetLayer, GetMaybeNet},
|
drawing::graph::{GetLayer, GetMaybeNet},
|
||||||
graph::GetPetgraphIndex,
|
geometry::shape::MeasureLength,
|
||||||
|
graph::{GetPetgraphIndex, MakeRef},
|
||||||
specctra::{design::SpecctraDesign, mesadata::SpecctraMesadata},
|
specctra::{design::SpecctraDesign, mesadata::SpecctraMesadata},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -148,7 +149,7 @@ pub fn assert_band_length(
|
||||||
epsilon: f64,
|
epsilon: f64,
|
||||||
) {
|
) {
|
||||||
let band = board.band_between_pins(source, target).unwrap();
|
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);
|
assert!((band_length - length).abs() < epsilon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue