First implementation of custom region type
This commit is contained in:
parent
9a3a10c8b4
commit
edcc3528aa
|
@ -34,6 +34,7 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
|
|||
let (pt1, pt2) = match ct_state.transfer.transfer_region.dest_region {
|
||||
Region::Point((x, y)) => ((x, y), (x, y)),
|
||||
Region::Rect(c1, c2) => (c1, c2),
|
||||
Region::Custom(_) => ((0,0), (0,0)),
|
||||
};
|
||||
m_start_handle.set(Some(pt1));
|
||||
m_end_handle.set(Some(pt2));
|
||||
|
|
|
@ -34,6 +34,7 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html {
|
|||
let (pt1, pt2) = match ct_state.transfer.transfer_region.source_region {
|
||||
Region::Point((x, y)) => ((x, y), (x, y)),
|
||||
Region::Rect(c1, c2) => (c1, c2),
|
||||
Region::Custom(_) => ((0,0), (0,0)),
|
||||
};
|
||||
m_start_handle.set(Some(pt1));
|
||||
m_end_handle.set(Some(pt2));
|
||||
|
|
|
@ -353,6 +353,7 @@ impl From<&Region> for RegionDisplay {
|
|||
Region::Rect(c1, c2) => RegionDisplay::try_from((c1.0, c1.1, c2.0, c2.1))
|
||||
.ok()
|
||||
.unwrap(),
|
||||
Region::Custom(_) => RegionDisplay { text: "CUSTOM".to_string(), col_start: 0, row_start: 0, col_end: 0, row_end: 0 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,17 @@ use serde::{Deserialize, Serialize};
|
|||
|
||||
use super::plate::Plate;
|
||||
|
||||
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
||||
pub struct CustomRegion {
|
||||
src: Vec<(u8, u8)>,
|
||||
dest: Vec<(u8, u8)>,
|
||||
}
|
||||
|
||||
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
||||
pub enum Region {
|
||||
Rect((u8, u8), (u8, u8)),
|
||||
Point((u8, u8)),
|
||||
Custom(CustomRegion),
|
||||
}
|
||||
impl Default for Region {
|
||||
fn default() -> Self {
|
||||
|
@ -49,7 +56,7 @@ impl Default for TransferRegion {
|
|||
|
||||
impl TransferRegion {
|
||||
pub fn get_source_wells(&self) -> Vec<(u8, u8)> {
|
||||
match self.source_region {
|
||||
match &self.source_region {
|
||||
Region::Rect(c1, c2) => {
|
||||
let mut wells = Vec::<(u8, u8)>::new();
|
||||
let (ul, br) = standardize_rectangle(&c1, &c2);
|
||||
|
@ -71,7 +78,8 @@ impl TransferRegion {
|
|||
}
|
||||
wells
|
||||
}
|
||||
Region::Point(p) => vec![p],
|
||||
Region::Point(p) => vec![*p],
|
||||
Region::Custom(c) => c.src.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -112,6 +120,7 @@ impl TransferRegion {
|
|||
let source_corners: ((u8, u8), (u8, u8)) = match self.source_region {
|
||||
Region::Point((x, y)) => ((x, y), (x, y)),
|
||||
Region::Rect(c1, c2) => (c1, c2),
|
||||
Region::Custom(_) => ((0, 0), (0, 0)),
|
||||
};
|
||||
let (source_ul, _) = standardize_rectangle(&source_corners.0, &source_corners.1);
|
||||
// This map is not necessarily injective or surjective,
|
||||
|
@ -120,7 +129,7 @@ impl TransferRegion {
|
|||
// and simple then we *will* have injectivity.
|
||||
|
||||
// Non-replicate transfers:
|
||||
match self.dest_region {
|
||||
match &self.dest_region {
|
||||
Region::Point((x, y)) => {
|
||||
Box::new(move |(i, j)| {
|
||||
if source_wells.contains(&(i, j)) {
|
||||
|
@ -224,6 +233,22 @@ impl TransferRegion {
|
|||
}
|
||||
})
|
||||
}
|
||||
Region::Custom(c) => Box::new(move |(i, j)| {
|
||||
let src = c.src.clone();
|
||||
let dest = c.dest.clone();
|
||||
|
||||
let points: Vec<(u8, u8)> = src
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter(|(_index, (x, y))| *x == i && *y == j)
|
||||
.map(|(index, _)| dest[index])
|
||||
.collect();
|
||||
if points.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(points)
|
||||
}
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -256,7 +281,8 @@ impl TransferRegion {
|
|||
// log::debug!("s1.1: {}, max.1: {}", s1.1, source_max.1);
|
||||
return Err("Source region is out-of-bounds! (Too wide)");
|
||||
}
|
||||
}
|
||||
},
|
||||
Region::Custom(_) => return Ok(()),
|
||||
}
|
||||
|
||||
if il_source.0 == 0 || il_dest.1 == 0 {
|
||||
|
|
Loading…
Reference in New Issue