engeom 0.1.2__cp38-abi3-win_amd64.whl → 0.2.3__cp38-abi3-win_amd64.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/airfoil/__init__.py +5 -0
- engeom/airfoil.pyi +334 -0
- engeom/align.pyi +2 -2
- engeom/engeom.pyd +0 -0
- engeom/engeom.pyi +8 -3
- engeom/geom2.pyi +234 -16
- engeom/geom3.pyi +195 -29
- engeom/matplotlib.py +181 -29
- engeom/metrology/__init__.py +5 -0
- engeom/metrology.pyi +64 -0
- engeom/pyvista.py +151 -48
- {engeom-0.1.2.dist-info → engeom-0.2.3.dist-info}/METADATA +1 -1
- engeom-0.2.3.dist-info/RECORD +18 -0
- {engeom-0.1.2.dist-info → engeom-0.2.3.dist-info}/WHEEL +1 -1
- engeom-0.1.2.dist-info/RECORD +0 -14
engeom/pyvista.py
CHANGED
@@ -1,14 +1,19 @@
|
|
1
1
|
"""
|
2
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
@@ -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=_g1M2QM3kt1Ssm_sHOg_3TUY7GxNE2Ueyslb9ZDtPwk,94
|
3
|
+
engeom/airfoil/__init__.py,sha256=G6m7JEvHVk3sM2JooJPOg8JNA3VuEp0EIqczSEbC_PY,180
|
4
|
+
engeom/airfoil.pyi,sha256=0TVpXkolFUXbBqJp93FenA_XqvU7FD1DnbncAF0ubow,14654
|
5
|
+
engeom/align/__init__.py,sha256=SEeMqeqLKqJC73Mg8GwPwd9NwWnl-dcCqJ4rPdh8yyc,196
|
6
|
+
engeom/align.pyi,sha256=QCSKrTLkCoaIubcrPU9J-wDZe1lRP0GbPgWZmonXjo0,997
|
7
|
+
engeom/engeom.pyi,sha256=Jia11rU8ZnMKdlXgfGeBPlSmsYPEfALM-_ufNwR0ibQ,254
|
8
|
+
engeom/geom2/__init__.py,sha256=mRu8Zh6DE-EQyhxScoxszPqDjGVzGWVJEQO6RIAtS4A,174
|
9
|
+
engeom/geom2.pyi,sha256=Jh0ES-Gvkl7sFQV7VG6KdwgDbCPhmiETG_YOObYazhU,22741
|
10
|
+
engeom/geom3/__init__.py,sha256=DG5jt2xgS9WRNb58ZkkrcKQQO6bIG-irg-uV_BkHEj4,174
|
11
|
+
engeom/geom3.pyi,sha256=hIIwBa-n08CaEcPR-dB_RhksPoR74HJrV4jT9CNiqhs,33556
|
12
|
+
engeom/matplotlib.py,sha256=A0gdQshzE3G7joNHna4viYnioQtA8LVXfSuZ_X6AHeo,9001
|
13
|
+
engeom/metrology/__init__.py,sha256=cpsB0-hJGitzW79Coxwf7r_mpNaeI6yG3myDEVdBJgk,186
|
14
|
+
engeom/metrology.pyi,sha256=P_2pkoLUAOB0-RKppj0FN01XGY0jx1lGw9H1eKXrW8s,1144
|
15
|
+
engeom/pyvista.py,sha256=lqqFxsl_YVXEh0_szuH-y9HWkqMXpuVxFrWJyn8mxKY,5382
|
16
|
+
engeom/__init__.py,sha256=kYgFq3jq1quDfV013wEYQMlUBz4QNSpP6u8lFiuTHvc,115
|
17
|
+
engeom/engeom.pyd,sha256=BfTGfLE8zCZdjb1HavQNjavko9FB5e6BYdknfbDSM70,2315776
|
18
|
+
engeom-0.2.3.dist-info/RECORD,,
|
engeom-0.1.2.dist-info/RECORD
DELETED
@@ -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=mYDPFrpmO1_UhonyEoMo2i0zHOwqc92hj_Q3CYuEBdM,94
|
3
|
-
engeom/align/__init__.py,sha256=SEeMqeqLKqJC73Mg8GwPwd9NwWnl-dcCqJ4rPdh8yyc,196
|
4
|
-
engeom/align.pyi,sha256=KBC0nwcyp4YMfY2hRN1gr3DqFah-unqAd_o1KYwJAqc,1022
|
5
|
-
engeom/engeom.pyi,sha256=J44RFBaKfnr1z7WyXCeE-_wEJZvpRJBfHINfDPR93c4,204
|
6
|
-
engeom/geom2/__init__.py,sha256=mRu8Zh6DE-EQyhxScoxszPqDjGVzGWVJEQO6RIAtS4A,174
|
7
|
-
engeom/geom2.pyi,sha256=De3YQSGpS4UQ1zawtIsuVR4-7rcFjqmNvL9lbtzN_d4,17117
|
8
|
-
engeom/geom3/__init__.py,sha256=DG5jt2xgS9WRNb58ZkkrcKQQO6bIG-irg-uV_BkHEj4,174
|
9
|
-
engeom/geom3.pyi,sha256=fEFhdFmEJsDP3X0aE_N0heqMyyPnbYjpeB0hTR2xjOI,27295
|
10
|
-
engeom/matplotlib.py,sha256=Y9JZqpEFHm5EVzbr20P-NdxndNZdDH32OhE_KjxG_S4,3025
|
11
|
-
engeom/pyvista.py,sha256=Lyvm0K_rvhR2wZACtfwCPYwEuABqYSTdjvbBaQS9yI4,1721
|
12
|
-
engeom/__init__.py,sha256=kYgFq3jq1quDfV013wEYQMlUBz4QNSpP6u8lFiuTHvc,115
|
13
|
-
engeom/engeom.pyd,sha256=HaBm5BbeFpB1PMnziqm2ljTrSBgnU353rCX5H4bj3vM,1311232
|
14
|
-
engeom-0.1.2.dist-info/RECORD,,
|