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/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=_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,,
@@ -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-win_amd64
@@ -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,,