emerge 0.6.3__tar.gz → 0.6.6__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.
Potentially problematic release.
This version of emerge might be problematic. Click here for more details.
- emerge-0.6.6/.bumpversion.toml +72 -0
- {emerge-0.6.3 → emerge-0.6.6}/PKG-INFO +1 -1
- {emerge-0.6.3 → emerge-0.6.6}/emerge/__init__.py +2 -1
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/__init__.py +1 -1
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/operations.py +67 -20
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/pcb.py +17 -12
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/polybased.py +118 -24
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/shapes.py +40 -4
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geometry.py +45 -14
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/howto.py +1 -1
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/microwave_3d.py +1 -1
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/microwave_data.py +24 -7
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/selection.py +1 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/simmodel.py +26 -1
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo10_sgh.py +3 -3
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo11_lumped_element_filter.py +4 -2
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo12_mode_alignment.py +2 -1
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo13_helix_antenna.py +12 -6
- emerge-0.6.3/examples/demo4_boundary_selection.py → emerge-0.6.6/examples/demo14_boundary_selection.py +2 -1
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo1_stepped_imp_filter.py +1 -1
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo2_combline_filter.py +2 -2
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo3_coupled_line_filter.py +2 -2
- emerge-0.6.3/examples/demo3_patch_antenna.py → emerge-0.6.6/examples/demo4_patch_antenna.py +3 -3
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo5_revolve.py +1 -0
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo6_striplines_with_vias.py +6 -4
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo7_periodic_cells.py +2 -1
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo8_waveguide_bpf_synthesis.py +4 -3
- {emerge-0.6.3 → emerge-0.6.6}/examples/demo9_dielectric_resonator.py +2 -1
- {emerge-0.6.3 → emerge-0.6.6}/pyproject.toml +1 -1
- {emerge-0.6.3 → emerge-0.6.6}/uv.lock +1 -1
- emerge-0.6.3/.bumpversion.toml +0 -30
- emerge-0.6.3/emerge/_emerge/geo/pipes.py +0 -62
- {emerge-0.6.3 → emerge-0.6.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/.gitignore +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/.opt +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/.python-version +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/LICENSE +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/README.md +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/THIRD_PARTY_LICENSES.md +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/UMFPACK_Install_windows.md +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/UMFPACK_installer_windows.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/__main__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/_cache_check.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/bc.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/const.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/coord.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/cs.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/dataset.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/elements/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/elements/femdata.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/elements/index_interp.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/elements/ned2_interp.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/elements/nedelec2.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/elements/nedleg2.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/horn.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/modeler.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/pcb_tools/calculator.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/pcb_tools/macro.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/pmlbox.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo/step.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/geo2d.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/logsettings.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/material.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/mesh3d.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/mesher.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/mth/common_functions.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/mth/integrals.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/mth/optimized.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/mth/pairing.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/periodic.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/adaptive_freq.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/assembly/assembler.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/assembly/curlcurl.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/assembly/generalized_eigen.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/assembly/generalized_eigen_hb.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/assembly/periodicbc.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/assembly/robinbc.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/microwave_bc.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/periodic.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/port_functions.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/sc.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/simjob.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/sparam.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/physics/microwave/touchstone.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/display.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/matplotlib/mpldisplay.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/pyvista/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/pyvista/display.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/pyvista/display_settings.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot/simple_plots.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/plot.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/projects/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/projects/_gen_base.txt +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/projects/_load_base.txt +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/projects/generate_project.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/simulation_data.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/solve_interfaces/cudss_interface.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/solve_interfaces/pardiso_interface.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/solver.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/_emerge/system.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/cli.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/ext.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/lib.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/plot.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/emerge/pyvista.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/src/__init__.py +0 -0
- {emerge-0.6.3 → emerge-0.6.6}/src/_img/logo.jpeg +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
[tool.bumpversion]
|
|
2
|
+
current_version = "0.6.6"
|
|
3
|
+
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
4
|
+
serialize = ["{major}.{minor}.{patch}"]
|
|
5
|
+
search = "{current_version}"
|
|
6
|
+
replace = "{new_version}"
|
|
7
|
+
regex = false
|
|
8
|
+
ignore_missing_version = false
|
|
9
|
+
ignore_missing_files = false
|
|
10
|
+
tag = true
|
|
11
|
+
sign_tags= false
|
|
12
|
+
tag_name = "v{new_version}"
|
|
13
|
+
tag_message = "Bump version: {current_version} → {new_version}"
|
|
14
|
+
allow_dirty = false
|
|
15
|
+
commit = true
|
|
16
|
+
message = "Bump version: {current_version} → {new_version}"
|
|
17
|
+
moveable_tags = []
|
|
18
|
+
commit_args = ""
|
|
19
|
+
setup_hooks = []
|
|
20
|
+
pre_commit_hooks = []
|
|
21
|
+
post_commit_hooks = []
|
|
22
|
+
|
|
23
|
+
[[tool.bumpversion.files]]
|
|
24
|
+
filename = "uv.lock"
|
|
25
|
+
|
|
26
|
+
[[tool.bumpversion.files]]
|
|
27
|
+
filename = "pyproject.toml"
|
|
28
|
+
|
|
29
|
+
[[tool.bumpversion.files]]
|
|
30
|
+
filename = "src/emerge/__init__.py"
|
|
31
|
+
|
|
32
|
+
[[tool.bumpversion.files]]
|
|
33
|
+
filename = "examples/demo1_stepped_imp_filter.py"
|
|
34
|
+
|
|
35
|
+
[[tool.bumpversion.files]]
|
|
36
|
+
filename = "examples/demo2_combline_filter.py"
|
|
37
|
+
|
|
38
|
+
[[tool.bumpversion.files]]
|
|
39
|
+
filename = "examples/demo3_coupled_line_filter.py"
|
|
40
|
+
|
|
41
|
+
[[tool.bumpversion.files]]
|
|
42
|
+
filename = "examples/demo4_patch_antenna.py"
|
|
43
|
+
|
|
44
|
+
[[tool.bumpversion.files]]
|
|
45
|
+
filename = "examples/demo5_revolve.py"
|
|
46
|
+
|
|
47
|
+
[[tool.bumpversion.files]]
|
|
48
|
+
filename = "examples/demo6_striplines_with_vias.py"
|
|
49
|
+
|
|
50
|
+
[[tool.bumpversion.files]]
|
|
51
|
+
filename = "examples/demo7_periodic_cells.py"
|
|
52
|
+
|
|
53
|
+
[[tool.bumpversion.files]]
|
|
54
|
+
filename = "examples/demo8_waveguide_bpf_synthesis.py"
|
|
55
|
+
|
|
56
|
+
[[tool.bumpversion.files]]
|
|
57
|
+
filename = "examples/demo9_dielectric_resonator.py"
|
|
58
|
+
|
|
59
|
+
[[tool.bumpversion.files]]
|
|
60
|
+
filename = "examples/demo10_sgh.py"
|
|
61
|
+
|
|
62
|
+
[[tool.bumpversion.files]]
|
|
63
|
+
filename = "examples/demo11_lumped_element_filter.py"
|
|
64
|
+
|
|
65
|
+
[[tool.bumpversion.files]]
|
|
66
|
+
filename = "examples/demo12_mode_alignment.py"
|
|
67
|
+
|
|
68
|
+
[[tool.bumpversion.files]]
|
|
69
|
+
filename = "examples/demo13_helix_antenna.py"
|
|
70
|
+
|
|
71
|
+
[[tool.bumpversion.files]]
|
|
72
|
+
filename = "examples/demo14_boundary_selection.py"
|
|
@@ -18,7 +18,7 @@ along with this program; if not, see
|
|
|
18
18
|
"""
|
|
19
19
|
import os
|
|
20
20
|
|
|
21
|
-
__version__ = "0.6.
|
|
21
|
+
__version__ = "0.6.6"
|
|
22
22
|
|
|
23
23
|
############################################################
|
|
24
24
|
# HANDLE ENVIRONMENT VARIABLES #
|
|
@@ -52,6 +52,7 @@ from ._emerge.cs import CoordinateSystem, CS, GCS, Plane, Axis, XAX, YAX, ZAX, X
|
|
|
52
52
|
from ._emerge.coord import Line
|
|
53
53
|
from ._emerge import geo
|
|
54
54
|
from ._emerge.selection import Selection, FaceSelection, DomainSelection, EdgeSelection
|
|
55
|
+
from ._emerge.geometry import select
|
|
55
56
|
from ._emerge.mth.common_functions import norm, coax_rout, coax_rin
|
|
56
57
|
from ._emerge.physics.microwave.sc import stratton_chu
|
|
57
58
|
from ._emerge.periodic import RectCell, HexCell
|
|
@@ -19,6 +19,6 @@ from .pcb import PCB
|
|
|
19
19
|
from .pmlbox import pmlbox
|
|
20
20
|
from .horn import Horn
|
|
21
21
|
from .shapes import Cylinder, CoaxCylinder, Box, XYPlate, HalfSphere, Sphere, Plate, OldBox, Alignment, Cone
|
|
22
|
-
from .operations import subtract, add, embed, remove, rotate, mirror, change_coordinate_system, translate, intersect
|
|
22
|
+
from .operations import subtract, add, embed, remove, rotate, mirror, change_coordinate_system, translate, intersect, unite
|
|
23
23
|
from .polybased import XYPolygon, GeoPrism, Disc, Curve
|
|
24
24
|
from .step import STEPItems
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
# along with this program; if not, see
|
|
16
16
|
# <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
|
-
from typing import TypeVar
|
|
19
|
-
from ..geometry import GeoSurface, GeoVolume, GeoObject, GeoPoint, GeoEdge
|
|
18
|
+
from typing import TypeVar, overload
|
|
19
|
+
from ..geometry import GeoSurface, GeoVolume, GeoObject, GeoPoint, GeoEdge, GeoPolygon
|
|
20
20
|
from ..cs import CoordinateSystem, GCS
|
|
21
21
|
import gmsh
|
|
22
22
|
import numpy as np
|
|
@@ -144,7 +144,8 @@ def rotate(main: GeoVolume,
|
|
|
144
144
|
c0: tuple[float, float, float],
|
|
145
145
|
ax: tuple[float, float, float],
|
|
146
146
|
angle: float,
|
|
147
|
-
|
|
147
|
+
make_copy: bool = False,
|
|
148
|
+
degree=True) -> GeoObject:
|
|
148
149
|
"""Rotates a GeoVolume object around an axist defined at a coordinate.
|
|
149
150
|
|
|
150
151
|
Args:
|
|
@@ -159,17 +160,23 @@ def rotate(main: GeoVolume,
|
|
|
159
160
|
"""
|
|
160
161
|
if degree:
|
|
161
162
|
angle = angle * np.pi/180
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
|
|
164
|
+
if make_copy:
|
|
165
|
+
rotate_obj = main.make_copy()
|
|
166
|
+
else:
|
|
167
|
+
rotate_obj = main
|
|
168
|
+
|
|
169
|
+
gmsh.model.occ.rotate(rotate_obj.dimtags, *c0, *ax, -angle)
|
|
164
170
|
# Rotate the facepointers
|
|
165
|
-
for fp in
|
|
171
|
+
for fp in rotate_obj._all_pointers:
|
|
166
172
|
fp.rotate(c0, ax, angle)
|
|
167
|
-
return
|
|
173
|
+
return rotate_obj
|
|
168
174
|
|
|
169
175
|
def translate(main: GeoVolume,
|
|
170
176
|
dx: float = 0,
|
|
171
177
|
dy: float = 0,
|
|
172
|
-
dz: float = 0
|
|
178
|
+
dz: float = 0,
|
|
179
|
+
make_copy: bool = False) -> GeoObject:
|
|
173
180
|
"""Translates the GeoVolume object along a given displacement
|
|
174
181
|
|
|
175
182
|
Args:
|
|
@@ -177,17 +184,23 @@ def translate(main: GeoVolume,
|
|
|
177
184
|
dx (float, optional): The X-displacement in meters. Defaults to 0.
|
|
178
185
|
dy (float, optional): The Y-displacement in meters. Defaults to 0.
|
|
179
186
|
dz (float, optional): The Z-displacement in meters. Defaults to 0.
|
|
187
|
+
make_copy (bool, optional): Whether to make a copy first before translating.
|
|
180
188
|
|
|
181
189
|
Returns:
|
|
182
|
-
|
|
190
|
+
GeoObject: The translated object
|
|
183
191
|
"""
|
|
184
|
-
|
|
192
|
+
|
|
193
|
+
if make_copy:
|
|
194
|
+
trans_obj = main.make_copy()
|
|
195
|
+
else:
|
|
196
|
+
trans_obj = main
|
|
197
|
+
gmsh.model.occ.translate(trans_obj.dimtags, dx, dy, dz)
|
|
185
198
|
|
|
186
199
|
# Rotate the facepointers
|
|
187
|
-
for fp in
|
|
200
|
+
for fp in trans_obj._all_pointers:
|
|
188
201
|
fp.translate(dx, dy, dz)
|
|
189
202
|
|
|
190
|
-
return
|
|
203
|
+
return trans_obj
|
|
191
204
|
|
|
192
205
|
def mirror(main: GeoObject,
|
|
193
206
|
origin: tuple[float, float, float] = (0.0, 0.0, 0.0),
|
|
@@ -199,6 +212,7 @@ def mirror(main: GeoObject,
|
|
|
199
212
|
main (GeoVolume): The object to mirror
|
|
200
213
|
origin (tuple[float, float, float], optional): The point of origin in meters. Defaults to (0.0, 0.0, 0.0).
|
|
201
214
|
direction (tuple[float, float, float], optional): The normal axis defining the plane of reflection. Defaults to (1.0, 0.0, 0.0).
|
|
215
|
+
make_copy (bool, optional): Whether to make a copy first before mirroring.
|
|
202
216
|
|
|
203
217
|
Returns:
|
|
204
218
|
GeoVolume: The mirrored GeoVolume object
|
|
@@ -211,14 +225,12 @@ def mirror(main: GeoObject,
|
|
|
211
225
|
d = -(a*x0 + b*y0 + c*z0)
|
|
212
226
|
if (a==0) and (b==0) and (c==0):
|
|
213
227
|
return main
|
|
228
|
+
|
|
214
229
|
mirror_obj = main
|
|
215
230
|
if make_copy:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
else:
|
|
220
|
-
gmsh.model.occ.mirror(main.dimtags, a,b,c,d)
|
|
221
|
-
|
|
231
|
+
mirror_obj = main.make_copy()
|
|
232
|
+
gmsh.model.occ.mirror(mirror_obj.dimtags, a,b,c,d)
|
|
233
|
+
|
|
222
234
|
for fp in mirror_obj._all_pointers:
|
|
223
235
|
fp.mirror(origin, direction)
|
|
224
236
|
return mirror_obj
|
|
@@ -237,7 +249,7 @@ def change_coordinate_system(main: GeoObject,
|
|
|
237
249
|
old_cs (CoordinateSystem, optional): The old coordinate system. Defaults to GCS.
|
|
238
250
|
|
|
239
251
|
Returns:
|
|
240
|
-
|
|
252
|
+
GeoObject: The output object
|
|
241
253
|
"""
|
|
242
254
|
if new_cs._is_global and old_cs._is_global:
|
|
243
255
|
return main
|
|
@@ -254,4 +266,39 @@ def change_coordinate_system(main: GeoObject,
|
|
|
254
266
|
for fp in main._all_pointers:
|
|
255
267
|
fp.affine_transform(M1)
|
|
256
268
|
fp.affine_transform(M2)
|
|
257
|
-
return main
|
|
269
|
+
return main
|
|
270
|
+
|
|
271
|
+
@overload
|
|
272
|
+
def unite(*objects: GeoVolume) -> GeoVolume: ...
|
|
273
|
+
|
|
274
|
+
@overload
|
|
275
|
+
def unite(*objects: GeoSurface) -> GeoSurface: ...
|
|
276
|
+
|
|
277
|
+
@overload
|
|
278
|
+
def unite(*objects: GeoEdge) -> GeoEdge: ...
|
|
279
|
+
|
|
280
|
+
@overload
|
|
281
|
+
def unite(*objects: GeoPolygon) -> GeoSurface: ...
|
|
282
|
+
|
|
283
|
+
def unite(*objects: GeoObject) -> GeoObject:
|
|
284
|
+
"""Applies a fusion consisting of all geometries in the argument.
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
GeoObject: The resultant object
|
|
288
|
+
"""
|
|
289
|
+
main, *rest = objects
|
|
290
|
+
if not rest:
|
|
291
|
+
return main
|
|
292
|
+
main._exists = False
|
|
293
|
+
dts = []
|
|
294
|
+
for other in rest:
|
|
295
|
+
dts.extend(other.dimtags)
|
|
296
|
+
other._exists = False
|
|
297
|
+
|
|
298
|
+
new_dimtags, mapping = gmsh.model.occ.fuse(main.dimtags, dts)
|
|
299
|
+
|
|
300
|
+
new_obj = GeoObject.from_dimtags(new_dimtags)._take_tools(*objects)
|
|
301
|
+
new_obj.set_material(main.material)
|
|
302
|
+
new_obj.prio_set(main._priority)
|
|
303
|
+
|
|
304
|
+
return new_obj
|
|
@@ -22,7 +22,7 @@ from ..geometry import GeoPolygon, GeoVolume, GeoSurface
|
|
|
22
22
|
from ..material import Material, AIR, COPPER
|
|
23
23
|
from .shapes import Box, Plate, Cylinder
|
|
24
24
|
from .polybased import XYPolygon
|
|
25
|
-
from .operations import change_coordinate_system
|
|
25
|
+
from .operations import change_coordinate_system, unite
|
|
26
26
|
from .pcb_tools.macro import parse_macro
|
|
27
27
|
from .pcb_tools.calculator import PCBCalculator
|
|
28
28
|
|
|
@@ -310,7 +310,6 @@ class StripCurve(StripTurn):
|
|
|
310
310
|
points: list[tuple[float, float]] = []
|
|
311
311
|
Npts = int(np.ceil(abs(self.angle/self.dang)))
|
|
312
312
|
R = self.radius-np.sign(self.angle)*self.width/2
|
|
313
|
-
print(R, self.circ_origin, self._xhat, self._yhat)
|
|
314
313
|
for i in range(Npts):
|
|
315
314
|
ang = abs((i+1)/Npts * self.angle * np.pi/180)
|
|
316
315
|
pnew = self.circ_origin + R*(self._xhat*np.cos(ang)+self._yhat*np.sin(ang))
|
|
@@ -324,7 +323,6 @@ class StripCurve(StripTurn):
|
|
|
324
323
|
|
|
325
324
|
Npts = int(np.ceil(abs(self.angle/self.dang)))
|
|
326
325
|
R = self.radius+np.sign(self.angle)*self.width/2
|
|
327
|
-
print(R, self.circ_origin, self._xhat, self._yhat)
|
|
328
326
|
for i in range(Npts):
|
|
329
327
|
ang = abs((i+1)/Npts * self.angle * np.pi/180)
|
|
330
328
|
pnew = self.circ_origin + R*(self._xhat*np.cos(ang)+self._yhat*np.sin(ang))
|
|
@@ -1247,7 +1245,13 @@ class PCB:
|
|
|
1247
1245
|
plate = change_coordinate_system(plate, self.cs)
|
|
1248
1246
|
return plate # type: ignore
|
|
1249
1247
|
|
|
1250
|
-
|
|
1248
|
+
@overload
|
|
1249
|
+
def generate_vias(self, merge=Literal[True]) -> GeoVolume: ...
|
|
1250
|
+
|
|
1251
|
+
@overload
|
|
1252
|
+
def generate_vias(self, merge=Literal[False]) -> list[Cylinder]: ...
|
|
1253
|
+
|
|
1254
|
+
def generate_vias(self, merge=False) -> list[Cylinder] | GeoVolume:
|
|
1251
1255
|
"""Generates the via objects.
|
|
1252
1256
|
|
|
1253
1257
|
Args:
|
|
@@ -1321,7 +1325,7 @@ class PCB:
|
|
|
1321
1325
|
Returns:
|
|
1322
1326
|
list[Polygon] | GeoSurface: The output stripline polygons possibly merged if merge = True.
|
|
1323
1327
|
"""
|
|
1324
|
-
polys = []
|
|
1328
|
+
polys: list[GeoSurface] = []
|
|
1325
1329
|
allx = []
|
|
1326
1330
|
ally = []
|
|
1327
1331
|
|
|
@@ -1359,13 +1363,14 @@ class PCB:
|
|
|
1359
1363
|
|
|
1360
1364
|
self.traces = polys
|
|
1361
1365
|
if merge:
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
polys
|
|
1366
|
+
polys = unite(*polys)
|
|
1367
|
+
# tags = []
|
|
1368
|
+
# for p in polys:
|
|
1369
|
+
# tags.extend(p.tags)
|
|
1370
|
+
# if p.material != COPPER:
|
|
1371
|
+
# logger.warning(f'Merging a polygon with material {p.material} into a single polygon that will be COPPER.')
|
|
1372
|
+
# polys = GeoSurface(tags)
|
|
1373
|
+
# polys.material = COPPER
|
|
1369
1374
|
return polys
|
|
1370
1375
|
|
|
1371
1376
|
############################################################
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
# <https://www.gnu.org/licenses/>.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
import numpy as np
|
|
19
|
-
from ..cs import CoordinateSystem, GCS, Axis
|
|
19
|
+
from ..cs import CoordinateSystem, GCS, Axis, _parse_axis
|
|
20
20
|
from ..geometry import GeoVolume, GeoPolygon, GeoEdge, GeoSurface
|
|
21
21
|
from .shapes import Alignment
|
|
22
22
|
import gmsh
|
|
@@ -158,7 +158,35 @@ def rotate_point(point: tuple[float, float, float],
|
|
|
158
158
|
rotated += o
|
|
159
159
|
return tuple(rotated)
|
|
160
160
|
|
|
161
|
+
def _dist(p1: tuple[float, float], p2: tuple[float, float]) -> float:
|
|
162
|
+
return ((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2)**(0.5)
|
|
161
163
|
|
|
164
|
+
def _pair_points(x1: np.ndarray,
|
|
165
|
+
y1: np.ndarray,
|
|
166
|
+
x2: np.ndarray,
|
|
167
|
+
y2: np.ndarray) -> list[tuple[int,int]]:
|
|
168
|
+
if x1.shape[0]==x2.shape[0]:
|
|
169
|
+
return [(i,i) for i in range(x1.shape[0])]
|
|
170
|
+
|
|
171
|
+
#create point tuples
|
|
172
|
+
p1s = [(x,y) for x,y in zip(x1, y1)]
|
|
173
|
+
p2s = [(x,y) for x,y in zip(x2, y2)]
|
|
174
|
+
|
|
175
|
+
pairs = []
|
|
176
|
+
for i, p1 in enumerate(p1s):
|
|
177
|
+
d1 = _dist(p1, p2s[i-1])
|
|
178
|
+
d2 = _dist(p1, p2s[i])
|
|
179
|
+
d3 = _dist(p1, p2s[i+1])
|
|
180
|
+
mind = min([d1, d2, d3])
|
|
181
|
+
if mind==d1:
|
|
182
|
+
pairs.append((i,i-1))
|
|
183
|
+
continue
|
|
184
|
+
elif mind==d2:
|
|
185
|
+
pairs.append((i,i))
|
|
186
|
+
else:
|
|
187
|
+
pairs.append((i,i+1))
|
|
188
|
+
return pairs
|
|
189
|
+
|
|
162
190
|
def orthonormalize(axis: np.ndarray) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
|
163
191
|
"""Generates a set of orthonormal vectors given an input vector X
|
|
164
192
|
|
|
@@ -233,8 +261,9 @@ class XYPolygon:
|
|
|
233
261
|
"""This class generalizes a polygon in an un-embedded XY space that can be embedded in 3D space.
|
|
234
262
|
"""
|
|
235
263
|
def __init__(self,
|
|
236
|
-
xs: np.ndarray | list | tuple = None,
|
|
237
|
-
ys: np.ndarray | list | tuple = None
|
|
264
|
+
xs: np.ndarray | list | tuple | None = None,
|
|
265
|
+
ys: np.ndarray | list | tuple | None = None,
|
|
266
|
+
cs: CoordinateSystem | None = None):
|
|
238
267
|
"""Constructs an XY-plane placed polygon.
|
|
239
268
|
|
|
240
269
|
Args:
|
|
@@ -250,7 +279,13 @@ class XYPolygon:
|
|
|
250
279
|
self.y: np.ndarray = np.asarray(ys)
|
|
251
280
|
|
|
252
281
|
self.fillets: list[tuple[float, int]] = []
|
|
282
|
+
|
|
283
|
+
self._cs: CoordinateSystem = cs
|
|
253
284
|
|
|
285
|
+
@property
|
|
286
|
+
def center(self) -> tuple[float, float]:
|
|
287
|
+
return np.mean(self.x), np.mean(self.y)
|
|
288
|
+
|
|
254
289
|
@property
|
|
255
290
|
def length(self):
|
|
256
291
|
return sum([((self.x[i2]-self.x[i1])**2 + (self.y[i2]-self.y[i1])**2)**0.5 for i1, i2 in zip(range(self.N-1),range(1, self.N))])
|
|
@@ -282,6 +317,10 @@ class XYPolygon:
|
|
|
282
317
|
"""
|
|
283
318
|
return 0.5*np.abs(np.dot(self.x,np.roll(self.y,1))-np.dot(self.y,np.roll(self.x,1)))
|
|
284
319
|
|
|
320
|
+
def incs(self, cs: CoordinateSystem) -> XYPolygon:
|
|
321
|
+
self._cs = cs
|
|
322
|
+
return self
|
|
323
|
+
|
|
285
324
|
def extend(self, xpts: list[float], ypts: list[float]) -> XYPolygon:
|
|
286
325
|
"""Adds a series for x and y coordinates to the existing polygon.
|
|
287
326
|
|
|
@@ -301,7 +340,7 @@ class XYPolygon:
|
|
|
301
340
|
for i in range(self.N):
|
|
302
341
|
yield (self.x[i], self.y[i])
|
|
303
342
|
|
|
304
|
-
def fillet(self, radius: float, *indices: int) ->
|
|
343
|
+
def fillet(self, radius: float, *indices: int) -> XYPolygon:
|
|
305
344
|
"""Add a fillet rounding with a given radius to the provided nodes.
|
|
306
345
|
|
|
307
346
|
Example:
|
|
@@ -313,8 +352,9 @@ class XYPolygon:
|
|
|
313
352
|
"""
|
|
314
353
|
for i in indices:
|
|
315
354
|
self.fillets.append((radius, i))
|
|
355
|
+
return self
|
|
316
356
|
|
|
317
|
-
def
|
|
357
|
+
def _make_wire(self, cs: CoordinateSystem) -> tuple[list[int], list[int], int]:
|
|
318
358
|
"""Turns the XYPolygon object into a GeoPolygon that is embedded in 3D space.
|
|
319
359
|
|
|
320
360
|
The polygon will be placed in the XY-plane of the provided coordinate center.
|
|
@@ -340,13 +380,27 @@ class XYPolygon:
|
|
|
340
380
|
|
|
341
381
|
add = 0
|
|
342
382
|
for radius, index in self.fillets:
|
|
343
|
-
t1 = lines[index + add]
|
|
344
|
-
t2 = lines[
|
|
383
|
+
t1 = lines[(index + add-1) % len(lines)]
|
|
384
|
+
t2 = lines[index + add]
|
|
345
385
|
tag = gmsh.model.occ.fillet2_d(t1, t2, radius)
|
|
346
386
|
lines.insert(index, tag)
|
|
347
387
|
add += 1
|
|
348
388
|
|
|
349
389
|
wiretag = gmsh.model.occ.add_wire(lines)
|
|
390
|
+
return ptags, lines, wiretag
|
|
391
|
+
|
|
392
|
+
def _finalize(self, cs: CoordinateSystem) -> GeoPolygon:
|
|
393
|
+
"""Turns the XYPolygon object into a GeoPolygon that is embedded in 3D space.
|
|
394
|
+
|
|
395
|
+
The polygon will be placed in the XY-plane of the provided coordinate center.
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
cs (CoordinateSystem, optional): The coordinate system in which to put the polygon. Defaults to None.
|
|
399
|
+
|
|
400
|
+
Returns:
|
|
401
|
+
GeoPolygon: The resultant 3D GeoPolygon object.
|
|
402
|
+
"""
|
|
403
|
+
ptags, lines, wiretag = self._make_wire(cs)
|
|
350
404
|
surftag = gmsh.model.occ.add_plane_surface([wiretag,])
|
|
351
405
|
poly = GeoPolygon([surftag,])
|
|
352
406
|
poly.points = ptags
|
|
@@ -384,6 +438,8 @@ class XYPolygon:
|
|
|
384
438
|
Returns:
|
|
385
439
|
GeoPolygon: The resultant object.
|
|
386
440
|
"""
|
|
441
|
+
if self._cs is not None:
|
|
442
|
+
return self._finalize(self._cs)
|
|
387
443
|
if cs is None:
|
|
388
444
|
cs = GCS
|
|
389
445
|
return self._finalize(cs)
|
|
@@ -500,7 +556,34 @@ class XYPolygon:
|
|
|
500
556
|
self.extend(xs, ys)
|
|
501
557
|
return self
|
|
502
558
|
|
|
559
|
+
def connect(self, other: XYPolygon) -> GeoVolume:
|
|
560
|
+
"""Connect two XYPolygons with a defined coordinate system
|
|
503
561
|
|
|
562
|
+
The coordinate system must be defined before this function can be used. To add a coordinate systme without
|
|
563
|
+
rendering the Polygon to a GeoVolume, use:
|
|
564
|
+
>>> polygon.incs(my_cs_obj)
|
|
565
|
+
|
|
566
|
+
Args:
|
|
567
|
+
other (XYPolygon): _descrThe otheiption_
|
|
568
|
+
|
|
569
|
+
Returns:
|
|
570
|
+
GeoVolume: The resultant volume object
|
|
571
|
+
"""
|
|
572
|
+
if self._cs is None:
|
|
573
|
+
raise RuntimeError('Cannot connect XYPolygons without a defined coordinate system. Set this first using .incs()')
|
|
574
|
+
if other._cs is None:
|
|
575
|
+
raise RuntimeError('Cannot connect XYPolygons without a defined coordinate system. Set this first using .incs()')
|
|
576
|
+
p1, l1, w1 = self._make_wire(self._cs)
|
|
577
|
+
p2, l2, w2 = other._make_wire(other._cs)
|
|
578
|
+
o1 = np.array(self._cs.in_global_cs(*self.center, 0)).flatten()
|
|
579
|
+
o2 = np.array(other._cs.in_global_cs(*other.center, 0)).flatten()
|
|
580
|
+
dts = gmsh.model.occ.addThruSections([w1, w2], True, parametrization="IsoParametric")
|
|
581
|
+
vol = GeoVolume([t for d,t in dts if d==3])
|
|
582
|
+
|
|
583
|
+
vol._add_face_pointer('front',o1, self._cs.zax.np)
|
|
584
|
+
vol._add_face_pointer('back', o2, other._cs.zax.np)
|
|
585
|
+
return vol
|
|
586
|
+
|
|
504
587
|
class Disc(GeoSurface):
|
|
505
588
|
|
|
506
589
|
def __init__(self, origin: tuple[float, float, float],
|
|
@@ -525,8 +608,7 @@ class Curve(GeoEdge):
|
|
|
525
608
|
degree: int = 3,
|
|
526
609
|
weights: list[float] | None = None,
|
|
527
610
|
knots: list[float] | None = None,
|
|
528
|
-
ctype: Literal['Spline','BSpline','Bezier'] = '
|
|
529
|
-
dstart: tuple[float, float, float] | None = None):
|
|
611
|
+
ctype: Literal['Spline','BSpline','Bezier'] = 'Spline'):
|
|
530
612
|
"""Generate a Spline/Bspline or Bezier curve based on a series of points
|
|
531
613
|
|
|
532
614
|
This calls the different curve features in OpenCASCADE.
|
|
@@ -547,11 +629,6 @@ class Curve(GeoEdge):
|
|
|
547
629
|
self.xpts: np.ndarray = xpts
|
|
548
630
|
self.ypts: np.ndarray = ypts
|
|
549
631
|
self.zpts: np.ndarray = zpts
|
|
550
|
-
|
|
551
|
-
if dstart is None:
|
|
552
|
-
dstart = (xpts[1]-xpts[0], ypts[1]-ypts[0], zpts[1]-zpts[0])
|
|
553
|
-
|
|
554
|
-
self.dstart: tuple[float, float, float] = dstart
|
|
555
632
|
|
|
556
633
|
points = [gmsh.model.occ.add_point(x,y,z) for x,y,z in zip(xpts, ypts, zpts)]
|
|
557
634
|
|
|
@@ -571,6 +648,14 @@ class Curve(GeoEdge):
|
|
|
571
648
|
gmsh.model.occ.remove([(0,tag) for tag in points])
|
|
572
649
|
super().__init__(tags)
|
|
573
650
|
|
|
651
|
+
gmsh.model.occ.synchronize()
|
|
652
|
+
p1 = gmsh.model.getValue(self.dim, self.tags[0], [0,])
|
|
653
|
+
p2 = gmsh.model.getValue(self.dim, self.tags[0], [1e-6])
|
|
654
|
+
self.dstart: tuple[float, float, float] = (p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2])
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
|
|
574
659
|
@property
|
|
575
660
|
def p0(self) -> tuple[float, float, float]:
|
|
576
661
|
"""The start coordinate
|
|
@@ -653,7 +738,7 @@ class Curve(GeoEdge):
|
|
|
653
738
|
zp[2] += d/2*dz
|
|
654
739
|
dp = tuple(Z)
|
|
655
740
|
|
|
656
|
-
return Curve(xp, yp, zp, ctype='Spline'
|
|
741
|
+
return Curve(xp, yp, zp, ctype='Spline')
|
|
657
742
|
|
|
658
743
|
@staticmethod
|
|
659
744
|
def helix_lh(pstart: tuple[float, float, float],
|
|
@@ -731,9 +816,12 @@ class Curve(GeoEdge):
|
|
|
731
816
|
zp[2] += d/2*dz
|
|
732
817
|
dp = tuple(Z)
|
|
733
818
|
|
|
734
|
-
return Curve(xp, yp, zp, ctype='Spline'
|
|
819
|
+
return Curve(xp, yp, zp, ctype='Spline')
|
|
735
820
|
|
|
736
|
-
def pipe(self, crossection: GeoSurface | XYPolygon,
|
|
821
|
+
def pipe(self, crossection: GeoSurface | XYPolygon,
|
|
822
|
+
max_mesh_size: float | None = None,
|
|
823
|
+
start_tangent: Axis | tuple[float, float, float] | np.ndarray | None = None,
|
|
824
|
+
x_axis: Axis | tuple[float, float, float] | np.ndarray | None = None) -> GeoVolume:
|
|
737
825
|
"""Extrudes a surface or XYPolygon object along the given curve
|
|
738
826
|
|
|
739
827
|
If a GeoSurface object is used, make sure it starts at the center of the curve. This property
|
|
@@ -744,25 +832,31 @@ class Curve(GeoEdge):
|
|
|
744
832
|
Args:
|
|
745
833
|
crossection (GeoSurface | XYPolygon): The cross section definition to be used
|
|
746
834
|
max_mesh_size (float, optional): The maximum mesh size. Defaults to None
|
|
835
|
+
start_tangent (Axis, tuple, ndarray, optional): The input polygon plane normal direction. Defaults to None
|
|
836
|
+
x_axis (Axis, tuple, ndarray optional): The reference X-axis to align the input polygon. Defaults to None
|
|
747
837
|
Returns:
|
|
748
838
|
GeoVolume: The resultant volume object
|
|
749
839
|
"""
|
|
750
840
|
if isinstance(crossection, XYPolygon):
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
841
|
+
if start_tangent is None:
|
|
842
|
+
start_tangent = self.dstart
|
|
843
|
+
if x_axis is not None:
|
|
844
|
+
xax = _parse_axis(x_axis)
|
|
845
|
+
zax = _parse_axis(self.dstart)
|
|
846
|
+
yax = zax.cross(xax)
|
|
847
|
+
cs = CoordinateSystem(xax, yax, zax, self.p0)
|
|
848
|
+
else:
|
|
849
|
+
zax = self.dstart
|
|
850
|
+
cs = Axis(np.array(zax)).construct_cs(self.p0)
|
|
851
|
+
surf = crossection.geo(cs)
|
|
754
852
|
else:
|
|
755
853
|
surf = crossection
|
|
756
854
|
x1, y1, z1, x2, y2, z2 = gmsh.model.occ.getBoundingBox(*surf.dimtags[0])
|
|
757
855
|
diag = ((x2-x1)**2 + (y2-y1)**2 + (z2-z1)**2)**(0.5)
|
|
758
|
-
|
|
759
856
|
pipetag = gmsh.model.occ.addPipe(surf.dimtags, self.tags[0], 'GuidePlan')
|
|
760
|
-
|
|
761
857
|
self.remove()
|
|
762
858
|
surf.remove()
|
|
763
|
-
|
|
764
859
|
volume = GeoVolume(pipetag[0][1])
|
|
765
|
-
|
|
766
860
|
volume.max_meshsize = diag/2
|
|
767
861
|
return volume
|
|
768
862
|
|
|
@@ -31,9 +31,18 @@ class Alignment(Enum):
|
|
|
31
31
|
CORNER = 2
|
|
32
32
|
|
|
33
33
|
class Box(GeoVolume):
|
|
34
|
-
"""
|
|
34
|
+
"""Creates a box volume object.
|
|
35
|
+
Specify the alignment of the box with the provided position. The options are CORNER (default)
|
|
36
|
+
for the front-left-bottom node of the box or CENTER for the center of the box.
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
Args:
|
|
39
|
+
width (float): The x-size
|
|
40
|
+
depth (float): The y-size
|
|
41
|
+
height (float): The z-size
|
|
42
|
+
position (tuple, optional): The position of the box. Defaults to (0,0,0).
|
|
43
|
+
alignment (Alignment, optional): Which point of the box is placed at the position.
|
|
44
|
+
Defaults to Alignment.CORNER.
|
|
45
|
+
"""
|
|
37
46
|
|
|
38
47
|
def __init__(self,
|
|
39
48
|
width: float,
|
|
@@ -94,7 +103,12 @@ class Box(GeoVolume):
|
|
|
94
103
|
|
|
95
104
|
|
|
96
105
|
class Sphere(GeoVolume):
|
|
106
|
+
"""Generates a sphere objected centered ont he position with the given radius
|
|
97
107
|
|
|
108
|
+
Args:
|
|
109
|
+
radius (float): The sphere radius
|
|
110
|
+
position (tuple, optional): The center position. Defaults to (0,0,0).
|
|
111
|
+
"""
|
|
98
112
|
def __init__(self,
|
|
99
113
|
radius: float,
|
|
100
114
|
position: tuple = (0,0,0)):
|
|
@@ -109,6 +123,17 @@ class Sphere(GeoVolume):
|
|
|
109
123
|
self.tags: list[int] = [gmsh.model.occ.addSphere(x,y,z,radius),]
|
|
110
124
|
|
|
111
125
|
class XYPlate(GeoSurface):
|
|
126
|
+
"""Generates and XY-plane oriented plate
|
|
127
|
+
|
|
128
|
+
Specify the alignment of the plate with the provided position. The options are CORNER (default)
|
|
129
|
+
for the front-left node of the plate or CENTER for the center of the plate.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
width (float): The x-size of the plate
|
|
133
|
+
depth (float): The y-size of the plate
|
|
134
|
+
position (tuple, optional): The position of the alignment node. Defaults to (0,0,0).
|
|
135
|
+
alignment (Alignment, optional): Which node to align to. Defaults to Alignment.CORNER.
|
|
136
|
+
"""
|
|
112
137
|
def __init__(self,
|
|
113
138
|
width: float,
|
|
114
139
|
depth: float,
|
|
@@ -134,7 +159,19 @@ class XYPlate(GeoSurface):
|
|
|
134
159
|
|
|
135
160
|
|
|
136
161
|
class Plate(GeoSurface):
|
|
137
|
-
|
|
162
|
+
"""A generalized 2D rectangular plate in XYZ-space.
|
|
163
|
+
|
|
164
|
+
The plate is specified by an origin (o) in meters coordinate plus two vectors (u,v) in meters
|
|
165
|
+
that span two of the sides such that all points of the plate are defined by:
|
|
166
|
+
p1 = o
|
|
167
|
+
p2 = o+u
|
|
168
|
+
p3 = o+v
|
|
169
|
+
p4 = o+u+v
|
|
170
|
+
Args:
|
|
171
|
+
origin (tuple[float, float, float]): The origin of the plate in meters
|
|
172
|
+
u (tuple[float, float, float]): The u-axis of the plate
|
|
173
|
+
v (tuple[float, float, float]): The v-axis of the plate
|
|
174
|
+
"""
|
|
138
175
|
def __init__(self,
|
|
139
176
|
origin: tuple[float, float, float],
|
|
140
177
|
u: tuple[float, float, float],
|
|
@@ -297,7 +334,6 @@ class CoaxCylinder(GeoVolume):
|
|
|
297
334
|
|
|
298
335
|
xo, yo, zo = self.cs.in_global_cs(x.flatten(), y.flatten(), z.flatten())
|
|
299
336
|
return xo, yo, zo
|
|
300
|
-
return super().boundary()
|
|
301
337
|
|
|
302
338
|
class HalfSphere(GeoVolume):
|
|
303
339
|
|