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)]
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue