engeom 0.2.6__tar.gz → 0.2.7__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.2.6 → engeom-0.2.7}/Cargo.lock +1 -1
- {engeom-0.2.6 → engeom-0.2.7}/Cargo.toml +1 -1
- {engeom-0.2.6 → engeom-0.2.7}/PKG-INFO +1 -1
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/lib.rs +1 -0
- engeom-0.2.7/engeom/src/raster3.rs +60 -0
- engeom-0.2.7/python/engeom/raster3/__init__.py +9 -0
- engeom-0.2.7/python/engeom/raster3.pyi +19 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/lib.rs +12 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/mesh.rs +11 -2
- engeom-0.2.7/src/raster.rs +40 -0
- {engeom-0.2.6 → engeom-0.2.7}/.github/workflows/CI.yml +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/.gitignore +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/.gitmodules +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/README.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/airfoils/intro.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/api/airfoil.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/api/engeom.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/api/geom2.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/api/geom3.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/api/metrology.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/api/plot.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/bounding_volumes.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/curves.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/images/surface_point_meas.svg +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/index.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/isometries.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/meshes.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/metrology.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/numpy.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/planes_circles_lines.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/points_vectors.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/surf_points.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/docs/svd_basis.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/.gitignore +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/Cargo.lock +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/Cargo.toml +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/README.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/airfoils/camber.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/airfoils/overview.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/common/angles.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/common/core_space.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/common/discrete_domain.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/common/images/surface_point_meas.svg +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/common/svd_basis.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/geom2/alignment.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/geom2/curve.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/geom2/point_collections.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/geom2/shapes.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/index.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/javascripts/mathjax.js +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/docs/python_rust.md +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/mkdocs.yml +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/airfoil/camber.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/airfoil/edges.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/airfoil/helpers.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/airfoil/inscribed_circle.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/airfoil/orientation.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/airfoil.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/align.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/angles.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/convert_2d_3d.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/discrete_domain.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/indices.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/interval.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/kd_tree.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/points.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/poisson_disk.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/surface_point.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/svd_basis.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common/vec_f64.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/common.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/errors.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/func1/common_functions.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/func1/polynomial.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/func1/series1.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/func1.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/aabb2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/align2/jacobian.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/align2/points_to_curve.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/align2/rc_params2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/align2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/angles2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/circle2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/curve2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/hull.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/line2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2/polyline2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/align3/jacobian.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/align3/multi_param.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/align3/points_to_mesh.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/align3/rotations.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/align3.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/curve3.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/conformal.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/edges.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/faces.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/filtering.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/measurement.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/patches.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/queries.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/sampling.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh/uv_mapping.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/mesh.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/plane3.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3/point_cloud.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/geom3.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/io.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/metrology/dimension.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/metrology/line_profiles.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/metrology/surface_deviation.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/metrology/tolerance.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/metrology/tolerance_map.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/metrology.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/stats.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/engeom/src/utility.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/mkdocs.yml +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/pyproject.toml +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/_plot/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/_plot/common.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/_plot/matplotlib.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/_plot/pyvista.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/airfoil/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/airfoil.pyi +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/align/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/align.pyi +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/engeom.pyi +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/geom2/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/geom2.pyi +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/geom3/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/geom3.pyi +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/metrology/__init__.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/metrology.pyi +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/engeom/plot.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/tests/test_all.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/tests/test_geom2_simple.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/python/tests/test_geom3_simple.py +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/airfoil.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/alignments.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/bounding.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/common.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/conversions.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/geom2.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/geom3.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/metrology.rs +0 -0
- {engeom-0.2.6 → engeom-0.2.7}/src/svd_basis.rs +1 -1
@@ -0,0 +1,60 @@
|
|
1
|
+
//! This module contains tools for working with 3D voxel grids.
|
2
|
+
|
3
|
+
|
4
|
+
use std::collections::HashSet;
|
5
|
+
|
6
|
+
|
7
|
+
/// This function takes a set of coordinates in a 3D grid and returns a list of clusters of
|
8
|
+
/// connected voxel coordinates.
|
9
|
+
///
|
10
|
+
/// # Arguments
|
11
|
+
///
|
12
|
+
/// * `indices`:
|
13
|
+
///
|
14
|
+
/// returns: Vec<Vec<(u32, u32, u32), Global>, Global>
|
15
|
+
///
|
16
|
+
/// # Examples
|
17
|
+
///
|
18
|
+
/// ```
|
19
|
+
///
|
20
|
+
/// ```
|
21
|
+
pub fn clusters_from_sparse(mut indices: HashSet<(i32, i32, i32)>) -> Vec<Vec<(i32, i32, i32)>> {
|
22
|
+
let mut results = Vec::new();
|
23
|
+
|
24
|
+
while !indices.is_empty() {
|
25
|
+
let mut working = Vec::new();
|
26
|
+
let mut to_visit = Vec::new();
|
27
|
+
|
28
|
+
to_visit.push(pop_index(&mut indices));
|
29
|
+
|
30
|
+
while !to_visit.is_empty() {
|
31
|
+
let current = to_visit.pop().unwrap();
|
32
|
+
working.push(current);
|
33
|
+
|
34
|
+
for x in -1..=1 {
|
35
|
+
for y in -1..=1 {
|
36
|
+
for z in -1..=1 {
|
37
|
+
if x == 0 && y == 0 && z == 0 {
|
38
|
+
continue;
|
39
|
+
}
|
40
|
+
|
41
|
+
let neighbor = (current.0 + x, current.1 + y, current.2 + z);
|
42
|
+
if indices.remove(&neighbor) {
|
43
|
+
to_visit.push(neighbor);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
results.push(working.into_iter().collect());
|
51
|
+
}
|
52
|
+
|
53
|
+
results
|
54
|
+
}
|
55
|
+
|
56
|
+
fn pop_index(indices: &mut HashSet<(i32, i32, i32)>) -> (i32, i32, i32) {
|
57
|
+
let result = indices.iter().next().unwrap().clone();
|
58
|
+
indices.remove(&result);
|
59
|
+
result
|
60
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
"""
|
2
|
+
This module provides a number of classes and functions for working with 3D raster (voxel) data.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from ..engeom import _raster3
|
6
|
+
|
7
|
+
# Global import of all functions
|
8
|
+
for name in [n for n in dir(_raster3) if not n.startswith("_")]:
|
9
|
+
globals()[name] = getattr(_raster3, name)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import List
|
4
|
+
|
5
|
+
from numpy.typing import NDArray
|
6
|
+
|
7
|
+
def clusters_from_sparse(indices: NDArray[int]) -> List[NDArray[int]]:
|
8
|
+
"""
|
9
|
+
Find clusters of connected voxel indices from a sparse array of voxel coordinates. The input array should be a Nx3
|
10
|
+
array of integer voxel indices. The output is a list of arrays, where each array contains the indices of a single
|
11
|
+
cluster of connected voxels.
|
12
|
+
|
13
|
+
The connectivity is defined as 26-connectivity, i.e. each voxel is connected to all neighbors with which it shares
|
14
|
+
at least one corner.
|
15
|
+
|
16
|
+
:param indices: Nx3 array of voxel indices
|
17
|
+
:return: List of arrays, each containing a Mx3 numpy array of the indices of a single cluster of connected voxels
|
18
|
+
"""
|
19
|
+
...
|
@@ -7,6 +7,7 @@ mod geom2;
|
|
7
7
|
mod geom3;
|
8
8
|
mod mesh;
|
9
9
|
mod metrology;
|
10
|
+
mod raster;
|
10
11
|
mod svd_basis;
|
11
12
|
|
12
13
|
use pyo3::prelude::*;
|
@@ -89,6 +90,14 @@ fn register_metrology_module(parent_module: &Bound<'_, PyModule>) -> PyResult<()
|
|
89
90
|
parent_module.add_submodule(&child)
|
90
91
|
}
|
91
92
|
|
93
|
+
fn register_raster3_module(parent_module: &Bound<'_, PyModule>) -> PyResult<()> {
|
94
|
+
let child = PyModule::new(parent_module.py(), "_raster3")?;
|
95
|
+
|
96
|
+
child.add_function(wrap_pyfunction!(raster::clusters_from_sparse, &child)?)?;
|
97
|
+
|
98
|
+
parent_module.add_submodule(&child)
|
99
|
+
}
|
100
|
+
|
92
101
|
/// Engeom is a library for geometric operations in 2D and 3D space.
|
93
102
|
#[pymodule(name = "engeom")]
|
94
103
|
fn py_engeom(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
@@ -98,6 +107,9 @@ fn py_engeom(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
98
107
|
// 3D geometry submodule
|
99
108
|
register_geom3(m)?;
|
100
109
|
|
110
|
+
// 3D raster module
|
111
|
+
register_raster3_module(m)?;
|
112
|
+
|
101
113
|
// Alignment submodule
|
102
114
|
register_align_module(m)?;
|
103
115
|
|
@@ -161,12 +161,21 @@ impl Mesh {
|
|
161
161
|
Ok(result.into_pyarray(py))
|
162
162
|
}
|
163
163
|
|
164
|
-
fn measure_point_deviation(
|
164
|
+
fn measure_point_deviation(
|
165
|
+
&self,
|
166
|
+
x: f64,
|
167
|
+
y: f64,
|
168
|
+
z: f64,
|
169
|
+
dist_mode: DeviationMode,
|
170
|
+
) -> Distance3 {
|
165
171
|
let point = engeom::Point3::new(x, y, z);
|
166
172
|
Distance3::from_inner(self.inner.measure_point_deviation(&point, dist_mode.into()))
|
167
173
|
}
|
168
174
|
|
169
|
-
fn boundary_first_flatten<'py>(
|
175
|
+
fn boundary_first_flatten<'py>(
|
176
|
+
&self,
|
177
|
+
py: Python<'py>,
|
178
|
+
) -> PyResult<Bound<'py, PyArrayDyn<f64>>> {
|
170
179
|
let edges = self
|
171
180
|
.inner
|
172
181
|
.calc_edges()
|
@@ -0,0 +1,40 @@
|
|
1
|
+
use numpy::ndarray::{Array1, ArrayD};
|
2
|
+
use numpy::{IntoPyArray, PyArray1, PyArrayDyn, PyReadonlyArrayDyn, PyUntypedArrayMethods};
|
3
|
+
use pyo3::exceptions::PyValueError;
|
4
|
+
use pyo3::types::PyIterator;
|
5
|
+
use pyo3::{
|
6
|
+
pyclass, pyfunction, Bound, FromPyObject, IntoPyObject, IntoPyObjectExt, Py, PyAny, PyResult,
|
7
|
+
Python,
|
8
|
+
};
|
9
|
+
use std::collections::HashSet;
|
10
|
+
|
11
|
+
#[pyfunction]
|
12
|
+
pub fn clusters_from_sparse<'py>(
|
13
|
+
indices: PyReadonlyArrayDyn<'py, i32>,
|
14
|
+
) -> PyResult<Vec<Bound<'py, PyArrayDyn<i32>>>> {
|
15
|
+
let shape = indices.shape();
|
16
|
+
if shape.len() != 2 || shape[1] != 3 {
|
17
|
+
return Err(PyValueError::new_err("Expected Nx3 array of indices"));
|
18
|
+
}
|
19
|
+
|
20
|
+
let mut working = HashSet::new();
|
21
|
+
for r in indices.as_array().rows().into_iter() {
|
22
|
+
let idx = (r[0], r[1], r[2]);
|
23
|
+
working.insert(idx);
|
24
|
+
}
|
25
|
+
|
26
|
+
let mut results = engeom::raster3::clusters_from_sparse(working);
|
27
|
+
let mut combined = Vec::new();
|
28
|
+
|
29
|
+
for result in results.drain(..) {
|
30
|
+
let mut array = ArrayD::zeros(vec![result.len(), 3]);
|
31
|
+
for (i, idx) in result.iter().enumerate() {
|
32
|
+
array[[i, 0]] = idx.0;
|
33
|
+
array[[i, 1]] = idx.1;
|
34
|
+
array[[i, 2]] = idx.2;
|
35
|
+
}
|
36
|
+
combined.push(array.into_pyarray(indices.py()));
|
37
|
+
}
|
38
|
+
|
39
|
+
Ok(combined)
|
40
|
+
}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,9 +1,9 @@
|
|
1
1
|
use crate::conversions::{array_to_points2, array_to_points3};
|
2
|
+
use crate::geom2::{Iso2, Vector2};
|
2
3
|
use crate::geom3::{Iso3, Vector3};
|
3
4
|
use numpy::ndarray::Array1;
|
4
5
|
use numpy::{IntoPyArray, PyArray1, PyReadonlyArray1, PyReadonlyArrayDyn};
|
5
6
|
use pyo3::prelude::*;
|
6
|
-
use crate::geom2::{Iso2, Vector2};
|
7
7
|
|
8
8
|
#[pyclass]
|
9
9
|
pub struct SvdBasis2 {
|