mirror of https://github.com/hannobraun/Fornjot
Merge pull request #735 from hannobraun/shape
Remove more unused parts of `Shape`
This commit is contained in:
commit
412bfe811c
|
@ -1,17 +1,13 @@
|
||||||
use fj_math::Scalar;
|
|
||||||
|
|
||||||
use crate::objects::{Curve, Cycle, Edge, Face, Surface, Vertex};
|
use crate::objects::{Curve, Cycle, Edge, Face, Surface, Vertex};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
stores::{Store, Stores},
|
stores::{Store, Stores},
|
||||||
Handle, Iter, Object, Update,
|
Handle, Iter, Object,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The boundary representation of a shape
|
/// The boundary representation of a shape
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Shape {
|
pub struct Shape {
|
||||||
distinct_min_distance: Scalar,
|
|
||||||
|
|
||||||
stores: Stores,
|
stores: Stores,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,11 +15,6 @@ impl Shape {
|
||||||
/// Construct a new shape
|
/// Construct a new shape
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
// This should really come from `Self::DEFAULT_MIN_DISTANCE`, or a
|
|
||||||
// similarly named constant. Unfortunately `Scalar::from_f64` can't
|
|
||||||
// be `const` yet.
|
|
||||||
distinct_min_distance: Scalar::from_f64(5e-7), // 0.5 µm
|
|
||||||
|
|
||||||
stores: Stores {
|
stores: Stores {
|
||||||
curves: Store::new(),
|
curves: Store::new(),
|
||||||
surfaces: Store::new(),
|
surfaces: Store::new(),
|
||||||
|
@ -55,17 +46,6 @@ impl Shape {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Override the minimum distance between distinct objects
|
|
||||||
///
|
|
||||||
/// Used for vertex validation, to determine whether vertices are unique.
|
|
||||||
pub fn with_distinct_min_distance(
|
|
||||||
mut self,
|
|
||||||
distinct_min_distance: impl Into<Scalar>,
|
|
||||||
) -> Self {
|
|
||||||
self.distinct_min_distance = distinct_min_distance.into();
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Insert an object into the shape
|
/// Insert an object into the shape
|
||||||
///
|
///
|
||||||
/// Validates the object, and returns an error if it is not valid. See the
|
/// Validates the object, and returns an error if it is not valid. See the
|
||||||
|
@ -119,39 +99,6 @@ impl Shape {
|
||||||
object.merge_into(self)
|
object.merge_into(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Merge the provided shape into this one
|
|
||||||
///
|
|
||||||
/// Returns a [`Mapping`] that maps each object from the merged shape to the
|
|
||||||
/// merged objects in this shape.
|
|
||||||
pub fn merge_shape(&mut self, other: &Shape) {
|
|
||||||
for object in other.curves() {
|
|
||||||
object.get().merge_into(self);
|
|
||||||
}
|
|
||||||
for object in other.surfaces() {
|
|
||||||
object.get().merge_into(self);
|
|
||||||
}
|
|
||||||
for object in other.vertices() {
|
|
||||||
object.get().merge_into(self);
|
|
||||||
}
|
|
||||||
for object in other.edges() {
|
|
||||||
object.get().merge_into(self);
|
|
||||||
}
|
|
||||||
for object in other.cycles() {
|
|
||||||
object.get().merge_into(self);
|
|
||||||
}
|
|
||||||
for object in other.faces() {
|
|
||||||
object.get().merge_into(self);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Update objects in the shape
|
|
||||||
///
|
|
||||||
/// Returns [`Update`], and API that can be used to update objects in the
|
|
||||||
/// shape.
|
|
||||||
pub fn update(&mut self) -> Update {
|
|
||||||
Update::new(&mut self.stores)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Access an iterator over all curves
|
/// Access an iterator over all curves
|
||||||
///
|
///
|
||||||
/// The caller must not make any assumptions about the order of curves.
|
/// The caller must not make any assumptions about the order of curves.
|
||||||
|
|
|
@ -6,12 +6,10 @@ mod api;
|
||||||
mod local;
|
mod local;
|
||||||
mod object;
|
mod object;
|
||||||
mod stores;
|
mod stores;
|
||||||
mod update;
|
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
api::Shape,
|
api::Shape,
|
||||||
local::LocalForm,
|
local::LocalForm,
|
||||||
object::Object,
|
object::Object,
|
||||||
stores::{Handle, Iter},
|
stores::{Handle, Iter},
|
||||||
update::Update,
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -81,15 +81,6 @@ impl<T: Object> Store<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update<F>(&mut self, mut f: F)
|
|
||||||
where
|
|
||||||
F: FnMut(&mut T),
|
|
||||||
{
|
|
||||||
for (_, object) in self.objects.write().iter_mut() {
|
|
||||||
f(object);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn ptr(&self) -> *const () {
|
fn ptr(&self) -> *const () {
|
||||||
Arc::as_ptr(&self.objects) as _
|
Arc::as_ptr(&self.objects) as _
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
use super::{stores::Stores, Object};
|
|
||||||
|
|
||||||
/// API to update a `Shape`
|
|
||||||
///
|
|
||||||
/// See [`Shape::update`].
|
|
||||||
pub struct Update<'r> {
|
|
||||||
stores: &'r mut Stores,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'r> Update<'r> {
|
|
||||||
pub(super) fn new(stores: &'r mut Stores) -> Self {
|
|
||||||
Self { stores }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Update all objects of a specific type
|
|
||||||
pub fn update_all<T: Object>(self, f: impl FnMut(&mut T)) -> Self {
|
|
||||||
self.stores.get::<T>().update(f);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -232,28 +232,29 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn coherence_edge() {
|
fn coherence_edge() {
|
||||||
let mut shape = Shape::new();
|
let mut tmp = Shape::new();
|
||||||
Edge::builder(&mut shape)
|
|
||||||
.build_line_segment_from_points([[0., 0., 0.], [1., 0., 0.]])
|
let a = Point::from([0., 0., 0.]);
|
||||||
.get();
|
let b = Point::from([1., 0., 0.]);
|
||||||
|
|
||||||
|
let curve = {
|
||||||
|
let curve = tmp.insert(Curve::line_from_points([a, b]));
|
||||||
|
LocalForm::canonical_only(curve)
|
||||||
|
};
|
||||||
|
|
||||||
|
let a = tmp.insert(Vertex { point: a });
|
||||||
|
let b = tmp.insert(Vertex { point: b });
|
||||||
|
|
||||||
let deviation = Scalar::from_f64(0.25);
|
let deviation = Scalar::from_f64(0.25);
|
||||||
|
|
||||||
shape.update().update_all(|edge: &mut Edge<3>| {
|
let a = LocalForm::new(Point::from([Scalar::ZERO + deviation]), a);
|
||||||
let original = edge.clone();
|
let b = LocalForm::new(Point::from([Scalar::ONE]), b);
|
||||||
*edge = Edge {
|
let vertices = VerticesOfEdge::from_vertices([a, b]);
|
||||||
vertices: original.vertices.map(|vertex| {
|
|
||||||
LocalForm::new(
|
let edge = Edge { curve, vertices };
|
||||||
*vertex.local() + [deviation],
|
|
||||||
vertex.canonical(),
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
..original
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let result = validate(
|
let result = validate(
|
||||||
shape.clone(),
|
edge.clone(),
|
||||||
&ValidationConfig {
|
&ValidationConfig {
|
||||||
identical_max_distance: deviation * 2.,
|
identical_max_distance: deviation * 2.,
|
||||||
..ValidationConfig::default()
|
..ValidationConfig::default()
|
||||||
|
@ -262,7 +263,7 @@ mod tests {
|
||||||
assert!(result.is_ok());
|
assert!(result.is_ok());
|
||||||
|
|
||||||
let result = validate(
|
let result = validate(
|
||||||
shape,
|
edge,
|
||||||
&ValidationConfig {
|
&ValidationConfig {
|
||||||
identical_max_distance: deviation / 2.,
|
identical_max_distance: deviation / 2.,
|
||||||
..ValidationConfig::default()
|
..ValidationConfig::default()
|
||||||
|
|
Loading…
Reference in New Issue