engeom 0.1.2__cp38-abi3-macosx_11_0_arm64.whl → 0.2.3__cp38-abi3-macosx_11_0_arm64.whl

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/pyvista.py CHANGED
@@ -1,14 +1,19 @@
1
1
  """
2
- This module contains helper functions for working with PyVista.
2
+ This module contains helper functions for working with PyVista.
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
- from typing import List
7
+ from typing import List, Any, Dict, Union, Iterable, Tuple
7
8
 
8
9
  import numpy
9
10
  from pyvista import ColorLike
10
11
 
11
- from .geom3 import Mesh, Curve3
12
+ from .geom3 import Mesh, Curve3, Vector3, Point3
13
+ from .metrology import Length3
14
+ from .matplotlib import LabelPlace
15
+
16
+ PlotCoords = Union[Point3, Vector3, Iterable[float]]
12
17
 
13
18
  try:
14
19
  import pyvista
@@ -16,48 +21,146 @@ except ImportError:
16
21
  pass
17
22
  else:
18
23
 
19
- def mesh_polydata(mesh: Mesh) -> pyvista.PolyData:
20
- """
21
- Creates a PyVista PolyData object from a Mesh object.
22
- :param mesh: a Mesh object
23
- :return: a PyVista PolyData object
24
- """
25
-
26
- if pyvista is None:
27
- raise ImportError("PyVista is not installed.")
28
-
29
- vertices = mesh.clone_vertices()
30
- faces = mesh.clone_triangles()
31
- faces = numpy.hstack((numpy.ones((faces.shape[0], 1), dtype=faces.dtype) * 3, faces))
32
- return pyvista.PolyData(vertices, faces)
33
-
34
-
35
- def add_curves_to_plotter(
36
- plotter: pyvista.Plotter,
37
- curves: List[Curve3],
38
- color: ColorLike = 'w',
39
- width: float = 5.0,
40
- label: str | None = None,
41
- name: str | None = None,
42
- ) -> List[pyvista.vtkActor]:
43
- """
44
- Adds curves to a PyVista plotter.
45
- :param plotter:
46
- :param curves:
47
- :param color:
48
- :param width:
49
- :param label:
50
- :param name:
51
- :return:
52
- """
53
-
54
- if pyvista is None:
55
- raise ImportError("PyVista is not installed.")
56
-
57
- result_list = []
58
- for curve in curves:
59
- v = curve.clone_vertices()
60
- added = plotter.add_lines(v, connected=True, color=color, width=width, label=label, name=name)
61
- result_list.append(added)
62
-
63
- return result_list
24
+ class PlotterHelper:
25
+ def __init__(self, plotter: pyvista.Plotter):
26
+ self.plotter = plotter
27
+
28
+ def add_curves(
29
+ self,
30
+ *curves: Curve3,
31
+ color: ColorLike = "w",
32
+ width: float = 5.0,
33
+ label: str | None = None,
34
+ name: str | None = None,
35
+ ) -> List[pyvista.vtkActor]:
36
+ """
37
+
38
+ :param curves:
39
+ :param color:
40
+ :param width:
41
+ :param label:
42
+ :param name:
43
+ :return:
44
+ """
45
+ result_list = []
46
+ for curve in curves:
47
+ added = self.plotter.add_lines(
48
+ curve.points,
49
+ connected=True,
50
+ color=color,
51
+ width=width,
52
+ label=label,
53
+ name=name,
54
+ )
55
+ result_list.append(added)
56
+
57
+ return result_list
58
+
59
+ def add_mesh(self, mesh: Mesh, **kwargs) -> pyvista.vtkActor:
60
+ """
61
+
62
+ :param mesh:
63
+ :return:
64
+ """
65
+ if "cmap" in kwargs:
66
+ cmap_extremes = _cmap_extremes(kwargs["cmap"])
67
+ kwargs.update(cmap_extremes)
68
+
69
+ prefix = numpy.ones((mesh.faces.shape[0], 1), dtype=mesh.faces.dtype)
70
+ faces = numpy.hstack((prefix * 3, mesh.faces))
71
+ data = pyvista.PolyData(mesh.vertices, faces)
72
+ return self.plotter.add_mesh(data, **kwargs)
73
+
74
+ def dimension(
75
+ self,
76
+ length: Length3,
77
+ template: str = "{value:.3f}",
78
+ label_place: LabelPlace = LabelPlace.Outside,
79
+ label_offset: float | None = None,
80
+ text_size: int = 16,
81
+ scale_value: float = 1.0,
82
+ ):
83
+ label_offset = label_offset or max(abs(length.value), 1.0) * 3
84
+
85
+ t_a = length.center.scalar_projection(length.a)
86
+ t_b = length.center.scalar_projection(length.b)
87
+
88
+ outside = length.center.at_distance(max(t_a, t_b))
89
+ inside = length.center.at_distance(min(t_a, t_b))
90
+
91
+ circles = []
92
+ builder = LineBuilder()
93
+
94
+ builder.add(inside - length.direction * label_offset * 0.25)
95
+ builder.add(inside)
96
+ circles.append(inside)
97
+ builder.skip()
98
+
99
+ circles.append(outside)
100
+ builder.add(outside)
101
+ builder.add(outside + length.direction * label_offset)
102
+
103
+ points = numpy.array([_tuplefy(p) for p in circles], dtype=numpy.float64)
104
+ self.plotter.add_points(points, color="black", point_size=4, render_points_as_spheres=True)
105
+
106
+ lines = builder.build()
107
+ self.plotter.add_lines(lines, color="black", width=1.5)
108
+
109
+ value = length.value * scale_value
110
+ label = pyvista.Label(text=template.format(value=value), position=lines[-1], size=text_size)
111
+ self.plotter.add_actor(label)
112
+
113
+ def arrow(self, start: PlotCoords, direction: PlotCoords,
114
+ tip_length: float = 0.25,
115
+ tip_radius: float = 0.1,
116
+ shaft_radius: float = 0.05,
117
+ **kwargs):
118
+ pd = pyvista.Arrow(_tuplefy(start), _tuplefy(direction), tip_length=tip_length, tip_radius=tip_radius,
119
+ shaft_radius=shaft_radius)
120
+ self.plotter.add_mesh(pd, **kwargs, color="black")
121
+
122
+
123
+ def _cmap_extremes(item: Any) -> Dict[str, ColorLike]:
124
+ working = {}
125
+ try:
126
+ from matplotlib.colors import Colormap
127
+ except ImportError:
128
+ return working
129
+ else:
130
+ if isinstance(item, Colormap):
131
+ over = getattr(item, "_rgba_over", None)
132
+ under = getattr(item, "_rgba_under", None)
133
+ if over is not None:
134
+ working["above_color"] = over
135
+ if under is not None:
136
+ working["below_color"] = under
137
+ return working
138
+
139
+
140
+ class LineBuilder:
141
+ def __init__(self):
142
+ self.vertices = []
143
+ self._skip = 1
144
+
145
+ def add(self, points: PlotCoords):
146
+ if self.vertices:
147
+ if self._skip > 0:
148
+ self._skip -= 1
149
+ else:
150
+ self.vertices.append(self.vertices[-1])
151
+
152
+ self.vertices.append(_tuplefy(points))
153
+
154
+ def skip(self):
155
+ self._skip = 2
156
+
157
+ def build(self) -> numpy.ndarray:
158
+ return numpy.array(self.vertices, dtype=numpy.float64)
159
+
160
+
161
+ def _tuplefy(item: PlotCoords) -> Tuple[float, float, float]:
162
+ if isinstance(item, (Point3, Vector3)):
163
+ return item.x, item.y, item.z
164
+ else:
165
+ x, y, z, *_ = item
166
+ return x, y, z
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engeom
3
- Version: 0.1.2
3
+ Version: 0.2.3
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -0,0 +1,18 @@
1
+ engeom-0.2.3.dist-info/METADATA,sha256=iGZ__VhZChSD4XCI0Wz0nfHMgMdD2GJEcaFqx6f1Jpo,339
2
+ engeom-0.2.3.dist-info/WHEEL,sha256=nueuVYsuRBtSjfqcjzlZpAANOvhemlVJqHt21fcVDVQ,102
3
+ engeom/geom2.pyi,sha256=Jh0ES-Gvkl7sFQV7VG6KdwgDbCPhmiETG_YOObYazhU,22741
4
+ engeom/geom3.pyi,sha256=hIIwBa-n08CaEcPR-dB_RhksPoR74HJrV4jT9CNiqhs,33556
5
+ engeom/geom3/__init__.py,sha256=DG5jt2xgS9WRNb58ZkkrcKQQO6bIG-irg-uV_BkHEj4,174
6
+ engeom/pyvista.py,sha256=lqqFxsl_YVXEh0_szuH-y9HWkqMXpuVxFrWJyn8mxKY,5382
7
+ engeom/geom2/__init__.py,sha256=mRu8Zh6DE-EQyhxScoxszPqDjGVzGWVJEQO6RIAtS4A,174
8
+ engeom/metrology/__init__.py,sha256=cpsB0-hJGitzW79Coxwf7r_mpNaeI6yG3myDEVdBJgk,186
9
+ engeom/matplotlib.py,sha256=A0gdQshzE3G7joNHna4viYnioQtA8LVXfSuZ_X6AHeo,9001
10
+ engeom/airfoil.pyi,sha256=0TVpXkolFUXbBqJp93FenA_XqvU7FD1DnbncAF0ubow,14654
11
+ engeom/airfoil/__init__.py,sha256=G6m7JEvHVk3sM2JooJPOg8JNA3VuEp0EIqczSEbC_PY,180
12
+ engeom/__init__.py,sha256=QN5uETqrN442w41foyrcCPV_x6NP-mrxkPJhdvdey1g,109
13
+ engeom/align/__init__.py,sha256=SEeMqeqLKqJC73Mg8GwPwd9NwWnl-dcCqJ4rPdh8yyc,196
14
+ engeom/engeom.pyi,sha256=gZZGESiXpLyARdKpYz7TAM0VUqWQ3hZQeTmksJTYWFw,242
15
+ engeom/metrology.pyi,sha256=P_2pkoLUAOB0-RKppj0FN01XGY0jx1lGw9H1eKXrW8s,1144
16
+ engeom/align.pyi,sha256=QCSKrTLkCoaIubcrPU9J-wDZe1lRP0GbPgWZmonXjo0,997
17
+ engeom/engeom.abi3.so,sha256=yETHF2tu1xjV83vhZbPYjCEjEvd7FCMPO29ykQ0hnI0,2609440
18
+ engeom-0.2.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: maturin (1.8.1)
2
+ Generator: maturin (1.8.2)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp38-abi3-macosx_11_0_arm64
@@ -1,14 +0,0 @@
1
- engeom-0.1.2.dist-info/METADATA,sha256=ym_mnfPDlcTOzcYgeEZGMCFsgidl30syGoPDLY_B2eA,339
2
- engeom-0.1.2.dist-info/WHEEL,sha256=fPYOJLx2edKzGkAKHiRlt5qr-MtqxrOB4_pSJ_LwCfA,102
3
- engeom/geom2.pyi,sha256=De3YQSGpS4UQ1zawtIsuVR4-7rcFjqmNvL9lbtzN_d4,17117
4
- engeom/geom3.pyi,sha256=fEFhdFmEJsDP3X0aE_N0heqMyyPnbYjpeB0hTR2xjOI,27295
5
- engeom/geom3/__init__.py,sha256=DG5jt2xgS9WRNb58ZkkrcKQQO6bIG-irg-uV_BkHEj4,174
6
- engeom/pyvista.py,sha256=Lyvm0K_rvhR2wZACtfwCPYwEuABqYSTdjvbBaQS9yI4,1721
7
- engeom/geom2/__init__.py,sha256=mRu8Zh6DE-EQyhxScoxszPqDjGVzGWVJEQO6RIAtS4A,174
8
- engeom/matplotlib.py,sha256=Y9JZqpEFHm5EVzbr20P-NdxndNZdDH32OhE_KjxG_S4,3025
9
- engeom/__init__.py,sha256=QN5uETqrN442w41foyrcCPV_x6NP-mrxkPJhdvdey1g,109
10
- engeom/align/__init__.py,sha256=SEeMqeqLKqJC73Mg8GwPwd9NwWnl-dcCqJ4rPdh8yyc,196
11
- engeom/engeom.pyi,sha256=pLlD_YazsO0zu3guQZx85btESz0gAwVv79xD0pjd7Nc,196
12
- engeom/align.pyi,sha256=KBC0nwcyp4YMfY2hRN1gr3DqFah-unqAd_o1KYwJAqc,1022
13
- engeom/engeom.abi3.so,sha256=kHH5nM0276tkazY1fxa9rGov5S_8YXTboKKLubEblnQ,1597472
14
- engeom-0.1.2.dist-info/RECORD,,