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.
Files changed (109) hide show
  1. {engeom-0.1.1 → engeom-0.1.2}/Cargo.lock +3 -3
  2. {engeom-0.1.1 → engeom-0.1.2}/Cargo.toml +1 -1
  3. {engeom-0.1.1 → engeom-0.1.2}/PKG-INFO +1 -1
  4. {engeom-0.1.1 → engeom-0.1.2}/engeom/Cargo.lock +2 -2
  5. {engeom-0.1.1 → engeom-0.1.2}/engeom/Cargo.toml +1 -1
  6. engeom-0.1.2/engeom/src/common/indices.rs +130 -0
  7. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/curve2.rs +1 -1
  8. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/curve3.rs +10 -0
  9. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh.rs +87 -4
  10. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/plane3.rs +0 -1
  11. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/io.rs +9 -2
  12. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/lib.rs +1 -1
  13. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/engeom.pyi +1 -7
  14. engeom-0.1.2/python/engeom/geom2.pyi +516 -0
  15. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/geom3.pyi +307 -7
  16. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/matplotlib.py +40 -4
  17. engeom-0.1.2/python/engeom/pyvista.py +63 -0
  18. {engeom-0.1.1 → engeom-0.1.2}/src/alignments.rs +1 -1
  19. engeom-0.1.2/src/common.rs +51 -0
  20. engeom-0.1.2/src/geom2.rs +684 -0
  21. {engeom-0.1.1 → engeom-0.1.2}/src/geom3.rs +291 -3
  22. {engeom-0.1.1 → engeom-0.1.2}/src/lib.rs +11 -6
  23. {engeom-0.1.1 → engeom-0.1.2}/src/mesh.rs +31 -6
  24. {engeom-0.1.1 → engeom-0.1.2}/src/svd_basis.rs +0 -1
  25. engeom-0.1.1/engeom/src/common/indices.rs +0 -9
  26. engeom-0.1.1/python/engeom/geom2.pyi +0 -139
  27. engeom-0.1.1/python/engeom/pyvista.py +0 -26
  28. engeom-0.1.1/src/common.rs +0 -18
  29. engeom-0.1.1/src/geom2.rs +0 -286
  30. engeom-0.1.1/src/isometries.rs +0 -8
  31. engeom-0.1.1/src/primitives.rs +0 -3
  32. {engeom-0.1.1 → engeom-0.1.2}/.github/workflows/CI.yml +0 -0
  33. {engeom-0.1.1 → engeom-0.1.2}/.gitignore +0 -0
  34. {engeom-0.1.1 → engeom-0.1.2}/.gitmodules +0 -0
  35. {engeom-0.1.1 → engeom-0.1.2}/engeom/.gitignore +0 -0
  36. {engeom-0.1.1 → engeom-0.1.2}/engeom/README.md +0 -0
  37. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/airfoils/camber.md +0 -0
  38. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/airfoils/overview.md +0 -0
  39. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/angles.md +0 -0
  40. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/core_space.md +0 -0
  41. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/discrete_domain.md +0 -0
  42. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/images/surface_point_meas.svg +0 -0
  43. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/common/svd_basis.md +0 -0
  44. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/alignment.md +0 -0
  45. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/curve.md +0 -0
  46. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/point_collections.md +0 -0
  47. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/geom2/shapes.md +0 -0
  48. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/index.md +0 -0
  49. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/javascripts/mathjax.js +0 -0
  50. {engeom-0.1.1 → engeom-0.1.2}/engeom/docs/python_rust.md +0 -0
  51. {engeom-0.1.1 → engeom-0.1.2}/engeom/mkdocs.yml +0 -0
  52. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/camber.rs +0 -0
  53. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/edges.rs +0 -0
  54. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/helpers.rs +0 -0
  55. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/inscribed_circle.rs +0 -0
  56. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil/orientation.rs +0 -0
  57. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/airfoil.rs +0 -0
  58. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/align.rs +0 -0
  59. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/angles.rs +0 -0
  60. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/convert_2d_3d.rs +0 -0
  61. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/discrete_domain.rs +0 -0
  62. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/interval.rs +0 -0
  63. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/points.rs +0 -0
  64. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/surface_point.rs +0 -0
  65. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/svd_basis.rs +0 -0
  66. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common/vec_f64.rs +0 -0
  67. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/common.rs +0 -0
  68. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/errors.rs +0 -0
  69. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1/common_functions.rs +0 -0
  70. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1/polynomial.rs +0 -0
  71. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1/series1.rs +0 -0
  72. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/func1.rs +0 -0
  73. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2/jacobian.rs +0 -0
  74. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2/points_to_curve.rs +0 -0
  75. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2/rc_params2.rs +0 -0
  76. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/align2.rs +0 -0
  77. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/angles2.rs +0 -0
  78. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/circle2.rs +0 -0
  79. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/hull.rs +0 -0
  80. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/kd_tree2.rs +0 -0
  81. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/line2.rs +0 -0
  82. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2/polyline2.rs +0 -0
  83. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom2.rs +0 -0
  84. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/jacobian.rs +0 -0
  85. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/multi_param.rs +0 -0
  86. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/points_to_mesh.rs +0 -0
  87. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3/rotations.rs +0 -0
  88. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/align3.rs +0 -0
  89. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/kd_tree3.rs +0 -0
  90. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh/patches.rs +0 -0
  91. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh/serialization.rs +0 -0
  92. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/mesh/uv_mapping.rs +0 -0
  93. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3/points.rs +0 -0
  94. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/geom3.rs +0 -0
  95. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/line_profiles.rs +0 -0
  96. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/surface_deviation.rs +0 -0
  97. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/tolerance.rs +0 -0
  98. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology/tolerance_map.rs +0 -0
  99. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/metrology.rs +0 -0
  100. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/stats.rs +0 -0
  101. {engeom-0.1.1 → engeom-0.1.2}/engeom/src/utility.rs +0 -0
  102. {engeom-0.1.1 → engeom-0.1.2}/pyproject.toml +0 -0
  103. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/__init__.py +0 -0
  104. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/align/__init__.py +0 -0
  105. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/align.pyi +0 -0
  106. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/geom2/__init__.py +0 -0
  107. {engeom-0.1.1 → engeom-0.1.2}/python/engeom/geom3/__init__.py +0 -0
  108. {engeom-0.1.1 → engeom-0.1.2}/python/tests/test_all.py +0 -0
  109. {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
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.0"
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.1"
616
+ version = "0.1.2"
617
617
  dependencies = [
618
618
  "engeom",
619
619
  "numpy",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "py-engeom"
3
- version = "0.1.1"
3
+ version = "0.1.2"
4
4
  edition = "2021"
5
5
 
6
6
  # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engeom
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -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
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.0"
279
+ version = "0.1.1"
280
280
  dependencies = [
281
281
  "approx",
282
282
  "criterion",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "engeom"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  edition = "2021"
5
5
  readme = "README.md"
6
6
 
@@ -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 transformed(&self, transform: &Iso2) -> Self {
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, SurfacePoint3, Result};
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
- Ok(Mesh::new(vertices, triangles, false))
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, SvdBasis3,
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
- import numpy
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
-