From c9bef50f3e3c6f8b428c88559eae9a36600825f1 Mon Sep 17 00:00:00 2001 From: Devin Date: Sun, 25 Jan 2026 15:48:28 +0100 Subject: [PATCH 01/14] Change property "desktop_class" to "desktop" Resolves issue #6506 Update private property "_desktop_class" to "_desktop_instance". Update unit tests --- .../pyaedt_extensions_doc/commandline.rst | 4 +- .../project/advanced_fields_calculator.rst | 4 +- .../templates/getting_started.rst | 4 +- src/ansys/aedt/core/aedt_logger.py | 6 +- .../aedt/core/application/aedt_objects.py | 6 +- src/ansys/aedt/core/application/analysis.py | 12 +- .../aedt/core/application/analysis_3d.py | 4 +- .../aedt/core/application/analysis_nexxim.py | 4 +- src/ansys/aedt/core/application/design.py | 130 +++++++++--------- src/ansys/aedt/core/circuit.py | 8 +- src/ansys/aedt/core/desktop.py | 8 +- .../aedt/core/emit_core/results/results.py | 6 +- .../core/extensions/hfss/mcad_assembly.py | 2 +- .../hfss3dlayout/parametrize_edb.py | 2 +- .../hfss3dlayout/post_layout_design.py | 2 +- .../resources/configure_layout/master_ui.py | 2 +- .../extensions/hfss3dlayout/via_clustering.py | 8 +- .../extensions/hfss3dlayout/via_design.py | 2 +- src/ansys/aedt/core/generic/configurations.py | 4 +- src/ansys/aedt/core/hfss.py | 8 +- src/ansys/aedt/core/hfss3dlayout.py | 6 +- src/ansys/aedt/core/icepak.py | 12 +- src/ansys/aedt/core/internal/checks.py | 12 +- src/ansys/aedt/core/maxwell.py | 100 +++++++------- src/ansys/aedt/core/maxwellcircuit.py | 2 +- src/ansys/aedt/core/mechanical.py | 2 +- .../aedt/core/modeler/cad/components_3d.py | 8 +- src/ansys/aedt/core/modeler/cad/object_3d.py | 2 +- src/ansys/aedt/core/modeler/cad/primitives.py | 2 +- .../modeler/circuits/object_3d_circuit.py | 2 +- .../modeler/circuits/primitives_circuit.py | 2 +- .../circuits/primitives_maxwell_circuit.py | 10 +- .../modeler/circuits/primitives_nexxim.py | 12 +- .../circuits/primitives_twin_builder.py | 4 +- src/ansys/aedt/core/modeler/modeler_3d.py | 2 +- src/ansys/aedt/core/modeler/modeler_pcb.py | 4 +- src/ansys/aedt/core/modeler/schematic.py | 2 +- src/ansys/aedt/core/modules/material.py | 6 +- src/ansys/aedt/core/modules/solve_setup.py | 16 +-- src/ansys/aedt/core/q3d.py | 2 +- src/ansys/aedt/core/rpc/rpyc_services.py | 6 +- src/ansys/aedt/core/twinbuilder.py | 12 +- .../advanced/farfield_visualization.py | 2 +- .../advanced/rcs_visualization.py | 4 +- .../aedt/core/visualization/post/common.py | 22 +-- .../core/visualization/post/compliance.py | 58 ++++---- .../visualization/post/farfield_exporter.py | 8 +- .../visualization/post/fields_calculator.py | 16 +-- .../core/visualization/post/monitor_icepak.py | 2 +- .../core/visualization/post/post_common_3d.py | 8 +- .../core/visualization/post/post_maxwell.py | 10 +- .../filter_solutions/test_desktop_types.py | 8 +- .../test_export_to_aedt.py | 2 +- tests/system/general/test_circuit.py | 8 +- tests/system/general/test_design.py | 40 +++--- tests/system/general/test_hfss.py | 2 +- tests/system/general/test_message_manager.py | 4 +- tests/system/general/test_twinbuilder.py | 2 +- tests/system/layout/test_3dlayout_modeler.py | 8 +- .../solvers/sequential/test_launch_desktop.py | 4 +- tests/system/solvers/test_pdf.py | 2 +- .../unit/extensions/test_kernel_converter.py | 20 +-- tests/unit/extensions/test_version_manager.py | 16 +-- tests/unit/extensions/test_via_clustering.py | 6 +- tests/unit/test_cli.py | 6 +- tests/unit/test_utils.py | 6 +- 66 files changed, 355 insertions(+), 361 deletions(-) diff --git a/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst b/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst index 0c4e3ed9b079..fe5ff5e358f9 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst @@ -34,8 +34,8 @@ Finally, this code shows how you can run the extension directly from a Python sc file_path = "my_file.stl" hfss = ansys.aedt.core.Hfss() # Specify the AEDT session to connect - os.environ["PYAEDT_DESKTOP_PORT"] = str(hfss.desktop_class.port) - os.environ["PYAEDT_DESKTOP_VERSION"] = hfss.desktop_class.aedt_version_id + os.environ["PYAEDT_DESKTOP_PORT"] = str(hfss.desktop.port) + os.environ["PYAEDT_DESKTOP_VERSION"] = hfss.desktop.aedt_version_id # Launch extension main( { diff --git a/doc/source/User_guide/pyaedt_extensions_doc/project/advanced_fields_calculator.rst b/doc/source/User_guide/pyaedt_extensions_doc/project/advanced_fields_calculator.rst index e059beec3395..7dc65e418513 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/project/advanced_fields_calculator.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/project/advanced_fields_calculator.rst @@ -56,8 +56,8 @@ Finally, this code shows how you can use the Advanced Field Calculator: hfss = ansys.aedt.core.Hfss() # Specify the AEDT session to connect - os.environ["PYAEDT_DESKTOP_PORT"] = str(hfss.desktop_class.port) - os.environ["PYAEDT_DESKTOP_VERSION"] = hfss.desktop_class.aedt_version_id + os.environ["PYAEDT_DESKTOP_PORT"] = str(hfss.desktop.port) + os.environ["PYAEDT_DESKTOP_VERSION"] = hfss.desktop.aedt_version_id # Add an existing expression in the catalog name = hfss.post.fields_calculator.add_expression("voltage_line", "Polyline1") diff --git a/doc/source/User_guide/pyaedt_extensions_doc/templates/getting_started.rst b/doc/source/User_guide/pyaedt_extensions_doc/templates/getting_started.rst index d7ecde80d587..f97902d066bd 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/templates/getting_started.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/templates/getting_started.rst @@ -35,8 +35,8 @@ The extension can be run from a Python script in the following way: hfss = ansys.aedt.core.Hfss() # Specify the AEDT session to connect - os.environ["PYAEDT_DESKTOP_PORT"] = str(hfss.desktop_class.port) - os.environ["PYAEDT_DESKTOP_VERSION"] = hfss.desktop_class.aedt_version_id + os.environ["PYAEDT_DESKTOP_PORT"] = str(hfss.desktop.port) + os.environ["PYAEDT_DESKTOP_VERSION"] = hfss.desktop.aedt_version_id main({"origin_x": 2, "radius": 6, "is_test": True}) diff --git a/src/ansys/aedt/core/aedt_logger.py b/src/ansys/aedt/core/aedt_logger.py index e4aa459ecbb5..3fea53eaa40f 100644 --- a/src/ansys/aedt/core/aedt_logger.py +++ b/src/ansys/aedt/core/aedt_logger.py @@ -158,7 +158,7 @@ class AedtLogger: """ def __init__(self, level=logging.DEBUG, filename=None, to_stdout=False, desktop=None): - self._desktop_class = desktop + self._desktop_instance = desktop self._oproject = None self._odesign = None self._project_name = "" @@ -269,8 +269,8 @@ def remove_all_project_file_logger(self): @property def _desktop(self): - if self._desktop_class: - return self._desktop_class.odesktop + if self._desktop_instance: + return self._desktop_instance.odesktop return None # pragma: no cover @property diff --git a/src/ansys/aedt/core/application/aedt_objects.py b/src/ansys/aedt/core/application/aedt_objects.py index a6a0ccdee6b9..33ee373ff8ca 100644 --- a/src/ansys/aedt/core/application/aedt_objects.py +++ b/src/ansys/aedt/core/application/aedt_objects.py @@ -112,7 +112,7 @@ def oradfield(self): SolutionsHfss.CharacteristicMode, ]: return self._odesign.GetModule("RadField") - if self.desktop_class.aedt_version_id >= "2025.1" and self.design_type == "Q3D Extractor": + if self.desktop.aedt_version_id >= "2025.1" and self.design_type == "Q3D Extractor": return self._odesign.GetModule("RadField") return None @@ -405,12 +405,12 @@ def oeditor(self): self._oeditor = self._odesign.GetEditor("SchematicEditor") if is_linux and settings.aedt_version == "2024.1": # pragma: no cover time.sleep(1) - self.desktop_class.close_windows() + self.desktop.close_windows() elif self.design_type in ["Twin Builder", "Maxwell Circuit", "EMIT"]: self._oeditor = self._odesign.SetActiveEditor("SchematicEditor") if is_linux and settings.aedt_version == "2024.1": # pragma: no cover time.sleep(1) - self.desktop_class.close_windows() + self.desktop.close_windows() elif self.design_type in ["HFSS 3D Layout Design", "HFSS3DLayout"]: self._oeditor = self._odesign.GetEditor("Layout") elif self.design_type in [DesignType.MODELCREATION.NAME, DesignType.RMXPRT.NAME]: diff --git a/src/ansys/aedt/core/application/analysis.py b/src/ansys/aedt/core/application/analysis.py index 6b5d9485c981..01eed69df9d4 100644 --- a/src/ansys/aedt/core/application/analysis.py +++ b/src/ansys/aedt/core/application/analysis.py @@ -1831,7 +1831,7 @@ def analyze_setup( ) if name is None: try: - if self.desktop_class.aedt_version_id > "2023.1" and self.design_type not in [ + if self.desktop.aedt_version_id > "2023.1" and self.design_type not in [ "RMxprt", "ModelCreation", ]: @@ -1850,7 +1850,7 @@ def analyze_setup( self.logger.warning("Failed to revert to initial design mesh.") try: self.logger.info("Solving design setup %s", name) - if self.desktop_class.aedt_version_id > "2023.1" and self.design_type not in [ + if self.desktop.aedt_version_id > "2023.1" and self.design_type not in [ "RMxprt", "ModelCreation", ]: @@ -1891,7 +1891,7 @@ def are_there_simulations_running(self): ---------- >>> oDesktop.AreThereSimulationsRunning """ - return self.desktop_class.are_there_simulations_running + return self.desktop.are_there_simulations_running @pyaedt_function_handler() def get_monitor_data(self): @@ -1908,7 +1908,7 @@ def get_monitor_data(self): ---------- >>> oDesktop.GetMonitorData """ - return self.desktop_class.get_monitor_data() + return self.desktop.get_monitor_data() @pyaedt_function_handler() def stop_simulations(self, clean_stop=True): @@ -1925,7 +1925,7 @@ def stop_simulations(self, clean_stop=True): ---------- >>> oDesktop.StopSimulations """ - return self.desktop_class.stop_simulations(clean_stop=clean_stop) + return self.desktop.stop_simulations(clean_stop=clean_stop) # flake8: noqa: E501 @pyaedt_function_handler() @@ -2099,7 +2099,7 @@ def submit_job( ---------- >>> oDesktop.SubmitJob """ - return self.desktop_class.submit_job( + return self.desktop.submit_job( self.project_file, cluster_name, aedt_full_exe_path, nodes, cores, wait_for_license, setting_file ) diff --git a/src/ansys/aedt/core/application/analysis_3d.py b/src/ansys/aedt/core/application/analysis_3d.py index adea253f9c47..ebd9b6b019c7 100644 --- a/src/ansys/aedt/core/application/analysis_3d.py +++ b/src/ansys/aedt/core/application/analysis_3d.py @@ -1249,7 +1249,7 @@ def import_dxf( """ input_file = Path(input_file) - if self.desktop_class.non_graphical and self.desktop_class.aedt_version_id < "2024.2": # pragma: no cover + if self.desktop.non_graphical and self.desktop.aedt_version_id < "2024.2": # pragma: no cover self.logger.error("Method is supported only in graphical mode.") return False dxf_layers = get_dxf_layers(input_file) @@ -1329,7 +1329,7 @@ def import_gds_3d(self, input_file: str, mapping_layers: dict, units: str = "um" >>> hfss.import_gds_3d(gds_path, gds_number, units="um", import_method=1) """ - if self.desktop_class.non_graphical and self.desktop_class.aedt_version_id < "2024.1": # pragma: no cover + if self.desktop.non_graphical and self.desktop.aedt_version_id < "2024.1": # pragma: no cover self.logger.error("Method is supported only in graphical mode.") return False if not check_if_path_exists(input_file): diff --git a/src/ansys/aedt/core/application/analysis_nexxim.py b/src/ansys/aedt/core/application/analysis_nexxim.py index 68f11fc255b8..92ee4a8e0c76 100644 --- a/src/ansys/aedt/core/application/analysis_nexxim.py +++ b/src/ansys/aedt/core/application/analysis_nexxim.py @@ -159,7 +159,7 @@ def push_down(self, component): else: out_name = component try: - self.desktop_class.active_design(self.oproject, out_name, self.design_type) + self.desktop.active_design(self.oproject, out_name, self.design_type) self.__init__(project=self.project_name, design=out_name) except Exception: # pragma: no cover return False @@ -176,7 +176,7 @@ def pop_up(self): """ try: parent_name = self.odesign.GetName().split(";")[1].split("/")[0] - self.desktop_class.active_design(self.oproject, parent_name, self.design_type) + self.desktop.active_design(self.oproject, parent_name, self.design_type) self.__init__(project=self.project_name, design=parent_name) except Exception: return False diff --git a/src/ansys/aedt/core/application/design.py b/src/ansys/aedt/core/application/design.py index 816e92225c75..546bb9253ca7 100644 --- a/src/ansys/aedt/core/application/design.py +++ b/src/ansys/aedt/core/application/design.py @@ -201,8 +201,8 @@ def __init__( self._project_datasets: List = [] self._design_datasets: List = [] self.close_on_exit: bool = close_on_exit - self._desktop_class = None - self._desktop_class = self.__init_desktop_from_design( + self._desktop_instance = None + self._desktop_instance = self.__init_desktop_from_design( settings.aedt_version if settings.aedt_version else version, non_graphical, new_desktop, @@ -215,16 +215,16 @@ def __init__( from ansys.aedt.core.generic.aedt_constants import DesignType self._design_type: str = getattr(DesignType, design_type) - self._global_logger = self._desktop_class.logger - self._logger = self._desktop_class.logger + self._global_logger = self._desktop_instance.logger + self._logger = self._desktop_instance.logger - self.student_version = self._desktop_class.student_version + self.student_version = self._desktop_instance.student_version if self.student_version: settings.disable_bounding_box_sat = True self._mttime: Optional[float] = None - self._desktop = self._desktop_class.odesktop - self._desktop_install_dir: Optional[str] = self._desktop_class.aedt_install_dir + self._desktop = self._desktop_instance.odesktop + self._desktop_install_dir: Optional[str] = self._desktop_instance.aedt_install_dir self._odesign: Optional[Any] = None self._oproject: Optional[Any] = None @@ -252,7 +252,7 @@ def __init__( self._logger.oproject = self.oproject self._logger.odesign = self.odesign - AedtObjects.__init__(self, self._desktop_class, self.oproject, self.odesign, is_inherithed=True) + AedtObjects.__init__(self, self._desktop_instance, self.oproject, self.odesign, is_inherithed=True) self.logger.info("Aedt Objects correctly read") if is_windows and not self.__t and not settings.lazy_load and Path(self.project_file).exists(): self.__t = threading.Thread(target=load_aedt_thread, args=(self.project_file,), daemon=True) @@ -291,8 +291,8 @@ def _pyaedt_details(self) -> Dict[str, str]: _p_dets["Project Path"] = self.project_file _p_dets["Platform"] = platform.platform() _p_dets["Python Version"] = platform.python_version() - _p_dets["AEDT Process ID"] = self.desktop_class.aedt_process_id - _p_dets["AEDT GRPC Port"] = self.desktop_class.port + _p_dets["AEDT Process ID"] = self.desktop.aedt_process_id + _p_dets["AEDT GRPC Port"] = self.desktop.port return _p_dets def __str__(self) -> str: @@ -306,16 +306,16 @@ def __str__(self) -> str: def __exit__(self, ex_type, ex_value, ex_traceback) -> None: if ex_type: exception_to_desktop(ex_value, ex_traceback) - if self._desktop_class._connected_app_instances > 0: # pragma: no cover - self._desktop_class._connected_app_instances -= 1 - if self._desktop_class._connected_app_instances <= 0 and self._desktop_class._initialized_from_design: + if self._desktop_instance._connected_app_instances > 0: # pragma: no cover + self._desktop_instance._connected_app_instances -= 1 + if self._desktop_instance._connected_app_instances <= 0 and self._desktop_instance._initialized_from_design: if self.close_on_exit: - self.desktop_class.close_desktop() + self.desktop.close_desktop() else: - self.desktop_class.release_desktop(False, False) + self.desktop.release_desktop(False, False) def __enter__(self): # pragma: no cover - self._desktop_class._connected_app_instances += 1 + self._desktop_instance._connected_app_instances += 1 return self @pyaedt_function_handler() @@ -357,23 +357,23 @@ def _init_design(self, project_name: str, design_name: str, solution_type: Optio design=design_name, solution_type=solution_type, version=settings.aedt_version, - non_graphical=self._desktop_class.non_graphical, + non_graphical=self._desktop_instance.non_graphical, new_desktop=False, close_on_exit=self.close_on_exit, student_version=self.student_version, - machine=self._desktop_class.machine, - port=self._desktop_class.port, + machine=self._desktop_instance.machine, + port=self._desktop_instance.port, ) @property - def desktop_class(self): + def desktop(self): """``Desktop`` class. Returns ------- :class:`ansys.aedt.core.desktop.Desktop` """ - return self._desktop_class + return self._desktop_instance @property def project_datasets(self) -> Dict[str, DataSet]: @@ -594,7 +594,7 @@ def odesktop(self): >>> hfss.odesktop """ - return self.desktop_class.odesktop + return self.desktop.odesktop @pyaedt_function_handler() def __delitem__(self, key: str) -> None: @@ -704,7 +704,7 @@ def aedt_version_id(self) -> str: @property def _aedt_version(self) -> str: - return self.desktop_class.aedt_version_id + return self.desktop.aedt_version_id @property def design_name(self) -> Optional[str]: @@ -813,7 +813,7 @@ def project_name(self) -> Optional[str]: ---------- >>> oProject.GetName """ - if self._project_name and self._project_name in self.desktop_class.project_list: + if self._project_name and self._project_name in self.desktop.project_list: return self._project_name if not self.oproject: @@ -959,7 +959,7 @@ def personallib(self) -> str: ---------- >>> oDesktop.GetPersonalLibDirectory """ - return self.desktop_class.personallib + return self.desktop.personallib @property def userlib(self) -> str: @@ -974,7 +974,7 @@ def userlib(self) -> str: ---------- >>> oDesktop.GetUserLibDirectory """ - return self.desktop_class.userlib + return self.desktop.userlib @property def syslib(self) -> str: @@ -989,7 +989,7 @@ def syslib(self) -> str: ---------- >>> oDesktop.GetLibraryDirectory """ - return self.desktop_class.syslib + return self.desktop.syslib @property def src_dir(self) -> str: @@ -1164,7 +1164,7 @@ def _find_design(self) -> Tuple[str, str]: if not self._check_design_consistency(): count_consistent_designs = 0 for des in self.design_list: - self._odesign = self.desktop_class.active_design(self.oproject, des, self.design_type) + self._odesign = self.desktop.active_design(self.oproject, des, self.design_type) if self._check_design_consistency(): count_consistent_designs += 1 activedes = des @@ -1193,7 +1193,7 @@ def odesign(self): >>> oProject.InsertDesign """ if settings.use_multi_desktop: # pragma: no cover - self._desktop_class.grpc_plugin.recreate_application(True) + self._desktop_instance.grpc_plugin.recreate_application(True) if self._design_name: self._odesign = self.oproject.SetActiveDesign(self._design_name) return self._odesign @@ -1209,7 +1209,7 @@ def odesign(self, des_name) -> None: else: activedes, warning_msg = self._find_design() if activedes: - self._odesign = self.desktop_class.active_design(self.oproject, activedes, self.design_type) + self._odesign = self.desktop.active_design(self.oproject, activedes, self.design_type) self.logger.info(warning_msg) self.design_solutions._odesign = self.odesign @@ -1223,7 +1223,7 @@ def odesign(self, des_name) -> None: self.solution_type == "HFSS3DLayout" or self.solution_type == "HFSS 3D Layout Design" ): self.set_oo_property_value(self.odesign, "Design Settings", "Design Mode/IC", self._ic_mode) - self.desktop_class.active_design(self.oproject, des_name) + self.desktop.active_design(self.oproject, des_name) self._design_name = None @property @@ -1241,19 +1241,19 @@ def oproject(self): >>> oDesktop.NewProject """ if settings.use_multi_desktop: # pragma: no cover - self._desktop_class.grpc_plugin.recreate_application(True) + self._desktop_instance.grpc_plugin.recreate_application(True) return self._oproject @oproject.setter def oproject(self, proj_name=None): if not proj_name: - self._oproject = self.desktop_class.active_project() + self._oproject = self.desktop.active_project() if self._oproject: self.logger.info(f"No project is defined. Project {self._oproject.GetName()} exists and has been read.") else: - prj_list = self.desktop_class.project_list + prj_list = self.desktop.project_list if prj_list and proj_name in list(prj_list): - self._oproject = self.desktop_class.active_project(proj_name) + self._oproject = self.desktop.active_project(proj_name) self._add_handler() self.logger.info("Project %s set to active.", proj_name) elif Path(proj_name).exists() or ( @@ -1262,12 +1262,12 @@ def oproject(self, proj_name=None): if ".aedtz" in proj_name: p = Path(proj_name) save_to_file = available_file_name(p.parent / f"{p.stem}.aedt") - if str(p.stem) in self.desktop_class.project_list: + if str(p.stem) in self.desktop.project_list: save_to_file = available_file_name(p.parent / f"{generate_unique_name(str(p.stem))}.aedt") self.odesktop.RestoreProjectArchive(str(p), str(save_to_file), True, True) time.sleep(0.5) proj_name = save_to_file.stem - self._oproject = self.desktop_class.active_project(proj_name) + self._oproject = self.desktop.active_project(proj_name) self._add_handler() self.logger.info(f"Archive {proj_name} has been restored to project {self._oproject.GetName()}") elif ".def" in proj_name or proj_name[-5:] == ".aedb": @@ -1277,7 +1277,7 @@ def oproject(self, proj_name=None): project = proj_name[:-5] + ".aedt" if Path(project).exists() and self.check_if_project_is_loaded(project): pname = self.check_if_project_is_loaded(project) - self._oproject = self.desktop_class.active_project(pname) + self._oproject = self.desktop.active_project(pname) self._add_handler() self.logger.info("Project %s set to active.", pname) elif Path(project).exists(): @@ -1298,7 +1298,7 @@ def oproject(self, proj_name=None): oTool.ImportEDB(proj_name) else: oTool.ImportEDB(str(Path(proj_name) / "edb.def")) - self._oproject = self.desktop_class.active_project() + self._oproject = self.desktop.active_project() self._oproject.Save() self._add_handler() self.logger.info( @@ -1306,7 +1306,7 @@ def oproject(self, proj_name=None): ) elif self.check_if_project_is_loaded(proj_name): pname = self.check_if_project_is_loaded(proj_name) - self._oproject = self.desktop_class.active_project(pname) + self._oproject = self.desktop.active_project(pname) self._add_handler() self.logger.info("Project %s set to active.", pname) else: @@ -1319,19 +1319,19 @@ def oproject(self, proj_name=None): self._oproject = self.odesktop.OpenProject(proj_name) if not is_windows and settings.aedt_version: time.sleep(1) - self.desktop_class.close_windows() + self.desktop.close_windows() self._add_handler() self.logger.info("Project %s has been opened.", self._oproject.GetName()) time.sleep(0.5) elif settings.force_error_on_missing_project and ".aedt" in proj_name: raise Exception("Project doesn't exist. Check it and retry.") else: - project_list = self.desktop_class.project_list + project_list = self.desktop.project_list self._oproject = self.odesktop.NewProject() if not self._oproject: - new_project_list = [i for i in self.desktop_class.project_list if i not in project_list] + new_project_list = [i for i in self.desktop.project_list if i not in project_list] if new_project_list: - self._oproject = self.desktop_class.active_project(new_project_list[0]) + self._oproject = self.desktop.active_project(new_project_list[0]) if proj_name.endswith(".aedt"): self._oproject.Rename(proj_name, True) elif not proj_name.endswith(".aedtz"): @@ -1339,12 +1339,12 @@ def oproject(self, proj_name=None): self._add_handler() self.logger.info("Project %s has been created.", self._oproject.GetName()) if not self._oproject: - project_list = self.desktop_class.project_list + project_list = self.desktop.project_list self._oproject = self.odesktop.NewProject() if not self._oproject: - new_project_list = [i for i in self.desktop_class.project_list if i not in project_list] + new_project_list = [i for i in self.desktop.project_list if i not in project_list] if new_project_list: - self._oproject = self.desktop_class.active_project(new_project_list[0]) + self._oproject = self.desktop.active_project(new_project_list[0]) self._add_handler() self.logger.info("Project %s has been created.", self._oproject.GetName()) self._project_name = None @@ -2505,7 +2505,7 @@ def _get_design_datasets(self): @pyaedt_function_handler() def close_desktop(self): """Close AEDT and release it. - This is the same as calling, `design.desktop_class.close_desktop()`. + This is the same as calling, `design.desktop.close_desktop()`. Returns ------- @@ -2513,7 +2513,7 @@ def close_desktop(self): ``True`` when successful, ``False`` when failed. """ - self.desktop_class.close_desktop() + self.desktop.close_desktop() return True @pyaedt_function_handler() @@ -2569,14 +2569,14 @@ def release_desktop(self, close_projects=True, close_desktop=True): """ if close_desktop: - self.desktop_class.close_desktop() + self.desktop.close_desktop() else: - self.desktop_class.release_desktop(close_projects, False) + self.desktop.release_desktop(close_projects, False) props = [a for a in dir(self) if not a.startswith("__")] for a in props: self.__dict__.pop(a, None) - self._desktop_class = None + self._desktop_instance = None gc.collect() return True @@ -3256,7 +3256,7 @@ def close_project(self, name=None, save=True): >>> oDesktop.CloseProject """ legacy_name = self.project_name - if name and name not in self.desktop_class.project_list: + if name and name not in self.desktop.project_list: self.logger.warning("Project named '%s' was not found.", name) return False if not name: @@ -3264,7 +3264,7 @@ def close_project(self, name=None, save=True): if self.design_type == "HFSS 3D Layout Design": self._close_edb() self.logger.info(f"Closing the AEDT Project {name}") - oproj = self.desktop_class.active_project(name) + oproj = self.desktop.active_project(name) proj_path = oproj.GetPath() if not name: proj_path = oproj.GetName() @@ -3283,9 +3283,9 @@ def close_project(self, name=None, save=True): self.logger.odesign = None self.logger.oproject = None self.design_solutions._odesign = None - AedtObjects.__init__(self, self._desktop_class, is_inherithed=True) + AedtObjects.__init__(self, self._desktop_instance, is_inherithed=True) else: - self.desktop_class.active_project(legacy_name) + self.desktop.active_project(legacy_name) i = 0 timeout = 10 @@ -3342,7 +3342,7 @@ def delete_design(self, name=None, fallback_design=None): self._odesign = None self.logger.odesign = None self.design_solutions._odesign = None - AedtObjects.__init__(self, self._desktop_class, project=self.oproject, is_inherithed=True) + AedtObjects.__init__(self, self._desktop_instance, project=self.oproject, is_inherithed=True) return False else: if is_windows: @@ -3350,7 +3350,7 @@ def delete_design(self, name=None, fallback_design=None): self._odesign = None self.logger.odesign = None self.design_solutions._odesign = None - AedtObjects.__init__(self, self._desktop_class, project=self.oproject, is_inherithed=True) + AedtObjects.__init__(self, self._desktop_instance, project=self.oproject, is_inherithed=True) return True @pyaedt_function_handler() @@ -3464,9 +3464,9 @@ def _insert_design(self, design_type, design_name=None): ) if not is_windows and settings.aedt_version and self.design_type == DesignType.CIRCUIT.NAME: time.sleep(1) - self.desktop_class.close_windows() + self.desktop.close_windows() if new_design is None: # pragma: no cover - new_design = self.desktop_class.active_design(self.oproject, unique_design_name, self.design_type) + new_design = self.desktop.active_design(self.oproject, unique_design_name, self.design_type) if new_design is None: self.logger.error("Failed to create design.") return @@ -3593,9 +3593,9 @@ def copy_design_from(self, project, design, save_project=True, set_active_design proj_from.CopyDesign(design) # paste in the destination project and get the name self._oproject.Paste() - new_designname = self.desktop_class.active_design(self._oproject, design_type=self.design_type).GetName() + new_designname = self.desktop.active_design(self._oproject, design_type=self.design_type).GetName() if ( - self.desktop_class.active_design(self._oproject, design_type=self.design_type).GetDesignType() + self.desktop.active_design(self._oproject, design_type=self.design_type).GetDesignType() == "HFSS 3D Layout Design" ): new_designname = new_designname[2:] # name is returned as '2;EMDesign3' @@ -3649,7 +3649,7 @@ def duplicate_design(self, name, save_after_duplicate=True): self.odesign = actual_name[0] self.design_name = newname self._close_edb() - AedtObjects.__init__(self, self._desktop_class, self.oproject, self.odesign, is_inherithed=True) + AedtObjects.__init__(self, self._desktop_instance, self.oproject, self.odesign, is_inherithed=True) if save_after_duplicate: self.oproject.Save() self._project_dictionary = None @@ -4087,7 +4087,7 @@ def design_variation(self, variation=None): @pyaedt_function_handler() def _assert_consistent_design_type(self, des_name): if des_name in self.design_list: - self._odesign = self.desktop_class.active_design(self.oproject, des_name, self.design_type) + self._odesign = self.desktop.active_design(self.oproject, des_name, self.design_type) dtype = self._odesign.GetDesignType() if dtype not in ["RMxprt", "ModelCreation"]: if dtype != self._design_type: @@ -4098,7 +4098,7 @@ def _assert_consistent_design_type(self, des_name): return True elif ":" in des_name: try: - self._odesign = self.desktop_class.active_design(self.oproject, des_name, self.design_type) + self._odesign = self.desktop.active_design(self.oproject, des_name, self.design_type) return True except Exception: return des_name diff --git a/src/ansys/aedt/core/circuit.py b/src/ansys/aedt/core/circuit.py index e9a765036db4..4aa21a693a68 100644 --- a/src/ansys/aedt/core/circuit.py +++ b/src/ansys/aedt/core/circuit.py @@ -227,7 +227,7 @@ def create_schematic_from_netlist(self, input_file): delta = 0.0508 use_instance = True model = [] - self.desktop_class.close_windows() + self.desktop.close_windows() autosave = False if self._desktop.GetAutoSaveEnabled() == 1: self._desktop.EnableAutoSave(False) @@ -680,7 +680,7 @@ def get_source_pin_names( oDesign = oSrcProject.SetActiveDesign(source_design_name) if is_linux and settings.aedt_version == "2024.1": # pragma: no cover time.sleep(1) - self.desktop_class.close_windows() + self.desktop.close_windows() tmp_oModule = oDesign.GetModule("BoundarySetup") port = None if port_selector == 1: @@ -1624,9 +1624,9 @@ def import_edb_in_circuit(self, input_dir): self.logger.error( "Failed to setup co-simulation settings, make sure the simulation setup is properly defined" ) - active_project = hfss.desktop_class.active_project(hfss.project_name) + active_project = hfss.desktop.active_project(hfss.project_name) active_project.CopyDesign(hfss.design_name) - active_project = hfss.desktop_class.active_project(self.project_name) + active_project = hfss.desktop.active_project(self.project_name) active_project.Paste() hfss_3d_layout_model = self.modeler.schematic.add_subcircuit_3dlayout(hfss.design_name) hfss.close_project(save=False) diff --git a/src/ansys/aedt/core/desktop.py b/src/ansys/aedt/core/desktop.py index 429457d7c449..4644e1057ce1 100644 --- a/src/ansys/aedt/core/desktop.py +++ b/src/ansys/aedt/core/desktop.py @@ -1420,7 +1420,7 @@ def __release_aedt_application(self, pid, is_grpc_api): Parameters ---------- - desktop_class : :class:ansys.aedt.core.desktop.Desktop + desktop : :class:ansys.aedt.core.desktop.Desktop Desktop class. pid : int Process ID of the desktop app that is being closed. @@ -1457,7 +1457,7 @@ def __close_aedt_application(self, pid, is_grpc_api): Parameters ---------- - desktop_class : :class:ansys.aedt.core.desktop.Desktop + desktop : :class:ansys.aedt.core.desktop.Desktop Desktop class. pid : int Process ID of the desktop app that is being closed. @@ -1537,7 +1537,7 @@ def __release_and_close_desktop(self, close_projects, close_aedt_app): return True if self.is_grpc_api: self.grpc_plugin.recreate_application(True) - self.logger._desktop_class = None + self.logger._desktop_instance = None self.logger._oproject = None self.logger._odesign = None if os.getenv("PYAEDT_DOC_GENERATION", "False").lower() in ("true", "1", "t"): # pragma: no cover @@ -2646,7 +2646,7 @@ def __set_logger_file(self): else: project_dir = tempfile.gettempdir() self.__logfile = Path(project_dir) / f"pyaedt{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.log" - self.logger._desktop_class = self + self.logger._desktop_instance = self if self.aedt_version_id >= "2024.2": messages = self.odesktop.GetMessages("", "", 0) check_message = f" {self.port}." diff --git a/src/ansys/aedt/core/emit_core/results/results.py b/src/ansys/aedt/core/emit_core/results/results.py index 543d445a9c83..b1a8fec49230 100644 --- a/src/ansys/aedt/core/emit_core/results/results.py +++ b/src/ansys/aedt/core/emit_core/results/results.py @@ -57,7 +57,7 @@ def __init__(self, emit_obj): self.revisions = [] """List of all result revisions. Only one loaded at a time""" - self.design = emit_obj.desktop_class.active_design(emit_obj.odesktop.GetActiveProject()) + self.design = emit_obj.desktop.active_design(emit_obj.odesktop.GetActiveProject()) """Active design for the EMIT project.""" self.aedt_version = int(self.emit_project.aedt_version_id[-3:]) @@ -271,9 +271,7 @@ def analyze(self): # no changes since last created revision, load it elif ( self.revisions[-1].revision_number - == self.emit_project.desktop_class.active_design( - self.emit_project.desktop_class.active_project() - ).GetRevision() + == self.emit_project.desktop.active_design(self.emit_project.desktop.active_project()).GetRevision() ): self.get_revision(self.revisions[-1].name) else: diff --git a/src/ansys/aedt/core/extensions/hfss/mcad_assembly.py b/src/ansys/aedt/core/extensions/hfss/mcad_assembly.py index a44eaa2ea6b5..f809fb694983 100644 --- a/src/ansys/aedt/core/extensions/hfss/mcad_assembly.py +++ b/src/ansys/aedt/core/extensions/hfss/mcad_assembly.py @@ -194,7 +194,7 @@ def run(self, config_data): del app if "PYTEST_CURRENT_TEST" not in os.environ: # pragma: no cover - hfss.desktop_class.release_desktop(False, False) + hfss.desktop.release_desktop(False, False) else: hfss.close_project(save=False) return diff --git a/src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py b/src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py index 7387cf7874ae..176702d1da70 100644 --- a/src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py @@ -398,7 +398,7 @@ def main(data: ParametrizeEdbExtensionData): if "PYTEST_CURRENT_TEST" not in os.environ: h3d = Hfss3dLayout(str(new_project_aedb)) h3d.logger.info("Parametric project generated successfully.") - h3d.desktop_class.release_desktop(False, False) + h3d.desktop.release_desktop(False, False) return True diff --git a/src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design.py b/src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design.py index a4114f7e3f0f..ff6cc645753e 100644 --- a/src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design.py @@ -388,7 +388,7 @@ def main(data: PostLayoutDesignExtensionData): # Open new project with micro vias new_h3d = ansys.aedt.core.Hfss3dLayout(project=new_edb_path) if "PYTEST_CURRENT_TEST" not in os.environ: - new_h3d.desktop_class.release_desktop(False, False) + new_h3d.desktop.release_desktop(False, False) else: raise AEDTRuntimeError(f"Unknown action: {data.action}") diff --git a/src/ansys/aedt/core/extensions/hfss3dlayout/resources/configure_layout/master_ui.py b/src/ansys/aedt/core/extensions/hfss3dlayout/resources/configure_layout/master_ui.py index 71e12d309c93..76049af082ce 100644 --- a/src/ansys/aedt/core/extensions/hfss3dlayout/resources/configure_layout/master_ui.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/resources/configure_layout/master_ui.py @@ -197,7 +197,7 @@ def export_config_from_edb(self): def load_edb_into_hfss3dlayout(self, edb_path: Union[str, Path]): app = ansys.aedt.core.Hfss3dLayout(project=str(edb_path), **self.aedt_info.model_dump()) if "PYTEST_CURRENT_TEST" not in os.environ: # pragma: no cover - app.desktop_class.release_desktop(False, False) + app.desktop.release_desktop(False, False) else: app.close_project(save=False) return app diff --git a/src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering.py b/src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering.py index ab7c1b4a86f3..d92d4321975b 100644 --- a/src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering.py @@ -214,7 +214,7 @@ def add_drawing_layer(): ) layer = hfss.modeler.stackup.add_layer("via_merging") layer.usp = True - hfss.desktop_class.release_desktop(False, False) + hfss.desktop.release_desktop(False, False) def callback_merge_vias(extension: ViaClusteringExtension): """Callback for merging via instances.""" @@ -229,7 +229,7 @@ def callback_merge_vias(extension: ViaClusteringExtension): primitives = hfss.modeler.objects_by_layer(layer="via_merging") if not primitives: messagebox.showwarning(message="No primitives found on layer defined for merging padstack instances.") - hfss.desktop_class.release_desktop(False, False) + hfss.desktop.release_desktop(False, False) extension.release_desktop() raise AEDTRuntimeError("No primitives found on layer defined for merging padstack instances.") @@ -261,7 +261,7 @@ def callback_merge_vias(extension: ViaClusteringExtension): contour_list=contour_list, ) extension.data = via_clustering_data - hfss.desktop_class.release_desktop(False, False) + hfss.desktop.release_desktop(False, False) extension.root.destroy() button_add_layer = ttk.Button( @@ -327,7 +327,7 @@ def main(data: ViaClusteringExtensionData): if "PYTEST_CURRENT_TEST" not in os.environ: # pragma: no cover h3d = Hfss3dLayout(new_aedb_path) h3d.logger.info("Project generated correctly.") - h3d.desktop_class.release_desktop(False, False) + h3d.desktop.release_desktop(False, False) return True diff --git a/src/ansys/aedt/core/extensions/hfss3dlayout/via_design.py b/src/ansys/aedt/core/extensions/hfss3dlayout/via_design.py index 7d50e2717f17..65a1f7d6c1f5 100644 --- a/src/ansys/aedt/core/extensions/hfss3dlayout/via_design.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/via_design.py @@ -199,7 +199,7 @@ def create_design(self, create_design_path: Optional[Path] = None): ) if "PYTEST_CURRENT_TEST" not in os.environ: - hfss_3d.desktop_class.release_desktop(False, False) + hfss_3d.desktop.release_desktop(False, False) return True @property diff --git a/src/ansys/aedt/core/generic/configurations.py b/src/ansys/aedt/core/generic/configurations.py index 856011c9655e..fac219a0b605 100644 --- a/src/ansys/aedt/core/generic/configurations.py +++ b/src/ansys/aedt/core/generic/configurations.py @@ -2123,7 +2123,7 @@ def apply_operations_to_native_components(obj, operation_dict, native_dict): # native = NativeComponentPCB(self._app, native_dict["Type"], native_name, nc_dict) else: native = NativeComponentObject(self._app, native_dict["Type"], native_name, nc_dict) - prj_list = set(self._app.desktop_class.project_list) + prj_list = set(self._app.desktop.project_list) definition_names = set(self._app.oeditor.Get3DComponentDefinitionNames()) instance_names = { def_name: set(self._app.oeditor.Get3DComponentInstanceNames(def_name)) @@ -2152,7 +2152,7 @@ def apply_operations_to_native_components(obj, operation_dict, native_dict): # if nc_dict["NativeComponentDefinitionProvider"]["Type"] == "PCB" and nc_dict[ "NativeComponentDefinitionProvider" ]["DefnLink"]["Project"] not in [self._app.project_file or "This Project*"]: - prj = list(set(self._app.desktop_class.project_list) - prj_list)[0] + prj = list(set(self._app.desktop.project_list) - prj_list)[0] design = nc_dict["NativeComponentDefinitionProvider"]["DefnLink"]["Design"] from ansys.aedt.core.generic.design_types import get_pyaedt_app diff --git a/src/ansys/aedt/core/hfss.py b/src/ansys/aedt/core/hfss.py index 8c020755c53a..249d7e23d8ec 100644 --- a/src/ansys/aedt/core/hfss.py +++ b/src/ansys/aedt/core/hfss.py @@ -2675,7 +2675,7 @@ def create_sbr_custom_array_file( >>> from ansys.aedt.core import Hfss >>> hfss = Hfss() >>> hfss.create_sbr_custom_array_file() - >>> hfss.desktop_class.close_desktop() + >>> hfss.desktop.close_desktop() """ if output_file is None: output_file = Path(self.working_directory) / "custom_array.sarr" @@ -6050,7 +6050,7 @@ def set_phase_center_per_port(self, coordinate_system=None): >>> hfss.set_phase_center_per_port(["Global", "Global"]) """ - if not self.desktop_class.is_grpc_api: # pragma: no cover + if not self.desktop.is_grpc_api: # pragma: no cover raise AEDTRuntimeError("Set phase center is not supported by AEDT COM API. Set phase center manually.") port_names = self.ports[::] @@ -6310,7 +6310,7 @@ def lumped_port( self.solution_type == SolutionsHfss.DrivenModal or ( self.solution_type in [SolutionsHfss.DrivenTerminal, SolutionsHfss.Transient] - and self.desktop_class.aedt_version_id >= "2024.1" + and self.desktop.aedt_version_id >= "2024.1" ) and not reference ): @@ -6516,7 +6516,7 @@ def wave_port( self.solution_type == SolutionsHfss.DrivenModal or ( self.solution_type in [SolutionsHfss.DrivenTerminal, SolutionsHfss.Transient] - and self.desktop_class.aedt_version_id >= "2024.1" + and self.desktop.aedt_version_id >= "2024.1" ) and not reference ): diff --git a/src/ansys/aedt/core/hfss3dlayout.py b/src/ansys/aedt/core/hfss3dlayout.py index ecb7b53f0ba4..26e9e9bdf2d2 100644 --- a/src/ansys/aedt/core/hfss3dlayout.py +++ b/src/ansys/aedt/core/hfss3dlayout.py @@ -759,8 +759,8 @@ def import_edb(self, input_folder): input_folder = Path(input_folder) / "edb.def" self.oimport_export.ImportEDB(str(input_folder)) self._close_edb() - project_name = self.desktop_class.active_project().GetName() - design_name = self.desktop_class.active_design(self.desktop_class.active_project()).GetName().split(";")[-1] + project_name = self.desktop.active_project().GetName() + design_name = self.desktop.active_design(self.desktop.active_project()).GetName().split(";")[-1] self.__init__(project=project_name, design=design_name) return True @@ -1991,7 +1991,7 @@ def enable_rigid_flex(self): """ if settings.aedt_version >= "2022.2": self.modeler.oeditor.ProcessBentModelCmd() - if self.desktop_class.non_graphical: + if self.desktop.non_graphical: return True return True if self.variable_manager["BendModel"].expression == "1" else False diff --git a/src/ansys/aedt/core/icepak.py b/src/ansys/aedt/core/icepak.py index d7b8acab2192..2dfa14b76759 100644 --- a/src/ansys/aedt/core/icepak.py +++ b/src/ansys/aedt/core/icepak.py @@ -1940,16 +1940,16 @@ def copyGroupFrom(self, group_name, source_design, source_project_name=None, sou >>> oEditor.Copy >>> oeditor.Paste """ - pj_names = self.desktop_class.project_list + pj_names = self.desktop.project_list if source_project_name == self.project_name or source_project_name is None: - active_project = self.desktop_class.active_project() + active_project = self.desktop.active_project() else: self.oproject = source_project_path # self._desktop.OpenProject(source_project_path) - active_project = self.desktop_class.active_project(source_project_name) + active_project = self.desktop.active_project(source_project_name) - active_design = self.desktop_class.active_design(active_project, source_design) + active_design = self.desktop.active_design(active_project, source_design) active_editor = active_design.SetActiveEditor("3D Modeler") active_editor.Copy(["NAME:Selections", "Selections:=", group_name]) @@ -2433,7 +2433,7 @@ def import_idf( ---------- >>> oDesign.ImportIDF """ - active_design_name = self.desktop_class.active_design(self.oproject).GetName() + active_design_name = self.desktop.active_design(self.oproject).GetName() if not library_path: if board_path.endswith(".emn"): library_path = board_path[:-3] + "emp" @@ -2525,7 +2525,7 @@ def import_idf( ) self.modeler.add_new_objects() if active_design_name: - self.desktop_class.active_design(self.oproject, active_design_name) + self.desktop.active_design(self.oproject, active_design_name) return True @pyaedt_function_handler() diff --git a/src/ansys/aedt/core/internal/checks.py b/src/ansys/aedt/core/internal/checks.py index 3a85c43806c6..c8571e82996d 100644 --- a/src/ansys/aedt/core/internal/checks.py +++ b/src/ansys/aedt/core/internal/checks.py @@ -77,12 +77,12 @@ def fetch_odesktop_from_private_app_attribute(item): if app is not None: return app.odesktop - def fetch_odesktop_from_desktop_class(item): - attributes_to_check = ["desktop_class", "_desktop_class"] + def fetch_odesktop_from_desktop(item): + attributes_to_check = ["desktop", "_desktop_instance"] for attribute in attributes_to_check: - desktop_class = getattr(item, attribute, None) - if desktop_class is not None: - return desktop_class.odesktop + desktop_obj = getattr(item, attribute, None) + if desktop_obj is not None: + return desktop_obj.odesktop def aedt_version_decorator(method): """Decorator to check AEDT version compatibility for a method.""" @@ -92,7 +92,7 @@ def wrapper(self, *args, **kwargs): odesktop = ( fetch_odesktop_from_common_attributes_names(self) or fetch_odesktop_from_private_app_attribute(self) - or fetch_odesktop_from_desktop_class(self) + or fetch_odesktop_from_desktop(self) ) if odesktop is None: raise AEDTRuntimeError("The AEDT desktop object is not available.") diff --git a/src/ansys/aedt/core/maxwell.py b/src/ansys/aedt/core/maxwell.py index 58dddf2ecfbb..f3836480c453 100644 --- a/src/ansys/aedt/core/maxwell.py +++ b/src/ansys/aedt/core/maxwell.py @@ -106,7 +106,7 @@ def change_symmetry_multiplier(self, value=1): >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d(solution_type="Transient") >>> m3d.change_symmetry_multiplier(value=3) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ return self.change_design_settings({"Multiplier": value}) @@ -140,7 +140,7 @@ def change_inductance_computation(self, compute_transient_inductance=True, incre >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d("Transient") >>> m3d.change_inductance_computation(compute_transient_inductance=True, incremental_matrix=True) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ return self.change_design_settings( {"ComputeTransientInductance": compute_transient_inductance, "ComputeIncrementalMatrix": incremental_matrix} @@ -199,7 +199,7 @@ def apply_skew( >>> m2d.modeler.create_circle([0, 0, 0], 21, name="Circle_outer") >>> band = m2d.assign_rotate_motion("Circle_outer", positive_limit=300, mechanical_transient=True) >>> m2d.apply_skew(skew_part="Rotor", skew_angle="3", number_of_slices="5") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if skew_type not in ("Continuous", "Step", "V-Shape", "User Defined"): raise ValueError("Invalid skew type.") @@ -271,7 +271,7 @@ def set_core_losses(self, assignment, core_loss_on_field=False): >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d() >>> m3d.set_core_losses(assignment=["PQ_Core_Bottom", "PQ_Core_Top"], core_loss_on_field=True) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -354,7 +354,7 @@ def assign_matrix( >>> m2d.assign_voltage(["Port1"], amplitude=1, name="1V") >>> m2d.assign_voltage(["Port2"], amplitude=0, name="0V") >>> m2d.assign_matrix(assignment=["1V"], matrix_name="Matrix1", group_sources=["0V"]) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ assignment = self.modeler.convert_to_selections(assignment, True) @@ -518,7 +518,7 @@ def eddy_effects_on(self, assignment, enable_eddy_effects=True, enable_displacem >>> m3d = Maxwell3d(solution_type="Transient") >>> box = m3d.modeler.create_box(origin=[0, 0, 0], sizes=[10, 10, 10], name="cube", material="Copper") >>> m3d.eddy_effects_on(assignment=box.name, enable_eddy_effects=True, enable_displacement_current=False) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ solid_objects_names = self.get_all_conductors_names() if not solid_objects_names: @@ -631,7 +631,7 @@ def setup_y_connection(self, assignment=None): >>> m2d = Maxwell2d("Motor_EM_R2019R3.aedt") >>> m2d.set_active_design("Basis_Model_For_Test") >>> m2d.setup_y_connection(["PhaseA", "PhaseB", "PhaseC"]) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if self.solution_type != SolutionsMaxwell3D.Transient: raise AEDTRuntimeError("Y connections only available for Transient solutions.") @@ -683,7 +683,7 @@ def assign_current(self, assignment, amplitude=1, phase="0deg", solid=True, swap >>> m3d = Maxwell3d(solution_type="ElectroDCConduction") >>> cylinder = m3d.modeler.create_cylinder("X", [0, 0, 0], 10, 100, 250) >>> current = m3d.assign_current(cylinder.top_face_x.id, amplitude="2mA") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if isinstance(amplitude, (int, float)): amplitude = str(amplitude) + "A" @@ -812,7 +812,7 @@ def assign_translate_motion( >>> m3d.modeler.create_box([0, 0, 0], [10, 10, 10], name="Inner_Box") >>> m3d.modeler.create_box([0, 0, 0], [30, 20, 20], name="Outer_Box") >>> m3d.assign_translate_motion("Outer_Box", velocity=1, mechanical_transient=True) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if self.solution_type != SolutionsMaxwell3D.Transient: raise AEDTRuntimeError("Motion applies only to the Transient setup.") @@ -918,7 +918,7 @@ def assign_rotate_motion( >>> m2d.modeler.create_circle(origin=[0, 0, 0], radius=10, name="Circle_inner") >>> m2d.modeler.create_circle(origin=[0, 0, 0], radius=30, name="Circle_outer") >>> bound = m2d.assign_rotate_motion(assignment="Circle_outer", positive_limit=180) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if self.solution_type != SolutionsMaxwell3D.Transient: raise AEDTRuntimeError("Motion applies only to the Transient setup.") @@ -979,7 +979,7 @@ def assign_voltage(self, assignment, amplitude=1, name=None): >>> m2d = Maxwell2d(version="2025.2", solution_type="ElectrostaticZ") >>> region_id = m2d.modeler.create_region(pad_value=[500, 50, 50]) >>> voltage = m2d.assign_voltage(assignment=region_id.edges, amplitude=0, name="GRD") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() Create a region in Maxwell 3D and assign voltage to its edges. @@ -987,7 +987,7 @@ def assign_voltage(self, assignment, amplitude=1, name=None): >>> m3d = Maxwell3d(version="2025.2", solution_type="Electrostatic") >>> region_id = m3d.modeler.create_box([0, 0, 0], [10, 10, 10]) >>> voltage = m3d.assign_voltage(assignment=region_id.faces, amplitude=0, name="GRD") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if isinstance(amplitude, (int, float)): amplitude = f"{amplitude}mV" @@ -1049,7 +1049,7 @@ def assign_voltage_drop(self, assignment, amplitude=1, swap_direction=False, nam >>> m3d = Maxwell3d(solution_type="Magnetostatic") >>> cylinder = m3d.modeler.create_cylinder(origin=[0, 0, 0], radius=5, height=15, orientation="Z") >>> m3d.assign_voltage_drop(assignment=cylinder.top_face_z, amplitude="1V", name="Volt", swap_direction=False) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if isinstance(amplitude, (int, float)): amplitude = str(amplitude) + "mV" @@ -1097,7 +1097,7 @@ def assign_floating(self, assignment, charge_value=0, name=None): >>> m2d.solution_type = SolutionsMaxwell2D.ElectroStaticXY >>> rect = m2d.modeler.create_rectangle([0, 0, 0], [3, 1], name="Rectangle1") >>> floating = m2d.assign_floating(assignment=rect, charge_value=3, name="floating_test") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() Assign a floating excitation for a Maxwell 3D Electrostatic design providing an object. @@ -1110,7 +1110,7 @@ def assign_floating(self, assignment, charge_value=0, name=None): Assign a floating excitation providing a list of faces. >>> floating1 = m3d.assign_floating(assignment=[box.faces[0], box.faces[1]], charge_value=3) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if self.solution_type not in (SolutionsMaxwell3D.ElectroStatic, SolutionsMaxwell3D.ElectricTransient): raise AEDTRuntimeError( @@ -1198,7 +1198,7 @@ def assign_winding( >>> m2d = Maxwell2d(solution_type="TransientZ") >>> terminal = m2d.modeler.create_rectangle(origin=[0, 0, 0], sizes=[10, 5]) >>> winding = m2d.assign_winding(assignment=terminal.name, current=3, name="winding") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if not name: name = generate_unique_name("Winding") @@ -1263,7 +1263,7 @@ def add_winding_coils(self, assignment, coils): >>> coil = m2d.assign_coil(assignment=terminal.name, conductors_number=5) >>> winding = m2d.assign_winding(current=3, is_solid=False) >>> m2d.add_winding_coils(assignment=winding.name, coils=coil.name) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if self.modeler._is3d: self.oboundary.AddWindingTerminals(assignment, coils) @@ -1305,7 +1305,7 @@ def assign_coil(self, assignment, conductors_number=1, polarity="Positive", name >>> m2d = Maxwell2d(solution_type="TransientZ") >>> terminal = m2d.modeler.create_rectangle(origin=[0, 0, 0], sizes=[10, 5]) >>> coil = m2d.assign_coil(assignment=[terminal], conductors_number=5, name="Coil") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if polarity.lower() == "positive": point = False @@ -1393,7 +1393,7 @@ def assign_force(self, assignment, coordinate_system="Global", is_virtual=True, >>> m3d.assign_material(conductor1, "copper") >>> m3d.assign_material(conductor2, "copper") >>> m3d.assign_force("conductor1", is_virtual=False, force_name="force_copper") # conductor, use Lorentz force - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if self.solution_type in (SolutionsMaxwell3D.ACConduction, SolutionsMaxwell3D.DCConduction): raise AEDTRuntimeError("Solution type has no 'Matrix' parameter.") @@ -1465,7 +1465,7 @@ def assign_torque( >>> m3d = Maxwell3d(solution_type="Transient") >>> cylinder = m3d.modeler.create_cylinder(origin=[0, 0, 0], orientation="Z", radius=3, height=21) >>> m3d.assign_torque(assignment=cylinder.name, axis="Z", is_virtual=True, torque_name="torque") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if self.solution_type in (SolutionsMaxwell3D.ACConduction, SolutionsMaxwell3D.DCConduction): raise AEDTRuntimeError("Solution Type has not Matrix Parameter") @@ -1529,7 +1529,7 @@ def solve_inside(self, name, activate=True): >>> m3d = Maxwell3d(version=2025.2, solution_type="Transient", new_desktop=False) >>> cylinder = m3d.modeler.create_cylinder(origin=[0, 0, 0], orientation="Z", radius=3, height=21) >>> m3d.solve_inside(name=cylinder.name, activate=False) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ self.modeler[name].solve_inside = activate return True @@ -1563,7 +1563,7 @@ def analyze_from_zero(self): >>> setup.props["StopTime"] = "2/50s" >>> setup.props["TimeStep"] = "1/500s" >>> m2d.analyze_from_zero() - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if self.solution_type != SolutionsMaxwell3D.Transient: raise AEDTRuntimeError("This methods work only with Maxwell Transient Analysis.") @@ -1610,7 +1610,7 @@ def set_initial_angle(self, motion_setup, angle): >>> m2d.modeler.create_circle(origin=[0, 0, 0], radius=21, name="Outer") >>> bound = m2d.assign_rotate_motion(assignment="Outer", negative_limit=0, positive_limit=300) >>> m2d.set_initial_angle(motion_setup=bound.name, angle=5) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ self.odesign.ChangeProperty( [ @@ -1660,7 +1660,7 @@ def assign_symmetry(self, assignment, symmetry_name=None, is_odd=True): >>> m2d = Maxwell2d() >>> rect = m2d.modeler.create_rectangle(origin=[0, 0, 0], sizes=[10, 30]) >>> m2d.assign_symmetry(assignment=rect.top_edge_x, symmetry_name="symmetry1") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if symmetry_name is None: symmetry_name = generate_unique_name("Symmetry") @@ -1742,7 +1742,7 @@ def assign_current_density( >>> m2d = Maxwell2d(solution_type="Magnetostatic") >>> coil = m2d.modeler.create_rectangle(origin=[0, 0, 0], sizes=[10, 5]) >>> m2d.assign_current_density(assignment=[coil], current_density_2d="5", current_density_name="J") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D @@ -1857,7 +1857,7 @@ def assign_radiation(self, assignment, radiation=None): >>> box1 = m3d.modeler.create_box([0, 0, 0], [2, 10, 10]) >>> box2 = m3d.modeler.create_box([10, 0, 0], [2, 10, 10]) >>> m3d.assign_radiation([box1, box2.faces[0]]) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in [maxwell_solutions.EddyCurrent, maxwell_solutions.ACMagnetic]: @@ -1923,7 +1923,7 @@ def enable_harmonic_force( >>> m3d = Maxwell3d(solution_type="Transient") >>> cylinder = m3d.modeler.create_cylinder(origin=[0, 0, 0], orientation="Z", radius=3, height=21) >>> m3d.enable_harmonic_force(assignment=cylinder.name) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if self.solution_type != SolutionsMaxwell3D.Transient: raise AEDTRuntimeError("This methods work only with Maxwell Transient Analysis.") @@ -2132,7 +2132,7 @@ def export_element_based_harmonic_force( >>> m3d.analyze(setup=setup.name, use_auto_settings=False) >>> # Export element based harmonic force in a .csv file. >>> m3d.export_element_based_harmonic_force() - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if self.solution_type not in ( SolutionsMaxwell3D.Transient, @@ -2181,7 +2181,7 @@ def create_external_circuit(self, circuit_design=None): >>> coil = m2d.modeler.create_circle([0, 0, 0], 10, name="Coil1") >>> m2d.assign_winding(assignment=[coil.name], winding_type="External", name="Winding1") >>> cir = m2d.create_external_circuit(circuit_design="maxwell_circuit") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -2273,19 +2273,19 @@ def edit_external_circuit(self, netlist_file_path, schematic_design_name=None, p >>> netlist_path = "C:\\Users\\netlist.sph" >>> circuit.export_netlist_from_schematic(output_file=netlist_path) >>> m2d.edit_external_circuit(netlist_file_path=netlist_path, schematic_design_name="circuit_maxwell") - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ sources_array, sources_type_array = [], [] if schematic_design_name: if schematic_design_name not in self.design_list: raise AEDTRuntimeError(f"Schematic design '{schematic_design_name}' is not in design list.") - odesign = self.desktop_class.active_design(self.oproject, schematic_design_name) + odesign = self.desktop.active_design(self.oproject, schematic_design_name) oeditor = odesign.SetActiveEditor("SchematicEditor") if is_linux and settings.aedt_version == "2024.1": # pragma: no cover time.sleep(1) - self.desktop_class.close_windows() + self.desktop.close_windows() for comp in oeditor.GetAllComponents(): if "Voltage Source" in oeditor.GetPropertyValue("ComponentTab", comp, "Description"): @@ -2357,7 +2357,7 @@ def create_setup(self, name="MySetupAuto", setup_type=None, **kwargs): >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d() >>> m3d.create_setup(name="My_Setup", setup_type="AC Magnetic", MaximumPasses=10, PercentError=2) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if setup_type is None: setup_type = self.design_solutions.default_setup @@ -2449,7 +2449,7 @@ def export_matrix( >>> setup.analyze() >>> # Export C Matrix after solving >>> m3d.export_matrix(matrix_name=matrix.name, output_file=Path(m3d.working_directory) / "C_matrix.txt") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ matrix_names_list = [matrix.name for matrix in self.boundaries if isinstance(matrix, MaxwellParameters)] if not matrix_names_list: @@ -2668,7 +2668,7 @@ def assign_insulating(self, assignment, insulation=None): >>> m3d = Maxwell3d() >>> insulated_box = m3d.modeler.create_box([50, 0, 50], [294, 294, 19], name="InsulatedBox") >>> insulating_assignment = m3d.assign_insulating(assignment=insulated_box, insulation="InsulatingExample") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -2748,7 +2748,7 @@ def assign_impedance( >>> shield = m3d.modeler.create_box([-50, -50, -50], [294, 294, 19], name="shield") >>> shield_faces = m3d.modeler.select_allfaces_fromobjects(["shield"]) >>> impedance_assignment = m3d.assign_impedance(assignment=shield_faces, impedance="ShieldImpedance") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -2812,7 +2812,7 @@ def assign_current_density_terminal(self, assignment, current_density_name=None) >>> m3d = Maxwell3d(solution_type="EddyCurrent") >>> box = m3d.modeler.create_box(origin=[0, 0, 0], sizes=[25, 25, 2]) >>> m3d.assign_current_density_terminal(assignment=box.faces[0], current_density_name="J_terminal") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -2874,7 +2874,7 @@ def get_conduction_paths(self): >>> m3d.modeler.create_box(origin=[0, 0, 0], sizes=[-10, 10, 1], name="box2", material="copper") >>> m3d.modeler.create_box(origin=[-50, -50, -50], sizes=[1, 1, 1], name="box3", material="copper") >>> cond_path = m3d.get_conduction_paths() - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ conduction_paths = {} @@ -2949,7 +2949,7 @@ def assign_master_slave( >>> u_vector_origin_coordinates_slave=["10mm", "0mm", "0mm"], >>> u_vector_pos_coordinates_slave=["10mm", "10mm", "0mm"] >>> ) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ try: independent = self.modeler.convert_to_selections(independent, True) @@ -3039,7 +3039,7 @@ def assign_flux_tangential(self, assignment, flux_name=None): >>> m3d = Maxwell3d() >>> box = m3d.modeler.create_box([50, 0, 50], [294, 294, 19], name="Box") >>> flux_tangential = m3d.assign_flux_tangential(box.faces[0], "FluxExample") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D @@ -3110,7 +3110,7 @@ def assign_layout_force( >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d() >>> m3d.assign_layout_force(net_layers=nets_layers, component_name="LC1_1") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if component_name not in self.modeler.user_defined_component_names: raise AEDTRuntimeError("Provided component name doesn't exist in current design.") @@ -3207,7 +3207,7 @@ def assign_tangential_h_field( >>> y_component_imag=0, >>> bound_name="H_tangential" >>> ) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -3277,7 +3277,7 @@ def assign_zero_tangential_h_field(self, assignment, boundary=None): >>> m3d = Maxwell3d(solution_type="EddyCurrent") >>> box = m3d.modeler.create_box(origin=[0, 0, 0], sizes=[10, 10, 10]) >>> m3d.assign_zero_tangential_h_field(box.top_face_z) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in [maxwell_solutions.EddyCurrent, maxwell_solutions.ACMagnetic]: @@ -3383,7 +3383,7 @@ def assign_resistive_sheet( >>> bound = m3d.assign_resistive_sheet(assignment=resistive_face, resistance="3ohm") >>> m3d.solution_type = SolutionsMaxwell3D.Magnetostatic >>> bound = m3d.assign_resistive_sheet(assignment=resistive_face, non_linear=True) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( @@ -3529,7 +3529,7 @@ def assign_sink(self, assignment, name=None): >>> m3d = Maxwell3d(solution_type="ElectroDCConduction") >>> cylinder = m3d.modeler.create_cylinder("X", [0, 0, 0], 10, 100, 250) >>> current = m3d.assign_sink(cylinder.top_face_x.id) - >>> m3d.desktop_class.release_desktop() + >>> m3d.desktop.release_desktop() """ if not name: name = generate_unique_name("Sink") @@ -3744,7 +3744,7 @@ def generate_design_data(self, line_filter=None, object_filter=None): >>> m2d["height"] = "15mm" >>> m2d.modeler.create_rectangle(origin=[0, 0, 0], sizes=["width", "height"]) >>> m2d.generate_design_data() - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ def convert(obj): @@ -3814,7 +3814,7 @@ def assign_balloon(self, assignment, boundary=None, is_voltage=False): >>> region_id = m2d.modeler.create_region() >>> region_edges = region_id.edges >>> m2d.assign_balloon(edge_list=region_edges) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ assignment = self.modeler.convert_to_selections(assignment, True) @@ -3861,7 +3861,7 @@ def assign_vector_potential(self, assignment, vector_value=0, boundary=None): >>> region_id = m2d.modeler.create_region() >>> region_edges = region_id.edges >>> m2d.assign_vector_potential(input_edge=region_edges) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ assignment = self.modeler.convert_to_selections(assignment, True) @@ -3918,7 +3918,7 @@ def assign_master_slave( >>> independent=m2d.modeler["Rectangle1"].edges[0].id, >>> dependent=m2d.modeler["Rectangle1"].edges[2].id >>> ) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ try: independent = self.modeler.convert_to_selections(independent, True) @@ -3985,7 +3985,7 @@ def assign_end_connection(self, assignment, resistance=0, inductance=0, boundary >>> rect1 = m2d.modeler.create_rectangle([0, 0, 0], [5, 5], material="aluminum") >>> rect2 = m2d.modeler.create_rectangle([15, 20, 0], [5, 5], material="aluminum") >>> bound = m2d.assign_end_connection(assignment=[rect1, rect2]) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ maxwell_solutions = SolutionsMaxwell3D if self.solution_type not in ( diff --git a/src/ansys/aedt/core/maxwellcircuit.py b/src/ansys/aedt/core/maxwellcircuit.py index f2434b0aacb6..552d0dbe9d99 100644 --- a/src/ansys/aedt/core/maxwellcircuit.py +++ b/src/ansys/aedt/core/maxwellcircuit.py @@ -248,7 +248,7 @@ def export_netlist_from_schematic(self, output_file): >>> gnd.pins[0].connect_to_component(v.pins[0], use_wire=True) Export circuit netlist. >>> circ.export_netlist_from_schematic(output_file="C:\\Users\\netlist.sph") - >>> circ.desktop_class.close_desktop() + >>> circ.desktop.close_desktop() """ if Path(output_file).suffix != ".sph": self.logger.error("Invalid file extension. It must be ``.sph``.") diff --git a/src/ansys/aedt/core/mechanical.py b/src/ansys/aedt/core/mechanical.py index 6be4ed723a38..7d9ad5958a0f 100644 --- a/src/ansys/aedt/core/mechanical.py +++ b/src/ansys/aedt/core/mechanical.py @@ -667,7 +667,7 @@ def assign_2way_coupling(self, setup=None, number_of_iterations=2): >>> mech = Mechanical() >>> setup = mech.create_setup() >>> mech.assign_2way_coupling(setup.name, 1) - >>> mech.desktop_class.close_desktop() + >>> mech.desktop.close_desktop() """ if not setup: diff --git a/src/ansys/aedt/core/modeler/cad/components_3d.py b/src/ansys/aedt/core/modeler/cad/components_3d.py index bee24e67fbb6..ddedef1a2f35 100644 --- a/src/ansys/aedt/core/modeler/cad/components_3d.py +++ b/src/ansys/aedt/core/modeler/cad/components_3d.py @@ -873,7 +873,7 @@ def edit_definition(self, password=None): if password is None: password = os.getenv("PYAEDT_ENCRYPTED_PASSWORD", "") - project_list = [i for i in self._primitives._app.desktop_class.project_list] + project_list = [i for i in self._primitives._app.desktop.project_list] self._primitives.oeditor.Edit3DComponentDefinition( [ @@ -882,12 +882,12 @@ def edit_definition(self, password=None): ] ) - new_project = [i for i in self._primitives._app.desktop_class.project_list if i not in project_list] + new_project = [i for i in self._primitives._app.desktop.project_list if i not in project_list] if new_project: from ansys.aedt.core.generic.design_types import get_pyaedt_app - project = self._primitives._app.desktop_class.active_project(new_project[0]) + project = self._primitives._app.desktop.active_project(new_project[0]) # project = self._primitives._app.odesktop.GetActiveProject() project_name = project.GetName() project.GetDesigns()[0].GetName() @@ -896,7 +896,7 @@ def edit_definition(self, password=None): # design_name = project.GetDesigns()[0].GetName() # else: # design_name = project.GetActiveDesign().GetName() - return get_pyaedt_app(project_name, design_name, desktop=self._primitives._app.desktop_class) + return get_pyaedt_app(project_name, design_name, desktop=self._primitives._app.desktop) return False diff --git a/src/ansys/aedt/core/modeler/cad/object_3d.py b/src/ansys/aedt/core/modeler/cad/object_3d.py index 9d1aeebf4a0a..86122b2aaeb9 100644 --- a/src/ansys/aedt/core/modeler/cad/object_3d.py +++ b/src/ansys/aedt/core/modeler/cad/object_3d.py @@ -164,7 +164,7 @@ def _bounding_box_unmodel(self): self._odesign.Undo() if not modeled: self._odesign.Undo() - if not self._primitives._app.desktop_class.non_graphical: + if not self._primitives._app.desktop.non_graphical: self._primitives._app.odesktop.ClearMessages( self._primitives._app.project_name, self._primitives._app.design_name, 1 ) diff --git a/src/ansys/aedt/core/modeler/cad/primitives.py b/src/ansys/aedt/core/modeler/cad/primitives.py index 066f9ab5d33c..f4a9c0ee2384 100644 --- a/src/ansys/aedt/core/modeler/cad/primitives.py +++ b/src/ansys/aedt/core/modeler/cad/primitives.py @@ -9112,7 +9112,7 @@ class PrimitivesBuilder(PyAedtBase): >>> primitive_file = "primitives_file.json" >>> primitives_builder = PrimitivesBuilder(aedtapp, input_file=primitive_file) >>> primitives_builder.create(),, - >>> aedtapp.desktop_class.close_desktop() + >>> aedtapp.desktop.close_desktop() """ def __init__(self, app, input_file=None, input_dict=None): diff --git a/src/ansys/aedt/core/modeler/circuits/object_3d_circuit.py b/src/ansys/aedt/core/modeler/circuits/object_3d_circuit.py index 63475038f3d0..608048386595 100644 --- a/src/ansys/aedt/core/modeler/circuits/object_3d_circuit.py +++ b/src/ansys/aedt/core/modeler/circuits/object_3d_circuit.py @@ -855,7 +855,7 @@ def angle(self, angle=None): angle = self._circuit_components._app.value_with_units(self._angle, "deg") vMaterial = ["NAME:Component Angle", "Value:=", angle] self.change_property(vMaterial) - elif not self._circuit_components._app.desktop_class.is_grpc_api: + elif not self._circuit_components._app.desktop.is_grpc_api: if not angle: angle = str(self._angle) + "°" else: diff --git a/src/ansys/aedt/core/modeler/circuits/primitives_circuit.py b/src/ansys/aedt/core/modeler/circuits/primitives_circuit.py index 31a7650b6bea..545ef8c06658 100644 --- a/src/ansys/aedt/core/modeler/circuits/primitives_circuit.py +++ b/src/ansys/aedt/core/modeler/circuits/primitives_circuit.py @@ -1118,7 +1118,7 @@ def create_component( >>> aedtapp = TwinBuilder() >>> cmp = aedtapp.modeler.schematic.create_component(component_library="", component_name="ExcitationComponent") >>> cmp.set_property("ShowPin", True) - >>> aedtapp.desktop_class.close_desktop() + >>> aedtapp.desktop.close_desktop() """ # id = self.create_unique_id() if component_library: diff --git a/src/ansys/aedt/core/modeler/circuits/primitives_maxwell_circuit.py b/src/ansys/aedt/core/modeler/circuits/primitives_maxwell_circuit.py index 3e040736e4f1..df6a4a98fd0a 100644 --- a/src/ansys/aedt/core/modeler/circuits/primitives_maxwell_circuit.py +++ b/src/ansys/aedt/core/modeler/circuits/primitives_maxwell_circuit.py @@ -113,7 +113,7 @@ def create_resistor(self, name=None, value=50, location=None, angle=0, use_insta >>> from ansys.aedt.core import MaxwellCircuit >>> circ = MaxwellCircuit() >>> circ.modeler.schematic.create_resistor(value=10) - >>> circ.desktop_class.close_desktop() + >>> circ.desktop.close_desktop() """ if location is None: location = [] @@ -164,7 +164,7 @@ def create_inductor(self, name=None, value=50, location=None, angle=0, use_insta >>> from ansys.aedt.core import MaxwellCircuit >>> circ = MaxwellCircuit() >>> circ.modeler.schematic.create_inductor(value=10) - >>> circ.desktop_class.close_desktop() + >>> circ.desktop.close_desktop() """ if location is None: location = [] @@ -215,7 +215,7 @@ def create_capacitor(self, name=None, value=50, location=None, angle=0, use_inst >>> from ansys.aedt.core import MaxwellCircuit >>> circ = MaxwellCircuit() >>> circ.modeler.schematic.create_capacitor(value=10) - >>> circ.desktop_class.close_desktop() + >>> circ.desktop.close_desktop() """ if location is None: location = [] @@ -263,7 +263,7 @@ def create_diode(self, name=None, location=None, angle=0, use_instance_id_netlis >>> from ansys.aedt.core import MaxwellCircuit >>> circ = MaxwellCircuit() >>> circ.modeler.schematic.create_diode() - >>> circ.desktop_class.close_desktop() + >>> circ.desktop.close_desktop() """ if location is None: location = [] @@ -311,7 +311,7 @@ def create_winding(self, name=None, location=None, angle=0, use_instance_id_netl >>> from ansys.aedt.core import MaxwellCircuit >>> circ = MaxwellCircuit() >>> circ.modeler.schematic.create_winding(name="winding") - >>> circ.desktop_class.close_desktop() + >>> circ.desktop.close_desktop() """ if location is None: location = [] diff --git a/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py b/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py index 3ac44f957eaf..479ed67a525d 100644 --- a/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py +++ b/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py @@ -213,14 +213,14 @@ def create_subcircuit(self, location=None, angle=None, name=None, nested_subcirc self._app.odesign.InsertDesign("Circuit Design", name, "", parent_name) if is_linux and settings.aedt_version == "2024.1": # pragma: no cover time.sleep(1) - self._app.desktop_class.close_windows() + self._app.desktop.close_windows() if nested_subcircuit_id: pname = f"{self._app.design_name.split('/')[0]}:{nested_subcircuit_id}" - odes = self._app.desktop_class.active_design(self._app.oproject, pname) + odes = self._app.desktop.active_design(self._app.oproject, pname) oed = odes.SetActiveEditor("SchematicEditor") if is_linux and settings.aedt_version == "2024.1": # pragma: no cover time.sleep(1) - self._app.desktop_class.close_windows() + self._app.desktop.close_windows() objs = oed.GetAllElements() match = [i for i in objs if name in i] o = CircuitComponent(self, tabname=self.tab_name, custom_editor=oed) @@ -856,7 +856,7 @@ def create_voltage_probe(self, name=None, location=None, angle=0, use_instance_i >>> from ansys.aedt.core import Circuit >>> cir = Circuit() >>> cir.modeler.components.create_voltage_probe(name="probe") - >>> cir.desktop_class.release_desktop(False, False) + >>> cir.desktop.release_desktop(False, False) """ return self.__create_probe( name=name, @@ -899,7 +899,7 @@ def create_current_probe(self, name=None, location=None, angle=0, use_instance_i >>> from ansys.aedt.core import Circuit >>> cir = Circuit() >>> cir.modeler.components.create_current_probe(name="probe") - >>> cir.desktop_class.release_desktop(False, False) + >>> cir.desktop.release_desktop(False, False) """ return self.__create_probe( name=name, @@ -2123,7 +2123,7 @@ def create_component_from_spicemodel( >>> cir = Circuit(version="2025.2") >>> model = Path("Your path") / "test.lib" >>> cir.modeler.schematic.create_component_from_spicemodel(input_file=model, model="GRM1234", symbol="nexx_cap") - >>> cir.desktop_class.release_desktop(False, False) + >>> cir.desktop.release_desktop(False, False) """ if isinstance(input_file, str): input_file = Path(input_file) diff --git a/src/ansys/aedt/core/modeler/circuits/primitives_twin_builder.py b/src/ansys/aedt/core/modeler/circuits/primitives_twin_builder.py index a4f76795a380..839ad3a5d9a0 100644 --- a/src/ansys/aedt/core/modeler/circuits/primitives_twin_builder.py +++ b/src/ansys/aedt/core/modeler/circuits/primitives_twin_builder.py @@ -505,7 +505,7 @@ def create_component_from_sml( >>> model = "Thermal_ROM_SML" >>> pins_names = ["Input1_InternalHeatGeneration", "Input2_HeatFlow", "Output1_Temp1,Output2_Temp2"] >>> tb.modeler.schematic.create_component_from_sml(input_file=model, model=model, pins_names=pins_names) - >>> tb.desktop_class.release_desktop(False, False) + >>> tb.desktop.release_desktop(False, False) """ pins_names_str = ",".join(pins_names) arg = ["NAME:Options", "Mode:=", 1] @@ -550,7 +550,7 @@ def update_quantity_value(self, component_name, name, value, netlist_units=""): >>> modelpath = "Simplorer Elements\\Basic Elements\\Tools\\Time Functions:DATAPAIRS" >>> source1 = tb.modeler.schematic.create_component("source1", "", modelpath, [20 * G, 29 * G]) >>> tb.modeler.schematic.update_quantity_value(source1.composed_name, "PERIO", "0") - >>> tb.desktop_class.release_desktop(False, False) + >>> tb.desktop.release_desktop(False, False) """ try: self.oeditor.ChangeProperty( diff --git a/src/ansys/aedt/core/modeler/modeler_3d.py b/src/ansys/aedt/core/modeler/modeler_3d.py index 753832d360e8..a7c9d0824134 100644 --- a/src/ansys/aedt/core/modeler/modeler_3d.py +++ b/src/ansys/aedt/core/modeler/modeler_3d.py @@ -1049,7 +1049,7 @@ def import_nastran( if save_only_stl: return output_stls, nas_to_dict - self._app.desktop_class.close_windows() + self._app.desktop.close_windows() self.logger.info("Importing STL in 3D Modeler") if output_stls: for output_stl in output_stls: diff --git a/src/ansys/aedt/core/modeler/modeler_pcb.py b/src/ansys/aedt/core/modeler/modeler_pcb.py index 5d2d6907e841..ca2e1b04bc71 100644 --- a/src/ansys/aedt/core/modeler/modeler_pcb.py +++ b/src/ansys/aedt/core/modeler/modeler_pcb.py @@ -495,7 +495,7 @@ def import_cadence_brd(self, input_file, output_dir=None, name=None): self._oimportexport.ImportExtracta( input_file, str(Path(output_dir) / (name + ".aedb")), str(Path(output_dir) / (name + ".xml")) ) - self._app.__init__(self._app.desktop_class.active_project().GetName()) + self._app.__init__(self._app.desktop.active_project().GetName()) return True @pyaedt_function_handler() @@ -548,7 +548,7 @@ def import_ipc2581(self, input_file, output_dir=None, name=None): self._oimportexport.ImportIPC( input_file, str(Path(output_dir) / (name + ".aedb")), str(Path(output_dir) / (name + ".xml")) ) - self._app.__init__(self._app.desktop_class.active_project().GetName()) + self._app.__init__(self._app.desktop.active_project().GetName()) return True @pyaedt_function_handler() diff --git a/src/ansys/aedt/core/modeler/schematic.py b/src/ansys/aedt/core/modeler/schematic.py index bd9d5eb8a892..a48aa387669b 100644 --- a/src/ansys/aedt/core/modeler/schematic.py +++ b/src/ansys/aedt/core/modeler/schematic.py @@ -624,7 +624,7 @@ def move(self, assignment, offset, units=None): >>> oEditor.Move """ # TODO: Remove this once https://github.com/ansys/pyaedt/issues/6333 is fixed - if is_linux and self._app.desktop_class.non_graphical: + if is_linux and self._app.desktop.non_graphical: self.logger.error("Move is not supported in non-graphical mode on Linux.") return False sels = self._get_components_selections(assignment) diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index a46fe2f9f553..30b83dc1a769 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -2165,7 +2165,7 @@ def get_core_loss_coefficients( ... points_at_frequency={60: [[0, 0], [1, 3], [2, 7]]}, thickness="0.5mm", conductivity=0 ... ) >>> print(coefficients) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if not isinstance(points_at_frequency, dict): raise TypeError("Points list at frequency must be provided as a dictionary.") @@ -2292,7 +2292,7 @@ def set_coreloss_at_frequency( >>> m3d.materials["magnesium"].set_coreloss_at_frequency( ... points_at_frequency={60 : [[0,0], [1,3.5], [2,7.4]]} ... ) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() The second case shows how to set properties for core losses versus frequencies: @@ -2305,7 +2305,7 @@ def set_coreloss_at_frequency( ... 100 : [[0,0], [1,8], [2,9]], ... 150 : [[0,0], [1,10], [2,19]]} ... ) - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ if not isinstance(points_at_frequency, dict): diff --git a/src/ansys/aedt/core/modules/solve_setup.py b/src/ansys/aedt/core/modules/solve_setup.py index ea11a8ccab82..e283dd7d0b4e 100644 --- a/src/ansys/aedt/core/modules/solve_setup.py +++ b/src/ansys/aedt/core/modules/solve_setup.py @@ -942,9 +942,9 @@ def add_mesh_link( >>> m3d.set_active_design("target_design") The mesh link is assigned to the target design. >>> target_setup.add_mesh_link("source_design") - >>> m3d.desktop_class.close_desktop() + >>> m3d.desktop.close_desktop() """ - dkp = self._app.desktop_class + dkp = self._app.desktop source_design = design auto_update = self.auto_update try: @@ -3686,7 +3686,7 @@ def add_eddy_current_sweep( ... ) >>> sweep.props["RangeStart"] = "0.1Hz" >>> sweep.update() - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if self.setuptype not in [7, 60]: self._app.logger.warning("This method only applies to Maxwell Eddy Current Solution.") @@ -3845,7 +3845,7 @@ def set_save_fields( >>> setup.set_save_fields( ... enable=True, range_type="Custom", subrange_type="LinearStep", start=0, stop=8, count=2, units="ms" ... ) - >>> m2d.desktop_class.close_desktop() + >>> m2d.desktop.close_desktop() """ if self.setuptype != 5: if enable: @@ -4069,7 +4069,7 @@ def create_frequency_sweep( >>> q3d = Q3d() >>> setup = q3d.create_setup("LinearCountSetup") >>> sweep = setup.create_frequency_sweep(unit="GHz", start_frequency=0.5, stop_frequency=1.5, name="Sweep1") - >>> q3d.desktop_class.close_desktop() + >>> q3d.desktop.close_desktop() """ if sweep_type in ["Interpolating", "Fast"]: num_of_freq_points = num_of_freq_points or 401 @@ -4156,7 +4156,7 @@ def create_linear_step_sweep( ... name="LinearStepSweep", unit="MHz", start_frequency=1.1e3, stop_frequency=1200.1, step_size=153.8 ... ) >>> type(linear_step_sweep) - >>> q3d.desktop_class.close_desktop() + >>> q3d.desktop.close_desktop() """ if sweep_type not in ["Discrete", "Interpolating", "Fast"]: raise AttributeError("Invalid in `sweep_type`. It has to be either 'Discrete', 'Interpolating', or 'Fast'") @@ -4233,7 +4233,7 @@ def create_single_point_sweep( >>> setup = q3d.create_setup("SinglePointSetup") >>> single_point_sweep = setup.create_single_point_sweep(name="SinglePointSweep", unit="MHz", freq=1.1e3) >>> type(single_point_sweep) - >>> q3d.desktop_class.close_desktop() + >>> q3d.desktop.close_desktop() """ if name is None: name = generate_unique_name("SinglePoint") @@ -4334,7 +4334,7 @@ def get_sweep(self, name=None): >>> sweep.add_subrange("LinearCount", 0, 10, 1, "Hz") >>> sweep.add_subrange("LogScale", 10, 1e8, 100, "Hz") >>> sweep = setup.get_sweep("Sweep1") - >>> q3d.desktop_class.close_desktop() + >>> q3d.desktop.close_desktop() """ if name: for sweep in self.sweeps: diff --git a/src/ansys/aedt/core/q3d.py b/src/ansys/aedt/core/q3d.py index f6ed17f5cbcb..15b72fcc5ae6 100644 --- a/src/ansys/aedt/core/q3d.py +++ b/src/ansys/aedt/core/q3d.py @@ -1821,7 +1821,7 @@ def set_material_thresholds( if not magnetic_threshold: magnetic_threshold = 1.01 - if not self.desktop_class.is_grpc_api: + if not self.desktop.is_grpc_api: insulator_threshold = np.longdouble(insulator_threshold) perfect_conductor_threshold = np.longdouble(perfect_conductor_threshold) magnetic_threshold = np.longdouble(magnetic_threshold) diff --git a/src/ansys/aedt/core/rpc/rpyc_services.py b/src/ansys/aedt/core/rpc/rpyc_services.py index 1937096cb8c7..568aa86a5072 100644 --- a/src/ansys/aedt/core/rpc/rpyc_services.py +++ b/src/ansys/aedt/core/rpc/rpyc_services.py @@ -242,13 +242,13 @@ def on_disconnect(self, connection): # (to finalize the service, if needed) if self.app: if not is_linux: - if self.app and "desktop_class" in dir(self.app[0]) and "close_desktop" in dir(self.app[0].desktop_class): - self.app[0].desktop_class.close_desktop() + if self.app and "desktop" in dir(self.app[0]) and "close_desktop" in dir(self.app[0].desktop): + self.app[0].desktop.close_desktop() pass def exposed_close_connection(self): - if self.app and "desktop_class" in dir(self.app[0]) and "close_desktop" in dir(self.app[0].desktop_class): + if self.app and "desktop" in dir(self.app[0]) and "close_desktop" in dir(self.app[0].desktop): self.app[0].close_desktop() def _beta(self): diff --git a/src/ansys/aedt/core/twinbuilder.py b/src/ansys/aedt/core/twinbuilder.py index c14b276f5a86..b2036b942306 100644 --- a/src/ansys/aedt/core/twinbuilder.py +++ b/src/ansys/aedt/core/twinbuilder.py @@ -456,9 +456,9 @@ def add_q3d_dynamic_component( >>> tb.add_q3d_dynamic_component( ... "Q2D_ArmouredCableExample", "2D_Extractor_Cable", "MySetupAuto", "sweep1", "Original", "100mm" ... ) - >>> tb.desktop_class.close_desktop() + >>> tb.desktop.close_desktop() """ - dkp = self.desktop_class + dkp = self.desktop is_loaded = False if Path(source_project).is_file(): project_path = source_project @@ -712,14 +712,14 @@ def add_excitation_model( -------- >>> from ansys.aedt.core import TwinBuilder >>> tb = TwinBuilder(specified_version="2025.2") - >>> maxwell_app = tb.desktop_class[[project_name, "my_maxwell_design"]] + >>> maxwell_app = tb.desktop[[project_name, "my_maxwell_design"]] >>> excitations = {} >>> for e in maxwell_app.excitations_by_type["Winding Group"]: ... excitations[e.name] = ["20", True, e.props["Type"], False] >>> comp = tb.add_excitation_model(project=project_name, design="my_maxwell_design", excitations=excitations) - >>> tb.desktop_class.release_desktop(False, False) + >>> tb.desktop.release_desktop(False, False) """ - dkp = self.desktop_class + dkp = self.desktop project_selection = 0 if Path(project).is_file(): project_path = project @@ -729,7 +729,7 @@ def add_excitation_model( else: maxwell_app = dkp.load_project(project_path, design) project_selection = 1 - elif project in self.desktop_class.project_list: + elif project in self.desktop.project_list: project_name = "$PROJECTDIR/{}.aedt".format(project) maxwell_app = dkp[[project, design]] else: diff --git a/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py b/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py index 7c375ffaf778..9fa727a88175 100644 --- a/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py @@ -84,7 +84,7 @@ class FfdSolutionData(PyAedtBase): >>> app = ansys.aedt.core.Hfss(version="2025.2", design="Antenna") >>> data = app.get_antenna_data() >>> metadata_file = data.metadata_file - >>> app.desktop_class.close_desktop() + >>> app.desktop.close_desktop() >>> farfield_data = FfdSolutionData(input_file=metadata_file) >>> farfield_data.plot_3d(quantity_format="dB10") """ diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index b0c334dab6d1..a4e1ddc4eced 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -94,7 +94,7 @@ class MonostaticRCSData(PyAedtBase): >>> app = Hfss(version="2025.2", design="Antenna") >>> data = app.get_rcs_data() >>> metadata_file = data.metadata_file - >>> app.desktop_class.close_desktop() + >>> app.desktop.close_desktop() >>> rcs_data = MonostaticRCSData(input_file=metadata_file) """ @@ -636,7 +636,7 @@ class MonostaticRCSPlotter(PyAedtBase): >>> app = Hfss(version="2025.2", design="Antenna") >>> data = app.get_rcs_data() >>> metadata_file = data.metadata_file - >>> app.desktop_class.close_desktop() + >>> app.desktop.close_desktop() >>> rcs_data = MonostaticRCSData(input_file=metadata_file) >>> rcs_plotter = MonostaticRCSPlotter(rcs_data) """ diff --git a/src/ansys/aedt/core/visualization/post/common.py b/src/ansys/aedt/core/visualization/post/common.py index a10536dee15b..0d492f64f265 100644 --- a/src/ansys/aedt/core/visualization/post/common.py +++ b/src/ansys/aedt/core/visualization/post/common.py @@ -324,11 +324,11 @@ def available_report_quantities( >>> expressions = m3d.post.available_report_quantities( ... report_category="EddyCurrent", display_type="Data Table", context={"Matrix1": "ReducedMatrix1"} ... ) - >>> m3d.desktop_class.release_desktop(False, False) + >>> m3d.desktop.release_desktop(False, False) """ if not report_category: report_category = self.available_report_types[0] - elif self._app.desktop_class.aedt_version_id >= "2025.2" and report_category == "EddyCurrent": + elif self._app.desktop.aedt_version_id >= "2025.2" and report_category == "EddyCurrent": # From 2025R2, EddyCurrent category does not exist anymore, but old user code could still try to access # This check allows code back compatibility in the report self.logger.warning("Change the report category to AC Magnetic.") @@ -572,7 +572,7 @@ def _get_plot_inputs(self): names = self._app.get_oo_name(self.oreportsetup) plots = [] skip_plot = False - if self._app.design_type == "Circuit Netlist" and self._app.desktop_class.non_graphical: + if self._app.design_type == "Circuit Netlist" and self._app.desktop.non_graphical: skip_plot = True if names and not skip_plot: for name in names: @@ -1484,7 +1484,7 @@ def create_report( ... context="3D", ... ) >>> hfss.post.create_report("S(1,1)", hfss.nominal_sweep, variations=variations, plot_type="Smith Chart") - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) >>> from ansys.aedt.core import Maxwell2d >>> m2d = Maxwell2d() @@ -1494,7 +1494,7 @@ def create_report( ... primary_sweep_variable="Time", ... plot_name="Winding Plot 1", ... ) - >>> m2d.desktop_class.release_desktop(False, False) + >>> m2d.desktop.release_desktop(False, False) >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d(solution_type="EddyCurrent") @@ -1515,7 +1515,7 @@ def create_report( ... plot_type="Data Table", ... plot_name="reduced_matrix", ... ) - >>> m3d.desktop_class.release_desktop(False, False) + >>> m3d.desktop.release_desktop(False, False) """ report = self._get_report_object( expressions=expressions, @@ -1643,7 +1643,7 @@ def get_solution_data( ... variations=variations, ...) >>> data2.plot() - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) >>> from ansys.aedt.core import Maxwell2d >>> m2d = Maxwell2d() @@ -1653,7 +1653,7 @@ def get_solution_data( ... primary_sweep_variable="Time", ... ) >>> data3.plot("InputCurrent(PHA)") - >>> m2d.desktop_class.release_desktop(False, False) + >>> m2d.desktop.release_desktop(False, False) >>> from ansys.aedt.core import Circuit >>> circuit = Circuit() @@ -1661,7 +1661,7 @@ def get_solution_data( >>> spectralPlotData = circuit.post.get_solution_data( ... expressions="V(Vprobe1)", domain="Spectral", primary_sweep_variable="Spectrum", context=context ... ) - >>> circuit.desktop_class.release_desktop(False, False) + >>> circuit.desktop.release_desktop(False, False) >>> from ansys.aedt.core import Maxwell3d >>> m3d = Maxwell3d(solution_type="EddyCurrent") @@ -1677,7 +1677,7 @@ def get_solution_data( ... report_category="EddyCurrent", display_type="Data Table", context={"Matrix1": "ReducedMatrix1"} ... ) >>> data = m2d.post.get_solution_data(expressions=expressions, context={"Matrix1": "ReducedMatrix1"}) - >>> m3d.desktop_class.release_desktop(False, False) + >>> m3d.desktop.release_desktop(False, False) """ report = self._get_report_object( expressions=expressions, @@ -2661,7 +2661,7 @@ def emi_receiver(self, expressions=None, setup_name=None): if not setup_name: setup_name = self._post_app._app.nominal_sweep rep = None - if "EMIReceiver" in self._templates and self._post_app._app.desktop_class.aedt_version_id > "2023.2": + if "EMIReceiver" in self._templates and self._post_app._app.desktop.aedt_version_id > "2023.2": rep = ansys.aedt.core.visualization.report.emi.EMIReceiver(self._post_app, "EMIReceiver", setup_name) if not expressions: expressions = f"Average[{rep.net}]" diff --git a/src/ansys/aedt/core/visualization/post/compliance.py b/src/ansys/aedt/core/visualization/post/compliance.py index 6d287c4f6cd8..8d8f355a3349 100644 --- a/src/ansys/aedt/core/visualization/post/compliance.py +++ b/src/ansys/aedt/core/visualization/post/compliance.py @@ -576,7 +576,7 @@ def __init__(self, desktop, template): self._project_name = None self._output_folder = None self._parse_template() - self._desktop_class = desktop + self._desktop_instance = desktop self._dut = None self._summary = [["Test", "Results"]] self._summary_font = [["", None]] @@ -627,10 +627,10 @@ def load_project(self): bool """ if not self._project_file: - self._desktop_class.logger.error("Project path has not been provided.") + self._desktop_instance.logger.error("Project path has not been provided.") return False - self._desktop_class.load_project(self._project_file) - project = self._desktop_class.active_project() + self._desktop_instance.load_project(self._project_file) + project = self._desktop_instance.active_project() self._project_name = project.GetName() self._output_folder = os.path.join( project.GetPath(), self._project_name + ".pyaedt", generate_unique_name(self._template_name) @@ -754,7 +754,7 @@ def _parse_reports(self, report, is_parameter=False, is_report_parameters=False) name = report["name"] if name in self._reports.values(): - self._desktop_class.logger.warning(f"{name} already exists. The name must be unique.") + self._desktop_instance.logger.warning(f"{name} already exists. The name must be unique.") else: if is_parameter: self._parameters[report["name"]] = ParametersTemplate(report) @@ -867,7 +867,7 @@ def _add_skew(self, _design, aedt_report, chapter, name, pass_fail_criteria): ] if not trace_data: # pragma: no cover msg = "Failed to get solution data. Check if the design is solved or if the report data is correct." - self._desktop_class.logger.error(msg) + self._desktop_instance.logger.error(msg) else: units = trace_data.units_sweeps["Time"] pass_fail_table = [ @@ -949,13 +949,13 @@ def _create_derived_reports(self): return compliance_reports = self.report_data.add_chapter("Report Derived Parameters Results") for tpx, template_report in enumerate(self._reports_parameters.values()): - if self._desktop_class: + if self._desktop_instance: time.sleep(1) - self._desktop_class.odesktop.CloseAllWindows() + self._desktop_instance.odesktop.CloseAllWindows() settings.logger.info(f"Adding report {template_report.name}.") config_file = template_report.config_file if not os.path.exists(config_file) and not os.path.exists(os.path.join(self._template_folder, config_file)): - self._desktop_class.logger.error(f"{config_file} is not found.") + self._desktop_instance.logger.error(f"{config_file} is not found.") continue name = template_report.name traces = template_report.traces @@ -963,16 +963,16 @@ def _create_derived_reports(self): design_name = template_report.design_name report_type = template_report.report_type if template_report.project_name: - if template_report.project_name not in self._desktop_class.project_list: - self._desktop_class.load_project(template_report.project) + if template_report.project_name not in self._desktop_instance.project_list: + self._desktop_instance.load_project(template_report.project) else: template_report.project_name = self._project_name if _design and _design.design_name != design_name or _design is None: try: _design = get_pyaedt_app(template_report.project_name, design_name) - self._desktop_class.odesktop.CloseAllWindows() + self._desktop_instance.odesktop.CloseAllWindows() except Exception: # pragma: no cover - self._desktop_class.logger.error(f"Failed to retrieve design {design_name}") + self._desktop_instance.logger.error(f"Failed to retrieve design {design_name}") continue if os.path.exists(os.path.join(self._template_folder, config_file)): config_file = os.path.join(self._template_folder, config_file) @@ -1044,16 +1044,16 @@ def _create_aedt_reports(self): return False compliance_reports = self.report_data.add_chapter("Compliance Results") for tpx, template_report in enumerate(self._reports.values()): - if self._desktop_class: + if self._desktop_instance: time.sleep(1) - self._desktop_class.odesktop.CloseAllWindows() + self._desktop_instance.odesktop.CloseAllWindows() try: settings.logger.info(f"Adding report {template_report.name}.") config_file = template_report.config_file if not os.path.exists(config_file) and not os.path.exists( os.path.join(self._template_folder, config_file) ): - self._desktop_class.logger.error(f"{config_file} is not found.") + self._desktop_instance.logger.error(f"{config_file} is not found.") continue name = template_report.name traces = template_report.traces @@ -1063,16 +1063,16 @@ def _create_aedt_reports(self): report_type = template_report.report_type group = template_report.group_plots if template_report.project_name: - if template_report.project_name not in self._desktop_class.project_list: - self._desktop_class.load_project(template_report.project) + if template_report.project_name not in self._desktop_instance.project_list: + self._desktop_instance.load_project(template_report.project) else: template_report.project_name = self._project_name if _design and _design.design_name != design_name or _design is None: try: _design = get_pyaedt_app(template_report.project_name, design_name) - self._desktop_class.odesktop.CloseAllWindows() + self._desktop_instance.odesktop.CloseAllWindows() except Exception: # pragma: no cover - self._desktop_class.logger.error(f"Failed to retrieve design {design_name}") + self._desktop_instance.logger.error(f"Failed to retrieve design {design_name}") continue if os.path.exists(os.path.join(self._template_folder, config_file)): config_file = os.path.join(self._template_folder, config_file) @@ -1259,7 +1259,7 @@ def _create_aedt_reports(self): else: # pragma: no cover msg = f"Failed to create the report. Check {config_file} configuration file." - self._desktop_class.logger.error(msg) + self._desktop_instance.logger.error(msg) settings.logger.info(f"Report {template_report.name} added to the pdf.") except Exception: settings.logger.error(f"Failed to add {template_report.name} to the pdf.") @@ -1276,7 +1276,7 @@ def _create_parameters(self): if not os.path.exists(config_file): config_file = os.path.join(self._template_folder, config_file) if not os.path.exists(config_file): - self._desktop_class.logger.error(f"{config_file} not found.") + self._desktop_instance.logger.error(f"{config_file} not found.") continue name = template_report.name pass_fail = template_report.pass_fail @@ -1359,7 +1359,7 @@ def _add_statistical_violations(self, report, chapter, image_name, pass_fail_cri sols = report.get_solution_data() if not sols: # pragma: no cover msg = "Failed to get Solution Data. Check if the design is solved or the report data are correct." - self._desktop_class.logger.error(msg) + self._desktop_instance.logger.error(msg) return mag_data_in = sols.get_expression_data( sols.expressions[0], formula="magnitude", sweeps=["__UnitInterval", "__Amplitude"] @@ -1446,7 +1446,7 @@ def _add_contour_eye_diagram_violations(self, report, chapter, image_name, pass_ sols = report.get_solution_data() if not sols: # pragma: no cover msg = "Failed to get Solution Data. Check if the design is solved or the report data are correct." - self._desktop_class.logger.error(msg) + self._desktop_instance.logger.error(msg) return bit_error_rates = [1e-3, 1e-6, 1e-9, 1e-12] font_table = [["", None]] @@ -1499,7 +1499,7 @@ def _add_lna_violations(self, report, chapter, image_name, pass_fail_criteria): ] if not trace_data: # pragma: no cover msg = "Failed to get solution data. Check if the design is solved or if the report data is correct." - self._desktop_class.logger.error(msg) + self._desktop_instance.logger.error(msg) return pass_fail_table for trace_name in trace_data.expressions: trace_values = trace_data.get_expression_data(trace_name) @@ -1649,7 +1649,7 @@ def _create_project_info(self, report): report.add_empty_line(3) if _design.design_type == "Circuit Design": - if not self._desktop_class.non_graphical: + if not self._desktop_instance.non_graphical: for page in range(1, _design.modeler.pages + 1): name = os.path.join(self._output_folder, f"{_design.design_name}_{page}.jpg") image = _design.post.export_model_picture(name, page) @@ -1754,7 +1754,7 @@ def create_pdf(self, file_name, close_project=True): if not self.report_data.chapters: self.create_compliance_report() report = AnsysReport() - report.aedt_version = self._desktop_class.aedt_version_id + report.aedt_version = self._desktop_instance.aedt_version_id report.design_name = self._template_name report.report_specs.table_font_size = 7 report.report_specs.revision = f"Revision {self.revision}" @@ -1786,7 +1786,7 @@ def create_pdf(self, file_name, close_project=True): report.add_toc() output = report.save_pdf(self._output_folder, file_name=file_name) if close_project: - self._desktop_class.odesktop.CloseProject(self.project_name) + self._desktop_instance.odesktop.CloseProject(self.project_name) if output: - self._desktop_class.logger.info(f"Report has been saved in {output}") + self._desktop_instance.logger.info(f"Report has been saved in {output}") return output diff --git a/src/ansys/aedt/core/visualization/post/farfield_exporter.py b/src/ansys/aedt/core/visualization/post/farfield_exporter.py index 9e1a318642ef..30ad5592a918 100644 --- a/src/ansys/aedt/core/visualization/post/farfield_exporter.py +++ b/src/ansys/aedt/core/visualization/post/farfield_exporter.py @@ -122,7 +122,7 @@ def __init__( self.__farfield_data = None self.__metadata_file = "" - if self.__app.desktop_class.is_grpc_api and set_phase_center_per_port: + if self.__app.desktop.is_grpc_api and set_phase_center_per_port: self.__app.set_phase_center_per_port() else: # pragma: no cover self.__app.logger.warning("Set phase center in port location manually.") @@ -159,7 +159,7 @@ def export_farfield(self): file_path_txt = os.path.join(export_path, exported_name_map) input_file = file_path_xml - if self.__app.desktop_class.aedt_version_id < "2024.1": # pragma: no cover + if self.__app.desktop.aedt_version_id < "2024.1": # pragma: no cover input_file = file_path_txt # Create directory or check if files already exist @@ -176,7 +176,7 @@ def export_farfield(self): # Export far field if self.overwrite or not file_exists: - if self.__app.desktop_class.aedt_version_id < "2024.1": # pragma: no cover + if self.__app.desktop.aedt_version_id < "2024.1": # pragma: no cover is_exported = self.__app.export_element_pattern( frequencies=self.frequencies, setup=self.setup_name, @@ -245,7 +245,7 @@ def export_farfield(self): power = {} - if self.__app.desktop_class.aedt_version_id < "2024.1": + if self.__app.desktop.aedt_version_id < "2024.1": available_categories = self.__app.post.available_quantities_categories() excitations = [] is_power = True diff --git a/src/ansys/aedt/core/visualization/post/fields_calculator.py b/src/ansys/aedt/core/visualization/post/fields_calculator.py index 65cdebb6b001..ed28751a8490 100644 --- a/src/ansys/aedt/core/visualization/post/fields_calculator.py +++ b/src/ansys/aedt/core/visualization/post/fields_calculator.py @@ -80,7 +80,7 @@ class FieldsCalculator(PyAedtBase): ... "report": ["Data Table", "Rectangular Plot"], ... } >>> expr_name = hfss.post.fields_calculator.add_expression(my_expression, "Polyline1") - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) or they can be added from the ``expression_catalog.toml``: @@ -88,7 +88,7 @@ class FieldsCalculator(PyAedtBase): >>> hfss = Hfss() >>> poly = hfss.modeler.create_polyline([[0, 0, 0], [1, 0, 1]], name="Polyline1") >>> expr_name = hfss.post.fields_calculator.add_expression("voltage_line", "Polyline1") - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ @@ -163,7 +163,7 @@ def add_expression(self, calculation, assignment, name=None): ... "report": ["Data Table", "Rectangular Plot"], ... } >>> expr_name = hfss.post.fields_calculator.add_expression(my_expression, "Polyline1") - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ if assignment is not None: assignment = self.__app.modeler.convert_to_selections(assignment, return_list=True)[0] @@ -309,7 +309,7 @@ def expression_plot(self, calculation, assignment, names, setup=None): >>> poly = hfss.modeler.create_polyline([[0, 0, 0], [1, 0, 1]], name="Polyline1") >>> expr_name = hfss.post.fields_calculator.add_expression("voltage_line", "Polyline1") >>> reports = hfss.post.fields_calculator.expression_plot("voltage_line", "Polyline1", [name]) - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ if assignment is not None: assignment = self.__app.modeler.convert_to_selections(assignment, return_list=True) @@ -396,7 +396,7 @@ def delete_expression(self, name=None): >>> poly = hfss.modeler.create_polyline([[0, 0, 0], [1, 0, 1]], name="Polyline1") >>> expr_name = hfss.post.fields_calculator.add_expression("voltage_line", "Polyline1") >>> hfss.post.fields_calculator.delete_expression(expr_name) - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ if not name: self.ofieldsreporter.ClearAllNamedExpr() @@ -469,7 +469,7 @@ def load_expression_file(self, input_file): >>> hfss = Hfss() >>> my_toml = str(Path("my_path_to_toml") / "my_toml.toml") >>> new_catalog = hfss.post.fields_calculator.load_expression_file(my_toml) - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ if not Path(input_file).is_file(): self.__app.logger.error("File does not exist.") @@ -552,7 +552,7 @@ def write(self, expression, output_file, setup=None, intrinsics=None): >>> expr_name = hfss.post.fields_calculator.add_expression("voltage_line", "Polyline1") >>> file_path = Path(hfss.working_directory) / "my_expr.fld" >>> hfss.post.fields_calculator.write("voltage_line", file_path, hfss.nominal_adaptive) - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ if not self.is_expression_defined(expression): self.__app.logger.error("Expression does not exist in current stack.") @@ -838,7 +838,7 @@ def get_expressions(self, field_type: str = None) -> dict: # pragma: no cover >>> hfss = Hfss() >>> poly = hfss.modeler.create_polyline([[0, 0, 0], [1, 0, 1]], name="Polyline1") >>> exprs = hfss.post.fields_calculator.get_expressions() - >>> hfss.desktop_class.release_desktop(False, False) + >>> hfss.desktop.release_desktop(False, False) """ expressions = {} field_type = field_type or "" diff --git a/src/ansys/aedt/core/visualization/post/monitor_icepak.py b/src/ansys/aedt/core/visualization/post/monitor_icepak.py index 1911a3395ca5..5e47aac1c443 100644 --- a/src/ansys/aedt/core/visualization/post/monitor_icepak.py +++ b/src/ansys/aedt/core/visualization/post/monitor_icepak.py @@ -95,7 +95,7 @@ def __init__(self, p_app): self._face_monitors = {} self._point_monitors = {} self._app = p_app - if self._app.desktop_class.aedt_version_id > "2023.2": # pragma: no cover + if self._app.desktop.aedt_version_id > "2023.2": # pragma: no cover self.quantities_dict = quantities_dict_2 else: self.quantities_dict = quantities_dict_1 diff --git a/src/ansys/aedt/core/visualization/post/post_common_3d.py b/src/ansys/aedt/core/visualization/post/post_common_3d.py index bdf211e930e4..e52c7c3d9e33 100644 --- a/src/ansys/aedt/core/visualization/post/post_common_3d.py +++ b/src/ansys/aedt/core/visualization/post/post_common_3d.py @@ -970,13 +970,13 @@ def _create_fieldplot( if not setup: setup = self._app.existing_analysis_sweeps[0] - self._app.desktop_class.close_windows() + self._app.desktop.close_windows() try: self._app.modeler.fit_all() except Exception: self.logger.debug("Something went wrong with `fit_all` while creating field plot.") # pragma: no cover self._desktop.TileWindows(0) - self._app.desktop_class.active_design(self._oproject, self._app.design_name) + self._app.desktop.active_design(self._oproject, self._app.design_name) char_set = string.ascii_uppercase + string.digits if not plot_name: @@ -1478,7 +1478,7 @@ def export_model_picture( full_name = Path(self._app.working_directory) / (generate_unique_name(self._app.design_name) + ".jpg") # open the 3D modeler and remove the selection on other objects - if not self._app.desktop_class.non_graphical: # pragma: no cover + if not self._app.desktop.non_graphical: # pragma: no cover if self._app.design_type not in [ "HFSS 3D Layout Design", "Circuit Design", @@ -1522,7 +1522,7 @@ def export_model_picture( height = 1080 self.oeditor.ExportImage(str(full_name), width, height) else: - if self._app.desktop_class.non_graphical: + if self._app.desktop.non_graphical: if width == 0: width = 500 if height == 0: diff --git a/src/ansys/aedt/core/visualization/post/post_maxwell.py b/src/ansys/aedt/core/visualization/post/post_maxwell.py index 6b52e82dd731..3156410cd21e 100644 --- a/src/ansys/aedt/core/visualization/post/post_maxwell.py +++ b/src/ansys/aedt/core/visualization/post/post_maxwell.py @@ -79,13 +79,13 @@ def _create_fieldplot_line_traces( for i in self._app.setups: if i.name == setup.split(" : ")[0]: intrinsics = i.default_intrinsics - self._app.desktop_class.close_windows() + self._app.desktop.close_windows() try: self._app.modeler.fit_all() except Exception: # pragma: no cover self.logger.debug("Something went wrong with `fit_all` while creating field plot with line traces.") self._desktop.TileWindows(0) - self._app.desktop_class.active_design(self._oproject, self._app.design_name) + self._app.desktop.active_design(self._oproject, self._app.design_name) char_set = string.ascii_uppercase + string.digits if not plot_name: @@ -390,7 +390,7 @@ def evaluate_inception_voltage(self, plot_name, field_line_number=None): # prag Now the inception voltage evaluation can be performed on all (or a subset) of the created field line traces. >>> m2d.post.evaluate_inception_voltage(plot_name=plot.name, field_line_number=[1, 2, 4]) - >>> m2d.desktop_class.release_desktop() + >>> m2d.desktop.release_desktop() """ if self._app.solution_type != SolutionsMaxwell3D.ElectroStatic: raise AEDTRuntimeError("Field line traces is valid only for electrostatic solution") @@ -453,7 +453,7 @@ def export_inception_voltage(self, plot_name, output_file, field_line_number=Non ... output_file=str(Path(m2d.working_directory, "my_file.txt")), ... field_line_number=[1, 2, 4], ... ) - >>> m2d.desktop_class.release_desktop() + >>> m2d.desktop.release_desktop() """ if self._app.solution_type != "Electrostatic": raise AEDTRuntimeError("Field line traces is valid only for Electrostatic solution.") @@ -555,7 +555,7 @@ def modify_inception_parameters( The inception voltage evaluation can be performed on all (or a subset) of the created field line traces and inception voltage parameters can be edited >>> m2d.modify_inception_parameters() - >>> m2d.desktop_class.release_desktop() + >>> m2d.desktop.release_desktop() """ if not ionization_dataset: ionization_dataset = [0] diff --git a/tests/system/filter_solutions/test_desktop_types.py b/tests/system/filter_solutions/test_desktop_types.py index 9efd01c86f71..f90f0377331d 100644 --- a/tests/system/filter_solutions/test_desktop_types.py +++ b/tests/system/filter_solutions/test_desktop_types.py @@ -50,7 +50,7 @@ def test_lumped_exported_desktop(self, lumped_design): assert variables["C1"].value == pytest.approx(1.967e-12) assert variables["L2"].value == pytest.approx(1.288e-8) assert variables["C3"].value == pytest.approx(6.366e-12) - app.desktop_class.close_desktop() + app.desktop.close_desktop() def test_distributed_circuit_exported_desktop(self, distributed_design): schem_name = distributed_design.export_to_aedt.schematic_name @@ -69,7 +69,7 @@ def test_distributed_circuit_exported_desktop(self, distributed_design): assert variables["S1"].value == pytest.approx(3.362e-3) assert variables["S2"].value == pytest.approx(2.172e-2) assert variables["S3"].value == pytest.approx(1.008e-2) - app.desktop_class.close_desktop() + app.desktop.close_desktop() def test_distributed_hfss3dl_exported_desktop(self, distributed_design): schem_name = distributed_design.export_to_aedt.schematic_name @@ -89,7 +89,7 @@ def test_distributed_hfss3dl_exported_desktop(self, distributed_design): assert variables["S1"].value == pytest.approx(3.36225452227e-3) assert variables["S2"].value == pytest.approx(2.17231965814e-2) assert variables["S3"].value == pytest.approx(1.00773795179e-2) - app.desktop_class.close_desktop() + app.desktop.close_desktop() def test_distributed_hfss_exported_desktop(self, distributed_design): schem_name = distributed_design.export_to_aedt.schematic_name @@ -109,4 +109,4 @@ def test_distributed_hfss_exported_desktop(self, distributed_design): assert variables["S1"].value == pytest.approx(3.36225452227e-3) assert variables["S2"].value == pytest.approx(2.17231965814e-2) assert variables["S3"].value == pytest.approx(1.00773795179e-2) - app.desktop_class.close_desktop() + app.desktop.close_desktop() diff --git a/tests/system/filter_solutions/test_export_to_aedt/test_export_to_aedt.py b/tests/system/filter_solutions/test_export_to_aedt/test_export_to_aedt.py index 682a077810fb..095d4721ec91 100644 --- a/tests/system/filter_solutions/test_export_to_aedt/test_export_to_aedt.py +++ b/tests/system/filter_solutions/test_export_to_aedt/test_export_to_aedt.py @@ -483,7 +483,7 @@ def test_import_tuned_variables(self, lumped_design): assert lumped_design.export_to_aedt.import_tuned_variables().splitlines() == read_resource_file( "imported_netlist.ckt", "Lumped" ) - app.desktop_class.close_desktop() + app.desktop.close_desktop() def test_part_libraries(self, lumped_design): assert lumped_design.export_to_aedt.part_libraries == PartLibraries.LUMPED diff --git a/tests/system/general/test_circuit.py b/tests/system/general/test_circuit.py index 69611b122baf..17a0217a9a3a 100644 --- a/tests/system/general/test_circuit.py +++ b/tests/system/general/test_circuit.py @@ -508,7 +508,7 @@ def test_push_down(aedt_app): active_project = aedt_app.oproject.GetActiveDesign() if is_linux and DESKTOP_VERSION == "2024.1": time.sleep(1) - aedt_app.desktop_class.close_windows() + aedt_app.desktop.close_windows() active_project_name_1 = active_project.GetName() aedt_app.pop_up() subcircuit_2 = aedt_app.modeler.schematic.create_subcircuit( @@ -517,7 +517,7 @@ def test_push_down(aedt_app): active_project = aedt_app.oproject.GetActiveDesign() if is_linux and DESKTOP_VERSION == "2024.1": time.sleep(1) - aedt_app.desktop_class.close_windows() + aedt_app.desktop.close_windows() active_project_name_3 = active_project.GetName() assert active_project_name_1 == active_project_name_3 assert subcircuit_2.component_info["RefDes"] == "U2" @@ -529,14 +529,14 @@ def test_pop_up(aedt_app): active_project = aedt_app.oproject.GetActiveDesign() if is_linux and DESKTOP_VERSION == "2024.1": time.sleep(1) - aedt_app.desktop_class.close_windows() + aedt_app.desktop.close_windows() active_project_name_1 = active_project.GetName() aedt_app.modeler.schematic.create_subcircuit(location=[0.0, 0.0]) assert aedt_app.pop_up() active_project = aedt_app.oproject.GetActiveDesign() if is_linux and DESKTOP_VERSION == "2024.1": time.sleep(1) - aedt_app.desktop_class.close_windows() + aedt_app.desktop.close_windows() active_project_name_2 = active_project.GetName() assert active_project_name_1 == active_project_name_2 diff --git a/tests/system/general/test_design.py b/tests/system/general/test_design.py index ade46c77d01f..fe6b5a9ff83f 100644 --- a/tests/system/general/test_design.py +++ b/tests/system/general/test_design.py @@ -72,7 +72,7 @@ def test_design_properties(aedt_app): assert aedt_app.aedt_version_id assert aedt_app.valid_design assert aedt_app.clean_proj_folder() - assert aedt_app.desktop_class.install_path + assert aedt_app.desktop.install_path assert Path(aedt_app.lock_file).is_file() assert aedt_app.design_type == "HFSS" mylist = aedt_app.design_list @@ -91,15 +91,15 @@ def test_design_properties(aedt_app): assert aedt_app.omaterial_manager -def test_desktop_class_path(aedt_app): - assert Path(aedt_app.desktop_class.project_path()).exists() - assert Path(aedt_app.desktop_class.project_path(aedt_app.project_name)).exists() +def test_desktop_path(aedt_app): + assert Path(aedt_app.desktop.project_path()).exists() + assert Path(aedt_app.desktop.project_path(aedt_app.project_name)).exists() - assert len(aedt_app.desktop_class.design_list(aedt_app.project_name)) == 1 - assert aedt_app.desktop_class.design_type() == "HFSS" - assert aedt_app.desktop_class.design_type(aedt_app.project_name, aedt_app.design_name) == "HFSS" - assert aedt_app.desktop_class.src_dir.exists() - assert aedt_app.desktop_class.pyaedt_dir.exists() + assert len(aedt_app.desktop.design_list(aedt_app.project_name)) == 1 + assert aedt_app.desktop.design_type() == "HFSS" + assert aedt_app.desktop.design_type(aedt_app.project_name, aedt_app.design_name) == "HFSS" + assert aedt_app.desktop.src_dir.exists() + assert aedt_app.desktop.pyaedt_dir.exists() def test_copy_project(aedt_app, test_tmp_dir): @@ -203,13 +203,13 @@ def test_copy_design_from(coaxial, test_tmp_dir): def test_copy_example(aedt_app): - example_name = aedt_app.desktop_class.get_example("5G_SIW_Aperture_Antenna") + example_name = aedt_app.desktop.get_example("5G_SIW_Aperture_Antenna") from ansys.aedt.core.generic.file_utils import remove_project_lock remove_project_lock(example_name) aedt_app.copy_design_from(example_name, "0_5G Aperture Element") assert aedt_app.design_name == "0_5G Aperture Element" - assert not aedt_app.desktop_class.get_example("fake") + assert not aedt_app.desktop.get_example("fake") def test_design_name_setter(aedt_app): @@ -393,7 +393,7 @@ def test_aedt_object(aedt_app): aedt_obj = AedtObjects() assert aedt_obj._odesign assert aedt_obj._oproject - aedt_obj = AedtObjects(aedt_app._desktop_class, aedt_app.oproject, aedt_app.odesign) + aedt_obj = AedtObjects(aedt_app._desktop, aedt_app.oproject, aedt_app.odesign) assert aedt_obj._odesign == aedt_app.odesign @@ -437,14 +437,14 @@ def test_toolkit(aedt_app, desktop, test_tmp_dir): with open(file, "w") as f: f.write("import ansys.aedt.core\n") assert customize_automation_tab.add_script_to_menu(name="test_toolkit", script_file=str(file)) - assert customize_automation_tab.remove_script_from_menu(desktop_object=aedt_app.desktop_class, name="test_toolkit") + assert customize_automation_tab.remove_script_from_menu(desktop_object=aedt_app.desktop, name="test_toolkit") assert customize_automation_tab.add_script_to_menu( name="test_toolkit", script_file=str(file), - personal_lib=aedt_app.desktop_class.personallib, - aedt_version=aedt_app.desktop_class.aedt_version_id, + personal_lib=aedt_app.desktop.personallib, + aedt_version=aedt_app.desktop.aedt_version_id, ) - assert customize_automation_tab.remove_script_from_menu(desktop_object=aedt_app.desktop_class, name="test_toolkit") + assert customize_automation_tab.remove_script_from_menu(desktop_object=aedt_app.desktop, name="test_toolkit") def test_load_project(aedt_app, desktop, test_tmp_dir): @@ -501,24 +501,24 @@ def test_desktop_save_as(add_app, test_tmp_dir): app = add_app(application=Hfss) new_project = test_tmp_dir / "new.aedt" assert test_tmp_dir.exists() - assert app.desktop_class.save_project(project_path=str(new_project)) + assert app.desktop.save_project(project_path=str(new_project)) assert Path(new_project).is_file() assert app.project_name == "new" # Test using Path instead of string new_project_path = test_tmp_dir / "new_2.aedt" - assert app.desktop_class.save_project(project_path=new_project_path) + assert app.desktop.save_project(project_path=new_project_path) assert new_project_path.exists() assert app.project_name == "new_2" # Test using Path with only dir only_project_path = test_tmp_dir - assert app.desktop_class.save_project(project_path=only_project_path) + assert app.desktop.save_project(project_path=only_project_path) assert new_project_path.exists() # Test using Path and providing a project name new_project_path = test_tmp_dir / "new_3.aedt" project_name = app.project_name - assert app.desktop_class.save_project(project_name=project_name, project_path=new_project_path) + assert app.desktop.save_project(project_name=project_name, project_path=new_project_path) assert new_project_path.exists() assert app.project_name == "new_3" app.close_project(app.project_name, save=False) diff --git a/tests/system/general/test_hfss.py b/tests/system/general/test_hfss.py index 6509f579437a..cb4ef1fc7133 100644 --- a/tests/system/general/test_hfss.py +++ b/tests/system/general/test_hfss.py @@ -1751,7 +1751,7 @@ def test_set_phase_center_per_port(aedt_app): name="Wave2", renormalize=False, ) - if aedt_app.desktop_class.is_grpc_api: + if aedt_app.desktop.is_grpc_api: assert aedt_app.set_phase_center_per_port() assert aedt_app.set_phase_center_per_port(["Global", "Global"]) else: diff --git a/tests/system/general/test_message_manager.py b/tests/system/general/test_message_manager.py index e8e299da4a14..c14ac34adc90 100644 --- a/tests/system/general/test_message_manager.py +++ b/tests/system/general/test_message_manager.py @@ -143,5 +143,5 @@ def test_messaging(icepak_app): # pragma: no cover assert len(msg.aedt_messages.design_level) >= 4 settings.enable_desktop_logs = False - assert icepak_app.desktop_class.messenger - assert icepak_app.desktop_class.clear_messages() + assert icepak_app.desktop.messenger + assert icepak_app.desktop.clear_messages() diff --git a/tests/system/general/test_twinbuilder.py b/tests/system/general/test_twinbuilder.py index 628cd1ab1785..dd4dd85736b2 100644 --- a/tests/system/general/test_twinbuilder.py +++ b/tests/system/general/test_twinbuilder.py @@ -235,7 +235,7 @@ def test_add_excitation_model(add_app, test_tmp_dir): design="2 simplorer circuit", ) project_name = tb.project_name - dkp = tb.desktop_class + dkp = tb.desktop maxwell_app = dkp[[project_name, "1 maxwell busbar"]] assert not tb.add_excitation_model(project="invalid", design="1 maxwell busbar") diff --git a/tests/system/layout/test_3dlayout_modeler.py b/tests/system/layout/test_3dlayout_modeler.py index 54e2c8fba28a..5ef5c2f4a025 100644 --- a/tests/system/layout/test_3dlayout_modeler.py +++ b/tests/system/layout/test_3dlayout_modeler.py @@ -1003,7 +1003,7 @@ def test_import_gerber(aedt_app, test_tmp_dir): ) assert aedt_app.modeler.polygons aedt_app.close_project(save=False) - aedt_app.desktop_class.active_project(active_project) + aedt_app.desktop.active_project(active_project) @pytest.mark.skipif(is_linux, reason="Fails in linux") @@ -1022,7 +1022,7 @@ def test_import_gds(aedt_app, test_tmp_dir): assert aedt_app.import_gds(str(gds_file), output_dir=str(aedb_file), control_file=str(control_file)) aedt_app.close_project(save=False) - aedt_app.desktop_class.active_project(active_project) + aedt_app.desktop.active_project(active_project) @pytest.mark.skipif(is_linux, reason="Fails in linux") @@ -1038,7 +1038,7 @@ def test_import_dxf(aedt_app, test_tmp_dir): assert aedt_app.import_gerber(str(dxf_file), output_dir=str(aedb_file), control_file=str(control_file)) aedt_app.close_project(save=False) - aedt_app.desktop_class.active_project(active_project) + aedt_app.desktop.active_project(active_project) def test_import_ipc(aedt_app, test_tmp_dir): @@ -1049,7 +1049,7 @@ def test_import_ipc(aedt_app, test_tmp_dir): assert aedt_app.import_ipc2581(str(ipc_file), output_dir=str(aedb_file), control_file="") aedt_app.close_project(save=False) - aedt_app.desktop_class.active_project(active_project) + aedt_app.desktop.active_project(active_project) @pytest.mark.skipif(DESKTOP_VERSION < "2022.2", reason="Not working on AEDT 22R1") diff --git a/tests/system/solvers/sequential/test_launch_desktop.py b/tests/system/solvers/sequential/test_launch_desktop.py index a5d0edd20009..924755b8fe43 100644 --- a/tests/system/solvers/sequential/test_launch_desktop.py +++ b/tests/system/solvers/sequential/test_launch_desktop.py @@ -273,8 +273,8 @@ def test_run_desktop_rmxprt(desktop): def test_run_desktop_settings(desktop): aedtapp = Hfss() - assert aedtapp.desktop_class.disable_optimetrics() + assert aedtapp.desktop.disable_optimetrics() assert aedtapp.get_registry_key_int("Desktop/Settings/ProjectOptions/EnableLegacyOptimetricsTools") == 0 - assert aedtapp.desktop_class.enable_optimetrics() + assert aedtapp.desktop.enable_optimetrics() assert aedtapp.get_registry_key_int("Desktop/Settings/ProjectOptions/EnableLegacyOptimetricsTools") == 1 aedtapp.close_project(save=False) diff --git a/tests/system/solvers/test_pdf.py b/tests/system/solvers/test_pdf.py index 17b92bc7cdf4..b578f4116140 100644 --- a/tests/system/solvers/test_pdf.py +++ b/tests/system/solvers/test_pdf.py @@ -179,7 +179,7 @@ def test_virtual_compliance(aedt_app, test_tmp_dir): ) vc.save_configuration(compliance_folder / "main.json") assert (compliance_folder / "main.json").exists() - v = VirtualCompliance(aedt_app.desktop_class, compliance_folder / "main.json") + v = VirtualCompliance(aedt_app.desktop, compliance_folder / "main.json") assert v.create_compliance_report(close_project=False) diff --git a/tests/unit/extensions/test_kernel_converter.py b/tests/unit/extensions/test_kernel_converter.py index da70e04df21d..2875fd7860d4 100644 --- a/tests/unit/extensions/test_kernel_converter.py +++ b/tests/unit/extensions/test_kernel_converter.py @@ -42,12 +42,12 @@ @pytest.fixture def desktop(): """Fixture to mock Desktop.""" - with patch("ansys.aedt.core.extensions.common.kernel_converter.Desktop") as mock_desktop_class: + with patch("ansys.aedt.core.extensions.common.kernel_converter.Desktop") as mock_desktop: mock_desktop_instance = MagicMock() mock_desktop_instance.aedt_process_id = 12345 mock_desktop_instance.design_list.return_value = ["Design1", "Design2"] mock_desktop_instance.odesktop.NewProject.return_value = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance yield mock_desktop_instance @@ -209,7 +209,7 @@ def test_main_function_no_file_path(): @patch("ansys.aedt.core.extensions.common.kernel_converter._convert_aedt") @patch("ansys.aedt.core.extensions.common.kernel_converter._convert_3d_component") def test_main_function_with_directory( - mock_convert_3d_component, mock_convert_aedt, mock_desktop_class, mock_search_files, mock_app + mock_convert_3d_component, mock_convert_aedt, mock_desktop, mock_search_files, mock_app ): """Test main function with directory path.""" # Mock search_files to return test files @@ -220,7 +220,7 @@ def test_main_function_with_directory( # Mock Desktop mock_desktop_instance = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance data = KernelConverterExtensionData(file_path="/path/to/directory") @@ -235,11 +235,11 @@ def test_main_function_with_directory( @patch("ansys.aedt.core.extensions.common.kernel_converter.Desktop") @patch("ansys.aedt.core.extensions.common.kernel_converter._convert_aedt") -def test_main_function_with_single_file(mock_convert_aedt, mock_desktop_class, mock_app): +def test_main_function_with_single_file(mock_convert_aedt, mock_desktop, mock_app): """Test main function with single file path.""" # Mock Desktop mock_desktop_instance = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance data = KernelConverterExtensionData(file_path="/path/to/test.aedt") @@ -254,11 +254,11 @@ def test_main_function_with_single_file(mock_convert_aedt, mock_desktop_class, m @patch("ansys.aedt.core.extensions.common.kernel_converter.Desktop") @patch("ansys.aedt.core.extensions.common.kernel_converter._convert_3d_component") -def test_main_function_with_3d_component(mock_convert_3d, mock_desktop_class, mock_app): +def test_main_function_with_3d_component(mock_convert_3d, mock_desktop, mock_app): """Test main function with 3D component file.""" # Mock Desktop mock_desktop_instance = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance data = KernelConverterExtensionData(file_path="/path/to/test.a3dcomp") @@ -272,11 +272,11 @@ def test_main_function_with_3d_component(mock_convert_3d, mock_desktop_class, mo @patch("ansys.aedt.core.extensions.common.kernel_converter.Desktop") -def test_main_function_with_exception_handling(mock_desktop_class, caplog): +def test_main_function_with_exception_handling(mock_desktop, caplog): """Test main function exception handling.""" # Mock Desktop mock_desktop_instance = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance data = KernelConverterExtensionData(file_path="/path/to/test.aedt") diff --git a/tests/unit/extensions/test_version_manager.py b/tests/unit/extensions/test_version_manager.py index 3727bb1c8d24..d6540b97e1a4 100644 --- a/tests/unit/extensions/test_version_manager.py +++ b/tests/unit/extensions/test_version_manager.py @@ -902,17 +902,15 @@ def test_check_for_pyaedt_update_on_startup_exception_in_after(mock_get_logger, @patch("ansys.aedt.core.extensions.installer.version_manager.get_aedt_version") @patch("ansys.aedt.core.extensions.installer.version_manager.get_process_id") @patch("ansys.aedt.core.extensions.installer.version_manager.ansys.aedt.core.Desktop") -def test_get_desktop_with_existing_process( - mock_desktop_class, mock_get_process_id, mock_get_aedt_version, mock_get_port -): +def test_get_desktop_with_existing_process(mock_desktop, mock_get_process_id, mock_get_aedt_version, mock_get_port): """Test get_desktop when AEDT process already exists.""" mock_get_port.return_value = 12345 mock_get_aedt_version.return_value = "2024.1" mock_get_process_id.return_value = 9876 mock_desktop_instance = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance result = vm.get_desktop() - mock_desktop_class.assert_called_once_with(new_desktop=False, version="2024.1", port=12345, non_graphical=False) + mock_desktop.assert_called_once_with(new_desktop=False, version="2024.1", port=12345, non_graphical=False) assert result == mock_desktop_instance @@ -920,15 +918,13 @@ def test_get_desktop_with_existing_process( @patch("ansys.aedt.core.extensions.installer.version_manager.get_aedt_version") @patch("ansys.aedt.core.extensions.installer.version_manager.get_process_id") @patch("ansys.aedt.core.extensions.installer.version_manager.ansys.aedt.core.Desktop") -def test_get_desktop_without_existing_process( - mock_desktop_class, mock_get_process_id, mock_get_aedt_version, mock_get_port -): +def test_get_desktop_without_existing_process(mock_desktop, mock_get_process_id, mock_get_aedt_version, mock_get_port): """Test get_desktop when no AEDT process exists.""" mock_get_port.return_value = 54321 mock_get_aedt_version.return_value = "2023.2" mock_get_process_id.return_value = None mock_desktop_instance = MagicMock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance result = vm.get_desktop() - mock_desktop_class.assert_called_once_with(new_desktop=True, version="2023.2", port=54321, non_graphical=True) + mock_desktop.assert_called_once_with(new_desktop=True, version="2023.2", port=54321, non_graphical=True) assert result == mock_desktop_instance diff --git a/tests/unit/extensions/test_via_clustering.py b/tests/unit/extensions/test_via_clustering.py index c378887c9394..5e9fa1c18712 100644 --- a/tests/unit/extensions/test_via_clustering.py +++ b/tests/unit/extensions/test_via_clustering.py @@ -169,7 +169,7 @@ def test_via_clustering_extension_add_layer_button(mock_hfss_3d_layout_app_with_ # Verify that usp was set to True assert mock_layer.usp is True # Verify desktop was released - mock_hfss.desktop_class.release_desktop.assert_called_once_with(False, False) + mock_hfss.desktop.release_desktop.assert_called_once_with(False, False) extension.root.destroy() @@ -221,7 +221,7 @@ def test_via_clustering_extension_merge_vias_button_with_primitives(mock_hfss_3d assert extension.data.contour_list == expected_contours # Verify desktop was released - mock_hfss.desktop_class.release_desktop.assert_called_once_with(False, False) + mock_hfss.desktop.release_desktop.assert_called_once_with(False, False) def test_via_clustering_extension_merge_vias_unsupported_primitive(mock_hfss_3d_layout_app_with_layers): @@ -364,7 +364,7 @@ def test_main_function_without_pytest_env(): # Verify HFSS 3D Layout was instantiated and used mock_logger.info.assert_called_once_with("Project generated correctly.") - mock_h3d.desktop_class.release_desktop.assert_called_once_with(False, False) + mock_h3d.desktop.release_desktop.assert_called_once_with(False, False) def test_via_clustering_extension_wrong_design_type(): diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py index 893a784b4f8a..a4b47e208ef0 100644 --- a/tests/unit/test_cli.py +++ b/tests/unit/test_cli.py @@ -362,7 +362,7 @@ def test_stop_command_by_port_no_port_info(mock_get_port, mock_process_iter, cli def mock_start_command(): """Mock all dependencies for the start command tests.""" with ( - patch("ansys.aedt.core.desktop.Desktop") as mock_desktop_class, + patch("ansys.aedt.core.desktop.Desktop") as mock_desktop, patch("ansys.aedt.core.settings") as mock_settings, patch("threading.Thread") as mock_thread, patch("time.sleep") as mock_sleep, @@ -372,10 +372,10 @@ def mock_start_command(): # Configure mock Desktop class to return a mock instance mock_desktop_instance = Mock() - mock_desktop_class.return_value = mock_desktop_instance + mock_desktop.return_value = mock_desktop_instance yield { - "desktop_class": mock_desktop_class, + "desktop": mock_desktop, "desktop_instance": mock_desktop_instance, "settings": mock_settings, "thread": mock_thread, diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index b8e6f14c5335..0c020093a00f 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -308,14 +308,14 @@ def old_method(self): dummy.old_method() -def test_min_aedt_version_success_with_desktop_class(): +def test_min_aedt_version_success_with_desktop(): class Dummy: """Dummy class to test min version with __app attribute.""" odesktop = MagicMock() odesktop.GetVersion.return_value = CURRENT_YEAR_VERSION - desktop_class = MagicMock() - desktop_class.odesktop = odesktop + desktop = MagicMock() + desktop.odesktop = odesktop @min_aedt_version(PREVIOUS_YEAR_VERSION) def old_method(self): From 41e5e719d76b03dfc7f127e33e4bdccb1aea897a Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Sun, 25 Jan 2026 14:55:10 +0000 Subject: [PATCH 02/14] chore: adding changelog file 7150.miscellaneous.md [dependabot-skip] --- doc/changelog.d/7150.miscellaneous.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/7150.miscellaneous.md diff --git a/doc/changelog.d/7150.miscellaneous.md b/doc/changelog.d/7150.miscellaneous.md new file mode 100644 index 000000000000..fb1d7ff37a31 --- /dev/null +++ b/doc/changelog.d/7150.miscellaneous.md @@ -0,0 +1 @@ +Change property \"desktop_class\" to \"desktop\" From 26b8f02c20eaff6211d270625243abbdabf1f0ba Mon Sep 17 00:00:00 2001 From: Devin Date: Fri, 6 Feb 2026 11:46:51 -0600 Subject: [PATCH 03/14] Fix local download - Fix #7202 (incorrect handling of file) - Remove incorrectly handled debug statements. - Add unit test when using local repo to test example data. --- src/ansys/aedt/core/examples/downloads.py | 23 ++- .../core/visualization/post/solution_data.py | 4 +- tests/unit/test_downloads.py | 190 ++++++++++++++++++ 3 files changed, 209 insertions(+), 8 deletions(-) diff --git a/src/ansys/aedt/core/examples/downloads.py b/src/ansys/aedt/core/examples/downloads.py index e0f2163218c0..c5e26f634371 100644 --- a/src/ansys/aedt/core/examples/downloads.py +++ b/src/ansys/aedt/core/examples/downloads.py @@ -118,13 +118,24 @@ def _copy_local_example( source_relative_path: str, target_path: Optional[Union[str, Path]] = None, ) -> Path: # pragma: no cover - """Copy a folder from a local copy of the examples repo.""" - dst = Path(target_path) / Path(source_relative_path).name + """Copy a file or folder from a local copy of the examples repo.""" + pyaedt_logger.debug(f"Retrieving local example from '{settings.local_example_folder}'") + source = Path(settings.local_example_folder) / source_relative_path + target_path = Path(target_path) + + if source.is_file(): + target_path.mkdir(parents=True, exist_ok=True) + dst = target_path / source.name + try: + shutil.copy2(source, dst) + except Exception as e: + raise AEDTRuntimeError(f"Failed to copy {str(source)}.") from e + return dst + + dst = target_path / Path(source_relative_path).name dst.mkdir(parents=True, exist_ok=True) - pyaedt_logger.debug(f"Retrieving local folder from '{settings.local_example_folder}'") - source_folder = Path(settings.local_example_folder) / source_relative_path - for p in source_folder.rglob("*"): - target = dst / p.relative_to(source_folder) + for p in source.rglob("*"): + target = dst / p.relative_to(source) if p.is_dir(): target.mkdir(parents=True, exist_ok=True) else: diff --git a/src/ansys/aedt/core/visualization/post/solution_data.py b/src/ansys/aedt/core/visualization/post/solution_data.py index b362a6033405..18cbc9b02f26 100644 --- a/src/ansys/aedt/core/visualization/post/solution_data.py +++ b/src/ansys/aedt/core/visualization/post/solution_data.py @@ -72,11 +72,11 @@ def __init__(self, aedtdata): else: self._primary_sweep = self._sweeps_names[0] end = time.time() - start - print(f"Time to initialize solution data:{end}") + settings.logger.debug(f"Time to initialize solution data:{end}") self.init_solutions_data() self._ifft = None end = time.time() - start - print(f"Time to initialize solution data:{end}") + settings.logger.debug(f"Time to initialize solution data:{end}") @property def active_variation(self): diff --git a/tests/unit/test_downloads.py b/tests/unit/test_downloads.py index d7837ecaf3a0..e5668f021b25 100644 --- a/tests/unit/test_downloads.py +++ b/tests/unit/test_downloads.py @@ -23,12 +23,15 @@ # SOFTWARE. from pathlib import Path +from unittest.mock import patch import pytest from ansys.aedt.core.examples import downloads +from ansys.aedt.core.examples.downloads import _copy_local_example from ansys.aedt.core.generic.file_utils import generate_unique_name from ansys.aedt.core.generic.settings import is_linux +from ansys.aedt.core.internal.errors import AEDTRuntimeError @pytest.fixture(scope="module", autouse=True) @@ -120,3 +123,190 @@ def test_download_icepak_3d_component(test_tmp_dir): def test_download_fss_file(test_tmp_dir): example_folder = downloads.download_fss_3dcomponent(local_path=test_tmp_dir) assert Path(example_folder).exists() + + +# ================================ +# _copy_local_example unit tests +# ================================ + + +@pytest.fixture +def local_example_folder(test_tmp_dir): + """Create a mock local example folder structure for testing.""" + example_root = test_tmp_dir / "mock_example_data" + example_root.mkdir(parents=True, exist_ok=True) + return example_root + + +@pytest.fixture +def mock_settings(local_example_folder): + """Patch settings.local_example_folder to use the mock folder.""" + with patch("ansys.aedt.core.examples.downloads.settings") as mock_settings: + mock_settings.local_example_folder = str(local_example_folder) + yield mock_settings + + +class TestCopyLocalExampleFile: + """Tests for _copy_local_example when source is a file.""" + + def test_copy_single_file(self, test_tmp_dir, local_example_folder, mock_settings): + """Test copying a single file to target directory.""" + # Create a source file + source_file = local_example_folder / "test_file.txt" + source_file.write_text("test content") + + # Copy the file + target_dir = test_tmp_dir / "target" + result = _copy_local_example("test_file.txt", target_dir) + + # Verify + assert result.exists() + assert result.is_file() + assert result.name == "test_file.txt" + assert result.parent == target_dir + assert result.read_text() == "test content" + + def test_copy_file_in_subdirectory(self, test_tmp_dir, local_example_folder, mock_settings): + """Test copying a file from a subdirectory.""" + # Create a source file in a subdirectory + subdir = local_example_folder / "pyaedt" / "sbr" + subdir.mkdir(parents=True) + source_file = subdir / "Cassegrain.aedt" + source_file.write_text("aedt file content") + + # Copy the file + target_dir = test_tmp_dir / "target" + result = _copy_local_example("pyaedt/sbr/Cassegrain.aedt", target_dir) + + # Verify + assert result.exists() + assert result.is_file() + assert result.name == "Cassegrain.aedt" + assert result.parent == target_dir + assert result.read_text() == "aedt file content" + + def test_copy_file_creates_target_directory(self, test_tmp_dir, local_example_folder, mock_settings): + """Test that target directory is created if it doesn't exist.""" + # Create a source file + source_file = local_example_folder / "test_file.txt" + source_file.write_text("test content") + + # Copy to a non-existent nested target directory + target_dir = test_tmp_dir / "nested" / "target" / "dir" + assert not target_dir.exists() + + result = _copy_local_example("test_file.txt", target_dir) + + # Verify target directory was created + assert target_dir.exists() + assert result.exists() + + +class TestCopyLocalExampleFolder: + """Tests for _copy_local_example when source is a folder.""" + + def test_copy_folder_with_files(self, test_tmp_dir, local_example_folder, mock_settings): + """Test copying a folder containing multiple files.""" + # Create a source folder with files + source_folder = local_example_folder / "test_folder" + source_folder.mkdir() + (source_folder / "file1.txt").write_text("content 1") + (source_folder / "file2.txt").write_text("content 2") + + # Copy the folder + target_dir = test_tmp_dir / "target" + result = _copy_local_example("test_folder", target_dir) + + # Verify + assert result.exists() + assert result.is_dir() + assert result.name == "test_folder" + assert (result / "file1.txt").read_text() == "content 1" + assert (result / "file2.txt").read_text() == "content 2" + + def test_copy_folder_with_nested_structure(self, test_tmp_dir, local_example_folder, mock_settings): + """Test copying a folder with nested subdirectories.""" + # Create a source folder with nested structure + source_folder = local_example_folder / "parent_folder" + source_folder.mkdir() + (source_folder / "root_file.txt").write_text("root content") + + nested = source_folder / "subdir1" / "subdir2" + nested.mkdir(parents=True) + (nested / "nested_file.txt").write_text("nested content") + + # Copy the folder + target_dir = test_tmp_dir / "target" + result = _copy_local_example("parent_folder", target_dir) + + # Verify + assert result.exists() + assert (result / "root_file.txt").read_text() == "root content" + assert (result / "subdir1" / "subdir2" / "nested_file.txt").read_text() == "nested content" + + def test_copy_folder_preserves_empty_subdirectories(self, test_tmp_dir, local_example_folder, mock_settings): + """Test that empty subdirectories are preserved when copying.""" + # Create a source folder with an empty subdirectory + source_folder = local_example_folder / "folder_with_empty" + source_folder.mkdir() + (source_folder / "empty_subdir").mkdir() + (source_folder / "file.txt").write_text("content") + + # Copy the folder + target_dir = test_tmp_dir / "target" + result = _copy_local_example("folder_with_empty", target_dir) + + # Verify empty subdirectory exists + assert (result / "empty_subdir").exists() + assert (result / "empty_subdir").is_dir() + + def test_copy_folder_from_subdirectory(self, test_tmp_dir, local_example_folder, mock_settings): + """Test copying a folder from a subdirectory path.""" + # Create nested source folder + pyaedt = local_example_folder / "pyaedt" + pyaedt.mkdir() + source_folder = pyaedt / "custom_reports" + source_folder.mkdir() + (source_folder / "report.json").write_text('{"key": "value"}') + + # Copy the folder + target_dir = test_tmp_dir / "target" + result = _copy_local_example("pyaedt/custom_reports", target_dir) + + # Verify + assert result.exists() + assert result.name == "custom_reports" + assert (result / "report.json").read_text() == '{"key": "value"}' + + +class TestCopyLocalExampleErrors: + """Tests for error handling in _copy_local_example.""" + + def test_copy_file_raises_error_on_failure(self, test_tmp_dir, local_example_folder, mock_settings): + """Test that AEDTRuntimeError is raised when file copy fails.""" + # Create a source file + source_file = local_example_folder / "test_file.txt" + source_file.write_text("test content") + + target_dir = test_tmp_dir / "target" + + # Mock shutil.copy2 to raise an exception + with patch("ansys.aedt.core.examples.downloads.shutil.copy2") as mock_copy: + mock_copy.side_effect = PermissionError("Access denied") + with pytest.raises(AEDTRuntimeError, match="Failed to copy"): + _copy_local_example("test_file.txt", target_dir) + + def test_copy_folder_raises_error_on_failure(self, test_tmp_dir, local_example_folder, mock_settings): + """Test that AEDTRuntimeError is raised when folder file copy fails.""" + # Create a source folder with a file + source_folder = local_example_folder / "test_folder" + source_folder.mkdir() + (source_folder / "file.txt").write_text("content") + + target_dir = test_tmp_dir / "target" + + # Mock shutil.copy2 to raise an exception + with patch("ansys.aedt.core.examples.downloads.shutil.copy2") as mock_copy: + mock_copy.side_effect = PermissionError("Access denied") + with pytest.raises(AEDTRuntimeError, match="Failed to copy"): + _copy_local_example("test_folder", target_dir) From c547b03595cb841aa68cfb163a18ac0c8459c86e Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Fri, 6 Feb 2026 17:51:52 +0000 Subject: [PATCH 04/14] chore: adding changelog file 7212.fixed.md [dependabot-skip] --- doc/changelog.d/7212.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/7212.fixed.md diff --git a/doc/changelog.d/7212.fixed.md b/doc/changelog.d/7212.fixed.md new file mode 100644 index 000000000000..5df6470b769c --- /dev/null +++ b/doc/changelog.d/7212.fixed.md @@ -0,0 +1 @@ +Local access to file in example-data repo From dd53d4e8b733efc5a3bd8af0c06a9e804a29cbc3 Mon Sep 17 00:00:00 2001 From: Devin Date: Sat, 7 Feb 2026 08:57:03 -0600 Subject: [PATCH 05/14] Convert test_tmp_dir from a return fixture to a yield fixture. cleans up its own directory after teardown, preventing race conditions when pytest-xdist workers tear down module-scoped file_tmp_root while function-scoped fixtures still need the directory. --- tests/conftest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 08341f9e0070..6cda5611f725 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -263,7 +263,8 @@ def test_tmp_dir(file_tmp_root, request): if d.exists(): shutil.rmtree(d, ignore_errors=True) d.mkdir(parents=True, exist_ok=True) - return d + yield d + shutil.rmtree(d, ignore_errors=True) @pytest.fixture From 03a747f1f86f1fdd8f21c344094a2bc2e2916463 Mon Sep 17 00:00:00 2001 From: Devin Date: Sat, 7 Feb 2026 15:08:13 -0600 Subject: [PATCH 06/14] Allow for delay after simulation is started - Add while loop in test_analyze.py test_3dl_analyze_setup() --- tests/system/solvers/test_analyze.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/system/solvers/test_analyze.py b/tests/system/solvers/test_analyze.py index 9cf016d6db3b..0aebb0170a41 100644 --- a/tests/system/solvers/test_analyze.py +++ b/tests/system/solvers/test_analyze.py @@ -152,7 +152,12 @@ def test_3dl_analyze_setup(hfss3dl_solve): with pytest.raises(AEDTRuntimeError): hfss3dl_solve.set_export_touchstone() assert hfss3dl_solve.analyze_setup("Setup1", cores=4, blocking=False) - assert hfss3dl_solve.are_there_simulations_running + running = hfss3dl_solve.are_there_simulations_running + start = time.time() + while not running and time.time() - start < 10: + time.sleep(0.5) + running = hfss3dl_solve.are_there_simulations_running + assert running assert hfss3dl_solve.stop_simulations() while hfss3dl_solve.are_there_simulations_running: time.sleep(1) From 534beaf914e4ef6e811e2e8ce3302e9f7cd79e49 Mon Sep 17 00:00:00 2001 From: Devin Date: Sun, 8 Feb 2026 13:20:15 -0600 Subject: [PATCH 07/14] Add logging to help debug test failure on Linux --- tests/system/solvers/test_analyze.py | 67 ++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/tests/system/solvers/test_analyze.py b/tests/system/solvers/test_analyze.py index 0aebb0170a41..f1b39ba9d5bc 100644 --- a/tests/system/solvers/test_analyze.py +++ b/tests/system/solvers/test_analyze.py @@ -144,30 +144,91 @@ def test_3dl_generate_mesh(hfss3dl_solve): @pytest.mark.skipif(DESKTOP_VERSION < "2023.2", reason="Working only from 2023 R2") def test_3dl_analyze_setup(hfss3dl_solve): + logger = hfss3dl_solve.logger + logger.info("test_3dl_analyze_setup: START") + logger.info(f"test_3dl_analyze_setup: project_name={hfss3dl_solve.project_name}") + logger.info(f"test_3dl_analyze_setup: design_name={hfss3dl_solve.design_name}") + logger.info(f"test_3dl_analyze_setup: setup_names={hfss3dl_solve.setup_names}") + logger.info(f"test_3dl_analyze_setup: DESKTOP_VERSION={DESKTOP_VERSION}") + logger.info(f"test_3dl_analyze_setup: project_list={hfss3dl_solve.desktop_class.project_list}") + assert hfss3dl_solve.export_touchstone_on_completion(export=False) + logger.info("test_3dl_analyze_setup: export_touchstone_on_completion(False) OK") assert hfss3dl_solve.export_touchstone_on_completion(export=True) + logger.info("test_3dl_analyze_setup: export_touchstone_on_completion(True) OK") if DESKTOP_VERSION > "2024.2": assert hfss3dl_solve.set_export_touchstone() + logger.info("test_3dl_analyze_setup: set_export_touchstone() OK") else: with pytest.raises(AEDTRuntimeError): hfss3dl_solve.set_export_touchstone() - assert hfss3dl_solve.analyze_setup("Setup1", cores=4, blocking=False) + logger.info("test_3dl_analyze_setup: set_export_touchstone() raised AEDTRuntimeError as expected") + + logger.info("test_3dl_analyze_setup: calling analyze_setup('Setup1', cores=4, blocking=False)") + analyze_result = hfss3dl_solve.analyze_setup("Setup1", cores=4, blocking=False) + logger.info(f"test_3dl_analyze_setup: analyze_setup returned {analyze_result}") + assert analyze_result + running = hfss3dl_solve.are_there_simulations_running + logger.info(f"test_3dl_analyze_setup: initial are_there_simulations_running={running}") start = time.time() + poll_count = 0 while not running and time.time() - start < 10: time.sleep(0.5) running = hfss3dl_solve.are_there_simulations_running - assert running - assert hfss3dl_solve.stop_simulations() + poll_count += 1 + logger.info( + f"test_3dl_analyze_setup: poll #{poll_count} at {time.time() - start:.1f}s, " + f"are_there_simulations_running={running}" + ) + elapsed_poll = time.time() - start + logger.info( + f"test_3dl_analyze_setup: polling loop done after {elapsed_poll:.1f}s, " + f"poll_count={poll_count}, running={running}" + ) + + if not running: + setup_solved = hfss3dl_solve.setups[0].is_solved if hfss3dl_solve.setups else None + logger.warning( + f"test_3dl_analyze_setup: simulations NOT detected as running. " + f"setup_solved={setup_solved}, num_setups={len(hfss3dl_solve.setups)}" + ) + assert running, ( + f"Simulations not detected as running after {elapsed_poll:.1f}s " + f"(poll_count={poll_count}). Check AEDT logs for errors." + ) + + stop_result = hfss3dl_solve.stop_simulations() + logger.info(f"test_3dl_analyze_setup: stop_simulations returned {stop_result}") + assert stop_result + + wait_start = time.time() + wait_count = 0 while hfss3dl_solve.are_there_simulations_running: time.sleep(1) + wait_count += 1 + logger.info( + f"test_3dl_analyze_setup: waiting for simulations to stop, " + f"iteration #{wait_count}, elapsed={time.time() - wait_start:.1f}s" + ) + logger.info( + f"test_3dl_analyze_setup: simulations stopped after {time.time() - wait_start:.1f}s, " + f"wait_count={wait_count}" + ) + profile = hfss3dl_solve.setups[0].get_profile() + logger.info(f"test_3dl_analyze_setup: profile keys={list(profile.keys()) if profile else None}") key0 = list(profile.keys())[0] assert key0 == "Setup1" assert isinstance(profile[key0], SimulationProfile) + logger.info( + f"test_3dl_analyze_setup: elapsed_time={profile[key0].elapsed_time}, " + f"product={profile[key0].product}, max_memory={profile[key0].max_memory()}" + ) assert profile[key0].elapsed_time > timedelta(0) assert profile[key0].product == "HFSS3DLayout" assert profile[key0].max_memory() > MemoryGB(0.01) + logger.info("test_3dl_analyze_setup: PASS") def test_3dl_export_profile(hfss3dl_solved, test_tmp_dir): From f60815dcca50e04a6dc5fcb0f009303b30913522 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Feb 2026 19:21:09 +0000 Subject: [PATCH 08/14] CHORE: Auto fixes from pre-commit hooks --- tests/system/solvers/test_analyze.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/system/solvers/test_analyze.py b/tests/system/solvers/test_analyze.py index f1b39ba9d5bc..de19bb2bf2e0 100644 --- a/tests/system/solvers/test_analyze.py +++ b/tests/system/solvers/test_analyze.py @@ -212,8 +212,7 @@ def test_3dl_analyze_setup(hfss3dl_solve): f"iteration #{wait_count}, elapsed={time.time() - wait_start:.1f}s" ) logger.info( - f"test_3dl_analyze_setup: simulations stopped after {time.time() - wait_start:.1f}s, " - f"wait_count={wait_count}" + f"test_3dl_analyze_setup: simulations stopped after {time.time() - wait_start:.1f}s, wait_count={wait_count}" ) profile = hfss3dl_solve.setups[0].get_profile() From fd110e64b7ac429695784e0b74cf9f068dca4b3d Mon Sep 17 00:00:00 2001 From: Devin Date: Sun, 8 Feb 2026 14:43:05 -0600 Subject: [PATCH 09/14] Minimal logging in test_3dl_analyze_setup --- tests/system/solvers/test_analyze.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/tests/system/solvers/test_analyze.py b/tests/system/solvers/test_analyze.py index f1b39ba9d5bc..216fac598877 100644 --- a/tests/system/solvers/test_analyze.py +++ b/tests/system/solvers/test_analyze.py @@ -145,24 +145,14 @@ def test_3dl_generate_mesh(hfss3dl_solve): @pytest.mark.skipif(DESKTOP_VERSION < "2023.2", reason="Working only from 2023 R2") def test_3dl_analyze_setup(hfss3dl_solve): logger = hfss3dl_solve.logger - logger.info("test_3dl_analyze_setup: START") - logger.info(f"test_3dl_analyze_setup: project_name={hfss3dl_solve.project_name}") - logger.info(f"test_3dl_analyze_setup: design_name={hfss3dl_solve.design_name}") - logger.info(f"test_3dl_analyze_setup: setup_names={hfss3dl_solve.setup_names}") - logger.info(f"test_3dl_analyze_setup: DESKTOP_VERSION={DESKTOP_VERSION}") - logger.info(f"test_3dl_analyze_setup: project_list={hfss3dl_solve.desktop_class.project_list}") assert hfss3dl_solve.export_touchstone_on_completion(export=False) - logger.info("test_3dl_analyze_setup: export_touchstone_on_completion(False) OK") assert hfss3dl_solve.export_touchstone_on_completion(export=True) - logger.info("test_3dl_analyze_setup: export_touchstone_on_completion(True) OK") if DESKTOP_VERSION > "2024.2": assert hfss3dl_solve.set_export_touchstone() - logger.info("test_3dl_analyze_setup: set_export_touchstone() OK") else: with pytest.raises(AEDTRuntimeError): hfss3dl_solve.set_export_touchstone() - logger.info("test_3dl_analyze_setup: set_export_touchstone() raised AEDTRuntimeError as expected") logger.info("test_3dl_analyze_setup: calling analyze_setup('Setup1', cores=4, blocking=False)") analyze_result = hfss3dl_solve.analyze_setup("Setup1", cores=4, blocking=False) @@ -207,29 +197,15 @@ def test_3dl_analyze_setup(hfss3dl_solve): while hfss3dl_solve.are_there_simulations_running: time.sleep(1) wait_count += 1 - logger.info( - f"test_3dl_analyze_setup: waiting for simulations to stop, " - f"iteration #{wait_count}, elapsed={time.time() - wait_start:.1f}s" - ) - logger.info( - f"test_3dl_analyze_setup: simulations stopped after {time.time() - wait_start:.1f}s, " - f"wait_count={wait_count}" - ) profile = hfss3dl_solve.setups[0].get_profile() logger.info(f"test_3dl_analyze_setup: profile keys={list(profile.keys()) if profile else None}") key0 = list(profile.keys())[0] assert key0 == "Setup1" assert isinstance(profile[key0], SimulationProfile) - logger.info( - f"test_3dl_analyze_setup: elapsed_time={profile[key0].elapsed_time}, " - f"product={profile[key0].product}, max_memory={profile[key0].max_memory()}" - ) assert profile[key0].elapsed_time > timedelta(0) assert profile[key0].product == "HFSS3DLayout" assert profile[key0].max_memory() > MemoryGB(0.01) - logger.info("test_3dl_analyze_setup: PASS") - def test_3dl_export_profile(hfss3dl_solved, test_tmp_dir): profile_file = test_tmp_dir / "temp.prof" From 319ecebc27ffb70cd1f710c322a8bbd1c9d3c33b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Feb 2026 20:48:32 +0000 Subject: [PATCH 10/14] CHORE: Auto fixes from pre-commit hooks --- tests/system/solvers/test_analyze.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system/solvers/test_analyze.py b/tests/system/solvers/test_analyze.py index 216fac598877..85c7c3dffc2e 100644 --- a/tests/system/solvers/test_analyze.py +++ b/tests/system/solvers/test_analyze.py @@ -207,6 +207,7 @@ def test_3dl_analyze_setup(hfss3dl_solve): assert profile[key0].product == "HFSS3DLayout" assert profile[key0].max_memory() > MemoryGB(0.01) + def test_3dl_export_profile(hfss3dl_solved, test_tmp_dir): profile_file = test_tmp_dir / "temp.prof" profile_file = Path(hfss3dl_solved.export_profile("Setup1", output_file=profile_file)) From 63905384c9ad127e262c636ed6d2ba7a687821aa Mon Sep 17 00:00:00 2001 From: Devin Date: Tue, 10 Feb 2026 05:55:59 -0600 Subject: [PATCH 11/14] Change return to yield before removing test temp dir. --- tests/conftest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 5bf5e0c2598b..5f0682613114 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -262,7 +262,8 @@ def test_tmp_dir(file_tmp_root, request): if d.exists(): shutil.rmtree(d, ignore_errors=True) d.mkdir(parents=True, exist_ok=True) - return d + yield d + shutil.rmtree(d, ignore_errors=True) @pytest.fixture From 2c78b7cbb43afd9b8405f3b876117ba23e6255cf Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:59:36 +0000 Subject: [PATCH 12/14] chore: adding changelog file 7231.fixed.md [dependabot-skip] --- doc/changelog.d/7231.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/7231.fixed.md diff --git a/doc/changelog.d/7231.fixed.md b/doc/changelog.d/7231.fixed.md new file mode 100644 index 000000000000..03b1aebf1f11 --- /dev/null +++ b/doc/changelog.d/7231.fixed.md @@ -0,0 +1 @@ +Test Temp dir race condition From 79e054be4ea00f9b4a687d62eee609b770422a30 Mon Sep 17 00:00:00 2001 From: Devin <38879940+Devin-Crawford@users.noreply.github.com> Date: Tue, 10 Feb 2026 09:24:55 -0600 Subject: [PATCH 13/14] Apply suggestions from code review 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> --- tests/conftest.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 5f0682613114..7433f7ae642b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -263,7 +263,10 @@ def test_tmp_dir(file_tmp_root, request): shutil.rmtree(d, ignore_errors=True) d.mkdir(parents=True, exist_ok=True) yield d - shutil.rmtree(d, ignore_errors=True) + try: + shutil.rmtree(d, ignore_errors=True) + except Exception: + pyaedt_logger.warning(f"Failed to cleanup temporary directory {d}") @pytest.fixture From 07e7114773bedf72ad1da2474fded95b39bf79fa Mon Sep 17 00:00:00 2001 From: Devin Date: Sat, 14 Feb 2026 12:19:10 +0100 Subject: [PATCH 14/14] Teardown after yield in conftest --- tests/conftest.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7433f7ae642b..331677d3e9c3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -259,9 +259,6 @@ def desktop(tmp_path_factory, request): def test_tmp_dir(file_tmp_root, request): d = file_tmp_root / request.node.name.split("[", 1)[0] - if d.exists(): - shutil.rmtree(d, ignore_errors=True) - d.mkdir(parents=True, exist_ok=True) yield d try: shutil.rmtree(d, ignore_errors=True)