Reference Surface from Sketch

This commit is contained in:
Hanno Braun 2024-04-04 11:39:04 +02:00
parent de4cdc9cfb
commit 7fc8a1846c
7 changed files with 61 additions and 36 deletions

View File

@ -7,8 +7,8 @@ use crate::topology::{Sketch, Topology};
/// [module-level documentation]: super /// [module-level documentation]: super
pub trait BuildSketch { pub trait BuildSketch {
/// Create a sketch with no regions /// Create a sketch with no regions
fn empty(_: &Topology) -> Sketch { fn empty(topology: &Topology) -> Sketch {
Sketch::new([]) Sketch::new(topology.surfaces.space_2d(), [])
} }
} }

View File

@ -151,7 +151,7 @@ impl ReplaceCurve for Sketch {
} }
if replacement_happened { if replacement_happened {
ReplaceOutput::Updated(Sketch::new(regions)) ReplaceOutput::Updated(Sketch::new(self.surface().clone(), regions))
} else { } else {
ReplaceOutput::Original(self.clone()) ReplaceOutput::Original(self.clone())
} }

View File

@ -117,7 +117,7 @@ impl ReplaceHalfEdge for Sketch {
} }
if replacement_happened { if replacement_happened {
ReplaceOutput::Updated(Sketch::new(regions)) ReplaceOutput::Updated(Sketch::new(self.surface().clone(), regions))
} else { } else {
ReplaceOutput::Original(self.clone()) ReplaceOutput::Original(self.clone())
} }

View File

@ -153,7 +153,7 @@ impl ReplaceVertex for Sketch {
} }
if replacement_happened { if replacement_happened {
ReplaceOutput::Updated(Sketch::new(regions)) ReplaceOutput::Updated(Sketch::new(self.surface().clone(), regions))
} else { } else {
ReplaceOutput::Original(self.clone()) ReplaceOutput::Original(self.clone())
} }
@ -317,7 +317,7 @@ impl ReplaceVertex for Handle<Sketch> {
} }
if replacement_happened { if replacement_happened {
ReplaceOutput::Updated(Sketch::new(regions)) ReplaceOutput::Updated(Sketch::new(self.surface().clone(), regions))
} else { } else {
ReplaceOutput::Original(self.clone()) ReplaceOutput::Original(self.clone())
} }

View File

@ -47,7 +47,7 @@ impl UpdateSketch for Sketch {
{ {
let regions = regions.into_iter().map(|region| region.insert(core)); let regions = regions.into_iter().map(|region| region.insert(core));
let regions = self.regions().iter().cloned().chain(regions); let regions = self.regions().iter().cloned().chain(regions);
Sketch::new(regions) Sketch::new(self.surface().clone(), regions)
} }
fn update_region<T, R>( fn update_region<T, R>(
@ -69,6 +69,6 @@ impl UpdateSketch for Sketch {
}), }),
) )
.expect("Region not found"); .expect("Region not found");
Sketch::new(regions) Sketch::new(self.surface().clone(), regions)
} }
} }

View File

@ -1,22 +1,32 @@
use crate::{ use crate::{
storage::Handle, storage::Handle,
topology::{ObjectSet, Region}, topology::{ObjectSet, Region, Surface},
}; };
/// A 2-dimensional shape /// A 2-dimensional shape
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Sketch { pub struct Sketch {
surface: Handle<Surface>,
regions: ObjectSet<Region>, regions: ObjectSet<Region>,
} }
impl Sketch { impl Sketch {
/// Construct an empty instance of `Sketch` /// Construct an empty instance of `Sketch`
pub fn new(regions: impl IntoIterator<Item = Handle<Region>>) -> Self { pub fn new(
surface: Handle<Surface>,
regions: impl IntoIterator<Item = Handle<Region>>,
) -> Self {
Self { Self {
surface,
regions: regions.into_iter().collect(), regions: regions.into_iter().collect(),
} }
} }
/// Access the surface of the sketch
pub fn surface(&self) -> &Handle<Surface> {
&self.surface
}
/// Access the regions of the sketch /// Access the regions of the sketch
pub fn regions(&self) -> &ObjectSet<Region> { pub fn regions(&self) -> &ObjectSet<Region> {
&self.regions &self.regions

View File

@ -137,14 +137,21 @@ mod tests {
let region = <Region as BuildRegion>::circle([0., 0.], 1., &mut core) let region = <Region as BuildRegion>::circle([0., 0.], 1., &mut core)
.insert(&mut core); .insert(&mut core);
let valid_sketch = Sketch::new(vec![region.clone()]).insert(&mut core); let valid_sketch = Sketch::new(
core.layers.topology.surfaces.space_2d(),
vec![region.clone()],
)
.insert(&mut core);
valid_sketch.validate_and_return_first_error(&core.layers.geometry)?; valid_sketch.validate_and_return_first_error(&core.layers.geometry)?;
let shared_cycle = region.exterior(); let shared_cycle = region.exterior();
let invalid_sketch = Sketch::new(vec![ let invalid_sketch = Sketch::new(
core.layers.topology.surfaces.space_2d(),
vec![
Region::new(shared_cycle.clone(), vec![]).insert(&mut core), Region::new(shared_cycle.clone(), vec![]).insert(&mut core),
Region::new(shared_cycle.clone(), vec![]).insert(&mut core), Region::new(shared_cycle.clone(), vec![]).insert(&mut core),
]); ],
);
assert_contains_err!( assert_contains_err!(
core, core,
invalid_sketch, invalid_sketch,
@ -165,7 +172,11 @@ mod tests {
&mut core, &mut core,
) )
.insert(&mut core); .insert(&mut core);
let valid_sketch = Sketch::new(vec![region.clone()]).insert(&mut core); let valid_sketch = Sketch::new(
core.layers.topology.surfaces.space_2d(),
vec![region.clone()],
)
.insert(&mut core);
valid_sketch.validate_and_return_first_error(&core.layers.geometry)?; valid_sketch.validate_and_return_first_error(&core.layers.geometry)?;
let exterior = region.exterior(); let exterior = region.exterior();
@ -173,10 +184,12 @@ mod tests {
exterior.half_edges().iter().cloned().collect(); exterior.half_edges().iter().cloned().collect();
let interior = Cycle::new(cloned_edges).insert(&mut core); let interior = Cycle::new(cloned_edges).insert(&mut core);
let invalid_sketch = let invalid_sketch = Sketch::new(
Sketch::new(vec![ core.layers.topology.surfaces.space_2d(),
vec![
Region::new(exterior.clone(), vec![interior]).insert(&mut core) Region::new(exterior.clone(), vec![interior]).insert(&mut core)
]); ],
);
assert_contains_err!( assert_contains_err!(
core, core,
invalid_sketch, invalid_sketch,
@ -195,10 +208,10 @@ mod tests {
let valid_outer_circle = HalfEdge::circle([0., 0.], 1., &mut core); let valid_outer_circle = HalfEdge::circle([0., 0.], 1., &mut core);
let valid_exterior = let valid_exterior =
Cycle::new(vec![valid_outer_circle.clone()]).insert(&mut core); Cycle::new(vec![valid_outer_circle.clone()]).insert(&mut core);
let valid_sketch = let valid_sketch = Sketch::new(
Sketch::new(vec![ core.layers.topology.surfaces.space_2d(),
Region::new(valid_exterior.clone(), vec![]).insert(&mut core) vec![Region::new(valid_exterior.clone(), vec![]).insert(&mut core)],
]); );
valid_sketch.validate_and_return_first_error(&core.layers.geometry)?; valid_sketch.validate_and_return_first_error(&core.layers.geometry)?;
let invalid_outer_circle = HalfEdge::from_sibling( let invalid_outer_circle = HalfEdge::from_sibling(
@ -208,10 +221,12 @@ mod tests {
); );
let invalid_exterior = let invalid_exterior =
Cycle::new(vec![invalid_outer_circle.clone()]).insert(&mut core); Cycle::new(vec![invalid_outer_circle.clone()]).insert(&mut core);
let invalid_sketch = let invalid_sketch = Sketch::new(
Sketch::new(vec![ core.layers.topology.surfaces.space_2d(),
vec![
Region::new(invalid_exterior.clone(), vec![]).insert(&mut core) Region::new(invalid_exterior.clone(), vec![]).insert(&mut core)
]); ],
);
assert_contains_err!( assert_contains_err!(
core, core,
invalid_sketch, invalid_sketch,
@ -238,20 +253,20 @@ mod tests {
let valid_interior = let valid_interior =
Cycle::new(vec![cw_inner_circle.clone()]).insert(&mut core); Cycle::new(vec![cw_inner_circle.clone()]).insert(&mut core);
let valid_sketch = Sketch::new(vec![Region::new( let valid_sketch = Sketch::new(
exterior.clone(), core.layers.topology.surfaces.space_2d(),
vec![valid_interior], vec![Region::new(exterior.clone(), vec![valid_interior])
) .insert(&mut core)],
.insert(&mut core)]); );
valid_sketch.validate_and_return_first_error(&core.layers.geometry)?; valid_sketch.validate_and_return_first_error(&core.layers.geometry)?;
let invalid_interior = let invalid_interior =
Cycle::new(vec![inner_circle.clone()]).insert(&mut core); Cycle::new(vec![inner_circle.clone()]).insert(&mut core);
let invalid_sketch = Sketch::new(vec![Region::new( let invalid_sketch = Sketch::new(
exterior.clone(), core.layers.topology.surfaces.space_2d(),
vec![invalid_interior], vec![Region::new(exterior.clone(), vec![invalid_interior])
) .insert(&mut core)],
.insert(&mut core)]); );
assert_contains_err!( assert_contains_err!(
core, core,
invalid_sketch, invalid_sketch,