From a785b23a946655045e2dd313c5cef7accdd3d092 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Nov 2024 11:16:26 +0100 Subject: [PATCH 1/6] BUILD: update scikit-rf requirement from <1.4,>=0.30.0 to >=0.30.0,<1.5 (#5397) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 19ea72e9b71..a463daad2a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ tests = [ "pyvista[io]>=0.38.0,<0.45", # Never directly imported but required when loading ML related file see #4713 "scikit-learn>=1.0.0,<1.6", - "scikit-rf>=0.30.0,<1.4", + "scikit-rf>=0.30.0,<1.5", "SRTM.py", "utm", ] @@ -100,7 +100,7 @@ all = [ "fast-simplification>=0.1.7", # Never directly imported but required when loading ML related file see #4713 "scikit-learn>=1.0.0,<1.6", - "scikit-rf>=0.30.0,<1.4", + "scikit-rf>=0.30.0,<1.5", "SRTM.py", "utm", ] @@ -113,7 +113,7 @@ installer = [ "pyvista[io]>=0.38.0,<0.45", # Never directly imported but required when loading ML related file see #4713 "scikit-learn>=1.0.0,<1.6", - "scikit-rf>=0.30.0,<1.4", + "scikit-rf>=0.30.0,<1.5", "SRTM.py", "utm", "jupyterlab>=3.6.0,<4.4", From ea93f1b249a17d873853f8e1718e4cd6ffe5f719 Mon Sep 17 00:00:00 2001 From: Hui Zhou Date: Mon, 11 Nov 2024 08:16:51 +0100 Subject: [PATCH 2/6] FIX: close UI by click X should not trigger parametrization (#5367) Co-authored-by: ring630 <@gmail.com> --- .../workflows/hfss3dlayout/parametrize_edb.py | 93 +++++++++++-------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py b/src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py index fea6ef42692..ab7cd9413fd 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py +++ b/src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py @@ -57,6 +57,14 @@ def frontend(): # pragma: no cover + default_values = { + "layer": 0, + "material": 0, + "padstacks": 0, + "nets": 0, + "relative": 0, + } + app = ansys.aedt.core.Desktop( new_desktop=False, version=version, @@ -65,9 +73,13 @@ def frontend(): # pragma: no cover student_version=is_student, ) active_project = app.active_project() - active_design = app.active_design() - aedb_path = os.path.join(active_project.GetPath(), active_project.GetName() + ".aedb") - edb = Edb(aedb_path, active_design.GetName().split(";")[1], edbversion=version) + active_project_path = active_project.GetPath() + active_project_name = active_project.GetName() + aedb_path = os.path.join(active_project_path, active_project_name + ".aedb") + active_design_name = app.active_design().GetName().split(";")[1] + + app.release_desktop(False, False) + edb = Edb(aedb_path, active_design_name, edbversion=version) import tkinter from tkinter import ttk @@ -98,7 +110,7 @@ def frontend(): # pragma: no cover var9.set("New project name: ") label9.grid(row=0, column=0, pady=10) project_name = tkinter.Entry(master, width=30) - project_name.insert(tkinter.END, generate_unique_name(active_project.GetName(), n=2)) + project_name.insert(tkinter.END, generate_unique_name(active_project_name, n=2)) project_name.grid(row=0, column=1, pady=10, padx=5) var10 = tkinter.StringVar() @@ -108,7 +120,7 @@ def frontend(): # pragma: no cover relative = tkinter.IntVar() check5 = tkinter.Checkbutton(master, width=30, variable=relative) check5.grid(row=0, column=3, pady=10, padx=5) - relative.set(1) + relative.set(default_values["relative"]) var1 = tkinter.StringVar() label1 = tkinter.Label(master, textvariable=var1) @@ -117,7 +129,7 @@ def frontend(): # pragma: no cover layers = tkinter.IntVar() check1 = tkinter.Checkbutton(master, width=30, variable=layers) check1.grid(row=1, column=1, pady=10, padx=5) - layers.set(1) + layers.set(default_values["layer"]) var2 = tkinter.StringVar() label2 = tkinter.Label(master, textvariable=var2) @@ -126,7 +138,7 @@ def frontend(): # pragma: no cover materials = tkinter.IntVar() check2 = tkinter.Checkbutton(master, width=30, variable=materials) check2.grid(row=1, column=3, pady=10, padx=5) - materials.set(1) + materials.set(default_values["material"]) var3 = tkinter.StringVar() label3 = tkinter.Label(master, textvariable=var3) @@ -135,7 +147,7 @@ def frontend(): # pragma: no cover padstacks = tkinter.IntVar() check3 = tkinter.Checkbutton(master, width=30, variable=padstacks) check3.grid(row=2, column=1, pady=10, padx=5) - padstacks.set(1) + padstacks.set(default_values["padstacks"]) var5 = tkinter.StringVar() label5 = tkinter.Label(master, textvariable=var5) @@ -160,7 +172,7 @@ def frontend(): # pragma: no cover nets = tkinter.IntVar() check4 = tkinter.Checkbutton(master, width=30, variable=nets) check4.grid(row=4, column=1, pady=10, padx=5) - nets.set(1) + nets.set(default_values["nets"]) var8 = tkinter.StringVar() label8 = tkinter.Label(master, textvariable=var8) @@ -174,7 +186,10 @@ def frontend(): # pragma: no cover net_list.insert(idx, net) idx += 1 + master.flag = False + def callback(): + master.flag = True master.layers_ui = layers.get() master.materials_ui = materials.get() master.padstacks_ui = padstacks.get() @@ -191,34 +206,37 @@ def callback(): b = tkinter.Button(master, text="Create Parametric Model", width=40, command=callback) b.grid(row=5, column=1, pady=10) + edb.close_edb() tkinter.mainloop() - layers_ui = getattr(master, "layers_ui", extension_arguments["parametrize_layers"]) - materials_ui = getattr(master, "materials_ui", extension_arguments["parametrize_materials"]) - padstacks_ui = getattr(master, "padstacks_ui", extension_arguments["parametrize_padstacks"]) - nets_ui = getattr(master, "nets_ui", extension_arguments["parametrize_traces"]) - nets_filter_ui = getattr(master, "nets_filter", extension_arguments["nets_filter"]) - poly_ui = getattr(master, "poly_ui", extension_arguments["expansion_polygon_mm"]) - voids_ui = getattr(master, "voids_ui", extension_arguments["expansion_void_mm"]) - project_name_ui = getattr(master, "project_name_ui", extension_arguments["project_name"]) - relative_ui = getattr(master, "relative_ui", extension_arguments["relative_parametric"]) - - output_dict = { - "aedb_path": os.path.join(active_project.GetPath(), active_project.GetName() + ".aedb"), - "design_name": active_design.GetName().split(";")[1], - "parametrize_layers": layers_ui, - "parametrize_materials": materials_ui, - "parametrize_padstacks": padstacks_ui, - "parametrize_traces": nets_ui, - "nets_filter": nets_filter_ui, - "expansion_polygon_mm": float(poly_ui), - "expansion_void_mm": float(voids_ui), - "relative_parametric": relative_ui, - "project_name": project_name_ui, - } - edb.close_edb() - app.release_desktop(False, False) - return output_dict + if master.flag: + layers_ui = getattr(master, "layers_ui", extension_arguments["parametrize_layers"]) + materials_ui = getattr(master, "materials_ui", extension_arguments["parametrize_materials"]) + padstacks_ui = getattr(master, "padstacks_ui", extension_arguments["parametrize_padstacks"]) + nets_ui = getattr(master, "nets_ui", extension_arguments["parametrize_traces"]) + nets_filter_ui = getattr(master, "net_list_ui", extension_arguments["nets_filter"]) + poly_ui = getattr(master, "poly_ui", extension_arguments["expansion_polygon_mm"]) + voids_ui = getattr(master, "voids_ui", extension_arguments["expansion_void_mm"]) + project_name_ui = getattr(master, "project_name_ui", extension_arguments["project_name"]) + relative_ui = getattr(master, "relative_ui", extension_arguments["relative_parametric"]) + + output_dict = { + "aedb_path": os.path.join(active_project_path, active_project_name + ".aedb"), + "design_name": active_design_name, + "parametrize_layers": layers_ui, + "parametrize_materials": materials_ui, + "parametrize_padstacks": padstacks_ui, + "parametrize_traces": nets_ui, + "nets_filter": nets_filter_ui, + "expansion_polygon_mm": float(poly_ui), + "expansion_void_mm": float(voids_ui), + "relative_parametric": relative_ui, + "project_name": project_name_ui, + } + + return output_dict + else: + return False def main(extension_arguments): @@ -295,5 +313,6 @@ def main(extension_arguments): for output_name, output_value in output.items(): if output_name in extension_arguments: args[output_name] = output_value - - main(args) + main(args) + else: + main(args) From c4a1475c435652748f099d4304421dc4324736ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Morais?= <146729917+SMoraisAnsys@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:52:49 +0100 Subject: [PATCH 3/6] CI: Change flags in codecov (#5395) --- .github/workflows/ci_cd.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index db85ca4f814..52d48431221 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -99,7 +99,7 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} name: codecov-unit-tests file: ./coverage.xml - flags: unit + flags: linux_unit - name: Upload pytest test results uses: actions/upload-artifact@v4 @@ -158,7 +158,7 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} name: codecov-system-solvers-tests-windows file: ./coverage.xml - flags: system,solvers,windows + flags: windows_system_solvers - name: Upload pytest test results uses: actions/upload-artifact@v4 @@ -214,7 +214,7 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} name: codecov-system-solvers-tests-linux file: ./coverage.xml - flags: system,solvers,linux + flags: linux_system_solvers - name: Upload pytest test results uses: actions/upload-artifact@v4 @@ -278,7 +278,7 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} name: codecov-system-general-tests-windows file: ./coverage.xml - flags: system,general,windows + flags: windows_system_general - name: Upload pytest test results uses: actions/upload-artifact@v4 @@ -346,7 +346,7 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} name: codecov-system-general-tests file: ./coverage.xml - flags: system,general,linux + flags: linux_system_general - name: Upload pytest test results uses: actions/upload-artifact@v4 From 4d0d6fe5fc7d9798b6b1cdf48729e196047decf7 Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Mon, 11 Nov 2024 12:58:59 +0100 Subject: [PATCH 4/6] FIX: Revert f-string (#5404) --- .../core/workflows/templates/pyaedt_utils.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/ansys/aedt/core/workflows/templates/pyaedt_utils.py b/src/ansys/aedt/core/workflows/templates/pyaedt_utils.py index 22d1f7b1d81..3e432da6c16 100644 --- a/src/ansys/aedt/core/workflows/templates/pyaedt_utils.py +++ b/src/ansys/aedt/core/workflows/templates/pyaedt_utils.py @@ -40,7 +40,7 @@ def set_ansys_em_environment(oDesktop): - variable = f"ANSYSEM_ROOT{oDesktop.GetVersion()[2:6].replace('.', '')}" + variable = "ANSYSEM_ROOT{}".format(oDesktop.GetVersion()[2:6].replace(".", "")) if variable not in os.environ: os.environ[variable] = oDesktop.GetExeDir() @@ -57,8 +57,8 @@ def sanitize_interpreter_path(interpreter_path, version): def check_file(file_path, oDesktop): if not os.path.isfile(file_path): show_error( - f'"{file_path}" does not exist. Install PyAEDT using the Python script installer from the PyAEDT ' - "documentation.", + '"{}" does not exist. Install PyAEDT using the Python script installer from the PyAEDT ' + "documentation.".format(file_path), oDesktop, ) return False @@ -111,34 +111,34 @@ def environment_variables(oDesktop): os.environ["PYAEDT_STUDENT_VERSION"] = "False" if is_linux: edt_root = os.path.normpath(oDesktop.GetExeDir()) - os.environ[f"ANSYSEM_ROOT{version}"] = edt_root + os.environ["ANSYSEM_ROOT{}".format(version)] = edt_root ld_library_path_dirs_to_add = [ - f"{edt_root}/commonfiles/CPython/3_7/linx64/Release/python/lib", - f"{edt_root}/commonfiles/CPython/3_10/linx64/Release/python/lib", - f"{edt_root}/common/mono/Linux64/lib64", - f"{edt_root}/Delcross", - f"{edt_root}", + "{}/commonfiles/CPython/3_7/linx64/Release/python/lib".format(edt_root), + "{}/commonfiles/CPython/3_10/linx64/Release/python/lib".format(edt_root), + "{}/common/mono/Linux64/lib64".format(edt_root), + "{}/Delcross".format(edt_root), + "{}".format(edt_root), ] os.environ["LD_LIBRARY_PATH"] = ":".join(ld_library_path_dirs_to_add) + ":" + os.getenv("LD_LIBRARY_PATH", "") if version > "2023.1": os.environ["TCL_LIBRARY"] = os.path.join( - f"{edt_root}/commonfiles/CPython/3_10/linx64/Release/python/lib", "tcl8.5" + "{}/commonfiles/CPython/3_10/linx64/Release/python/lib".format(edt_root), "tcl8.5" ) os.environ["TK_LIBRARY"] = os.path.join( - f"{edt_root}/commonfiles/CPython/3_10/linx64/Release/python/lib", "tk8.5" + "{}/commonfiles/CPython/3_10/linx64/Release/python/lib".format(edt_root), "tk8.5" ) os.environ["TKPATH"] = os.path.join( - f"{edt_root}/commonfiles/CPython/3_10/linx64/Release/python/lib", "tk8.5" + "{}/commonfiles/CPython/3_10/linx64/Release/python/lib".format(edt_root), "tk8.5" ) else: os.environ["TCL_LIBRARY"] = os.path.join( - f"{edt_root}/commonfiles/CPython/3_7/linx64/Release/python/lib", "tcl8.5" + "{}/commonfiles/CPython/3_7/linx64/Release/python/lib".format(edt_root), "tcl8.5" ) os.environ["TK_LIBRARY"] = os.path.join( - f"{edt_root}/commonfiles/CPython/3_7/linx64/Release/python/lib", "tk8.5" + "{}/commonfiles/CPython/3_7/linx64/Release/python/lib".format(edt_root), "tk8.5" ) os.environ["TKPATH"] = os.path.join( - f"{edt_root}/commonfiles/CPython/3_7/linx64/Release/python/lib", "tk8.5" + "{}/commonfiles/CPython/3_7/linx64/Release/python/lib".format(edt_root), "tk8.5" ) From 33278b9dbb255749461ac29dd8030d1abbea2f7d Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Tue, 12 Nov 2024 09:16:42 +0100 Subject: [PATCH 5/6] FEAT: Update wireframe method (#5386) --- .../aedt/core/application/analysis_3d.py | 2 +- src/ansys/aedt/core/generic/configurations.py | 2 +- .../core/modeler/advanced_cad/stackup_3d.py | 2 +- src/ansys/aedt/core/modeler/cad/object_3d.py | 3 +- src/ansys/aedt/core/modeler/cad/primitives.py | 77 +++++++++++++++++++ .../aedt/core/modeler/cad/primitives_3d.py | 4 +- src/ansys/aedt/core/modules/material_lib.py | 35 ++++++++- tests/system/general/test_08_Primitives3D.py | 36 +++++++++ 8 files changed, 151 insertions(+), 10 deletions(-) diff --git a/src/ansys/aedt/core/application/analysis_3d.py b/src/ansys/aedt/core/application/analysis_3d.py index 71f71d031e5..be4a88b4503 100644 --- a/src/ansys/aedt/core/application/analysis_3d.py +++ b/src/ansys/aedt/core/application/analysis_3d.py @@ -952,7 +952,7 @@ def assignmaterial_from_sherlock_files(self, component_file, material_file): list_mat_obj += [rd for rd, md in zip(component_data["Ref Des"], component_data["Material"]) if md == mat] list_mat_obj = [mo for mo in list_mat_obj if mo in all_objs] if list_mat_obj: - newmat = self.materials.checkifmaterialexists(mat) + newmat = self.materials.exists_material(mat) if not newmat: newmat = self.materials.add_material(mat.lower()) if "Material Density" in material_data: diff --git a/src/ansys/aedt/core/generic/configurations.py b/src/ansys/aedt/core/generic/configurations.py index da649c10b74..5ccd1131b47 100644 --- a/src/ansys/aedt/core/generic/configurations.py +++ b/src/ansys/aedt/core/generic/configurations.py @@ -1148,7 +1148,7 @@ def import_config(self, config_file, *args): if self.options.import_materials and dict_in.get("materials", None): self.results.import_materials = True for el, val in dict_in["materials"].items(): - if self._app.materials.checkifmaterialexists(el): + if self._app.materials.exists_material(el): newname = generate_unique_name(el) self._app.logger.warning("Material %s already exists. Renaming to %s", el, newname) else: diff --git a/src/ansys/aedt/core/modeler/advanced_cad/stackup_3d.py b/src/ansys/aedt/core/modeler/advanced_cad/stackup_3d.py index cd7a7ba2845..fa6dc15ec9e 100644 --- a/src/ansys/aedt/core/modeler/advanced_cad/stackup_3d.py +++ b/src/ansys/aedt/core/modeler/advanced_cad/stackup_3d.py @@ -244,7 +244,7 @@ def __init__(self, application, material_name, cloned_material_name, list_of_pro self._magnetic_loss_tangent = None self._material = None self._material_name = None - if application.materials.checkifmaterialexists(material_name): + if application.materials.exists_material(material_name): if not list_of_properties: cloned_material = application.materials.duplicate_material(material_name, cloned_material_name) permittivity = cloned_material.permittivity.value diff --git a/src/ansys/aedt/core/modeler/cad/object_3d.py b/src/ansys/aedt/core/modeler/cad/object_3d.py index 0301c40392f..d5e53ff5d32 100644 --- a/src/ansys/aedt/core/modeler/cad/object_3d.py +++ b/src/ansys/aedt/core/modeler/cad/object_3d.py @@ -933,7 +933,7 @@ def material_name(self): @material_name.setter def material_name(self, mat): - matobj = self._primitives._materials.checkifmaterialexists(mat) + matobj = self._primitives._materials.exists_material(mat) mat_value = None if matobj: mat_value = chr(34) + matobj.name + chr(34) @@ -1267,7 +1267,6 @@ def part_coordinate_system(self, sCS): pcs = ["NAME:Orientation", "Value:=", sCS] self._change_property(pcs) self._part_coordinate_system = sCS - return True @property def solve_inside(self): diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 71a5a065c9f..a4198684c54 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -43,6 +43,7 @@ from ansys.aedt.core.generic.data_handlers import json_to_dict from ansys.aedt.core.generic.general_methods import _dim_arg from ansys.aedt.core.generic.general_methods import _uname +from ansys.aedt.core.generic.general_methods import clamp from ansys.aedt.core.generic.general_methods import generate_unique_name from ansys.aedt.core.generic.general_methods import is_linux from ansys.aedt.core.generic.general_methods import is_number @@ -6280,6 +6281,82 @@ def update_object(self, assignment): o = self._create_object(name) return o + @pyaedt_function_handler() + def update_geometry_property(self, assignment, name=None, value=None): + """Update property of assigned geometry objects. + + Parameters + ---------- + assignment : str, or list + Object name or list of object names to be updated. + name : str, optional + Property name to change. The default is ``None``, in which case no property is updated. + Available options are: ``"display_wireframe"``, `"material"``, and `"solve_inside"``. + value : bool or str, optional + Property value. The default is ``None`` in which case + no value is assigned. + + Returns + ------- + bool + ``True`` when successful, ``False`` when failed. + + """ + assignment = self.convert_to_selections(assignment, True) + + # Define property mapping + property_mapping = { + "display_wireframe": {"property_name": "Display Wireframe", "reset_attr": ["_wireframe"]}, + "material_name": {"property_name": "Material", "reset_attr": ["_material_name", "_model", "_solve_inside"]}, + "solve_inside": {"property_name": "Solve Inside", "reset_attr": ["_solve_inside"]}, + "color": {"property_name": "Color", "reset_attr": ["_color"]}, + "transparency": {"property_name": "Transparent", "reset_attr": ["_transparency"]}, + "part_coordinate_system": {"property_name": "Orientation", "reset_attr": ["_part_coordinate_system"]}, + } + + # Check if property name is valid + property_key = name.lower() + if property_key not in property_mapping: + self.logger.error("Invalid property name.") + return False + + # Retrieve property settings + property_name = property_mapping[property_key]["property_name"] + reset_attr = property_mapping[property_key]["reset_attr"] + + # Handle special cases for material + if property_key == "material_name" and isinstance(value, str): + matobj = self._materials.exists_material(value) + if matobj: + value = f'"{matobj.name}"' + elif "[" in value or "(" in value: # pragma: no cover + value = value + else: + self.logger.error("Invalid material value.") + return False + + value_command = ["Value:=", value] + if property_key == "color": + if isinstance(value, tuple) or isinstance(value, list): + R = clamp(value[0], 0, 255) + G = clamp(value[1], 0, 255) + B = clamp(value[2], 0, 255) + value_command = ["R:=", str(R), "G:=", str(G), "B:=", str(B)] + else: + self.logger.error("Invalid color.") + return False + + # Reset property values + for obj_name in assignment: + obj = self.objects_by_name[obj_name] + for attr in reset_attr: + setattr(obj, attr, None) + + props = [f"NAME:{property_name}"] + props.extend(value_command) + + return self._change_geometry_property(props, assignment) + @pyaedt_function_handler() def value_in_object_units(self, value): """Convert one or more strings for numerical lengths to floating point values. diff --git a/src/ansys/aedt/core/modeler/cad/primitives_3d.py b/src/ansys/aedt/core/modeler/cad/primitives_3d.py index f8397fb8540..adb0d5d72d1 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives_3d.py +++ b/src/ansys/aedt/core/modeler/cad/primitives_3d.py @@ -3086,7 +3086,7 @@ def check_choke_values(self, input_dir, create_another_file=True): try: core_material = str(values["Core"]["Material"]) if len(core_material) > 0: - if self.materials.checkifmaterialexists(core_material): + if self.materials.exists_material(core_material): values["Core"]["Material"] = self.materials._get_aedt_case_name(core_material) else: self.logger.error( @@ -3109,7 +3109,7 @@ def check_choke_values(self, input_dir, create_another_file=True): try: winding_material = str(values["Outer Winding"]["Material"]) if len(winding_material) > 0: - if self.materials.checkifmaterialexists(winding_material): + if self.materials.exists_material(winding_material): values["Outer Winding"]["Material"] = self.materials._get_aedt_case_name(winding_material) else: self.logger.error( diff --git a/src/ansys/aedt/core/modules/material_lib.py b/src/ansys/aedt/core/modules/material_lib.py index d1e6aeb0323..1037e233f76 100644 --- a/src/ansys/aedt/core/modules/material_lib.py +++ b/src/ansys/aedt/core/modules/material_lib.py @@ -93,7 +93,7 @@ def __iter__(self): return iter(self.material_keys.values()) if sys.version_info.major > 2 else self.material_keys.itervalues() def __getitem__(self, item): - matobj = self.checkifmaterialexists(item) + matobj = self.exists_material(item) if matobj: return matobj elif item in list(self.surface_material_keys.keys()): @@ -243,6 +243,35 @@ def _get_surface_materials(self): def checkifmaterialexists(self, material): """Check if a material exists in AEDT or PyAEDT Definitions. + .. deprecated:: 0.11.4 + Use :func:`exists_material` method instead. + + Parameters + ---------- + material : str + Name of the material. If the material exists and is not in the materials database, + it is added to this database. + + Returns + ------- + :class:`ansys.aedt.core.modules.material.Material` + Material object if present, ``False`` when failed. + + References + ---------- + + >>> oDefinitionManager.GetProjectMaterialNames + >>> oMaterialManager.GetData + """ + warnings.warn( + "`checkifmaterialexists` is deprecated. Use `exists_material` method instead.", DeprecationWarning + ) + return self.exists_material(material=material) + + @pyaedt_function_handler() + def exists_material(self, material): + """Check if a material exists in AEDT or PyAEDT Definitions. + Parameters ---------- material : str @@ -293,7 +322,7 @@ def check_thermal_modifier(self, material): ``True`` when successful, ``False`` when failed. """ - omat = self.checkifmaterialexists(material) + omat = self.exists_material(material) if omat: for el in MatProperties.aedtname: if omat.__dict__["_" + el].thermalmodifier: @@ -451,7 +480,7 @@ def add_material_sweep(self, assignment, name): """ matsweep = [] for mat in assignment: - matobj = self.checkifmaterialexists(mat) + matobj = self.exists_material(mat) if matobj: matsweep.append(matobj) diff --git a/tests/system/general/test_08_Primitives3D.py b/tests/system/general/test_08_Primitives3D.py index a561b3a62ce..baff07f0c44 100644 --- a/tests/system/general/test_08_Primitives3D.py +++ b/tests/system/general/test_08_Primitives3D.py @@ -2035,3 +2035,39 @@ def test_94_create_equationbased_surface(self): x_uv="(sin(_v*2*pi)^2+1.2)*cos(_u*2*pi)", y_uv="(sin(_v*2*pi)^2+1.2)*sin(_u*2*pi)", z_uv="_v*2" ) assert surf.name in self.aedtapp.modeler.sheet_names + + def test_95_update_geometry_property(self): + self.aedtapp.insert_design("Update_properties") + box1 = self.aedtapp.modeler.create_box([0, 0, 0], [1, 2, 3]) + box2 = self.aedtapp.modeler.create_box([10, 10, 10], [1, 2, 3]) + box1.display_wireframe = False + box2.display_wireframe = False + + assert not self.aedtapp.modeler.update_geometry_property([box1.name], "wireframe", True) + assert not self.aedtapp.modeler.update_geometry_property([box1.name], "material_name", "invented") + assert not self.aedtapp.modeler.update_geometry_property([box1.name], "color", "red") + + self.aedtapp.modeler.update_geometry_property([box1.name], "display_wireframe", True) + assert box1.display_wireframe + + self.aedtapp.modeler.update_geometry_property([box1.name, box2.name], "display_wireframe", True) + assert box2.display_wireframe + + self.aedtapp.modeler.update_geometry_property([box1.name, box2.name], "material_name", "copper") + assert box2.material_name == "copper" + assert not box2.solve_inside + + self.aedtapp.modeler.update_geometry_property([box2.name], "solve_inside", True) + assert box2.solve_inside + assert not box1.solve_inside + + self.aedtapp.modeler.update_geometry_property([box1.name, box2.name], "color", (255, 255, 0)) + assert box2.color == box1.color == (255, 255, 0) + + self.aedtapp.modeler.update_geometry_property([box1.name, box2.name], "transparency", 0.75) + assert box2.transparency == 0.75 + + cs = self.aedtapp.modeler.create_coordinate_system() + self.aedtapp.modeler.update_geometry_property([box2.name], "part_coordinate_system", cs.name) + assert box2.part_coordinate_system == cs.name + assert box1.part_coordinate_system == "Global" From 48f4e8710d1f51cdfe7db6b52853b8a052c46dcb Mon Sep 17 00:00:00 2001 From: boyang2022 Date: Tue, 12 Nov 2024 14:00:21 +0100 Subject: [PATCH 6/6] FEAT: Circuit current probe (#5352) Co-authored-by: Samuelopez-ansys --- .../modeler/circuits/primitives_nexxim.py | 73 +++++++++++++++++-- tests/system/general/test_21_Circuit.py | 9 ++- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py b/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py index d57fbf6e470..4179ed83b9b 100644 --- a/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py +++ b/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py @@ -813,7 +813,7 @@ def create_voltage_probe(self, name=None, location=None, angle=0, use_instance_i Parameters ---------- - name : + name : str, optional Name of the voltage probe. The default is ``None``. location : list of float, optional Position on the X axis and Y axis. The default is ``None``. @@ -830,24 +830,87 @@ def create_voltage_probe(self, name=None, location=None, angle=0, use_instance_i References ---------- + >>> oEditor.CreateComponent + + Examples + -------- + >>> from ansys.aedt.core import Circuit + >>> cir = Circuit() + >>> cir.modeler.components.create_voltage_probe(name="probe") + >>> cir.release_desktop(False, False) + """ + return self.__create_probe( + name=name, + probe_type="voltage", + location=location, + angle=angle, + use_instance_id_netlist=use_instance_id_netlist, + ) + + @pyaedt_function_handler() + def create_current_probe(self, name=None, location=None, angle=0, use_instance_id_netlist=False): + """Create a current probe. + + Parameters + ---------- + name : str, optional + Name of the current probe. The default is ``None``. + location : list of float, optional + Position on the X axis and Y axis. The default is ``None``. + angle : float, optional + Angle rotation in degrees. The default is ``0``. + use_instance_id_netlist : bool, optional + Whether to use the instance ID in the net list. + The default is ``False``. + + Returns + ------- + :class:`ansys.aedt.core.modeler.cad.object_3dcircuit.CircuitComponent` + Circuit Component Object. + References + ---------- >>> oEditor.CreateComponent + + Examples + -------- + >>> from ansys.aedt.core import Circuit + >>> cir = Circuit() + >>> cir.modeler.components.create_current_probe(name="probe") + >>> cir.release_desktop(False, False) """ + return self.__create_probe( + name=name, + probe_type="current", + location=location, + angle=angle, + use_instance_id_netlist=use_instance_id_netlist, + ) + + def __create_probe(self, name=None, probe_type="voltage", location=None, angle=0.0, use_instance_id_netlist=False): + if probe_type == "voltage": + component_name = "VPROBE" + elif probe_type == "current": + component_name = "IPROBE" + else: # pragma: no cover + self.logger.error("Wrong probe type assigned.") + return False + if location is None: location = [] else: location = [location[0] + 0.2 * 24.4 / 1000, location[1] + 0.2 * 24.4 / 1000] cmpid = self.create_component( - None, + name, component_library="Probes", - component_name="VPROBE", + component_name=component_name, location=location, angle=angle, use_instance_id_netlist=use_instance_id_netlist, ) - - cmpid.set_property("Name", name) + if name: + cmpid.set_property("InstanceName", name) return cmpid @pyaedt_function_handler(compname="name") diff --git a/tests/system/general/test_21_Circuit.py b/tests/system/general/test_21_Circuit.py index 5144c237bb4..6d99dd229ae 100644 --- a/tests/system/general/test_21_Circuit.py +++ b/tests/system/general/test_21_Circuit.py @@ -517,7 +517,7 @@ def test_35_netlist_data_block(self): assert self.aedtapp.analyze() def test_36_create_voltage_probe(self): - myprobe = self.aedtapp.modeler.components.create_voltage_probe(name="test_probe", location=[0.4, 0.2]) + myprobe = self.aedtapp.modeler.components.create_voltage_probe(name="voltage_probe") assert type(myprobe.id) is int def test_37_draw_graphical_primitives(self): @@ -988,3 +988,10 @@ def test_51_import_asc(self): self.aedtapp.insert_design("ASC") asc_file = os.path.join(TESTS_GENERAL_PATH, "example_models", test_subfolder, "butter.asc") assert self.aedtapp.create_schematic_from_asc_file(asc_file) + + def test_52_create_current_probe(self): + iprobe = self.aedtapp.modeler.schematic.create_current_probe(name="test_probe", location=[0.4, 0.2]) + assert type(iprobe.id) is int + assert iprobe.InstanceName == "test_probe" + iprobe2 = self.aedtapp.modeler.schematic.create_current_probe(location=[0.8, 0.2]) + assert type(iprobe2.id) is int