From 341109e35ad3c2f0f8a566d932a743a4777a010f Mon Sep 17 00:00:00 2001 From: Devin Date: Sun, 15 Feb 2026 13:11:30 +0100 Subject: [PATCH 01/19] Improve consistency Add method modeler.get_objects_by_name to be consistent with modeler.get_objects_by_material --- src/ansys/aedt/core/modeler/cad/primitives.py | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index d506137e3b6..a4a48aaf1aa 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7463,23 +7463,29 @@ def get_obj_id(self, assignment): return None @pyaedt_function_handler() - def get_object_from_name(self, assignment): - """Return the object from an object name. + def get_objects_by_name(self, assignment, case_sensitive: bool = True): + """Return the objects given a search string. Parameters ---------- assignment : str - Name of the object. + String used to filter by object names.. + case_sensitive : bool, optional + Whether the string is case-sensitive. The default is ``True``. Returns ------- - :class:`ansys.aedt.core.modeler.cad.object_3d.Object3d` - 3D object returned. + list of class:`ansys.aedt.core.modeler.cad.object_3d.Object3d` + Returns a list of objects whose names contain the + search string.. """ - if assignment in self.object_names: - # object_id = self.get_obj_id(objname) - return self.objects[assignment] + if case_sensitive: + return [o for name, o in self.objects_by_name.items() if assignment in name] + else: + return [o for name, o in self.objects_by_name.items() + if assignment.lower() in name.lower()] + return None @pyaedt_function_handler() def get_objects_w_string(self, string_name, case_sensitive: bool = True): From 132a4ee783a2d65c3c2830fe25388d70f5295104 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Feb 2026 12:13:55 +0000 Subject: [PATCH 02/19] CHORE: Auto fixes from pre-commit hooks --- src/ansys/aedt/core/modeler/cad/primitives.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index a4a48aaf1aa..8911948d245 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7463,7 +7463,7 @@ def get_obj_id(self, assignment): return None @pyaedt_function_handler() - def get_objects_by_name(self, assignment, case_sensitive: bool = True): + def get_objects_by_name(self, assignment, case_sensitive: bool = True): """Return the objects given a search string. Parameters @@ -7483,8 +7483,7 @@ def get_objects_by_name(self, assignment, case_sensitive: bool = True): if case_sensitive: return [o for name, o in self.objects_by_name.items() if assignment in name] else: - return [o for name, o in self.objects_by_name.items() - if assignment.lower() in name.lower()] + return [o for name, o in self.objects_by_name.items() if assignment.lower() in name.lower()] return None @pyaedt_function_handler() From 0c9ac434e5b3c4f33fa146a748218ffc2bda328a Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Sun, 15 Feb 2026 12:16:25 +0000 Subject: [PATCH 03/19] chore: adding changelog file 7264.added.md [dependabot-skip] --- doc/changelog.d/7264.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/7264.added.md diff --git a/doc/changelog.d/7264.added.md b/doc/changelog.d/7264.added.md new file mode 100644 index 00000000000..fed1ec5eeab --- /dev/null +++ b/doc/changelog.d/7264.added.md @@ -0,0 +1 @@ +Improve consistency From 99fbbccf9e5fe6938033100d2f6b39219b0446b2 Mon Sep 17 00:00:00 2001 From: Devin Date: Sun, 15 Feb 2026 14:38:16 +0100 Subject: [PATCH 04/19] Reinstate get_object_from_name --- src/ansys/aedt/core/modeler/cad/primitives.py | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index a4a48aaf1aa..b1a89bee38e 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -4443,7 +4443,7 @@ def create_faceted_bondwire_from_true_surface( str Name of the bondwire created. """ - old_bondwire = self.get_object_from_name(assignment) + old_bondwire = self.get_objects_by_name(assignment)[0] if not old_bondwire: return False edges = old_bondwire.edges @@ -7487,6 +7487,25 @@ def get_objects_by_name(self, assignment, case_sensitive: bool = True): if assignment.lower() in name.lower()] return None + @pyaedt_function_handler() + def get_object_from_name(self, assignment): + """Return the object from an object name. + + Parameters + ---------- + assignment : str + Name of the object. + + Returns + ------- + :class:`ansys.aedt.core.modeler.cad.object_3d.Object3d` + 3D object returned. + + """ + if assignment in self.object_names: + # object_id = self.get_obj_id(objname) + return self.objects[assignment] + @pyaedt_function_handler() def get_objects_w_string(self, string_name, case_sensitive: bool = True): """Retrieve all objects with a given string in their names. From c72051ec79021ac09abd46efadc83f4c6c12f54d Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Sun, 15 Feb 2026 23:51:07 +0100 Subject: [PATCH 05/19] Update src/ansys/aedt/core/modeler/cad/primitives.py Co-authored-by: Maxime Rey <87315832+MaxJPRey@users.noreply.github.com> --- src/ansys/aedt/core/modeler/cad/primitives.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 7acf4ac465d..36170fa7f46 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7477,7 +7477,7 @@ def get_objects_by_name(self, assignment, case_sensitive: bool = True): ------- list of class:`ansys.aedt.core.modeler.cad.object_3d.Object3d` Returns a list of objects whose names contain the - search string.. + search string. """ if case_sensitive: From 761ff53400ae4a36c58d630f362c142074dd00bf Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Sun, 15 Feb 2026 23:51:16 +0100 Subject: [PATCH 06/19] Update src/ansys/aedt/core/modeler/cad/primitives.py Co-authored-by: Maxime Rey <87315832+MaxJPRey@users.noreply.github.com> --- src/ansys/aedt/core/modeler/cad/primitives.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 36170fa7f46..1613e4e253d 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7469,7 +7469,7 @@ def get_objects_by_name(self, assignment, case_sensitive: bool = True): Parameters ---------- assignment : str - String used to filter by object names.. + String used to filter by object names. case_sensitive : bool, optional Whether the string is case-sensitive. The default is ``True``. From 285e372b600adf06fea9314bde8f46c58bbe9469 Mon Sep 17 00:00:00 2001 From: Devin Date: Wed, 18 Feb 2026 09:36:32 +0100 Subject: [PATCH 07/19] Update material value to allow file assignment A file containing x,y datapoints can be assigned as a table to permeability. --- src/ansys/aedt/core/application/design.py | 66 ++++++++++++----------- src/ansys/aedt/core/modules/material.py | 23 +++++++- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/ansys/aedt/core/application/design.py b/src/ansys/aedt/core/application/design.py index 05efdc8f9d8..0668816a5d7 100644 --- a/src/ansys/aedt/core/application/design.py +++ b/src/ansys/aedt/core/application/design.py @@ -2828,37 +2828,41 @@ def import_dataset1d( >>> oProject.AddDataset >>> oDesign.AddDataset """ - input_file = Path(input_file) - with open_file(input_file, "r") as f: - lines = f.read().splitlines() - header = lines[0] - points = lines[1:] - - header_list = header.split("\t") - units = ["", ""] - cont = 0 - for h in header_list: - result = re.search(r"\[([A-Za-z0-9_]+)\]", h) - if result: - units[cont] = result.group(1) - cont += 1 - - xlist = [] - ylist = [] - for item in points: - xlist.append(float(item.split()[0])) - ylist.append(float(item.split()[1])) - - if not name: - name = input_file.stem - - if name[0] == "$": - name = name[1:] - is_project_dataset = True - - return self.create_dataset( - name, xlist, ylist, is_project_dataset=is_project_dataset, x_unit=units[0], y_unit=units[1], sort=sort - ) + in_file = Path(input_file) + if in_file.is_file(): + with in_file.open(encoding="utf-8") as f: + lines = f.read().splitlines() + header = lines[0] + points = lines[1:] + + header_list = header.split("\t") + units = ["", ""] + cont = 0 + for h in header_list: + result = re.search(r"\[([A-Za-z0-9_]+)\]", h) + if result: + units[cont] = result.group(1) + cont += 1 + + xlist = [] + ylist = [] + for item in points: + xlist.append(float(item.split()[0])) + ylist.append(float(item.split()[1])) + + if not name: + name = input_file.stem + + if name[0] == "$": + name = name[1:] + is_project_dataset = True + + return self.create_dataset( + name, xlist, ylist, is_project_dataset=is_project_dataset, x_unit=units[0], y_unit=units[1], sort=sort + ) + else: + self.logger.error("Input file does not exist.") + return None @pyaedt_function_handler() def import_dataset3d( diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index 8b06884eda1..3fc63eb3616 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -38,6 +38,9 @@ """ import copy +import csv +from typing import Union +from pathlib import Path from ansys.aedt.core.base import PyAedtBase from ansys.aedt.core.generic.constants import CSS4_COLORS @@ -430,7 +433,7 @@ def value(self): return [i.value for i in self._property_value] @value.setter - def value(self, val) -> None: + def value(self, val: Union[str, list, Path, float, int]) -> None: if isinstance(val, list) and isinstance(val[0], list): self._property_value[0].value = val self.set_non_linear() @@ -452,6 +455,24 @@ def value(self, val) -> None: if len(val) == 4: self._property_value[0].value = val self._material._update_props(self.name, val, update_aedt=self._material._material_update) + elif isinstance(val, (str, Path)): + val = Path(val) + if not val.is_file(): + raise FileNotFoundError(f"Argument {val} is not a file.") + try: + datalist = [] + with open(val) as f: + reader = csv.reader(f, delimiter="\t") + next(reader) + for row in reader: + if len(row) != 2: + raise ValueError(f"Line {lineno}: expected 2 columns, got {len(parts)}") + if not (row[0].isnumeric() and row[1].isnumeric()): + raise ValueError(f"Line {lineno}: expected numeric values, got {row[0]} and {row[1]}") + datalist.append([float(row[0]), float(row[1])]) + self.value = datalist + except AttributeError: + raise FileNotFoundError(f"Argument {val} is not a file.") else: self.type = "simple" self._property_value[0].value = val From 9df6acdbd9c70fee90eed69b1fad0c9aea506b46 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 08:37:55 +0000 Subject: [PATCH 08/19] CHORE: Auto fixes from pre-commit hooks --- src/ansys/aedt/core/modules/material.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index 3fc63eb3616..8dda0f1a59c 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -39,7 +39,6 @@ import copy import csv -from typing import Union from pathlib import Path from ansys.aedt.core.base import PyAedtBase @@ -433,7 +432,7 @@ def value(self): return [i.value for i in self._property_value] @value.setter - def value(self, val: Union[str, list, Path, float, int]) -> None: + def value(self, val: str | list | Path | float | int) -> None: if isinstance(val, list) and isinstance(val[0], list): self._property_value[0].value = val self.set_non_linear() From 350e9065726bacac9f4064376941ed2e09388285 Mon Sep 17 00:00:00 2001 From: Devin <38879940+Devin-Crawford@users.noreply.github.com> Date: Fri, 20 Feb 2026 17:33:37 +0100 Subject: [PATCH 09/19] Apply suggestion from @SMoraisAnsys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks. Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- src/ansys/aedt/core/modeler/cad/primitives.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 1613e4e253d..e77d1f255e0 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7484,7 +7484,6 @@ def get_objects_by_name(self, assignment, case_sensitive: bool = True): return [o for name, o in self.objects_by_name.items() if assignment in name] else: return [o for name, o in self.objects_by_name.items() if assignment.lower() in name.lower()] - return None @pyaedt_function_handler() def get_object_from_name(self, assignment): From 8f2737d30bf89a11c7e5dca659c89007e3d19239 Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Wed, 18 Mar 2026 11:52:05 +0100 Subject: [PATCH 10/19] Apply suggestion from @Devin-Crawford Co-authored-by: Devin <38879940+Devin-Crawford@users.noreply.github.com> --- src/ansys/aedt/core/application/design.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/application/design.py b/src/ansys/aedt/core/application/design.py index cf7a0434581..70192e7e8b4 100644 --- a/src/ansys/aedt/core/application/design.py +++ b/src/ansys/aedt/core/application/design.py @@ -2875,7 +2875,9 @@ def import_dataset1d( name, xlist, ylist, is_project_dataset=is_project_dataset, x_unit=units[0], y_unit=units[1], sort=sort ) else: - self.logger.error("Input file does not exist.") + error_message = f"Input file '{in_file}' does not exist." + self.logger.error(error_message) + raise FileNotFoundError(error_message) return None @pyaedt_function_handler() From 892febfaee7e7470e02ec2b0c9d76fa198bf462b Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Wed, 18 Mar 2026 11:54:34 +0100 Subject: [PATCH 11/19] add test --- src/ansys/aedt/core/application/design.py | 2 -- tests/system/general/test_design.py | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/application/design.py b/src/ansys/aedt/core/application/design.py index 70192e7e8b4..b5e56a36c80 100644 --- a/src/ansys/aedt/core/application/design.py +++ b/src/ansys/aedt/core/application/design.py @@ -2876,9 +2876,7 @@ def import_dataset1d( ) else: error_message = f"Input file '{in_file}' does not exist." - self.logger.error(error_message) raise FileNotFoundError(error_message) - return None @pyaedt_function_handler() def import_dataset3d( diff --git a/tests/system/general/test_design.py b/tests/system/general/test_design.py index 1550357beee..06988e61e29 100644 --- a/tests/system/general/test_design.py +++ b/tests/system/general/test_design.py @@ -286,6 +286,8 @@ def test_import_dataset1d(aedt_app) -> None: assert ds4.delete() assert aedt_app.import_dataset1d(filename) assert ds5.delete() + with pytest.raises(FileNotFoundError): + aedt_app.import_dataset1d(TESTS_GENERAL_PATH / "example_models" / TEST_SUBFOLDER / "dummy.tab") def test_import_dataset3d(aedt_app) -> None: From f69249e10cc6b5914a6f8a06ada4d920927e0902 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Wed, 18 Mar 2026 12:09:54 +0100 Subject: [PATCH 12/19] Fix codacy --- src/ansys/aedt/core/modules/material.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index 7f0f1b0b0df..038daebb6d1 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -2797,27 +2797,29 @@ def __init__(self, materiallib, name: str, props=None, material_update: bool = T else: self.physics_type = ["Thermal"] self._props["PhysicsTypes"] = dict({"set": ["Thermal"]}) - for property in SurfMatProperties.aedtname: - if property in self._props: + for surface_property in SurfMatProperties.aedtname: + if surface_property in self._props: mods = None if "ModifierData" in self._props: modifiers = self._props["ModifierData"]["ThermalModifierData"]["all_thermal_modifiers"] for mod in modifiers: if isinstance(modifiers[mod], list): for one_tm in modifiers[mod]: - if one_tm["Property:"] == property: + if one_tm["Property:"] == surface_property: if mods: mods = [mods] mods.append(one_tm) else: mods = one_tm else: - if modifiers[mod]["Property:"] == property: + if modifiers[mod]["Property:"] == surface_property: mods = modifiers[mod] - self.__dict__["_" + property] = MatProperty(self, property, self._props[property], mods) + self.__dict__["_" + surface_property] = MatProperty( + self, surface_property, self._props[surface_property], mods + ) else: - self.__dict__["_" + property] = MatProperty( - self, property, SurfMatProperties.get_defaultvalue(aedtname=property) + self.__dict__["_" + surface_property] = MatProperty( + self, surface_property, SurfMatProperties.get_defaultvalue(aedtname=surface_property) ) @property From 1995f813b0febbb38eeb0d4eaa210dee7c3648d4 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Sun, 22 Mar 2026 09:04:58 +0100 Subject: [PATCH 13/19] FIX: improve type hints for get_objects_by_name and get_object_from_name methods --- src/ansys/aedt/core/modeler/cad/primitives.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 012bfd1cf86..4538d7e4425 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7601,7 +7601,7 @@ def get_obj_id(self, assignment: str) -> int | None: return None @pyaedt_function_handler() - def get_objects_by_name(self, assignment, case_sensitive: bool = True): + def get_objects_by_name(self, assignment, case_sensitive: bool = True) -> list[Object3d]: """Return the objects given a search string. Parameters @@ -7624,7 +7624,7 @@ def get_objects_by_name(self, assignment, case_sensitive: bool = True): return [o for name, o in self.objects_by_name.items() if assignment.lower() in name.lower()] @pyaedt_function_handler() - def get_object_from_name(self, assignment: str) -> Object3d: + def get_object_from_name(self, assignment: str) -> Object3d | None: """Return the object from an object name. Parameters @@ -7639,8 +7639,8 @@ def get_object_from_name(self, assignment: str) -> Object3d: """ if assignment in self.object_names: - # object_id = self.get_obj_id(objname) return self.objects[assignment] + return None @pyaedt_function_handler() def get_objects_w_string(self, string_name: str, case_sensitive: bool = True) -> list: From 22989a7c0ece915ffa0863a717a2ea8372700aef Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Sun, 22 Mar 2026 09:27:17 +0100 Subject: [PATCH 14/19] FIX: improve error handling and add validation for material value file input --- src/ansys/aedt/core/modules/material.py | 26 +++++++++---------- .../example_models/T03/ds_1d_invalid.tab | 4 +++ tests/system/general/test_materials.py | 21 +++++++++++++++ 3 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 tests/system/general/example_models/T03/ds_1d_invalid.tab diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index 038daebb6d1..b3c429cc693 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -458,20 +458,18 @@ def value(self, val: str | list | Path | float | int) -> None: val = Path(val) if not val.is_file(): raise FileNotFoundError(f"Argument {val} is not a file.") - try: - datalist = [] - with open(val) as f: - reader = csv.reader(f, delimiter="\t") - next(reader) - for row in reader: - if len(row) != 2: - raise ValueError(f"Expected 2 columns, got {len(row)}") - if not (row[0].isnumeric() and row[1].isnumeric()): - raise ValueError(f"Expected numeric values, got {row[0]} and {row[1]}") - datalist.append([float(row[0]), float(row[1])]) - self.value = datalist - except AttributeError: - raise FileNotFoundError(f"Argument {val} is not a file.") + datalist = [] + with open(val) as f: + reader = csv.reader(f, delimiter="\t") + next(reader) + for row in reader: + if len(row) != 2: + raise ValueError(f"Expected 2 columns, got {len(row)}") + if not (is_number(row[0]) and is_number(row[1])): + raise ValueError(f"Expected numeric values, got {row[0]} and {row[1]}") + datalist.append([float(row[0]), float(row[1])]) + self.value = datalist + else: self.type = "simple" self._property_value[0].value = val diff --git a/tests/system/general/example_models/T03/ds_1d_invalid.tab b/tests/system/general/example_models/T03/ds_1d_invalid.tab new file mode 100644 index 00000000000..dc63c9ebdb7 --- /dev/null +++ b/tests/system/general/example_models/T03/ds_1d_invalid.tab @@ -0,0 +1,4 @@ +"X [cel]" "Y" +1.5 "hola" +2 3.5 +2 5 diff --git a/tests/system/general/test_materials.py b/tests/system/general/test_materials.py index b985bf0d55a..0a8e1ba18f3 100644 --- a/tests/system/general/test_materials.py +++ b/tests/system/general/test_materials.py @@ -164,6 +164,27 @@ def test_create_material(aedt_app) -> None: mat1.material_appearance = [11, 22] +def test_material_value_file(aedt_app) -> None: + mat1 = aedt_app.materials.add_material("new_copper") + filename = Path(TESTS_GENERAL_PATH) / "example_models" / TEST_SUBFOLDER / "ds_1d.tab" + + with pytest.raises(FileNotFoundError): + aedt_app.materials["new_copper"].permittivity = Path("invented.tab") + + with pytest.raises(ValueError): + filename2 = Path(TESTS_GENERAL_PATH) / "example_models" / TEST_SUBFOLDER / "ds_3d.tab" + aedt_app.materials["new_copper"].permittivity = Path(filename2) + + with pytest.raises(ValueError): + filename3 = Path(TESTS_GENERAL_PATH) / "example_models" / TEST_SUBFOLDER / "ds_1d_invalid.tab" + aedt_app.materials["new_copper"].permittivity = Path(filename3) + + mat1.permittivity = filename + + assert len(mat1.permittivity.value) == 3 + assert isinstance(mat1.permittivity.value, list) + + def test_create_modifiers(aedt_app) -> None: aedt_app.materials.add_material("new_copper") assert aedt_app.materials["new_copper"].mass_density.add_thermal_modifier_free_form( From a141ea23c02ae8ad0ec0757611874fac72159f42 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Sun, 22 Mar 2026 13:59:35 +0100 Subject: [PATCH 15/19] FIX: enhance get_objects_by_name method to support wildcard patterns and improve type validation --- src/ansys/aedt/core/modeler/cad/primitives.py | 46 +++++++++++++++---- src/ansys/aedt/core/modules/material.py | 2 +- tests/system/general/test_3d_modeler.py | 12 +++++ 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 4538d7e4425..62cac618da3 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -27,6 +27,7 @@ from __future__ import annotations import copy +import fnmatch import math import os from pathlib import Path @@ -7601,27 +7602,54 @@ def get_obj_id(self, assignment: str) -> int | None: return None @pyaedt_function_handler() - def get_objects_by_name(self, assignment, case_sensitive: bool = True) -> list[Object3d]: - """Return the objects given a search string. + def get_objects_by_name( + self, + assignment: str, + case_sensitive: bool = True, + ) -> list[Object3d]: + """Return the objects whose names match a wildcard pattern. + + The ``*`` character acts as a wildcard that matches any sequence of + characters (including none). The matching mode is inferred + automatically from the position of ``*`` in ``assignment``: Parameters ---------- assignment : str - String used to filter by object names. + Wildcard pattern to match against object names. + Use ``*`` as a wildcard for any sequence of characters. case_sensitive : bool, optional - Whether the string is case-sensitive. The default is ``True``. + Whether the match is case-sensitive. The default is ``True``. Returns ------- - list of class:`ansys.aedt.core.modeler.cad.object_3d.Object3d` - Returns a list of objects whose names contain the - search string. + list of :class:`ansys.aedt.core.modeler.cad.object_3d.Object3d` + Objects whose names satisfy the pattern. + + Examples + -------- + # Exact match + >>> objs = modeler.get_objects_by_name("Patch_1") + + # All objects whose name starts with "Substrate" + >>> objs = modeler.get_objects_by_name("Substrate*") + + # All objects whose name ends with "_gnd" + >>> objs = modeler.get_objects_by_name("*_gnd") + + # All objects whose name contains "patch" + >>> objs = modeler.get_objects_by_name("*patch*", case_sensitive=False) + # Mid-string wildcard: names like "Sub_1", "Sub_gnd_1". + >>> objs = modeler.get_objects_by_name("Sub*_1") """ + names = list(self.objects_by_name.keys()) if case_sensitive: - return [o for name, o in self.objects_by_name.items() if assignment in name] + matched = [n for n in names if fnmatch.fnmatchcase(n, assignment)] else: - return [o for name, o in self.objects_by_name.items() if assignment.lower() in name.lower()] + pat = assignment.lower() + matched = [n for n in names if fnmatch.fnmatchcase(n.lower(), pat)] + return [self.objects_by_name[n] for n in matched] @pyaedt_function_handler() def get_object_from_name(self, assignment: str) -> Object3d | None: diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index b3c429cc693..140a220beb6 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -454,7 +454,7 @@ def value(self, val: str | list | Path | float | int) -> None: if len(val) == 4: self._property_value[0].value = val self._material._update_props(self.name, val, update_aedt=self._material._material_update) - elif isinstance(val, (str, Path)): + elif isinstance(val, Path): val = Path(val) if not val.is_file(): raise FileNotFoundError(f"Argument {val} is not a file.") diff --git a/tests/system/general/test_3d_modeler.py b/tests/system/general/test_3d_modeler.py index 2c963cd5b40..a3606970e22 100644 --- a/tests/system/general/test_3d_modeler.py +++ b/tests/system/general/test_3d_modeler.py @@ -1298,6 +1298,18 @@ def test_project_sheet_success_with_single_object(aedt_app) -> None: assert sorted(EXPECTED_POSITIONS) == sorted(positions), "Object has not the expected vertices positions" aedt_app.modeler.delete(aedt_app.modeler.object_names) + box = aedt_app.modeler.create_box([-10, -10, -10], [20, 20, 20], "box_project_operation") + name = box.name + assert aedt_app.modeler.get_objects_by_name(name.upper(), case_sensitive=False) + assert not aedt_app.modeler.get_objects_by_name(name.upper(), case_sensitive=True) + + assert aedt_app.modeler.get_objects_by_name("box_*", case_sensitive=True) + assert aedt_app.modeler.get_objects_by_name("box_*", case_sensitive=False) + assert aedt_app.modeler.get_objects_by_name("*_project_*", case_sensitive=False) + assert aedt_app.modeler.get_objects_by_name("*_operation", case_sensitive=False) + assert not aedt_app.modeler.get_objects_by_name("Box_*", case_sensitive=True) + assert not aedt_app.modeler.get_objects_by_name("plane_*", case_sensitive=False) + def test_project_sheet_success_with_multiple_objects(aedt_app) -> None: """Test project sheet method with multiple objects.""" From 52b5610279c2435408fbe3e8adb20f75b6109f61 Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Mon, 23 Mar 2026 21:28:58 +0100 Subject: [PATCH 16/19] Update src/ansys/aedt/core/application/design.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- src/ansys/aedt/core/application/design.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/application/design.py b/src/ansys/aedt/core/application/design.py index 97ecd4694c3..e5219fdb8b9 100644 --- a/src/ansys/aedt/core/application/design.py +++ b/src/ansys/aedt/core/application/design.py @@ -2887,8 +2887,7 @@ def import_dataset1d( name, xlist, ylist, is_project_dataset=is_project_dataset, x_unit=units[0], y_unit=units[1], sort=sort ) else: - error_message = f"Input file '{in_file}' does not exist." - raise FileNotFoundError(error_message) + raise FileNotFoundError(f"Input file '{in_file}' does not exist.") @pyaedt_function_handler() def import_dataset3d( From 339daca0a0378d1b620a58c8904ef0255e7d9eb0 Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Tue, 24 Mar 2026 08:07:14 +0100 Subject: [PATCH 17/19] Update src/ansys/aedt/core/modeler/cad/primitives.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- src/ansys/aedt/core/modeler/cad/primitives.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 62cac618da3..b2dabb97a91 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -4497,9 +4497,11 @@ def create_faceted_bondwire_from_true_surface( str Name of the bondwire created. """ - old_bondwire = self.get_objects_by_name(assignment)[0] - if not old_bondwire: - return False + bojects = self.get_objects_by_name(assignment) + if objects: + old_bondwire = objects[0] + else: + raise ValueError(f"Assignment {assignment} does not match an object.") edges = old_bondwire.edges faces = old_bondwire.faces centers = [] From 907217591a350886f23884984d3505ed5d58892b Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Tue, 24 Mar 2026 08:07:28 +0100 Subject: [PATCH 18/19] Update src/ansys/aedt/core/modeler/cad/primitives.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- src/ansys/aedt/core/modeler/cad/primitives.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index b2dabb97a91..4793e4e4156 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -7612,7 +7612,7 @@ def get_objects_by_name( """Return the objects whose names match a wildcard pattern. The ``*`` character acts as a wildcard that matches any sequence of - characters (including none). The matching mode is inferred + characters (including none). The matching mode is inferred automatically from the position of ``*`` in ``assignment``: Parameters From e255937312e32c70cf3faecc765ee58ccb196d14 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 24 Mar 2026 08:11:35 +0100 Subject: [PATCH 19/19] FIX: remove redundant return statement in get_objects_by_name method --- src/ansys/aedt/core/modeler/cad/primitives.py | 3 +-- src/ansys/aedt/core/modules/material.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 4793e4e4156..095b8c164e7 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -4497,7 +4497,7 @@ def create_faceted_bondwire_from_true_surface( str Name of the bondwire created. """ - bojects = self.get_objects_by_name(assignment) + objects = self.get_objects_by_name(assignment) if objects: old_bondwire = objects[0] else: @@ -7670,7 +7670,6 @@ def get_object_from_name(self, assignment: str) -> Object3d | None: """ if assignment in self.object_names: return self.objects[assignment] - return None @pyaedt_function_handler() def get_objects_w_string(self, string_name: str, case_sensitive: bool = True) -> list: diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index 140a220beb6..084e448b4cc 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -454,7 +454,7 @@ def value(self, val: str | list | Path | float | int) -> None: if len(val) == 4: self._property_value[0].value = val self._material._update_props(self.name, val, update_aedt=self._material._material_update) - elif isinstance(val, Path): + elif isinstance(val, Path) and val.suffix in [".csv", ".tab"]: val = Path(val) if not val.is_file(): raise FileNotFoundError(f"Argument {val} is not a file.")