From beec0690d0f46cd510b90de50ee25d67c2732c42 Mon Sep 17 00:00:00 2001 From: Jack Davies <80680946+jgsdavies@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:42:58 +0200 Subject: [PATCH] Custom mesh lengths for adaptive regions. (#334) * initial commit * update tests --- src/ansys/motorcad/core/geometry.py | 7 +++++-- .../core/methods/adaptive_geometry.py | 15 +++++++++++++- tests/test_geometry.py | 20 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/ansys/motorcad/core/geometry.py b/src/ansys/motorcad/core/geometry.py index 2891e4c9e..b2852587f 100644 --- a/src/ansys/motorcad/core/geometry.py +++ b/src/ansys/motorcad/core/geometry.py @@ -46,8 +46,7 @@ def __init__(self, motorcad_instance=None): self._child_names = [] self._motorcad_instance = motorcad_instance self._region_type = RegionType.adaptive - - # expect other properties to be implemented here including number duplications, material etc + self.mesh_length = 0 def __eq__(self, other): """Override the default equals implementation for Region.""" @@ -187,6 +186,9 @@ def _from_json(cls, json, motorcad_instance=None): new_region.parent_name = json["parent_name"] new_region._child_names = json["child_names"] + if "mesh_length" in json: + new_region.mesh_length = json["mesh_length"] + return new_region # method to convert python object to send to Motor-CAD @@ -209,6 +211,7 @@ def _to_json(self): "entities": _convert_entities_to_json(self.entities), "parent_name": self.parent_name, "region_type": self._region_type.value, + "mesh_length": self.mesh_length, } return region_dict diff --git a/src/ansys/motorcad/core/methods/adaptive_geometry.py b/src/ansys/motorcad/core/methods/adaptive_geometry.py index acb87f0f7..8abde8f8b 100644 --- a/src/ansys/motorcad/core/methods/adaptive_geometry.py +++ b/src/ansys/motorcad/core/methods/adaptive_geometry.py @@ -21,7 +21,9 @@ # SOFTWARE. """Methods for adaptive geometry.""" -from ansys.motorcad.core.geometry import Region +from warnings import warn + +from ansys.motorcad.core.geometry import Region, RegionMagnet from ansys.motorcad.core.rpc_client_core import is_running_in_internal_scripting @@ -118,6 +120,17 @@ def set_region(self, region): Motor-CAD region object. """ self.connection.ensure_version_at_least("2024.0") + + if isinstance(region, RegionMagnet): + if (region._br_multiplier != 0.0) or (region._magnet_angle != 0.0): + # User has changed magnet properties that do not exist in older Motor-CAD API + if not self.connection.check_version_at_least("2024.2"): + warn("Setting magnet properties is only available in Motor-CAD 2024R2 or later") + + if region.mesh_length != 0: + if not self.connection.check_version_at_least("2025"): + warn("Setting region mesh length is only available in Motor-CAD 2025R1 or later") + raw_region = region._to_json() method = "SetRegion" diff --git a/tests/test_geometry.py b/tests/test_geometry.py index 99d3204d4..7c7baf638 100644 --- a/tests/test_geometry.py +++ b/tests/test_geometry.py @@ -42,6 +42,7 @@ _orientation_of_three_points, rt_to_xy, ) +import ansys.motorcad.core.rpc_client_core as rpc_client_core from ansys.motorcad.core.rpc_client_core import DEFAULT_INSTANCE, set_default_instance @@ -351,6 +352,7 @@ def test_region_from_json(): "parent_name": "Insulation", "child_names": ["Duct", "Duct_1"], "region type": "Adaptive Region", + "mesh_length": 0.035, } test_region = geometry.Region() @@ -364,6 +366,7 @@ def test_region_from_json(): test_region.entities = [] test_region.parent_name = "Insulation" test_region._child_names = ["Duct", "Duct_1"] + test_region.mesh_length = 0.035 region = geometry.Region._from_json(raw_region) @@ -382,6 +385,7 @@ def test_region_to_json(): "entities": [], "parent_name": "Insulation", "region_type": "Adaptive Region", + "mesh_length": 0.035, } test_region = geometry.Region() @@ -394,6 +398,7 @@ def test_region_to_json(): test_region.duplications = 10 test_region.entities = [] test_region.parent_name = "Insulation" + test_region.mesh_length = 0.035 assert test_region._to_json() == raw_region @@ -1906,3 +1911,18 @@ def test_get_set_region_magnet(mc): assert magnet.br_value == 1.31 assert magnet.br_used == 1.31 * 2 assert magnet.region_type == RegionType.magnet + + +def test_get_set_region_compatibility(mc, monkeypatch): + monkeypatch.setattr(mc.connection, "program_version", "2024.1") + monkeypatch.setattr(rpc_client_core, "DONT_CHECK_MOTORCAD_VERSION", False) + test_region = RegionMagnet() + test_region.br_multiplier = 2 + with pytest.warns(UserWarning): + mc.set_region(test_region) + + test_region = Region() + test_region.mesh_length = 0.1 + + with pytest.warns(UserWarning): + mc.set_region(test_region)