mirror of
https://github.com/hannobraun/Fornjot
synced 2025-10-19 06:18:03 +00:00
Reference Surface
from Sketch
This commit is contained in:
parent
de4cdc9cfb
commit
7fc8a1846c
@ -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(), [])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user