engeom 0.1.1__tar.gz → 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {engeom-0.1.1 → engeom-0.1.2}/Cargo.lock +3 -3
- {engeom-0.1.1 → engeom-0.1.2}/Cargo.toml +1 -1
- {engeom-0.1.1 → engeom-0.1.2}/PKG-INFO +1 -1
- {engeom-0.1.1 → engeom-0.1.2}/engeom/Cargo.lock +2 -2
- {engeom-0.1.1 → engeom-0.1.2}/engeom/Cargo.toml +1 -1
- engeom-0.1.2/engeom/src/common/indices.rs +130 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/curve2.rs +1 -1
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/curve3.rs +10 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh.rs +87 -4
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/plane3.rs +0 -1
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/io.rs +9 -2
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/lib.rs +1 -1
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/engeom.pyi +1 -7
- engeom-0.1.2/python/engeom/geom2.pyi +516 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/geom3.pyi +307 -7
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/matplotlib.py +40 -4
- engeom-0.1.2/python/engeom/pyvista.py +63 -0
- {engeom-0.1.1 → engeom-0.1.2}/src/alignments.rs +1 -1
- engeom-0.1.2/src/common.rs +51 -0
- engeom-0.1.2/src/geom2.rs +684 -0
- {engeom-0.1.1 → engeom-0.1.2}/src/geom3.rs +291 -3
- {engeom-0.1.1 → engeom-0.1.2}/src/lib.rs +11 -6
- {engeom-0.1.1 → engeom-0.1.2}/src/mesh.rs +31 -6
- {engeom-0.1.1 → engeom-0.1.2}/src/svd_basis.rs +0 -1
- engeom-0.1.1/engeom/src/common/indices.rs +0 -9
- engeom-0.1.1/python/engeom/geom2.pyi +0 -139
- engeom-0.1.1/python/engeom/pyvista.py +0 -26
- engeom-0.1.1/src/common.rs +0 -18
- engeom-0.1.1/src/geom2.rs +0 -286
- engeom-0.1.1/src/isometries.rs +0 -8
- engeom-0.1.1/src/primitives.rs +0 -3
- {engeom-0.1.1 → engeom-0.1.2}/.github/workflows/CI.yml +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/.gitignore +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/.gitmodules +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/.gitignore +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/README.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/airfoils/camber.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/airfoils/overview.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/angles.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/core_space.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/discrete_domain.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/images/surface_point_meas.svg +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/svd_basis.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/alignment.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/curve.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/point_collections.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/shapes.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/index.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/javascripts/mathjax.js +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/python_rust.md +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/mkdocs.yml +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/camber.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/edges.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/helpers.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/inscribed_circle.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/orientation.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/align.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/angles.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/convert_2d_3d.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/discrete_domain.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/interval.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/points.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/surface_point.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/svd_basis.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/vec_f64.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/errors.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1/common_functions.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1/polynomial.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1/series1.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2/jacobian.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2/points_to_curve.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2/rc_params2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/angles2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/circle2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/hull.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/kd_tree2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/line2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/polyline2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/jacobian.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/multi_param.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/points_to_mesh.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/rotations.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/kd_tree3.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh/patches.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh/serialization.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh/uv_mapping.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/points.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/line_profiles.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/surface_deviation.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/tolerance.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/tolerance_map.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/stats.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/engeom/src/utility.rs +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/pyproject.toml +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/__init__.py +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/align/__init__.py +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/align.pyi +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/geom2/__init__.py +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/engeom/geom3/__init__.py +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/python/tests/test_all.py +0 -0
- {engeom-0.1.1 → engeom-0.1.2}/src/conversions.rs +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
# This file is automatically @generated by Cargo.
|
2
2
|
# It is not intended for manual editing.
|
3
|
-
version =
|
3
|
+
version = 4
|
4
4
|
|
5
5
|
[[package]]
|
6
6
|
name = "ahash"
|
@@ -149,7 +149,7 @@ dependencies = [
|
|
149
149
|
|
150
150
|
[[package]]
|
151
151
|
name = "engeom"
|
152
|
-
version = "0.1.
|
152
|
+
version = "0.1.1"
|
153
153
|
dependencies = [
|
154
154
|
"itertools 0.14.0",
|
155
155
|
"kiddo",
|
@@ -613,7 +613,7 @@ dependencies = [
|
|
613
613
|
|
614
614
|
[[package]]
|
615
615
|
name = "py-engeom"
|
616
|
-
version = "0.1.
|
616
|
+
version = "0.1.2"
|
617
617
|
dependencies = [
|
618
618
|
"engeom",
|
619
619
|
"numpy",
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This file is automatically @generated by Cargo.
|
2
2
|
# It is not intended for manual editing.
|
3
|
-
version =
|
3
|
+
version = 4
|
4
4
|
|
5
5
|
[[package]]
|
6
6
|
name = "ahash"
|
@@ -276,7 +276,7 @@ dependencies = [
|
|
276
276
|
|
277
277
|
[[package]]
|
278
278
|
name = "engeom"
|
279
|
-
version = "0.1.
|
279
|
+
version = "0.1.1"
|
280
280
|
dependencies = [
|
281
281
|
"approx",
|
282
282
|
"criterion",
|
@@ -0,0 +1,130 @@
|
|
1
|
+
//! This module should have tools for working with indices
|
2
|
+
|
3
|
+
use std::collections::HashSet;
|
4
|
+
|
5
|
+
pub fn index_vec(indices: Option<&[usize]>, len: usize) -> Vec<usize> {
|
6
|
+
if let Some(items) = indices {
|
7
|
+
items.to_vec()
|
8
|
+
} else {
|
9
|
+
(0..len).collect::<Vec<_>>()
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
/// Identify chains of indices. Starting from a set of index pairs, assemble consecutive pairs into
|
14
|
+
/// chains of contiguous indices while preserving the order of each pair. The input is a slice of
|
15
|
+
/// u32 pairs, and the output is a vector of vectors of u32. Each inner vector represents a chain
|
16
|
+
/// of contiguous indices.
|
17
|
+
///
|
18
|
+
/// # Arguments
|
19
|
+
///
|
20
|
+
/// * `indices`: original pairs of indices
|
21
|
+
///
|
22
|
+
/// returns: Vec<Vec<u32, Global>, Global>
|
23
|
+
///
|
24
|
+
/// # Examples
|
25
|
+
///
|
26
|
+
/// ```
|
27
|
+
///
|
28
|
+
/// ```
|
29
|
+
pub fn chained_indices(indices: &[[u32; 2]]) -> Vec<Vec<u32>> {
|
30
|
+
let mut pairs = index_vec(None, indices.len());
|
31
|
+
|
32
|
+
let mut chains: Vec<Vec<u32>> = Vec::new();
|
33
|
+
let mut working = Vec::new();
|
34
|
+
let mut forward = true;
|
35
|
+
|
36
|
+
while !pairs.is_empty() {
|
37
|
+
// If working is empty, start a new chain with the first pair
|
38
|
+
if working.is_empty() {
|
39
|
+
let i = pairs.pop().unwrap();
|
40
|
+
working.push(indices[i][0]);
|
41
|
+
working.push(indices[i][1]);
|
42
|
+
forward = true;
|
43
|
+
}
|
44
|
+
|
45
|
+
if forward {
|
46
|
+
let last = *working.last().unwrap();
|
47
|
+
if let Some((k, i)) = chain_candidates(&pairs, indices, last, true) {
|
48
|
+
working.push(indices[i][1]);
|
49
|
+
pairs.swap_remove(k);
|
50
|
+
} else {
|
51
|
+
forward = false;
|
52
|
+
}
|
53
|
+
} else {
|
54
|
+
let first = *working.first().unwrap();
|
55
|
+
if let Some((k, i)) = chain_candidates(&pairs, indices, first, false) {
|
56
|
+
working.insert(0, indices[i][0]);
|
57
|
+
pairs.swap_remove(k);
|
58
|
+
} else {
|
59
|
+
chains.push(working.clone());
|
60
|
+
working.clear();
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
if !working.is_empty() {
|
66
|
+
chains.push(working);
|
67
|
+
}
|
68
|
+
|
69
|
+
chains
|
70
|
+
}
|
71
|
+
|
72
|
+
fn chain_candidates(
|
73
|
+
pairs: &[usize],
|
74
|
+
indices: &[[u32; 2]],
|
75
|
+
last: u32,
|
76
|
+
forward: bool,
|
77
|
+
) -> Option<(usize, usize)> {
|
78
|
+
let mut candidates = Vec::new();
|
79
|
+
let j = if forward { 0 } else { 1 };
|
80
|
+
|
81
|
+
for (k, &i) in pairs.iter().enumerate() {
|
82
|
+
if indices[i][j] == last {
|
83
|
+
candidates.push((k, i));
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
if candidates.len() == 1 {
|
88
|
+
Some(candidates[0])
|
89
|
+
} else {
|
90
|
+
None
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
#[cfg(test)]
|
95
|
+
mod tests {
|
96
|
+
use super::*;
|
97
|
+
|
98
|
+
#[test]
|
99
|
+
fn chain_candidates_forward() {
|
100
|
+
let indices = [[0, 1], [1, 2], [2, 3]];
|
101
|
+
let pairs = [1, 2];
|
102
|
+
|
103
|
+
let result = chain_candidates(&pairs, &indices, 1, true);
|
104
|
+
|
105
|
+
assert_eq!(result, Some((0, 1)));
|
106
|
+
}
|
107
|
+
|
108
|
+
#[test]
|
109
|
+
fn chain_candidates_backwards() {
|
110
|
+
let indices = [[0, 1], [1, 2], [2, 3]];
|
111
|
+
let pairs = [0, 1];
|
112
|
+
|
113
|
+
let result = chain_candidates(&pairs, &indices, 2, false);
|
114
|
+
|
115
|
+
assert_eq!(result, Some((1, 1)));
|
116
|
+
}
|
117
|
+
|
118
|
+
#[test]
|
119
|
+
fn test_chained_indices() {
|
120
|
+
let indices = [[0, 1], [1, 2], [2, 3], [4, 5], [5, 6], [7, 8]];
|
121
|
+
|
122
|
+
let mut chains = chained_indices(&indices);
|
123
|
+
chains.sort_by(|a, b| a[0].cmp(&b[0]));
|
124
|
+
|
125
|
+
assert_eq!(chains.len(), 3);
|
126
|
+
assert_eq!(chains[0], vec![0, 1, 2, 3]);
|
127
|
+
assert_eq!(chains[1], vec![4, 5, 6]);
|
128
|
+
assert_eq!(chains[2], vec![7, 8]);
|
129
|
+
}
|
130
|
+
}
|
@@ -695,7 +695,7 @@ impl Curve2 {
|
|
695
695
|
/// ```
|
696
696
|
///
|
697
697
|
/// ```
|
698
|
-
pub fn
|
698
|
+
pub fn transformed_by(&self, transform: &Iso2) -> Self {
|
699
699
|
let points = transform_points(self.line.vertices(), transform);
|
700
700
|
Curve2::from_points(&points, self.tol, self.is_closed).unwrap()
|
701
701
|
}
|
@@ -101,6 +101,16 @@ impl Curve3 {
|
|
101
101
|
self.line.vertices()
|
102
102
|
}
|
103
103
|
|
104
|
+
pub fn transformed_by(&self, iso: &Iso3) -> Self {
|
105
|
+
let points = self
|
106
|
+
.line
|
107
|
+
.vertices()
|
108
|
+
.iter()
|
109
|
+
.map(|p| iso * p)
|
110
|
+
.collect::<Vec<_>>();
|
111
|
+
Self::from_points(&points, self.tol).unwrap()
|
112
|
+
}
|
113
|
+
|
104
114
|
pub fn from_points(points: &[Point3], tol: f64) -> Result<Self> {
|
105
115
|
let mut points = points.to_vec();
|
106
116
|
points.dedup_by(|a, b| dist(a, b) <= tol);
|
@@ -6,16 +6,16 @@ mod patches;
|
|
6
6
|
mod serialization;
|
7
7
|
mod uv_mapping;
|
8
8
|
|
9
|
-
use crate::{Iso3, Plane3, Point2, Point3,
|
9
|
+
use crate::{Curve3, Iso3, Plane3, Point2, Point3, Result, SurfacePoint3};
|
10
10
|
use std::f64::consts::PI;
|
11
11
|
|
12
12
|
pub use self::serialization::{MeshData, MeshFlatData};
|
13
13
|
pub use self::uv_mapping::UvMapping;
|
14
|
-
use crate::common::indices::index_vec;
|
14
|
+
use crate::common::indices::{chained_indices, index_vec};
|
15
15
|
use crate::common::SurfacePointCollection;
|
16
16
|
use crate::geom3::points::points_sample_poisson_disk;
|
17
|
-
use parry3d_f64::query::{PointProjection, PointQueryWithLocation, SplitResult};
|
18
|
-
use parry3d_f64::shape::{TriMesh, TrianglePointLocation};
|
17
|
+
use parry3d_f64::query::{IntersectResult, PointProjection, PointQueryWithLocation, SplitResult};
|
18
|
+
use parry3d_f64::shape::{TriMesh, TriMeshFlags, TrianglePointLocation};
|
19
19
|
use rand::prelude::SliceRandom;
|
20
20
|
use rand::thread_rng;
|
21
21
|
|
@@ -27,6 +27,51 @@ pub struct Mesh {
|
|
27
27
|
}
|
28
28
|
|
29
29
|
impl Mesh {
|
30
|
+
/// Create a new mesh from a list of vertices and a list of triangles. Additional options can
|
31
|
+
/// be set to merge duplicate vertices and delete degenerate triangles.
|
32
|
+
///
|
33
|
+
/// # Arguments
|
34
|
+
///
|
35
|
+
/// * `vertices`:
|
36
|
+
/// * `triangles`:
|
37
|
+
/// * `is_solid`:
|
38
|
+
/// * `merge_duplicates`:
|
39
|
+
/// * `delete_degenerate`:
|
40
|
+
/// * `uv`:
|
41
|
+
///
|
42
|
+
/// returns: Result<Mesh, Box<dyn Error, Global>>
|
43
|
+
///
|
44
|
+
/// # Examples
|
45
|
+
///
|
46
|
+
/// ```
|
47
|
+
///
|
48
|
+
/// ```
|
49
|
+
pub fn new_with_options(
|
50
|
+
vertices: Vec<Point3>,
|
51
|
+
triangles: Vec<[u32; 3]>,
|
52
|
+
is_solid: bool,
|
53
|
+
merge_duplicates: bool,
|
54
|
+
delete_degenerate: bool,
|
55
|
+
uv: Option<UvMapping>,
|
56
|
+
) -> Result<Self> {
|
57
|
+
let mut flags = TriMeshFlags::empty();
|
58
|
+
if merge_duplicates {
|
59
|
+
flags |= TriMeshFlags::MERGE_DUPLICATE_VERTICES;
|
60
|
+
flags |= TriMeshFlags::DELETE_DUPLICATE_TRIANGLES;
|
61
|
+
}
|
62
|
+
if delete_degenerate {
|
63
|
+
flags |= TriMeshFlags::DELETE_BAD_TOPOLOGY_TRIANGLES;
|
64
|
+
flags |= TriMeshFlags::DELETE_DEGENERATE_TRIANGLES;
|
65
|
+
}
|
66
|
+
|
67
|
+
let shape = TriMesh::with_flags(vertices, triangles, flags)?;
|
68
|
+
Ok(Self {
|
69
|
+
shape,
|
70
|
+
is_solid,
|
71
|
+
uv,
|
72
|
+
})
|
73
|
+
}
|
74
|
+
|
30
75
|
pub fn new(vertices: Vec<Point3>, triangles: Vec<[u32; 3]>, is_solid: bool) -> Self {
|
31
76
|
let shape = TriMesh::new(vertices, triangles).expect("Failed to create TriMesh");
|
32
77
|
Self {
|
@@ -361,6 +406,44 @@ impl Mesh {
|
|
361
406
|
SplitResult::Positive => SplitResult::Positive,
|
362
407
|
}
|
363
408
|
}
|
409
|
+
|
410
|
+
/// Perform a section of the mesh with a plane, returning a list of `Curve3` objects that
|
411
|
+
/// trace the intersection of the mesh with the plane.
|
412
|
+
///
|
413
|
+
/// # Arguments
|
414
|
+
///
|
415
|
+
/// * `plane`:
|
416
|
+
/// * `tol`:
|
417
|
+
///
|
418
|
+
/// returns: Result<Vec<Curve3, Global>, Box<dyn Error, Global>>
|
419
|
+
///
|
420
|
+
/// # Examples
|
421
|
+
///
|
422
|
+
/// ```
|
423
|
+
///
|
424
|
+
/// ```
|
425
|
+
pub fn section(&self, plane: &Plane3, tol: Option<f64>) -> Result<Vec<Curve3>> {
|
426
|
+
let tol = tol.unwrap_or(1.0e-6);
|
427
|
+
let mut collected = Vec::new();
|
428
|
+
let result = self
|
429
|
+
.shape
|
430
|
+
.intersection_with_local_plane(&plane.normal, plane.d, 1.0e-6);
|
431
|
+
|
432
|
+
if let IntersectResult::Intersect(pline) = result {
|
433
|
+
let chains = chained_indices(pline.indices());
|
434
|
+
for chain in chains.iter() {
|
435
|
+
let points = chain
|
436
|
+
.iter()
|
437
|
+
.map(|&i| pline.vertices()[i as usize])
|
438
|
+
.collect::<Vec<_>>();
|
439
|
+
if let Ok(curve) = Curve3::from_points(&points, tol) {
|
440
|
+
collected.push(curve);
|
441
|
+
}
|
442
|
+
}
|
443
|
+
}
|
444
|
+
|
445
|
+
Ok(collected)
|
446
|
+
}
|
364
447
|
}
|
365
448
|
|
366
449
|
fn box_geom(width: f64, height: f64, depth: f64) -> (Vec<Point3>, Vec<[u32; 3]>) {
|
@@ -37,7 +37,6 @@ impl Plane3 {
|
|
37
37
|
self.normal.dot(&point.coords) - self.d
|
38
38
|
}
|
39
39
|
|
40
|
-
|
41
40
|
/// Measure and return the distance from the plane to a point in 3D space. The distance is
|
42
41
|
/// always positive, and indicates the shortest distance from the point to the plane. If you
|
43
42
|
/// need to know whether the point is above or below the plane, use `signed_distance_to_point`.
|
@@ -12,7 +12,7 @@ use stl_io;
|
|
12
12
|
use crate::geom3::Mesh;
|
13
13
|
|
14
14
|
#[cfg(feature = "stl")]
|
15
|
-
pub fn read_mesh_stl(path: &Path) -> Result<Mesh> {
|
15
|
+
pub fn read_mesh_stl(path: &Path, merge_duplicates: bool, delete_degenerate: bool) -> Result<Mesh> {
|
16
16
|
let mut file = OpenOptions::new().read(true).open(path)?;
|
17
17
|
let mesh = stl_io::read_stl(&mut file)?;
|
18
18
|
|
@@ -34,7 +34,14 @@ pub fn read_mesh_stl(path: &Path) -> Result<Mesh> {
|
|
34
34
|
})
|
35
35
|
.collect::<Vec<_>>();
|
36
36
|
|
37
|
-
|
37
|
+
Mesh::new_with_options(
|
38
|
+
vertices,
|
39
|
+
triangles,
|
40
|
+
false,
|
41
|
+
merge_duplicates,
|
42
|
+
delete_degenerate,
|
43
|
+
None,
|
44
|
+
)
|
38
45
|
}
|
39
46
|
|
40
47
|
#[cfg(feature = "stl")]
|
@@ -26,7 +26,7 @@ pub use geom2::{
|
|
26
26
|
|
27
27
|
// Extremely common 3D types
|
28
28
|
pub use geom3::{
|
29
|
-
Curve3, CurveStation3, Iso3, Mesh, Plane3, Point3, SurfacePoint3, UnitVec3, Vector3,
|
29
|
+
Curve3, CurveStation3, Iso3, Mesh, Plane3, Point3, SurfacePoint3, SvdBasis3, UnitVec3, Vector3,
|
30
30
|
};
|
31
31
|
|
32
32
|
// Extremely common conversion tools
|
@@ -1,14 +1,8 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
-
|
3
|
-
from pathlib import Path
|
4
|
-
from typing import Any, List, Tuple, Union
|
5
2
|
from enum import Enum
|
6
3
|
|
7
|
-
|
8
|
-
|
4
|
+
type Resample = Resample_ByCount | Resample_BySpacing | Resample_ByMaxSpacing
|
9
5
|
|
10
6
|
class DeviationMode(Enum):
|
11
7
|
Absolute = 0
|
12
8
|
Normal = 1
|
13
|
-
|
14
|
-
|