From 17daf930b1c015eb25381c3c62b7566433448f05 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Mon, 28 Apr 2025 09:10:20 +0200 Subject: [PATCH 1/8] Refactor name workflows to extensions --- .pre-commit-config.yaml | 2 +- codecov.yml | 4 +- doc/source/Getting_started/Installation.rst | 4 +- .../Resources/pyaedt_installer_from_aedt.py | 4 +- .../Resources/toolkit_installer_from_aedt.py | 2 +- .../pyaedt_extensions_doc/commandline.rst | 8 +-- .../project/kernel_convert.rst | 4 +- .../templates/getting_started.rst | 2 +- src/ansys/aedt/core/desktop.py | 2 +- .../{workflows => extensions}/__init__.py | 0 .../circuit/__init__.py | 0 .../circuit/images/large/schematic.png | Bin .../circuit/import_schematic.py | 16 ++--- .../circuit/toolkits_catalog.toml | 0 .../customize_automation_tab.py | 15 ++--- .../emit/__init__.py | 0 .../hfss/__init__.py | 0 .../hfss/choke_designer.py | 16 ++--- .../hfss/images/large/antenna.png | Bin .../hfss/images/large/choke.png | Bin .../hfss/images/large/cloud.png | Bin .../hfss/images/large/move_it.png | Bin .../hfss/images/large/push.png | Bin .../hfss/images/large/shielding.png | Bin .../{workflows => extensions}/hfss/move_it.py | 14 ++--- .../hfss/push_excitation_from_file.py | 16 ++--- .../hfss/shielding_effectiveness.py | 16 ++--- .../hfss/toolkits_catalog.toml | 0 .../hfss3dlayout/__init__.py | 0 .../hfss3dlayout/cutout.py | 16 ++--- .../hfss3dlayout/export_layout.py | 16 ++--- .../hfss3dlayout/export_to_3d.py | 16 ++--- .../generate_arbitrary_wave_ports.py | 14 ++--- .../images/large/arbitrary_wave_port.png | Bin .../hfss3dlayout/images/large/cad3d.png | Bin .../hfss3dlayout/images/large/cutout.png | Bin .../hfss3dlayout/images/large/export.png | Bin .../hfss3dlayout/images/large/parametrize.png | Bin .../large/post_layout_design_toolkit.png | Bin .../hfss3dlayout/images/large/push.png | Bin .../hfss3dlayout/images/large/via_merging.png | Bin .../hfss3dlayout/parametrize_edb.py | 16 ++--- .../post_layout_design_toolkit.py | 14 ++--- .../push_excitation_from_file_3dl.py | 16 ++--- .../hfss3dlayout/toolkits_catalog.toml | 0 .../hfss3dlayout/via_clustering_extension.py | 16 ++--- .../icepak/__init__.py | 0 .../icepak/images/large/power_map.png | Bin .../icepak/power_map_from_csv.py | 16 ++--- .../icepak/toolkits_catalog.toml | 0 .../images/large/logo.png | Bin .../images/large/pyansys.png | Bin .../installer/__init__.py | 0 .../installer/console_setup.py | 0 .../installer/extension_manager.py | 27 +++++---- .../installer/extensions_catalog.toml | 0 .../installer/images/large/console.png | Bin .../images/large/extension_manager.png | Bin .../installer/images/large/jupyter.png | Bin .../installer/images/large/run_script.png | Bin .../installer/jupyter_template.ipynb | 0 .../installer/pyaedt_installer.py | 6 +- .../maxwell2d/__init__.py | 0 .../maxwell2d/toolkits_catalog.toml | 0 .../maxwell3d/__init__.py | 0 .../maxwell3d/fields_distribution.py | 16 ++--- .../images/large/fields_distribution.png | Bin .../images/large/magnet_segmentation.png | Bin .../maxwell3d/toolkits_catalog.toml | 0 .../mechanical/__init__.py | 0 .../core/{workflows => extensions}/misc.py | 0 .../project/__init__.py | 0 .../project/advanced_fields_calculator.py | 16 ++--- .../project/configure_edb.py | 12 ++-- .../project/create_report.py | 10 ++-- .../project/images/large/aedb.png | Bin .../project/images/large/cad3d.png | Bin .../project/images/large/fields.png | Bin .../project/images/large/pdf.png | Bin .../project/images/large/version_manager.png | Bin .../project/import_nastran.py | 16 ++--- .../project/kernel_converter.py | 16 ++--- .../project/points_cloud.py | 14 ++--- .../project/toolkits_catalog.toml | 0 .../project/version_manager.py | 18 +++--- .../{workflows => extensions}/q2d/__init__.py | 0 .../{workflows => extensions}/q3d/__init__.py | 0 .../templates/__init__.py | 0 .../templates/jupyter.py_build | 0 .../templates/pyaedt_console.py_build | 0 .../templates/pyaedt_utils.py | 0 .../templates/run_extension_manager.py_build | 0 .../templates/run_pyaedt_script.py_build | 0 .../run_pyaedt_toolkit_script.py_build | 0 .../templates/template_get_started.py | 14 ++--- .../twinbuilder/__init__.py | 0 .../twinbuilder/convert_to_circuit.py | 12 ++-- .../images/large/export_to_circuit.png | Bin .../twinbuilder/toolkits_catalog.toml | 0 src/pyaedt/workflows/__init__.py | 2 +- src/pyaedt/workflows/circuit/__init__.py | 2 +- .../workflows/customize_automation_tab.py | 2 +- src/pyaedt/workflows/emit/__init__.py | 2 +- src/pyaedt/workflows/hfss/__init__.py | 2 +- .../hfss/push_excitation_from_file.py | 2 +- src/pyaedt/workflows/hfss3dlayout/__init__.py | 2 +- src/pyaedt/workflows/hfss3dlayout/cutout.py | 2 +- .../workflows/hfss3dlayout/export_layout.py | 2 +- .../workflows/hfss3dlayout/export_to_3d.py | 2 +- .../workflows/hfss3dlayout/parametrize_edb.py | 2 +- .../push_excitation_from_file_3dl.py | 2 +- src/pyaedt/workflows/icepak/__init__.py | 2 +- .../workflows/icepak/power_map_from_csv.py | 2 +- src/pyaedt/workflows/installer/__init__.py | 2 +- .../workflows/installer/console_setup.py | 2 +- .../workflows/installer/extension_manager.py | 2 +- .../workflows/installer/pyaedt_installer.py | 2 +- src/pyaedt/workflows/maxwell2d/__init__.py | 2 +- src/pyaedt/workflows/maxwell3d/__init__.py | 2 +- src/pyaedt/workflows/mechanical/__init__.py | 2 +- src/pyaedt/workflows/misc.py | 2 +- src/pyaedt/workflows/project/__init__.py | 2 +- .../project/advanced_fields_calculator.py | 2 +- src/pyaedt/workflows/project/configure_edb.py | 2 +- src/pyaedt/workflows/project/create_report.py | 2 +- .../workflows/project/import_nastran.py | 2 +- .../workflows/project/kernel_converter.py | 2 +- src/pyaedt/workflows/q2d/__init__.py | 2 +- src/pyaedt/workflows/q3d/__init__.py | 2 +- src/pyaedt/workflows/templates/__init__.py | 2 +- .../workflows/templates/pyaedt_utils.py | 2 +- .../templates/template_get_started.py | 2 +- src/pyaedt/workflows/twinbuilder/__init__.py | 2 +- .../twinbuilder/convert_to_circuit.py | 2 +- tests/system/general/test_01_Design.py | 2 +- tests/system/general/test_01_toolkit_icons.py | 2 +- .../system/visualization/test_45_workflows.py | 56 +++++++++--------- tests/unit/test_extension_misc.py | 14 ++--- 138 files changed, 294 insertions(+), 292 deletions(-) rename src/ansys/aedt/core/{workflows => extensions}/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/circuit/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/circuit/images/large/schematic.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/circuit/import_schematic.py (92%) rename src/ansys/aedt/core/{workflows => extensions}/circuit/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/customize_automation_tab.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/emit/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/choke_designer.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/images/large/antenna.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/images/large/choke.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/images/large/cloud.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/images/large/move_it.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/images/large/push.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/images/large/shielding.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/move_it.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/push_excitation_from_file.py (94%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/shielding_effectiveness.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/hfss/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/cutout.py (95%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/export_layout.py (93%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/export_to_3d.py (93%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/generate_arbitrary_wave_ports.py (96%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/arbitrary_wave_port.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/cad3d.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/cutout.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/export.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/parametrize.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/post_layout_design_toolkit.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/push.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/images/large/via_merging.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/parametrize_edb.py (96%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/post_layout_design_toolkit.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/push_excitation_from_file_3dl.py (94%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/hfss3dlayout/via_clustering_extension.py (95%) rename src/ansys/aedt/core/{workflows => extensions}/icepak/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/icepak/images/large/power_map.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/icepak/power_map_from_csv.py (95%) rename src/ansys/aedt/core/{workflows => extensions}/icepak/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/images/large/logo.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/images/large/pyansys.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/console_setup.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/extension_manager.py (93%) rename src/ansys/aedt/core/{workflows => extensions}/installer/extensions_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/images/large/console.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/images/large/extension_manager.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/images/large/jupyter.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/images/large/run_script.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/jupyter_template.ipynb (100%) rename src/ansys/aedt/core/{workflows => extensions}/installer/pyaedt_installer.py (94%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell2d/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell2d/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell3d/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell3d/fields_distribution.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell3d/images/large/fields_distribution.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell3d/images/large/magnet_segmentation.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/maxwell3d/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/mechanical/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/misc.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/advanced_fields_calculator.py (95%) rename src/ansys/aedt/core/{workflows => extensions}/project/configure_edb.py (97%) rename src/ansys/aedt/core/{workflows => extensions}/project/create_report.py (92%) rename src/ansys/aedt/core/{workflows => extensions}/project/images/large/aedb.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/images/large/cad3d.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/images/large/fields.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/images/large/pdf.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/images/large/version_manager.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/import_nastran.py (95%) rename src/ansys/aedt/core/{workflows => extensions}/project/kernel_converter.py (96%) rename src/ansys/aedt/core/{workflows => extensions}/project/points_cloud.py (96%) rename src/ansys/aedt/core/{workflows => extensions}/project/toolkits_catalog.toml (100%) rename src/ansys/aedt/core/{workflows => extensions}/project/version_manager.py (96%) rename src/ansys/aedt/core/{workflows => extensions}/q2d/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/q3d/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/jupyter.py_build (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/pyaedt_console.py_build (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/pyaedt_utils.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/run_extension_manager.py_build (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/run_pyaedt_script.py_build (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/run_pyaedt_toolkit_script.py_build (100%) rename src/ansys/aedt/core/{workflows => extensions}/templates/template_get_started.py (96%) rename src/ansys/aedt/core/{workflows => extensions}/twinbuilder/__init__.py (100%) rename src/ansys/aedt/core/{workflows => extensions}/twinbuilder/convert_to_circuit.py (95%) rename src/ansys/aedt/core/{workflows => extensions}/twinbuilder/images/large/export_to_circuit.png (100%) rename src/ansys/aedt/core/{workflows => extensions}/twinbuilder/toolkits_catalog.toml (100%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index af86d16797a..eea0a55cefe 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,7 +13,7 @@ exclude: | (?x)( ^src/ansys/aedt/core/rpc/| ^src/ansys/aedt/core/sbrplus/matlab/| - ^src/ansys/aedt/core/workflows/installer| + ^src/ansys/aedt/core/extensions/installer| tests/system/general/example_models/| tests/system/visualization/example_models/| tests/system/solvers/example_models/ diff --git a/codecov.yml b/codecov.yml index 366c4f910c4..05ba2e94749 100644 --- a/codecov.yml +++ b/codecov.yml @@ -2,8 +2,8 @@ ignore: - "src/ansys/aedt/core/rpc/*.py" - "src/ansys/aedt/core/misc/*.py" - "src/ansys/aedt/core/visualization/advanced/sbrplus/hdm_utils.py" - - "src/ansys/aedt/core/workflows/installer" - - "src/ansys/aedt/core/workflows/templates" + - "src/ansys/aedt/core/extensions/installer" + - "src/ansys/aedt/core/extensions/templates" - "src/ansys/aedt/core/common_rpc.py" - "src/ansys/aedt/core/internal/grpc_plugin_dll_class.py" - "src/ansys/aedt/core/edb.py" diff --git a/doc/source/Getting_started/Installation.rst b/doc/source/Getting_started/Installation.rst index c7691c9e45b..d1ed5c5b6f1 100644 --- a/doc/source/Getting_started/Installation.rst +++ b/doc/source/Getting_started/Installation.rst @@ -101,7 +101,7 @@ Finally, in the Python console, run the following commands: .. code:: - from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt + from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt add_pyaedt_to_aedt(“your_aedt_version", r“path_to_personalib") You can also install the PyAEDT panels using the following steps, this is also useful if you have a centralized PyAEDT installation: @@ -152,7 +152,7 @@ Finally, in the Python console, run the following commands: .. code:: - from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt + from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt add_pyaedt_to_aedt(“your_aedt_version", r“path_to_personalib") diff --git a/doc/source/Resources/pyaedt_installer_from_aedt.py b/doc/source/Resources/pyaedt_installer_from_aedt.py index 15b306bb742..dedb2877f30 100644 --- a/doc/source/Resources/pyaedt_installer_from_aedt.py +++ b/doc/source/Resources/pyaedt_installer_from_aedt.py @@ -137,14 +137,14 @@ def run_pyinstaller_from_c_python(oDesktop): # f.write("import sys\n") # f.write('sys.path.insert(0, r"c:\\ansysdev\\git\\repos\\pyaedt")\n') if version <= "231": - f.write("from pyaedt.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt\n") + f.write("from pyaedt.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt\n") f.write( 'add_pyaedt_to_aedt(aedt_version="{}", personallib=r"{}")\n'.format( oDesktop.GetVersion()[:6], oDesktop.GetPersonalLibDirectory() ) ) else: - f.write("from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt\n") + f.write("from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt\n") f.write( 'add_pyaedt_to_aedt(aedt_version="{}", personal_lib=r"{}")\n'.format( oDesktop.GetVersion()[:6], oDesktop.GetPersonalLibDirectory() diff --git a/doc/source/Resources/toolkit_installer_from_aedt.py b/doc/source/Resources/toolkit_installer_from_aedt.py index 629bcf8015a..0f9367df87b 100644 --- a/doc/source/Resources/toolkit_installer_from_aedt.py +++ b/doc/source/Resources/toolkit_installer_from_aedt.py @@ -51,7 +51,7 @@ def run_pyinstaller_from_c_python(oDesktop, pyaedt_interpreter): if os.path.isfile(python_script): os.remove(python_script) with open(python_script, "w") as f: - f.write("from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt\n") + f.write("from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt\n") f.write( 'add_pyaedt_to_aedt(aedt_version="{}", personal_lib=r"{}")\n'.format( oDesktop.GetVersion()[:6], oDesktop.GetPersonalLibDirectory())) diff --git a/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst b/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst index a0d4368b460..7b1773aef5f 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/commandline.rst @@ -6,14 +6,14 @@ Every extension can also launch the extension user interface from the terminal: SET PYAEDT_SCRIPT_PORT=50051 SET PYAEDT_SCRIPT_VERSION=2025.1 - python.exe path/to/pyaedt/workflows/project/import_nastran.py + python.exe path/to/pyaedt/extensions/project/import_nastran.py The available arguments are: ``file_path``, ``planar``, ``lightweight``, and ``decimate``. You can obtain these arguments from the help with this command: .. code:: - python.exe path/to/pyaedt/workflows/project/import_nastran.py --help + python.exe path/to/pyaedt/extensions/project/import_nastran.py --help This code shows how to pass the input file as an argument, which doesn't launch the user interface: @@ -21,7 +21,7 @@ This code shows how to pass the input file as an argument, which doesn't launch export PYAEDT_SCRIPT_PORT=50051 export PYAEDT_SCRIPT_VERSION=2025.1 - python.exe path/to/pyaedt/workflows/project/import_nastran.py --file_path="my_file.stl" + python.exe path/to/pyaedt/extensions/project/import_nastran.py --file_path="my_file.stl" Finally, this code shows how you can run the extension directly from a Python script: @@ -29,7 +29,7 @@ Finally, this code shows how you can run the extension directly from a Python sc import ansys.aedt.core import os - from ansys.aedt.core.workflows.project.import_nastran import main + from ansys.aedt.core.extensions.project.import_nastran import main file_path = "my_file.stl" hfss = ansys.aedt.core.Hfss() # Specify the AEDT session to connect diff --git a/doc/source/User_guide/pyaedt_extensions_doc/project/kernel_convert.rst b/doc/source/User_guide/pyaedt_extensions_doc/project/kernel_convert.rst index 00545ff8e08..906e792fb2c 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/project/kernel_convert.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/project/kernel_convert.rst @@ -43,13 +43,13 @@ You can also launch the extension user interface from the terminal: .. code:: - python.exe path/to/pyaedt/workflows/project/kernel_converter.py + python.exe path/to/pyaedt/extensions/project/kernel_converter.py Finally, this code shows how you can run the extension directly from a Python script: .. code:: python - from ansys.aedt.core.workflows.project.kernel_converter import main + from ansys.aedt.core.extensions.project.kernel_converter import main main(test_args = {"password": "my_pwd", "application": "HFSS", 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 743aeee20bc..591a0045c8a 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 @@ -30,7 +30,7 @@ The extension can be run from a Python script in the following way: import ansys.aedt.core import os - from ansys.aedt.core.workflows.templates.template_get_started import main + from ansys.aedt.core.extensions.templates.template_get_started import main hfss = ansys.aedt.core.Hfss() diff --git a/src/ansys/aedt/core/desktop.py b/src/ansys/aedt/core/desktop.py index 6006b131ba5..aa9174c57f8 100644 --- a/src/ansys/aedt/core/desktop.py +++ b/src/ansys/aedt/core/desktop.py @@ -1564,7 +1564,7 @@ def get_available_toolkits(): list List of toolkit names. """ - from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits + from ansys.aedt.core.extensions.customize_automation_tab import available_toolkits return list(available_toolkits().keys()) diff --git a/src/ansys/aedt/core/workflows/__init__.py b/src/ansys/aedt/core/extensions/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/__init__.py rename to src/ansys/aedt/core/extensions/__init__.py diff --git a/src/ansys/aedt/core/workflows/circuit/__init__.py b/src/ansys/aedt/core/extensions/circuit/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/circuit/__init__.py rename to src/ansys/aedt/core/extensions/circuit/__init__.py diff --git a/src/ansys/aedt/core/workflows/circuit/images/large/schematic.png b/src/ansys/aedt/core/extensions/circuit/images/large/schematic.png similarity index 100% rename from src/ansys/aedt/core/workflows/circuit/images/large/schematic.png rename to src/ansys/aedt/core/extensions/circuit/images/large/schematic.png diff --git a/src/ansys/aedt/core/workflows/circuit/import_schematic.py b/src/ansys/aedt/core/extensions/circuit/import_schematic.py similarity index 92% rename from src/ansys/aedt/core/workflows/circuit/import_schematic.py rename to src/ansys/aedt/core/extensions/circuit/import_schematic.py index 97eeac1bf44..d5bedc7413b 100644 --- a/src/ansys/aedt/core/workflows/circuit/import_schematic.py +++ b/src/ansys/aedt/core/extensions/circuit/import_schematic.py @@ -26,12 +26,12 @@ import ansys.aedt.core from ansys.aedt.core import Circuit -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student port = get_port() version = get_aedt_version() @@ -50,7 +50,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title(extension_description) @@ -59,7 +59,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/circuit/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/circuit/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/circuit/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/circuit/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/customize_automation_tab.py b/src/ansys/aedt/core/extensions/customize_automation_tab.py similarity index 97% rename from src/ansys/aedt/core/workflows/customize_automation_tab.py rename to src/ansys/aedt/core/extensions/customize_automation_tab.py index 2db2f094f58..df24f2bd26f 100644 --- a/src/ansys/aedt/core/workflows/customize_automation_tab.py +++ b/src/ansys/aedt/core/extensions/customize_automation_tab.py @@ -37,10 +37,10 @@ import warnings +import ansys.aedt.core.extensions +import ansys.aedt.core.extensions.templates from ansys.aedt.core.generic.file_utils import read_toml from ansys.aedt.core.generic.settings import is_linux -import ansys.aedt.core.workflows -import ansys.aedt.core.workflows.templates from defusedxml.ElementTree import ParseError from defusedxml.minidom import parseString @@ -116,7 +116,7 @@ def add_automation_tab( panel_element.remove(b) if not icon_file: - icon_file = os.path.join(os.path.dirname(ansys.aedt.core.workflows.__file__), "images", "large", "pyansys.png") + icon_file = os.path.join(os.path.dirname(ansys.aedt.core.extensions.__file__), "images", "large", "pyansys.png") file_name = os.path.basename(icon_file) @@ -295,9 +295,10 @@ def add_script_to_menu( toolkit_rel_lib_dir = os.path.join("Lib", file_name) lib_dir = os.path.join(toolkit_dir, toolkit_rel_lib_dir) toolkit_rel_lib_dir = "../../" + toolkit_rel_lib_dir - os.makedirs(lib_dir, exist_ok=True) + if copy_to_personal_lib: + os.makedirs(lib_dir, exist_ok=True) os.makedirs(tool_dir, exist_ok=True) - dest_script_path = None + dest_script_path = script_file if script_file and copy_to_personal_lib: dest_script_path = os.path.join(lib_dir, os.path.split(script_file)[-1]) shutil.copy2(script_file, dest_script_path) @@ -313,7 +314,7 @@ def add_script_to_menu( version_agnostic = True executable_version_agnostic = executable_interpreter - templates_dir = os.path.dirname(ansys.aedt.core.workflows.templates.__file__) + templates_dir = os.path.dirname(ansys.aedt.core.extensions.templates.__file__) ipython_executable = executable_version_agnostic.replace("python" + __exe(), "ipython" + __exe()) jupyter_executable = executable_version_agnostic.replace("python" + __exe(), "jupyter" + __exe()) @@ -508,7 +509,7 @@ def add_custom_toolkit(desktop_object, toolkit_name, wheel_toolkit=None, install tool_dir = os.path.join(toolkit_dir, product_name, toolkit_info["name"]) script_image = os.path.abspath( - os.path.join(os.path.dirname(ansys.aedt.core.workflows.__file__), product_name.lower(), toolkit_info["icon"]) + os.path.join(os.path.dirname(ansys.aedt.core.extensions.__file__), product_name.lower(), toolkit_info["icon"]) ) if install: diff --git a/src/ansys/aedt/core/workflows/emit/__init__.py b/src/ansys/aedt/core/extensions/emit/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/emit/__init__.py rename to src/ansys/aedt/core/extensions/emit/__init__.py diff --git a/src/ansys/aedt/core/workflows/hfss/__init__.py b/src/ansys/aedt/core/extensions/hfss/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/__init__.py rename to src/ansys/aedt/core/extensions/hfss/__init__.py diff --git a/src/ansys/aedt/core/workflows/hfss/choke_designer.py b/src/ansys/aedt/core/extensions/hfss/choke_designer.py similarity index 97% rename from src/ansys/aedt/core/workflows/hfss/choke_designer.py rename to src/ansys/aedt/core/extensions/hfss/choke_designer.py index 0ee8fe6ce1c..2cef9961ea8 100644 --- a/src/ansys/aedt/core/workflows/hfss/choke_designer.py +++ b/src/ansys/aedt/core/extensions/hfss/choke_designer.py @@ -28,14 +28,14 @@ import ansys.aedt.core from ansys.aedt.core import Hfss +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import read_json from ansys.aedt.core.generic.file_utils import write_configuration_file -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() @@ -96,7 +96,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme # Create UI master = tkinter.Tk() @@ -106,7 +106,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/antenna.png b/src/ansys/aedt/core/extensions/hfss/images/large/antenna.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/images/large/antenna.png rename to src/ansys/aedt/core/extensions/hfss/images/large/antenna.png diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/choke.png b/src/ansys/aedt/core/extensions/hfss/images/large/choke.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/images/large/choke.png rename to src/ansys/aedt/core/extensions/hfss/images/large/choke.png diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/cloud.png b/src/ansys/aedt/core/extensions/hfss/images/large/cloud.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/images/large/cloud.png rename to src/ansys/aedt/core/extensions/hfss/images/large/cloud.png diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/move_it.png b/src/ansys/aedt/core/extensions/hfss/images/large/move_it.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/images/large/move_it.png rename to src/ansys/aedt/core/extensions/hfss/images/large/move_it.png diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/push.png b/src/ansys/aedt/core/extensions/hfss/images/large/push.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/images/large/push.png rename to src/ansys/aedt/core/extensions/hfss/images/large/push.png diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/shielding.png b/src/ansys/aedt/core/extensions/hfss/images/large/shielding.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/images/large/shielding.png rename to src/ansys/aedt/core/extensions/hfss/images/large/shielding.png diff --git a/src/ansys/aedt/core/workflows/hfss/move_it.py b/src/ansys/aedt/core/extensions/hfss/move_it.py similarity index 97% rename from src/ansys/aedt/core/workflows/hfss/move_it.py rename to src/ansys/aedt/core/extensions/hfss/move_it.py index f408c224da3..cbd4bb6e04e 100644 --- a/src/ansys/aedt/core/workflows/hfss/move_it.py +++ b/src/ansys/aedt/core/extensions/hfss/move_it.py @@ -29,12 +29,12 @@ import ansys.aedt.core from ansys.aedt.core import get_pyaedt_app +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.internal.errors import AEDTRuntimeError -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student import numpy as np from scipy.interpolate import CubicSpline @@ -54,7 +54,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme app = ansys.aedt.core.Desktop( new_desktop=False, @@ -96,7 +96,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss/push_excitation_from_file.py b/src/ansys/aedt/core/extensions/hfss/push_excitation_from_file.py similarity index 94% rename from src/ansys/aedt/core/workflows/hfss/push_excitation_from_file.py rename to src/ansys/aedt/core/extensions/hfss/push_excitation_from_file.py index 6b587105a7c..07a3909474e 100644 --- a/src/ansys/aedt/core/workflows/hfss/push_excitation_from_file.py +++ b/src/ansys/aedt/core/extensions/hfss/push_excitation_from_file.py @@ -26,12 +26,12 @@ import ansys.aedt.core from ansys.aedt.core import Hfss -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student port = get_port() version = get_aedt_version() @@ -51,7 +51,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme # Get ports app = ansys.aedt.core.Desktop( @@ -92,7 +92,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss/shielding_effectiveness.py b/src/ansys/aedt/core/extensions/hfss/shielding_effectiveness.py similarity index 97% rename from src/ansys/aedt/core/workflows/hfss/shielding_effectiveness.py rename to src/ansys/aedt/core/extensions/hfss/shielding_effectiveness.py index 240bb8ef8f0..dface93bed8 100644 --- a/src/ansys/aedt/core/workflows/hfss/shielding_effectiveness.py +++ b/src/ansys/aedt/core/extensions/hfss/shielding_effectiveness.py @@ -26,13 +26,13 @@ import ansys.aedt.core from ansys.aedt.core import get_pyaedt_app +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import write_csv -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student import numpy as np port = get_port() @@ -64,7 +64,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title("Shielding effectiveness") @@ -73,7 +73,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/hfss/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/hfss/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/hfss/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/__init__.py b/src/ansys/aedt/core/extensions/hfss3dlayout/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/__init__.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/__init__.py diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/cutout.py b/src/ansys/aedt/core/extensions/hfss3dlayout/cutout.py similarity index 95% rename from src/ansys/aedt/core/workflows/hfss3dlayout/cutout.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/cutout.py index c48da74c87e..0c740bcfe76 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/cutout.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/cutout.py @@ -26,13 +26,13 @@ import ansys.aedt.core from ansys.aedt.core import Hfss3dLayout +import ansys.aedt.core.extensions.hfss3dlayout +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import generate_unique_name -import ansys.aedt.core.workflows.hfss3dlayout -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student from pyedb import Edb port = get_port() @@ -57,7 +57,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme app = ansys.aedt.core.Desktop( new_desktop=False, @@ -92,7 +92,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/export_layout.py b/src/ansys/aedt/core/extensions/hfss3dlayout/export_layout.py similarity index 93% rename from src/ansys/aedt/core/workflows/hfss3dlayout/export_layout.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/export_layout.py index ade175b78f8..0d2c840e63f 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/export_layout.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/export_layout.py @@ -25,12 +25,12 @@ from pathlib import Path import ansys.aedt.core -import ansys.aedt.core.workflows.hfss3dlayout -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions.hfss3dlayout +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from pyedb import Edb port = get_port() @@ -49,7 +49,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title(extension_description) @@ -58,7 +58,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/export_to_3d.py b/src/ansys/aedt/core/extensions/hfss3dlayout/export_to_3d.py similarity index 93% rename from src/ansys/aedt/core/workflows/hfss3dlayout/export_to_3d.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/export_to_3d.py index 41ea77fe7db..6647f706bdc 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/export_to_3d.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/export_to_3d.py @@ -25,12 +25,12 @@ from pathlib import Path import ansys.aedt.core -import ansys.aedt.core.workflows.hfss3dlayout -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions.hfss3dlayout +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student port = get_port() version = get_aedt_version() @@ -51,7 +51,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title(extension_description) @@ -60,7 +60,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/generate_arbitrary_wave_ports.py b/src/ansys/aedt/core/extensions/hfss3dlayout/generate_arbitrary_wave_ports.py similarity index 96% rename from src/ansys/aedt/core/workflows/hfss3dlayout/generate_arbitrary_wave_ports.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/generate_arbitrary_wave_ports.py index e6fe0b87586..421e15a81de 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/generate_arbitrary_wave_ports.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/generate_arbitrary_wave_ports.py @@ -29,13 +29,13 @@ import ansys.aedt.core from ansys.aedt.core.edb import Edb +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.hfss3dlayout import Hfss3dLayout from ansys.aedt.core.hfss import Hfss -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() @@ -53,7 +53,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.minsize(1000, 220) @@ -65,7 +65,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/arbitrary_wave_port.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/arbitrary_wave_port.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/arbitrary_wave_port.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/arbitrary_wave_port.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/cad3d.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/cad3d.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/cad3d.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/cad3d.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/cutout.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/cutout.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/cutout.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/cutout.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/export.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/export.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/export.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/export.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/parametrize.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/parametrize.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/parametrize.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/parametrize.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/post_layout_design_toolkit.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/post_layout_design_toolkit.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/post_layout_design_toolkit.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/post_layout_design_toolkit.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/push.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/push.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/push.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/push.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/images/large/via_merging.png b/src/ansys/aedt/core/extensions/hfss3dlayout/images/large/via_merging.png similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/images/large/via_merging.png rename to src/ansys/aedt/core/extensions/hfss3dlayout/images/large/via_merging.png diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py b/src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py similarity index 96% rename from src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py index 8f0fbfb8c3c..e9c2692145d 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/parametrize_edb.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/parametrize_edb.py @@ -26,13 +26,13 @@ import ansys.aedt.core from ansys.aedt.core import Hfss3dLayout +import ansys.aedt.core.extensions.hfss3dlayout +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import generate_unique_name -import ansys.aedt.core.workflows.hfss3dlayout -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student from pyedb import Edb port = get_port() @@ -87,7 +87,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title(extension_description) @@ -96,7 +96,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/post_layout_design_toolkit.py b/src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design_toolkit.py similarity index 97% rename from src/ansys/aedt/core/workflows/hfss3dlayout/post_layout_design_toolkit.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design_toolkit.py index 0d8cdd280ad..0401b31a7f2 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/post_layout_design_toolkit.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/post_layout_design_toolkit.py @@ -31,12 +31,12 @@ import PIL.Image import PIL.ImageTk import ansys.aedt.core -from ansys.aedt.core.workflows.misc import ExtensionTheme -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +from ansys.aedt.core.extensions.misc import ExtensionTheme +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from pyedb.generic.general_methods import generate_unique_name port = get_port() @@ -209,7 +209,7 @@ def __init__(self): master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/push_excitation_from_file_3dl.py b/src/ansys/aedt/core/extensions/hfss3dlayout/push_excitation_from_file_3dl.py similarity index 94% rename from src/ansys/aedt/core/workflows/hfss3dlayout/push_excitation_from_file_3dl.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/push_excitation_from_file_3dl.py index fab8d51539a..09a9250ff44 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/push_excitation_from_file_3dl.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/push_excitation_from_file_3dl.py @@ -26,12 +26,12 @@ import ansys.aedt.core from ansys.aedt.core import Hfss3dLayout -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student port = get_port() version = get_aedt_version() @@ -51,7 +51,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme # Get ports app = ansys.aedt.core.Desktop( @@ -98,7 +98,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/hfss3dlayout/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/hfss3dlayout/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/hfss3dlayout/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/hfss3dlayout/via_clustering_extension.py b/src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering_extension.py similarity index 95% rename from src/ansys/aedt/core/workflows/hfss3dlayout/via_clustering_extension.py rename to src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering_extension.py index dd3f7b4abf1..bd8af6868ec 100644 --- a/src/ansys/aedt/core/workflows/hfss3dlayout/via_clustering_extension.py +++ b/src/ansys/aedt/core/extensions/hfss3dlayout/via_clustering_extension.py @@ -30,12 +30,12 @@ import ansys.aedt.core from ansys.aedt.core import Hfss3dLayout from ansys.aedt.core import generate_unique_name -import ansys.aedt.core.workflows.hfss3dlayout -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions.hfss3dlayout +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from pyedb import Edb port = get_port() @@ -83,7 +83,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title(extension_description) @@ -92,7 +92,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/icepak/__init__.py b/src/ansys/aedt/core/extensions/icepak/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/icepak/__init__.py rename to src/ansys/aedt/core/extensions/icepak/__init__.py diff --git a/src/ansys/aedt/core/workflows/icepak/images/large/power_map.png b/src/ansys/aedt/core/extensions/icepak/images/large/power_map.png similarity index 100% rename from src/ansys/aedt/core/workflows/icepak/images/large/power_map.png rename to src/ansys/aedt/core/extensions/icepak/images/large/power_map.png diff --git a/src/ansys/aedt/core/workflows/icepak/power_map_from_csv.py b/src/ansys/aedt/core/extensions/icepak/power_map_from_csv.py similarity index 95% rename from src/ansys/aedt/core/workflows/icepak/power_map_from_csv.py rename to src/ansys/aedt/core/extensions/icepak/power_map_from_csv.py index bf2d3634b15..d2566c2fed8 100644 --- a/src/ansys/aedt/core/workflows/icepak/power_map_from_csv.py +++ b/src/ansys/aedt/core/extensions/icepak/power_map_from_csv.py @@ -27,12 +27,12 @@ import ansys.aedt.core from ansys.aedt.core import Icepak -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student port = get_port() version = get_aedt_version() @@ -52,7 +52,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme app = ansys.aedt.core.Desktop( new_desktop=False, @@ -84,7 +84,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/icepak/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/icepak/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/icepak/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/icepak/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/images/large/logo.png b/src/ansys/aedt/core/extensions/images/large/logo.png similarity index 100% rename from src/ansys/aedt/core/workflows/images/large/logo.png rename to src/ansys/aedt/core/extensions/images/large/logo.png diff --git a/src/ansys/aedt/core/workflows/images/large/pyansys.png b/src/ansys/aedt/core/extensions/images/large/pyansys.png similarity index 100% rename from src/ansys/aedt/core/workflows/images/large/pyansys.png rename to src/ansys/aedt/core/extensions/images/large/pyansys.png diff --git a/src/ansys/aedt/core/workflows/installer/__init__.py b/src/ansys/aedt/core/extensions/installer/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/installer/__init__.py rename to src/ansys/aedt/core/extensions/installer/__init__.py diff --git a/src/ansys/aedt/core/workflows/installer/console_setup.py b/src/ansys/aedt/core/extensions/installer/console_setup.py similarity index 100% rename from src/ansys/aedt/core/workflows/installer/console_setup.py rename to src/ansys/aedt/core/extensions/installer/console_setup.py diff --git a/src/ansys/aedt/core/workflows/installer/extension_manager.py b/src/ansys/aedt/core/extensions/installer/extension_manager.py similarity index 93% rename from src/ansys/aedt/core/workflows/installer/extension_manager.py rename to src/ansys/aedt/core/extensions/installer/extension_manager.py index d56e7283583..98781432ddb 100644 --- a/src/ansys/aedt/core/workflows/installer/extension_manager.py +++ b/src/ansys/aedt/core/extensions/installer/extension_manager.py @@ -31,16 +31,16 @@ import PIL.ImageTk from ansys.aedt.core import Desktop from ansys.aedt.core import is_windows -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.customize_automation_tab import add_custom_toolkit -from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu -from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits -from ansys.aedt.core.workflows.customize_automation_tab import remove_script_from_menu -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student -import ansys.aedt.core.workflows.templates +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.customize_automation_tab import add_custom_toolkit +from ansys.aedt.core.extensions.customize_automation_tab import add_script_to_menu +from ansys.aedt.core.extensions.customize_automation_tab import available_toolkits +from ansys.aedt.core.extensions.customize_automation_tab import remove_script_from_menu +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student +import ansys.aedt.core.extensions.templates port = get_port() version = get_aedt_version() @@ -258,7 +258,7 @@ def button_is_clicked( if toolkit_level in toolkits and selected_toolkit_name in toolkits[toolkit_level]: selected_toolkit_info = toolkits[toolkit_level][selected_toolkit_name] if not selected_toolkit_info.get("pip"): - product_path = os.path.join(os.path.dirname(ansys.aedt.core.workflows.__file__), toolkit_level.lower()) + product_path = os.path.join(os.path.dirname(ansys.aedt.core.extensions.__file__), toolkit_level.lower()) file = os.path.abspath(os.path.join(product_path, selected_toolkit_info.get("script"))) name = selected_toolkit_info.get("name") icon = os.path.abspath(os.path.join(product_path, selected_toolkit_info.get("icon"))) @@ -301,7 +301,7 @@ def button_is_clicked( if not file: file = os.path.join( - os.path.dirname(ansys.aedt.core.workflows.templates.__file__), "template_get_started.py" + os.path.dirname(ansys.aedt.core.extensions.templates.__file__), "template_get_started.py" ) if os.path.isfile(executable_interpreter): @@ -317,6 +317,7 @@ def button_is_clicked( personal_lib=desktop.personallib, aedt_version=desktop.aedt_version_id, template_file=template_file, + copy_to_personal_lib=False ) desktop.logger.info(f"{name} installed") else: @@ -334,7 +335,7 @@ def button_is_clicked( root.title("Extension Manager") # Load the logo for the main window -icon_path = os.path.join(os.path.dirname(ansys.aedt.core.workflows.__file__), "images", "large", "logo.png") +icon_path = os.path.join(os.path.dirname(ansys.aedt.core.extensions.__file__), "images", "large", "logo.png") im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/installer/extensions_catalog.toml b/src/ansys/aedt/core/extensions/installer/extensions_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/installer/extensions_catalog.toml rename to src/ansys/aedt/core/extensions/installer/extensions_catalog.toml diff --git a/src/ansys/aedt/core/workflows/installer/images/large/console.png b/src/ansys/aedt/core/extensions/installer/images/large/console.png similarity index 100% rename from src/ansys/aedt/core/workflows/installer/images/large/console.png rename to src/ansys/aedt/core/extensions/installer/images/large/console.png diff --git a/src/ansys/aedt/core/workflows/installer/images/large/extension_manager.png b/src/ansys/aedt/core/extensions/installer/images/large/extension_manager.png similarity index 100% rename from src/ansys/aedt/core/workflows/installer/images/large/extension_manager.png rename to src/ansys/aedt/core/extensions/installer/images/large/extension_manager.png diff --git a/src/ansys/aedt/core/workflows/installer/images/large/jupyter.png b/src/ansys/aedt/core/extensions/installer/images/large/jupyter.png similarity index 100% rename from src/ansys/aedt/core/workflows/installer/images/large/jupyter.png rename to src/ansys/aedt/core/extensions/installer/images/large/jupyter.png diff --git a/src/ansys/aedt/core/workflows/installer/images/large/run_script.png b/src/ansys/aedt/core/extensions/installer/images/large/run_script.png similarity index 100% rename from src/ansys/aedt/core/workflows/installer/images/large/run_script.png rename to src/ansys/aedt/core/extensions/installer/images/large/run_script.png diff --git a/src/ansys/aedt/core/workflows/installer/jupyter_template.ipynb b/src/ansys/aedt/core/extensions/installer/jupyter_template.ipynb similarity index 100% rename from src/ansys/aedt/core/workflows/installer/jupyter_template.ipynb rename to src/ansys/aedt/core/extensions/installer/jupyter_template.ipynb diff --git a/src/ansys/aedt/core/workflows/installer/pyaedt_installer.py b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py similarity index 94% rename from src/ansys/aedt/core/workflows/installer/pyaedt_installer.py rename to src/ansys/aedt/core/extensions/installer/pyaedt_installer.py index 6e0bf174fdc..462fc882776 100644 --- a/src/ansys/aedt/core/workflows/installer/pyaedt_installer.py +++ b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py @@ -28,8 +28,8 @@ import shutil from ansys.aedt.core.generic.file_utils import read_toml -from ansys.aedt.core.workflows import customize_automation_tab -import ansys.aedt.core.workflows.templates +from ansys.aedt.core.extensions import customize_automation_tab +import ansys.aedt.core.extensions.templates def add_pyaedt_to_aedt( @@ -59,7 +59,7 @@ def add_pyaedt_to_aedt( extensions_dir = os.path.join(personal_lib, "Toolkits") os.makedirs(extensions_dir, exist_ok=True) - templates_dir = os.path.dirname(ansys.aedt.core.workflows.templates.__file__) + templates_dir = os.path.dirname(ansys.aedt.core.extensions.templates.__file__) script_file = os.path.join(templates_dir, "pyaedt_utils.py") dest_script_path = os.path.join(extensions_dir, "pyaedt_utils.py") shutil.copy2(script_file, dest_script_path) diff --git a/src/ansys/aedt/core/workflows/maxwell2d/__init__.py b/src/ansys/aedt/core/extensions/maxwell2d/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/maxwell2d/__init__.py rename to src/ansys/aedt/core/extensions/maxwell2d/__init__.py diff --git a/src/ansys/aedt/core/workflows/maxwell2d/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/maxwell2d/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/maxwell2d/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/maxwell2d/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/maxwell3d/__init__.py b/src/ansys/aedt/core/extensions/maxwell3d/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/maxwell3d/__init__.py rename to src/ansys/aedt/core/extensions/maxwell3d/__init__.py diff --git a/src/ansys/aedt/core/workflows/maxwell3d/fields_distribution.py b/src/ansys/aedt/core/extensions/maxwell3d/fields_distribution.py similarity index 97% rename from src/ansys/aedt/core/workflows/maxwell3d/fields_distribution.py rename to src/ansys/aedt/core/extensions/maxwell3d/fields_distribution.py index f346732b7b3..e8630452681 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/fields_distribution.py +++ b/src/ansys/aedt/core/extensions/maxwell3d/fields_distribution.py @@ -26,13 +26,13 @@ import tkinter as tk import ansys.aedt.core +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.design_types import get_pyaedt_app from ansys.aedt.core.generic.file_utils import write_csv -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student import numpy as np port = get_port() @@ -83,7 +83,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme app = ansys.aedt.core.Desktop( new_desktop=False, @@ -134,7 +134,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) @@ -358,7 +358,7 @@ def show_popup(): def submit(): if option_var.get() == "Option 1": - from ansys.aedt.core.workflows.project.points_cloud import main as points_main + from ansys.aedt.core.extensions.project.points_cloud import main as points_main selected_objects = objects_list_lb.curselection() master.objects_list = [objects_list_lb.get(i) for i in selected_objects] diff --git a/src/ansys/aedt/core/workflows/maxwell3d/images/large/fields_distribution.png b/src/ansys/aedt/core/extensions/maxwell3d/images/large/fields_distribution.png similarity index 100% rename from src/ansys/aedt/core/workflows/maxwell3d/images/large/fields_distribution.png rename to src/ansys/aedt/core/extensions/maxwell3d/images/large/fields_distribution.png diff --git a/src/ansys/aedt/core/workflows/maxwell3d/images/large/magnet_segmentation.png b/src/ansys/aedt/core/extensions/maxwell3d/images/large/magnet_segmentation.png similarity index 100% rename from src/ansys/aedt/core/workflows/maxwell3d/images/large/magnet_segmentation.png rename to src/ansys/aedt/core/extensions/maxwell3d/images/large/magnet_segmentation.png diff --git a/src/ansys/aedt/core/workflows/maxwell3d/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/maxwell3d/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/maxwell3d/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/maxwell3d/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/mechanical/__init__.py b/src/ansys/aedt/core/extensions/mechanical/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/mechanical/__init__.py rename to src/ansys/aedt/core/extensions/mechanical/__init__.py diff --git a/src/ansys/aedt/core/workflows/misc.py b/src/ansys/aedt/core/extensions/misc.py similarity index 100% rename from src/ansys/aedt/core/workflows/misc.py rename to src/ansys/aedt/core/extensions/misc.py diff --git a/src/ansys/aedt/core/workflows/project/__init__.py b/src/ansys/aedt/core/extensions/project/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/project/__init__.py rename to src/ansys/aedt/core/extensions/project/__init__.py diff --git a/src/ansys/aedt/core/workflows/project/advanced_fields_calculator.py b/src/ansys/aedt/core/extensions/project/advanced_fields_calculator.py similarity index 95% rename from src/ansys/aedt/core/workflows/project/advanced_fields_calculator.py rename to src/ansys/aedt/core/extensions/project/advanced_fields_calculator.py index 5f5cac5fb8d..51079f5d469 100644 --- a/src/ansys/aedt/core/workflows/project/advanced_fields_calculator.py +++ b/src/ansys/aedt/core/extensions/project/advanced_fields_calculator.py @@ -26,14 +26,14 @@ import ansys.aedt.core from ansys.aedt.core import get_pyaedt_app +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import generate_unique_name from ansys.aedt.core.modeler.cad.elements_3d import FacePrimitive -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() @@ -52,7 +52,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme # Get ports app = ansys.aedt.core.Desktop( @@ -112,7 +112,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/project/configure_edb.py b/src/ansys/aedt/core/extensions/project/configure_edb.py similarity index 97% rename from src/ansys/aedt/core/workflows/project/configure_edb.py rename to src/ansys/aedt/core/extensions/project/configure_edb.py index e32a5bc3afe..515b682c35a 100644 --- a/src/ansys/aedt/core/workflows/project/configure_edb.py +++ b/src/ansys/aedt/core/extensions/project/configure_edb.py @@ -33,12 +33,12 @@ import PIL.ImageTk import ansys.aedt.core from ansys.aedt.core import Hfss3dLayout +import ansys.aedt.core.extensions.hfss3dlayout +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import generate_unique_name -import ansys.aedt.core.workflows.hfss3dlayout -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student from pyedb import Edb from pyedb import Siwave @@ -95,7 +95,7 @@ def __init__(self): self.selected_cfg_file_folder = tk.StringVar(value="") # Load the logo for the main window - icon_path = os.path.join(os.path.dirname(ansys.aedt.core.workflows.__file__), "images", "large", "logo.png") + icon_path = os.path.join(os.path.dirname(ansys.aedt.core.extensions.__file__), "images", "large", "logo.png") im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/project/create_report.py b/src/ansys/aedt/core/extensions/project/create_report.py similarity index 92% rename from src/ansys/aedt/core/workflows/project/create_report.py rename to src/ansys/aedt/core/extensions/project/create_report.py index 18a90e75659..35407d2b4b2 100644 --- a/src/ansys/aedt/core/workflows/project/create_report.py +++ b/src/ansys/aedt/core/extensions/project/create_report.py @@ -27,13 +27,13 @@ import ansys.aedt.core from ansys.aedt.core import get_pyaedt_app +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.general_methods import is_windows from ansys.aedt.core.visualization.plot.pdf import AnsysReport -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() diff --git a/src/ansys/aedt/core/workflows/project/images/large/aedb.png b/src/ansys/aedt/core/extensions/project/images/large/aedb.png similarity index 100% rename from src/ansys/aedt/core/workflows/project/images/large/aedb.png rename to src/ansys/aedt/core/extensions/project/images/large/aedb.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/cad3d.png b/src/ansys/aedt/core/extensions/project/images/large/cad3d.png similarity index 100% rename from src/ansys/aedt/core/workflows/project/images/large/cad3d.png rename to src/ansys/aedt/core/extensions/project/images/large/cad3d.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/fields.png b/src/ansys/aedt/core/extensions/project/images/large/fields.png similarity index 100% rename from src/ansys/aedt/core/workflows/project/images/large/fields.png rename to src/ansys/aedt/core/extensions/project/images/large/fields.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/pdf.png b/src/ansys/aedt/core/extensions/project/images/large/pdf.png similarity index 100% rename from src/ansys/aedt/core/workflows/project/images/large/pdf.png rename to src/ansys/aedt/core/extensions/project/images/large/pdf.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/version_manager.png b/src/ansys/aedt/core/extensions/project/images/large/version_manager.png similarity index 100% rename from src/ansys/aedt/core/workflows/project/images/large/version_manager.png rename to src/ansys/aedt/core/extensions/project/images/large/version_manager.png diff --git a/src/ansys/aedt/core/workflows/project/import_nastran.py b/src/ansys/aedt/core/extensions/project/import_nastran.py similarity index 95% rename from src/ansys/aedt/core/workflows/project/import_nastran.py rename to src/ansys/aedt/core/extensions/project/import_nastran.py index 6912956a824..a90f7bcee57 100644 --- a/src/ansys/aedt/core/workflows/project/import_nastran.py +++ b/src/ansys/aedt/core/extensions/project/import_nastran.py @@ -26,13 +26,13 @@ import ansys.aedt.core from ansys.aedt.core import get_pyaedt_app +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.visualization.advanced.misc import nastran_to_stl -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() @@ -52,7 +52,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title("Import Nastran or STL file") @@ -61,7 +61,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/project/kernel_converter.py b/src/ansys/aedt/core/extensions/project/kernel_converter.py similarity index 96% rename from src/ansys/aedt/core/workflows/project/kernel_converter.py rename to src/ansys/aedt/core/extensions/project/kernel_converter.py index 9bfaa3618c8..0429af8a2f6 100644 --- a/src/ansys/aedt/core/workflows/project/kernel_converter.py +++ b/src/ansys/aedt/core/extensions/project/kernel_converter.py @@ -33,16 +33,16 @@ from ansys.aedt.core import Maxwell3d from ansys.aedt.core import Q3d from ansys.aedt.core.application.design_solutions import solutions_types +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.design_types import get_pyaedt_app from ansys.aedt.core.generic.file_utils import generate_unique_name from ansys.aedt.core.generic.settings import settings from ansys.aedt.core.internal.filesystem import search_files -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student settings.use_grpc_api = True settings.use_multi_desktop = True @@ -63,7 +63,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme master = tkinter.Tk() master.title(extension_description) @@ -72,7 +72,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/project/points_cloud.py b/src/ansys/aedt/core/extensions/project/points_cloud.py similarity index 96% rename from src/ansys/aedt/core/workflows/project/points_cloud.py rename to src/ansys/aedt/core/extensions/project/points_cloud.py index 32bd8ab85ca..b5e4ae90b7d 100644 --- a/src/ansys/aedt/core/workflows/project/points_cloud.py +++ b/src/ansys/aedt/core/extensions/project/points_cloud.py @@ -29,12 +29,12 @@ import ansys.aedt.core from ansys.aedt.core import get_pyaedt_app +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.visualization.plot.pyvista import ModelPlotter -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student import pyvista as pv port = get_port() @@ -54,7 +54,7 @@ def frontend(): # pragma: no cover import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme app = ansys.aedt.core.Desktop( new_desktop=False, @@ -90,7 +90,7 @@ def frontend(): # pragma: no cover master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/project/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/project/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/project/toolkits_catalog.toml diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/extensions/project/version_manager.py similarity index 96% rename from src/ansys/aedt/core/workflows/project/version_manager.py rename to src/ansys/aedt/core/extensions/project/version_manager.py index f8962400c99..a3eca6dfe0a 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/extensions/project/version_manager.py @@ -38,11 +38,11 @@ import PIL.Image import PIL.ImageTk import ansys.aedt.core -from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu -from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id +from ansys.aedt.core.extensions.customize_automation_tab import add_script_to_menu +from ansys.aedt.core.extensions.customize_automation_tab import available_toolkits +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id import defusedxml from defusedxml.ElementTree import parse as defused_parse @@ -101,7 +101,7 @@ def pyedb_version(self): return pyedb.version def __init__(self, ui, desktop, aedt_version, personal_lib): - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme self.desktop = desktop self.aedt_version = aedt_version @@ -127,7 +127,7 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.ini_file_path = os.path.join(os.path.dirname(__file__), "settings.ini") # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) @@ -331,7 +331,7 @@ def update_extensions(self): if j["name"] == name: shutil.rmtree(extension_dir, ignore_errors=True) - workflow_dir = Path(ansys.aedt.core.workflows.__file__).parent + workflow_dir = Path(ansys.aedt.core.extensions.__file__).parent add_script_to_menu( name=name, @@ -512,7 +512,7 @@ def handle_remove_error(func, path, exc_info): else: return - from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt + from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt try: add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) diff --git a/src/ansys/aedt/core/workflows/q2d/__init__.py b/src/ansys/aedt/core/extensions/q2d/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/q2d/__init__.py rename to src/ansys/aedt/core/extensions/q2d/__init__.py diff --git a/src/ansys/aedt/core/workflows/q3d/__init__.py b/src/ansys/aedt/core/extensions/q3d/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/q3d/__init__.py rename to src/ansys/aedt/core/extensions/q3d/__init__.py diff --git a/src/ansys/aedt/core/workflows/templates/__init__.py b/src/ansys/aedt/core/extensions/templates/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/templates/__init__.py rename to src/ansys/aedt/core/extensions/templates/__init__.py diff --git a/src/ansys/aedt/core/workflows/templates/jupyter.py_build b/src/ansys/aedt/core/extensions/templates/jupyter.py_build similarity index 100% rename from src/ansys/aedt/core/workflows/templates/jupyter.py_build rename to src/ansys/aedt/core/extensions/templates/jupyter.py_build diff --git a/src/ansys/aedt/core/workflows/templates/pyaedt_console.py_build b/src/ansys/aedt/core/extensions/templates/pyaedt_console.py_build similarity index 100% rename from src/ansys/aedt/core/workflows/templates/pyaedt_console.py_build rename to src/ansys/aedt/core/extensions/templates/pyaedt_console.py_build diff --git a/src/ansys/aedt/core/workflows/templates/pyaedt_utils.py b/src/ansys/aedt/core/extensions/templates/pyaedt_utils.py similarity index 100% rename from src/ansys/aedt/core/workflows/templates/pyaedt_utils.py rename to src/ansys/aedt/core/extensions/templates/pyaedt_utils.py diff --git a/src/ansys/aedt/core/workflows/templates/run_extension_manager.py_build b/src/ansys/aedt/core/extensions/templates/run_extension_manager.py_build similarity index 100% rename from src/ansys/aedt/core/workflows/templates/run_extension_manager.py_build rename to src/ansys/aedt/core/extensions/templates/run_extension_manager.py_build diff --git a/src/ansys/aedt/core/workflows/templates/run_pyaedt_script.py_build b/src/ansys/aedt/core/extensions/templates/run_pyaedt_script.py_build similarity index 100% rename from src/ansys/aedt/core/workflows/templates/run_pyaedt_script.py_build rename to src/ansys/aedt/core/extensions/templates/run_pyaedt_script.py_build diff --git a/src/ansys/aedt/core/workflows/templates/run_pyaedt_toolkit_script.py_build b/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build similarity index 100% rename from src/ansys/aedt/core/workflows/templates/run_pyaedt_toolkit_script.py_build rename to src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/extensions/templates/template_get_started.py similarity index 96% rename from src/ansys/aedt/core/workflows/templates/template_get_started.py rename to src/ansys/aedt/core/extensions/templates/template_get_started.py index 35528b2e37f..7215b7faf32 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/extensions/templates/template_get_started.py @@ -26,12 +26,12 @@ from pathlib import Path import ansys.aedt.core +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.design_types import get_pyaedt_app -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() @@ -50,7 +50,7 @@ def frontend(): import PIL.Image import PIL.ImageTk - from ansys.aedt.core.workflows.misc import ExtensionTheme + from ansys.aedt.core.extensions.misc import ExtensionTheme app = ansys.aedt.core.Desktop( new_desktop=False, @@ -77,7 +77,7 @@ def frontend(): master.flag = False # Load the logo for the main window - icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + icon_path = Path(ansys.aedt.core.extensions.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) diff --git a/src/ansys/aedt/core/workflows/twinbuilder/__init__.py b/src/ansys/aedt/core/extensions/twinbuilder/__init__.py similarity index 100% rename from src/ansys/aedt/core/workflows/twinbuilder/__init__.py rename to src/ansys/aedt/core/extensions/twinbuilder/__init__.py diff --git a/src/ansys/aedt/core/workflows/twinbuilder/convert_to_circuit.py b/src/ansys/aedt/core/extensions/twinbuilder/convert_to_circuit.py similarity index 95% rename from src/ansys/aedt/core/workflows/twinbuilder/convert_to_circuit.py rename to src/ansys/aedt/core/extensions/twinbuilder/convert_to_circuit.py index 2b4c53a32fa..7186cbbbf99 100644 --- a/src/ansys/aedt/core/workflows/twinbuilder/convert_to_circuit.py +++ b/src/ansys/aedt/core/extensions/twinbuilder/convert_to_circuit.py @@ -26,14 +26,14 @@ import sys import ansys.aedt.core +import ansys.aedt.core.extensions +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student from ansys.aedt.core.generic.file_utils import read_toml from ansys.aedt.core.generic.settings import is_linux -import ansys.aedt.core.workflows -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student port = get_port() version = get_aedt_version() diff --git a/src/ansys/aedt/core/workflows/twinbuilder/images/large/export_to_circuit.png b/src/ansys/aedt/core/extensions/twinbuilder/images/large/export_to_circuit.png similarity index 100% rename from src/ansys/aedt/core/workflows/twinbuilder/images/large/export_to_circuit.png rename to src/ansys/aedt/core/extensions/twinbuilder/images/large/export_to_circuit.png diff --git a/src/ansys/aedt/core/workflows/twinbuilder/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/twinbuilder/toolkits_catalog.toml similarity index 100% rename from src/ansys/aedt/core/workflows/twinbuilder/toolkits_catalog.toml rename to src/ansys/aedt/core/extensions/twinbuilder/toolkits_catalog.toml diff --git a/src/pyaedt/workflows/__init__.py b/src/pyaedt/workflows/__init__.py index b06f752f19d..1c2cc9aadb8 100644 --- a/src/pyaedt/workflows/__init__.py +++ b/src/pyaedt/workflows/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows import * +from ansys.aedt.core.extensions import * diff --git a/src/pyaedt/workflows/circuit/__init__.py b/src/pyaedt/workflows/circuit/__init__.py index 65443a8fa4b..030b4ec3d0a 100644 --- a/src/pyaedt/workflows/circuit/__init__.py +++ b/src/pyaedt/workflows/circuit/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.circuit import * +from ansys.aedt.core.extensions.circuit import * diff --git a/src/pyaedt/workflows/customize_automation_tab.py b/src/pyaedt/workflows/customize_automation_tab.py index cd18a4921af..e4f0abff3b2 100644 --- a/src/pyaedt/workflows/customize_automation_tab.py +++ b/src/pyaedt/workflows/customize_automation_tab.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.customize_automation_tab import * +from ansys.aedt.core.extensions.customize_automation_tab import * diff --git a/src/pyaedt/workflows/emit/__init__.py b/src/pyaedt/workflows/emit/__init__.py index 4a34d3d13ea..0f84722ef97 100644 --- a/src/pyaedt/workflows/emit/__init__.py +++ b/src/pyaedt/workflows/emit/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.emit import * +from ansys.aedt.core.extensions.emit import * diff --git a/src/pyaedt/workflows/hfss/__init__.py b/src/pyaedt/workflows/hfss/__init__.py index 33d0bfa52b0..82b5cdc2dec 100644 --- a/src/pyaedt/workflows/hfss/__init__.py +++ b/src/pyaedt/workflows/hfss/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss import * +from ansys.aedt.core.extensions.hfss import * diff --git a/src/pyaedt/workflows/hfss/push_excitation_from_file.py b/src/pyaedt/workflows/hfss/push_excitation_from_file.py index f4c5756d306..fbb75a316f5 100644 --- a/src/pyaedt/workflows/hfss/push_excitation_from_file.py +++ b/src/pyaedt/workflows/hfss/push_excitation_from_file.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss.push_excitation_from_file import * +from ansys.aedt.core.extensions.hfss.push_excitation_from_file import * diff --git a/src/pyaedt/workflows/hfss3dlayout/__init__.py b/src/pyaedt/workflows/hfss3dlayout/__init__.py index dbd8d03831e..d64172a48a6 100644 --- a/src/pyaedt/workflows/hfss3dlayout/__init__.py +++ b/src/pyaedt/workflows/hfss3dlayout/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss3dlayout import * +from ansys.aedt.core.extensions.hfss3dlayout import * diff --git a/src/pyaedt/workflows/hfss3dlayout/cutout.py b/src/pyaedt/workflows/hfss3dlayout/cutout.py index 162c16fe791..a48e886bc65 100644 --- a/src/pyaedt/workflows/hfss3dlayout/cutout.py +++ b/src/pyaedt/workflows/hfss3dlayout/cutout.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss3dlayout.cutout import * +from ansys.aedt.core.extensions.hfss3dlayout.cutout import * diff --git a/src/pyaedt/workflows/hfss3dlayout/export_layout.py b/src/pyaedt/workflows/hfss3dlayout/export_layout.py index 921b8855571..c393f382667 100644 --- a/src/pyaedt/workflows/hfss3dlayout/export_layout.py +++ b/src/pyaedt/workflows/hfss3dlayout/export_layout.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss3dlayout.export_layout import * +from ansys.aedt.core.extensions.hfss3dlayout.export_layout import * diff --git a/src/pyaedt/workflows/hfss3dlayout/export_to_3d.py b/src/pyaedt/workflows/hfss3dlayout/export_to_3d.py index 0d1362cf516..a47be785ebf 100644 --- a/src/pyaedt/workflows/hfss3dlayout/export_to_3d.py +++ b/src/pyaedt/workflows/hfss3dlayout/export_to_3d.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss3dlayout.export_to_3d import * +from ansys.aedt.core.extensions.hfss3dlayout.export_to_3d import * diff --git a/src/pyaedt/workflows/hfss3dlayout/parametrize_edb.py b/src/pyaedt/workflows/hfss3dlayout/parametrize_edb.py index de211c103c3..edaf62e4201 100644 --- a/src/pyaedt/workflows/hfss3dlayout/parametrize_edb.py +++ b/src/pyaedt/workflows/hfss3dlayout/parametrize_edb.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss3dlayout.parametrize_edb import * +from ansys.aedt.core.extensions.hfss3dlayout.parametrize_edb import * diff --git a/src/pyaedt/workflows/hfss3dlayout/push_excitation_from_file_3dl.py b/src/pyaedt/workflows/hfss3dlayout/push_excitation_from_file_3dl.py index 396ddb8620d..b36d7de2b96 100644 --- a/src/pyaedt/workflows/hfss3dlayout/push_excitation_from_file_3dl.py +++ b/src/pyaedt/workflows/hfss3dlayout/push_excitation_from_file_3dl.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.hfss3dlayout.push_excitation_from_file_3dl import * +from ansys.aedt.core.extensions.hfss3dlayout.push_excitation_from_file_3dl import * diff --git a/src/pyaedt/workflows/icepak/__init__.py b/src/pyaedt/workflows/icepak/__init__.py index 03cba74abf2..22a4a18fe9e 100644 --- a/src/pyaedt/workflows/icepak/__init__.py +++ b/src/pyaedt/workflows/icepak/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.icepak import * +from ansys.aedt.core.extensions.icepak import * diff --git a/src/pyaedt/workflows/icepak/power_map_from_csv.py b/src/pyaedt/workflows/icepak/power_map_from_csv.py index 3d7d3112167..d5839fcba41 100644 --- a/src/pyaedt/workflows/icepak/power_map_from_csv.py +++ b/src/pyaedt/workflows/icepak/power_map_from_csv.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.icepak.power_map_from_csv import * +from ansys.aedt.core.extensions.icepak.power_map_from_csv import * diff --git a/src/pyaedt/workflows/installer/__init__.py b/src/pyaedt/workflows/installer/__init__.py index 71e061e8b7b..1911c0704b7 100644 --- a/src/pyaedt/workflows/installer/__init__.py +++ b/src/pyaedt/workflows/installer/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.installer import * +from ansys.aedt.core.extensions.installer import * diff --git a/src/pyaedt/workflows/installer/console_setup.py b/src/pyaedt/workflows/installer/console_setup.py index 829dd763f0f..9e439892feb 100644 --- a/src/pyaedt/workflows/installer/console_setup.py +++ b/src/pyaedt/workflows/installer/console_setup.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.installer.console_setup import * +from ansys.aedt.core.extensions.installer.console_setup import * diff --git a/src/pyaedt/workflows/installer/extension_manager.py b/src/pyaedt/workflows/installer/extension_manager.py index 3455dde2923..2f90ddce445 100644 --- a/src/pyaedt/workflows/installer/extension_manager.py +++ b/src/pyaedt/workflows/installer/extension_manager.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.installer.extension_manager import * +from ansys.aedt.core.extensions.installer.extension_manager import * diff --git a/src/pyaedt/workflows/installer/pyaedt_installer.py b/src/pyaedt/workflows/installer/pyaedt_installer.py index 0178052ab05..e5ec205b522 100644 --- a/src/pyaedt/workflows/installer/pyaedt_installer.py +++ b/src/pyaedt/workflows/installer/pyaedt_installer.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.installer.pyaedt_installer import * +from ansys.aedt.core.extensions.installer.pyaedt_installer import * diff --git a/src/pyaedt/workflows/maxwell2d/__init__.py b/src/pyaedt/workflows/maxwell2d/__init__.py index c06ef4e7384..be6ef9500da 100644 --- a/src/pyaedt/workflows/maxwell2d/__init__.py +++ b/src/pyaedt/workflows/maxwell2d/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.maxwell2d import * +from ansys.aedt.core.extensions.maxwell2d import * diff --git a/src/pyaedt/workflows/maxwell3d/__init__.py b/src/pyaedt/workflows/maxwell3d/__init__.py index cf8bba9aa9c..ceb478237af 100644 --- a/src/pyaedt/workflows/maxwell3d/__init__.py +++ b/src/pyaedt/workflows/maxwell3d/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.maxwell3d import * +from ansys.aedt.core.extensions.maxwell3d import * diff --git a/src/pyaedt/workflows/mechanical/__init__.py b/src/pyaedt/workflows/mechanical/__init__.py index 8432133d00d..4435b16c5cc 100644 --- a/src/pyaedt/workflows/mechanical/__init__.py +++ b/src/pyaedt/workflows/mechanical/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.mechanical import * +from ansys.aedt.core.extensions.mechanical import * diff --git a/src/pyaedt/workflows/misc.py b/src/pyaedt/workflows/misc.py index 6b7895f3f8e..860fc70c658 100644 --- a/src/pyaedt/workflows/misc.py +++ b/src/pyaedt/workflows/misc.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.misc import * +from ansys.aedt.core.extensions.misc import * diff --git a/src/pyaedt/workflows/project/__init__.py b/src/pyaedt/workflows/project/__init__.py index 6d7df5dae9e..73c7ce470e8 100644 --- a/src/pyaedt/workflows/project/__init__.py +++ b/src/pyaedt/workflows/project/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.project import * +from ansys.aedt.core.extensions.project import * diff --git a/src/pyaedt/workflows/project/advanced_fields_calculator.py b/src/pyaedt/workflows/project/advanced_fields_calculator.py index 91e7641e6df..0e976b846a3 100644 --- a/src/pyaedt/workflows/project/advanced_fields_calculator.py +++ b/src/pyaedt/workflows/project/advanced_fields_calculator.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.project.advanced_fields_calculator import * +from ansys.aedt.core.extensions.project.advanced_fields_calculator import * diff --git a/src/pyaedt/workflows/project/configure_edb.py b/src/pyaedt/workflows/project/configure_edb.py index e322f00f3d9..c4d07059fc7 100644 --- a/src/pyaedt/workflows/project/configure_edb.py +++ b/src/pyaedt/workflows/project/configure_edb.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.project.configure_edb import * +from ansys.aedt.core.extensions.project.configure_edb import * diff --git a/src/pyaedt/workflows/project/create_report.py b/src/pyaedt/workflows/project/create_report.py index 638106114db..d46231b6cc4 100644 --- a/src/pyaedt/workflows/project/create_report.py +++ b/src/pyaedt/workflows/project/create_report.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.project.create_report import * +from ansys.aedt.core.extensions.project.create_report import * diff --git a/src/pyaedt/workflows/project/import_nastran.py b/src/pyaedt/workflows/project/import_nastran.py index ca517a297c8..86eb7658015 100644 --- a/src/pyaedt/workflows/project/import_nastran.py +++ b/src/pyaedt/workflows/project/import_nastran.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.project.import_nastran import * +from ansys.aedt.core.extensions.project.import_nastran import * diff --git a/src/pyaedt/workflows/project/kernel_converter.py b/src/pyaedt/workflows/project/kernel_converter.py index df5b0ccbb79..155f921ef77 100644 --- a/src/pyaedt/workflows/project/kernel_converter.py +++ b/src/pyaedt/workflows/project/kernel_converter.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.project.kernel_converter import * +from ansys.aedt.core.extensions.project.kernel_converter import * diff --git a/src/pyaedt/workflows/q2d/__init__.py b/src/pyaedt/workflows/q2d/__init__.py index 851b62e6a70..bc8cdacc7e4 100644 --- a/src/pyaedt/workflows/q2d/__init__.py +++ b/src/pyaedt/workflows/q2d/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.q2d import * +from ansys.aedt.core.extensions.q2d import * diff --git a/src/pyaedt/workflows/q3d/__init__.py b/src/pyaedt/workflows/q3d/__init__.py index 6d5bd1f9997..b2884eded95 100644 --- a/src/pyaedt/workflows/q3d/__init__.py +++ b/src/pyaedt/workflows/q3d/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.q3d import * +from ansys.aedt.core.extensions.q3d import * diff --git a/src/pyaedt/workflows/templates/__init__.py b/src/pyaedt/workflows/templates/__init__.py index 9e87de6ed12..eb8990f13ee 100644 --- a/src/pyaedt/workflows/templates/__init__.py +++ b/src/pyaedt/workflows/templates/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.templates import * +from ansys.aedt.core.extensions.templates import * diff --git a/src/pyaedt/workflows/templates/pyaedt_utils.py b/src/pyaedt/workflows/templates/pyaedt_utils.py index 193bb8d840a..94c14d5e267 100644 --- a/src/pyaedt/workflows/templates/pyaedt_utils.py +++ b/src/pyaedt/workflows/templates/pyaedt_utils.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.templates.pyaedt_utils import * +from ansys.aedt.core.extensions.templates.pyaedt_utils import * diff --git a/src/pyaedt/workflows/templates/template_get_started.py b/src/pyaedt/workflows/templates/template_get_started.py index 9dec129452a..e98d724280a 100644 --- a/src/pyaedt/workflows/templates/template_get_started.py +++ b/src/pyaedt/workflows/templates/template_get_started.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.templates.template_get_started import * \ No newline at end of file +from ansys.aedt.core.extensions.templates.template_get_started import * \ No newline at end of file diff --git a/src/pyaedt/workflows/twinbuilder/__init__.py b/src/pyaedt/workflows/twinbuilder/__init__.py index 0a5b17eff66..382355df18c 100644 --- a/src/pyaedt/workflows/twinbuilder/__init__.py +++ b/src/pyaedt/workflows/twinbuilder/__init__.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.twinbuilder import * +from ansys.aedt.core.extensions.twinbuilder import * diff --git a/src/pyaedt/workflows/twinbuilder/convert_to_circuit.py b/src/pyaedt/workflows/twinbuilder/convert_to_circuit.py index 57c2cb609e3..a73edd49c77 100644 --- a/src/pyaedt/workflows/twinbuilder/convert_to_circuit.py +++ b/src/pyaedt/workflows/twinbuilder/convert_to_circuit.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.twinbuilder.convert_to_circuit import * +from ansys.aedt.core.extensions.twinbuilder.convert_to_circuit import * diff --git a/tests/system/general/test_01_Design.py b/tests/system/general/test_01_Design.py index 214f3e93726..2fd64d54cd6 100644 --- a/tests/system/general/test_01_Design.py +++ b/tests/system/general/test_01_Design.py @@ -32,9 +32,9 @@ from ansys.aedt.core.application.aedt_objects import AedtObjects from ansys.aedt.core.application.design import DesignSettings from ansys.aedt.core.application.design_solutions import model_names +from ansys.aedt.core.extensions import customize_automation_tab from ansys.aedt.core.generic.general_methods import is_linux from ansys.aedt.core.generic.general_methods import settings -from ansys.aedt.core.workflows import customize_automation_tab import pytest from tests import TESTS_GENERAL_PATH diff --git a/tests/system/general/test_01_toolkit_icons.py b/tests/system/general/test_01_toolkit_icons.py index 1e1081a9a18..6b8b5c1475e 100644 --- a/tests/system/general/test_01_toolkit_icons.py +++ b/tests/system/general/test_01_toolkit_icons.py @@ -30,7 +30,7 @@ defusedxml.defuse_stdlib() -from ansys.aedt.core.workflows.customize_automation_tab import add_automation_tab +from ansys.aedt.core.extensions.customize_automation_tab import add_automation_tab import pytest diff --git a/tests/system/visualization/test_45_workflows.py b/tests/system/visualization/test_45_workflows.py index 6b093b971d8..168f43a67a3 100644 --- a/tests/system/visualization/test_45_workflows.py +++ b/tests/system/visualization/test_45_workflows.py @@ -56,7 +56,7 @@ def init(self, desktop): def test_01_template(self, add_app): aedtapp = add_app(application=ansys.aedt.core.Hfss, project_name="workflow_test") - from ansys.aedt.core.workflows.templates.template_get_started import main + from ansys.aedt.core.extensions.templates.template_get_started import main assert main({"is_test": True, "origin_x": 2}) assert len(aedtapp.modeler.object_list) == 1 @@ -76,7 +76,7 @@ def test_01_template(self, add_app): def test_02_hfss_push(self, add_app): aedtapp = add_app(project_name=push_project, subfolder=test_subfolder) - from ansys.aedt.core.workflows.hfss.push_excitation_from_file import main + from ansys.aedt.core.extensions.hfss.push_excitation_from_file import main # No choice file_path = os.path.join(local_path, "example_models", "T20", "Sinusoidal.csv") @@ -97,7 +97,7 @@ def test_03_hfss3dlayout_export_3d_q3d(self, local_scratch, add_app): aedtapp.save_project(os.path.join(local_scratch.path, "test_03_hfss3dlayout_export_3d_q3d.aedt")) - from ansys.aedt.core.workflows.hfss3dlayout.export_to_3d import main + from ansys.aedt.core.extensions.hfss3dlayout.export_to_3d import main assert main({"is_test": True, "choice": "Export to Q3D"}) @@ -112,7 +112,7 @@ def test_03_hfss3dlayout_export_3d_icepak(self, local_scratch, add_app): aedtapp.save_project(os.path.join(local_scratch.path, "test_03_hfss3dlayout_export_3d_icepak.aedt")) - from ansys.aedt.core.workflows.hfss3dlayout.export_to_3d import main + from ansys.aedt.core.extensions.hfss3dlayout.export_to_3d import main assert main({"is_test": True, "choice": "Export to Icepak"}) @@ -127,7 +127,7 @@ def test_03_hfss3dlayout_export_3d_maxwell(self, local_scratch, add_app): aedtapp.save_project(os.path.join(local_scratch.path, "test_03_hfss3dlayout_export_3d_maxwell.aedt")) - from ansys.aedt.core.workflows.hfss3dlayout.export_to_3d import main + from ansys.aedt.core.extensions.hfss3dlayout.export_to_3d import main assert main({"is_test": True, "choice": "Export to Maxwell 3D"}) @@ -138,7 +138,7 @@ def test_03_hfss3dlayout_export_3d_maxwell(self, local_scratch, add_app): def test_04_project_report(self, add_app): aedtapp = add_app(application=ansys.aedt.core.Hfss, project_name=report, subfolder=test_subfolder) - from ansys.aedt.core.workflows.project.create_report import main + from ansys.aedt.core.extensions.project.create_report import main assert main({"is_test": True}) @@ -148,7 +148,7 @@ def test_04_project_report(self, add_app): def test_05_project_import_nastran(self, add_app, local_scratch): aedtapp = add_app(application=ansys.aedt.core.Hfss, project_name="workflow_nastran") - from ansys.aedt.core.workflows.project.import_nastran import main + from ansys.aedt.core.extensions.project.import_nastran import main # Non-existing file file_path = os.path.join(local_scratch.path, "test_cad_invented.nas") @@ -177,7 +177,7 @@ def test_05_project_import_nastran(self, add_app, local_scratch): def test_06_project_import_stl(self, add_app, local_scratch): aedtapp = add_app(application=ansys.aedt.core.Hfss, project_name="workflow_stl") - from ansys.aedt.core.workflows.project.import_nastran import main + from ansys.aedt.core.extensions.project.import_nastran import main file_path = shutil.copy( os.path.join(local_path, "example_models", "T20", "sphere.stl"), @@ -195,14 +195,14 @@ def test_07_twinbuilder_convert_circuit(self, add_app): application=ansys.aedt.core.TwinBuilder, project_name=twinbuilder_circuit, subfolder=test_subfolder ) - from ansys.aedt.core.workflows.twinbuilder.convert_to_circuit import main + from ansys.aedt.core.extensions.twinbuilder.convert_to_circuit import main assert main({"is_test": True}) aedtapp.close_project() def test_08_configure_a3d(self, local_scratch): - from ansys.aedt.core.workflows.project.configure_edb import main + from ansys.aedt.core.extensions.project.configure_edb import main configuration_path = shutil.copy( os.path.join(visualization_local_path, "example_models", "T45", "ports.json"), @@ -328,7 +328,7 @@ def test_08_advanced_fields_calculator_non_general(self, add_app): assert not aedtapp.post.fields_calculator.add_expression("voltage_line", "inner") assert not aedtapp.post.fields_calculator.add_expression("voltage_line", 500) - from ansys.aedt.core.workflows.project.advanced_fields_calculator import main + from ansys.aedt.core.extensions.project.advanced_fields_calculator import main assert main( { @@ -374,7 +374,7 @@ def test_09_advanced_fields_calculator_general(self, add_app): assert not aedtapp.post.fields_calculator.add_expression("e_field_magnitude", "Polyline1") assert not aedtapp.post.fields_calculator.load_expression_file("invented.toml") - from ansys.aedt.core.workflows.project.advanced_fields_calculator import main + from ansys.aedt.core.extensions.project.advanced_fields_calculator import main if desktop_version > "2024.2": assert main( @@ -430,7 +430,7 @@ def test_09_advanced_fields_calculator_general(self, add_app): aedtapp.close_project(aedtapp.project_name) def test_10_push_excitation_3dl(self, local_scratch, desktop): - from ansys.aedt.core.workflows.hfss3dlayout.push_excitation_from_file_3dl import main + from ansys.aedt.core.extensions.hfss3dlayout.push_excitation_from_file_3dl import main project_path = shutil.copy( os.path.join(local_path, "example_models", "T41", "test_post_3d_layout_solved_23R2.aedtz"), @@ -452,7 +452,7 @@ def test_10_push_excitation_3dl(self, local_scratch, desktop): h3d.close_project(h3d.project_name) def test_11_cutout(self, add_app): - from ansys.aedt.core.workflows.hfss3dlayout.cutout import main + from ansys.aedt.core.extensions.hfss3dlayout.cutout import main app = add_app("ANSYS-HSD_V1", application=ansys.aedt.core.Hfss3dLayout, subfolder=test_subfolder) @@ -469,7 +469,7 @@ def test_11_cutout(self, add_app): app.close_project() def test_12_export_layout(self, add_app): - from ansys.aedt.core.workflows.hfss3dlayout.export_layout import main + from ansys.aedt.core.extensions.hfss3dlayout.export_layout import main app = add_app("ANSYS-HSD_V1", application=ansys.aedt.core.Hfss3dLayout, subfolder=test_subfolder) @@ -477,7 +477,7 @@ def test_12_export_layout(self, add_app): app.close_project() def test_13_parametrize_layout(self, local_scratch): - from ansys.aedt.core.workflows.hfss3dlayout.parametrize_edb import main + from ansys.aedt.core.extensions.hfss3dlayout.parametrize_edb import main file_path = os.path.join(local_scratch.path, "ANSYS-HSD_V1_param.aedb") @@ -502,7 +502,7 @@ def test_13_parametrize_layout(self, local_scratch): ) def test_14_power_map_creation_ipk(self, local_scratch, add_app): - from ansys.aedt.core.workflows.icepak.power_map_from_csv import main + from ansys.aedt.core.extensions.icepak.power_map_from_csv import main file_path = os.path.join(visualization_local_path, "example_models", "T45", "icepak_classic_powermap.csv") aedtapp = add_app("PowerMap", application=ansys.aedt.core.Icepak, subfolder=test_subfolder) @@ -513,7 +513,7 @@ def test_14_power_map_creation_ipk(self, local_scratch, add_app): def test_15_import_asc(self, local_scratch, add_app): aedtapp = add_app("Circuit", application=ansys.aedt.core.Circuit) - from ansys.aedt.core.workflows.circuit.import_schematic import main + from ansys.aedt.core.extensions.circuit.import_schematic import main file_path = os.path.join(local_path, "example_models", "T21", "butter.asc") assert main({"is_test": True, "asc_file": file_path}) @@ -534,7 +534,7 @@ def test_15_import_asc(self, local_scratch, add_app): def test_16_arbitrary_waveport(self, local_scratch): import tempfile - from ansys.aedt.core.workflows.hfss3dlayout.generate_arbitrary_wave_ports import main + from ansys.aedt.core.extensions.hfss3dlayout.generate_arbitrary_wave_ports import main file_path = os.path.join(local_scratch.path, "waveport.aedb") @@ -551,7 +551,7 @@ def test_16_arbitrary_waveport(self, local_scratch): temp_dir.cleanup() def test_17_choke_designer(self, local_scratch): - from ansys.aedt.core.workflows.hfss.choke_designer import main + from ansys.aedt.core.extensions.hfss.choke_designer import main choke_config = { "Number of Windings": {"1": True, "2": False, "3": False, "4": False}, @@ -589,7 +589,7 @@ def test_17_choke_designer(self, local_scratch): @pytest.mark.skipif(is_linux, reason="Not supported in Linux.") def test_18_via_merging(self, local_scratch): - from ansys.aedt.core.workflows.hfss3dlayout.via_clustering_extension import main + from ansys.aedt.core.extensions.hfss3dlayout.via_clustering_extension import main file_path = os.path.join(local_scratch.path, "test_via_merging.aedb") new_file = os.path.join(local_scratch.path, "new_test_via_merging.aedb") @@ -612,7 +612,7 @@ def test_18_via_merging(self, local_scratch): def test_19_shielding_effectiveness(self, add_app, local_scratch): aedtapp = add_app(application=ansys.aedt.core.Hfss, project_name="se") - from ansys.aedt.core.workflows.hfss.shielding_effectiveness import main + from ansys.aedt.core.extensions.hfss.shielding_effectiveness import main assert not main( { @@ -654,7 +654,7 @@ def test_19_shielding_effectiveness(self, add_app, local_scratch): def test_20_point_cloud(self, add_app, local_scratch): aedtapp = add_app(project_name=point_cloud_generator, subfolder=test_subfolder) - from ansys.aedt.core.workflows.project.points_cloud import main + from ansys.aedt.core.extensions.project.points_cloud import main # No choice assert main({"is_test": True, "choice": "Torus1", "points": 1000, "output_file": local_scratch.path}) @@ -673,14 +673,14 @@ def test_21_move_it(self, add_app, local_scratch): points=test_points, segment_type=PolylineSegment("Spline", num_points=4), name="spline_4pt" ) - from ansys.aedt.core.workflows.hfss.move_it import main + from ansys.aedt.core.extensions.hfss.move_it import main assert main({"is_test": True, "choice": p2.name, "velocity": 1.4, "acceleration": 0, "delay": 0}) aedtapp.close_project(aedtapp.project_name) def test_fields_distribution(self, add_app, local_scratch): - from ansys.aedt.core.workflows.maxwell3d.fields_distribution import main + from ansys.aedt.core.extensions.maxwell3d.fields_distribution import main file_path = os.path.join(local_scratch.path, "loss_distribution.csv") @@ -766,7 +766,7 @@ def test_fields_distribution(self, add_app, local_scratch): @pytest.mark.skipif(is_linux, reason="Not Supported on Linux.") def test_layout_design_toolkit_antipad_1(self, add_app, local_scratch): - from ansys.aedt.core.workflows.hfss3dlayout.post_layout_design_toolkit import BackendAntipad + from ansys.aedt.core.extensions.hfss3dlayout.post_layout_design_toolkit import BackendAntipad file_path = os.path.join(local_scratch.path, "ANSYS-HSD_V1_antipad_1.aedb") @@ -782,7 +782,7 @@ def test_layout_design_toolkit_antipad_1(self, add_app, local_scratch): @pytest.mark.skipif(is_linux, reason="Not Supported on Linux.") def test_layout_design_toolkit_antipad_2(self, add_app, local_scratch): - from ansys.aedt.core.workflows.hfss3dlayout.post_layout_design_toolkit import BackendAntipad + from ansys.aedt.core.extensions.hfss3dlayout.post_layout_design_toolkit import BackendAntipad file_path = os.path.join(local_scratch.path, "ANSYS-HSD_V1_antipad_2.aedb") @@ -800,7 +800,7 @@ def test_layout_design_toolkit_antipad_2(self, add_app, local_scratch): @pytest.mark.skipif(is_linux, reason="Not Supported on Linux.") def test_layout_design_toolkit_micro_via(self, add_app, local_scratch): - from ansys.aedt.core.workflows.hfss3dlayout.post_layout_design_toolkit import BackendMircoVia + from ansys.aedt.core.extensions.hfss3dlayout.post_layout_design_toolkit import BackendMircoVia file_path = os.path.join(local_scratch.path, "ANSYS-HSD_V1_antipad_3.aedb") diff --git a/tests/unit/test_extension_misc.py b/tests/unit/test_extension_misc.py index 51c9104aab9..77123e2c25f 100644 --- a/tests/unit/test_extension_misc.py +++ b/tests/unit/test_extension_misc.py @@ -28,13 +28,13 @@ from unittest.mock import MagicMock from unittest.mock import patch -from ansys.aedt.core.workflows.misc import ExtensionTheme -from ansys.aedt.core.workflows.misc import __string_to_bool -from ansys.aedt.core.workflows.misc import get_aedt_version -from ansys.aedt.core.workflows.misc import get_arguments -from ansys.aedt.core.workflows.misc import get_port -from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.misc import is_student +from ansys.aedt.core.extensions.misc import ExtensionTheme +from ansys.aedt.core.extensions.misc import __string_to_bool +from ansys.aedt.core.extensions.misc import get_aedt_version +from ansys.aedt.core.extensions.misc import get_arguments +from ansys.aedt.core.extensions.misc import get_port +from ansys.aedt.core.extensions.misc import get_process_id +from ansys.aedt.core.extensions.misc import is_student import pytest DUMMY_ENV_VARS = { From acca17031bd9271b833ccc317c5a34db4c263ac3 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Mon, 28 Apr 2025 10:56:48 +0200 Subject: [PATCH 2/8] Comment template --- .../aedt/core/extensions/installer/pyaedt_installer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py index 462fc882776..e84e242a3a5 100644 --- a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py +++ b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py @@ -59,10 +59,10 @@ def add_pyaedt_to_aedt( extensions_dir = os.path.join(personal_lib, "Toolkits") os.makedirs(extensions_dir, exist_ok=True) - templates_dir = os.path.dirname(ansys.aedt.core.extensions.templates.__file__) - script_file = os.path.join(templates_dir, "pyaedt_utils.py") - dest_script_path = os.path.join(extensions_dir, "pyaedt_utils.py") - shutil.copy2(script_file, dest_script_path) + # templates_dir = os.path.dirname(ansys.aedt.core.extensions.templates.__file__) + # script_file = os.path.join(templates_dir, "pyaedt_utils.py") + # dest_script_path = os.path.join(extensions_dir, "pyaedt_utils.py") + # shutil.copy2(script_file, dest_script_path) __add_pyaedt_tabs(personal_lib, aedt_version) @@ -89,7 +89,7 @@ def __add_pyaedt_tabs(personal_lib, aedt_version): template_name, icon_file=icon_file, product="Project", - copy_to_personal_lib=True, + copy_to_personal_lib=False, executable_interpreter=None, panel="Panel_PyAEDT_Installer", personal_lib=personal_lib, From f4c6d73ab873110f2b77cfe201ebea282f74e7bb Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Mon, 28 Apr 2025 12:32:23 +0200 Subject: [PATCH 3/8] Use pyaedt_utils from installed library --- src/ansys/aedt/core/extensions/customize_automation_tab.py | 1 + .../aedt/core/extensions/installer/pyaedt_installer.py | 2 +- src/ansys/aedt/core/extensions/templates/jupyter.py_build | 4 +--- .../aedt/core/extensions/templates/pyaedt_console.py_build | 4 +--- .../extensions/templates/run_extension_manager.py_build | 4 +--- .../core/extensions/templates/run_pyaedt_script.py_build | 4 +--- .../extensions/templates/run_pyaedt_toolkit_script.py_build | 6 +++--- 7 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/ansys/aedt/core/extensions/customize_automation_tab.py b/src/ansys/aedt/core/extensions/customize_automation_tab.py index df24f2bd26f..175393e46f6 100644 --- a/src/ansys/aedt/core/extensions/customize_automation_tab.py +++ b/src/ansys/aedt/core/extensions/customize_automation_tab.py @@ -327,6 +327,7 @@ def add_script_to_menu( build_file_data = build_file_data.replace("##PYTHON_EXE##", executable_version_agnostic) build_file_data = build_file_data.replace("##JUPYTER_EXE##", jupyter_executable) build_file_data = build_file_data.replace("##TOOLKIT_NAME##", file_name) + build_file_data = build_file_data.replace("##EXTENSION_TEMPLATES##", templates_dir) if dest_script_path: build_file_data = build_file_data.replace("##PYTHON_SCRIPT##", dest_script_path) diff --git a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py index e84e242a3a5..8dc4cf25e50 100644 --- a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py +++ b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py @@ -89,7 +89,7 @@ def __add_pyaedt_tabs(personal_lib, aedt_version): template_name, icon_file=icon_file, product="Project", - copy_to_personal_lib=False, + copy_to_personal_lib=True, executable_interpreter=None, panel="Panel_PyAEDT_Installer", personal_lib=personal_lib, diff --git a/src/ansys/aedt/core/extensions/templates/jupyter.py_build b/src/ansys/aedt/core/extensions/templates/jupyter.py_build index c08fb3cd945..40a767eb20f 100644 --- a/src/ansys/aedt/core/extensions/templates/jupyter.py_build +++ b/src/ansys/aedt/core/extensions/templates/jupyter.py_build @@ -37,9 +37,7 @@ if is_linux: else: import subprocess -toolkits_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) - -sys.path.append(toolkits_dir) +sys.path.append(r"##EXTENSION_TEMPLATES##") import pyaedt_utils diff --git a/src/ansys/aedt/core/extensions/templates/pyaedt_console.py_build b/src/ansys/aedt/core/extensions/templates/pyaedt_console.py_build index e13661cd3f3..cf93185bbb5 100644 --- a/src/ansys/aedt/core/extensions/templates/pyaedt_console.py_build +++ b/src/ansys/aedt/core/extensions/templates/pyaedt_console.py_build @@ -37,9 +37,7 @@ if is_linux: else: import subprocess -toolkits_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) - -sys.path.append(toolkits_dir) +sys.path.append(r"##EXTENSION_TEMPLATES##") import pyaedt_utils diff --git a/src/ansys/aedt/core/extensions/templates/run_extension_manager.py_build b/src/ansys/aedt/core/extensions/templates/run_extension_manager.py_build index 0d831bc42a4..9a19a4b5a47 100644 --- a/src/ansys/aedt/core/extensions/templates/run_extension_manager.py_build +++ b/src/ansys/aedt/core/extensions/templates/run_extension_manager.py_build @@ -36,9 +36,7 @@ if is_linux: else: import subprocess -extensions_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) - -sys.path.append(extensions_dir) +sys.path.append(r"##EXTENSION_TEMPLATES##") import pyaedt_utils diff --git a/src/ansys/aedt/core/extensions/templates/run_pyaedt_script.py_build b/src/ansys/aedt/core/extensions/templates/run_pyaedt_script.py_build index 86ccec2ac92..0c7d42510ef 100644 --- a/src/ansys/aedt/core/extensions/templates/run_pyaedt_script.py_build +++ b/src/ansys/aedt/core/extensions/templates/run_pyaedt_script.py_build @@ -37,9 +37,7 @@ if is_linux: else: import subprocess -toolkits_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) - -sys.path.append(toolkits_dir) +sys.path.append(r"##EXTENSION_TEMPLATES##") import pyaedt_utils diff --git a/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build b/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build index ddbc5093024..2c30cc74e96 100644 --- a/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build +++ b/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build @@ -34,15 +34,15 @@ is_linux = os.name == "posix" is_iron_python = platform.python_implementation().lower() == "ironpython" - def aedt_script(): try: if is_linux: import subprocessdotnet as subprocess else: import subprocess - toolkits_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) - sys.path.append(toolkits_dir) + + sys.path.append(r"##EXTENSION_TEMPLATES##") + import pyaedt_utils # Get AEDT version From b9fc089ba63455fe1e02db076a99dd90f19366e3 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 29 Apr 2025 08:44:41 +0200 Subject: [PATCH 4/8] Update version manager --- .../extensions/customize_automation_tab.py | 4 +- .../installer/extensions_catalog.toml | 6 ++ .../images/large/version_manager.png | Bin 0 -> 2217 bytes .../extensions/installer/pyaedt_installer.py | 8 +- .../{project => installer}/version_manager.py | 94 +++--------------- .../extensions/project/toolkits_catalog.toml | 7 -- .../run_pyaedt_toolkit_script.py_build | 5 +- 7 files changed, 25 insertions(+), 99 deletions(-) create mode 100644 src/ansys/aedt/core/extensions/installer/images/large/version_manager.png rename src/ansys/aedt/core/extensions/{project => installer}/version_manager.py (81%) diff --git a/src/ansys/aedt/core/extensions/customize_automation_tab.py b/src/ansys/aedt/core/extensions/customize_automation_tab.py index 175393e46f6..b7b77410537 100644 --- a/src/ansys/aedt/core/extensions/customize_automation_tab.py +++ b/src/ansys/aedt/core/extensions/customize_automation_tab.py @@ -224,7 +224,7 @@ def available_toolkits(): def add_script_to_menu( name, - script_file, + script_file=None, template_file="run_pyaedt_toolkit_script", icon_file=None, product="Project", @@ -245,7 +245,7 @@ def add_script_to_menu( ---------- name : str Name of the toolkit to appear in AEDT. - script_file : str + script_file : str, optional Full path to the script file. The script will be copied to Personal Lib. template_file : str Script template name to use. The default is ``"run_pyaedt_toolkit_script"``. diff --git a/src/ansys/aedt/core/extensions/installer/extensions_catalog.toml b/src/ansys/aedt/core/extensions/installer/extensions_catalog.toml index bb054192289..0d2782bd066 100644 --- a/src/ansys/aedt/core/extensions/installer/extensions_catalog.toml +++ b/src/ansys/aedt/core/extensions/installer/extensions_catalog.toml @@ -21,3 +21,9 @@ name = "Extension Manager" script = "extension_manager.py" icon = "extension_manager.png" template = "run_extension_manager" + +[VersionManager] +name = "Version Manager" +script = "version_manager.py" +icon = "version_manager.png" +template = "run_pyaedt_toolkit_script" diff --git a/src/ansys/aedt/core/extensions/installer/images/large/version_manager.png b/src/ansys/aedt/core/extensions/installer/images/large/version_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fc1fc2d8d274748607c836002b6770d24486b9 GIT binary patch literal 2217 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 rHmuS08@^ta})lu1A%_00000NkvXXu0mjfL$f1j literal 0 HcmV?d00001 diff --git a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py index 8dc4cf25e50..c9938477395 100644 --- a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py +++ b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py @@ -59,17 +59,12 @@ def add_pyaedt_to_aedt( extensions_dir = os.path.join(personal_lib, "Toolkits") os.makedirs(extensions_dir, exist_ok=True) - # templates_dir = os.path.dirname(ansys.aedt.core.extensions.templates.__file__) - # script_file = os.path.join(templates_dir, "pyaedt_utils.py") - # dest_script_path = os.path.join(extensions_dir, "pyaedt_utils.py") - # shutil.copy2(script_file, dest_script_path) - __add_pyaedt_tabs(personal_lib, aedt_version) def __add_pyaedt_tabs(personal_lib, aedt_version): """Add PyAEDT tabs in AEDT.""" - pyaedt_tabs = ["Console", "Jupyter", "Run_Script", "ExtensionManager"] + pyaedt_tabs = ["Console", "Jupyter", "Run_Script", "ExtensionManager", "VersionManager"] extensions_catalog = read_toml(os.path.join(os.path.dirname(__file__), "extensions_catalog.toml")) @@ -81,6 +76,7 @@ def __add_pyaedt_tabs(personal_lib, aedt_version): script_path = None if extension_info["script"]: script_path = os.path.join(project_workflows_dir, extension_info["script"]) + icon_file = os.path.join(project_workflows_dir, "images", "large", extension_info["icon"]) template_name = extension_info["template"] customize_automation_tab.add_script_to_menu( diff --git a/src/ansys/aedt/core/extensions/project/version_manager.py b/src/ansys/aedt/core/extensions/installer/version_manager.py similarity index 81% rename from src/ansys/aedt/core/extensions/project/version_manager.py rename to src/ansys/aedt/core/extensions/installer/version_manager.py index a3eca6dfe0a..36adb2e52ce 100644 --- a/src/ansys/aedt/core/extensions/project/version_manager.py +++ b/src/ansys/aedt/core/extensions/installer/version_manager.py @@ -38,6 +38,7 @@ import PIL.Image import PIL.ImageTk import ansys.aedt.core +from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt from ansys.aedt.core.extensions.customize_automation_tab import add_script_to_menu from ansys.aedt.core.extensions.customize_automation_tab import available_toolkits from ansys.aedt.core.extensions.misc import get_aedt_version @@ -106,6 +107,7 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.desktop = desktop self.aedt_version = aedt_version self.personal_lib = personal_lib + self.change_theme_button = None # Configure style for ttk buttons self.style = ttk.Style() @@ -191,8 +193,7 @@ def create_button_menu(self): def create_ui_basic(self, parent): def create_ui_wheelhouse(frame): buttons = [ - ["Update from wheelhouse", self.update_from_wheelhouse], - ["Update extensions", self.update_extensions], + ["Update from wheelhouse", self.update_from_wheelhouse] ] for text, cmd in buttons: button = ttk.Button(frame, text=text, width=40, command=cmd, style="PyAEDT.TButton") @@ -267,7 +268,7 @@ def create_ui_pyedb(frame): entry.pack(side="left") def create_ui_pyaedt_buttons(frame): - buttons = [["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt]] + buttons = [["Reset AEDT panels", self.reset_pyaedt_buttons_in_aedt]] for text, cmd in buttons: button = ttk.Button(frame, text=text, width=40, command=cmd, style="PyAEDT.TButton") button.pack(side="left", padx=10, pady=10) @@ -284,69 +285,13 @@ def create_ui_pyaedt_buttons(frame): create_ui_pyedb(frame1) create_ui_pyaedt_buttons(frame2) - def create_ui_extensions(self, parent): - frame = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) - frame.pack(padx=5, pady=5) - - buttons = [ - ["Update Configure Layout", self.update_extensions], - ] - for text, cmd in buttons: - button = ttk.Button(frame, text=text, width=20, command=cmd, style="PyAEDT.TButton") - button.pack(side="left", padx=10, pady=10) - - def is_git_available(self): + @staticmethod + def is_git_available(): res = shutil.which("git") is not None if not res: messagebox.showerror("Error: Git Not Found", "Git does not seem to be installed or is not accessible.") return res - def update_extensions(self): - response = messagebox.askyesno("Confirm Action", "Are you sure you want to proceed?") - if response: - toolkits_path = Path(self.personal_lib, "Toolkits") - temp = [] - for product in toolkits_path.iterdir(): - if not product.is_dir(): - continue - xml_file = product / "TabConfig.xml" - if xml_file.exists(): - tree = defused_parse(xml_file) - root2 = tree.getroot() - panel_label = "Panel_PyAEDT_Extensions" - for panel in root2.findall("panel"): - if panel.get("label") == panel_label: - for button in panel.findall("button"): - name = button.get("label") - temp.append([product, name]) - - atk = available_toolkits() - msg = ["Below extensions are updated.", ""] - for product, name in temp: - product_name = product.stem - if product_name not in atk: - continue - for _, j in atk[product_name].items(): - extension_dir = product / name - if j["name"] == name: - shutil.rmtree(extension_dir, ignore_errors=True) - - workflow_dir = Path(ansys.aedt.core.extensions.__file__).parent - - add_script_to_menu( - name=name, - script_file=str(workflow_dir / product_name.lower() / j["script"]), - icon_file=str(workflow_dir / product_name.lower() / j["icon"]), - product=product_name, - template_file=j.get("template", "run_pyaedt_toolkit_script"), - copy_to_personal_lib=True, - executable_interpreter=self.python_exe, - personal_lib=self.personal_lib, - aedt_version=self.aedt_version, - ) - msg.append(f"{product_name} {name}") - messagebox.showinfo("Message", "\n".join(msg)) - def update_pyaedt(self): response = messagebox.askyesno("Disclaimer", DISCLAIMER) @@ -501,24 +446,9 @@ def handle_remove_error(func, path, exc_info): response = messagebox.askyesno("Confirm Action", "Are you sure you want to proceed?") if response: - toolkit_path = os.path.join(self.personal_lib, "Toolkits") - - if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): - msg = [f"Toolkits path {toolkit_path} already exists.", "Are you sure you want to reset toolkits?"] - msg = "\n".join(msg) - response = messagebox.askyesno("Confirm Action", msg) - if response: - shutil.rmtree(toolkit_path, onerror=handle_remove_error) - else: - return - from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt - - try: - add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) - messagebox.showinfo("Success", "PyAEDT buttons added in AEDT.") - except subprocess.CalledProcessError as e: # nosec - messagebox.showerror("Error", f"Error adding buttons to AEDT: {e}") + add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) + messagebox.showinfo("Success", "PyAEDT panels updated in AEDT.") def clicked_refresh(self, need_restart=False): msg = [f"Venv path: {self.venv_path}", f"Python version: {self.python_version}"] @@ -550,12 +480,12 @@ def get_desktop_info(release_desktop=True): close_project = True close_on_exit = True - app = ansys.aedt.core.Desktop(new_desktop=new_desktop, version=aedt_version, port=port, non_graphical=ng) - personal_lib = app.personallib + aedtapp = ansys.aedt.core.Desktop(new_desktop=new_desktop, version=aedt_version, port=port, non_graphical=ng) + personal_lib = aedtapp.personallib if release_desktop: - app.release_desktop(close_project, close_on_exit) + aedtapp.release_desktop(close_project, close_on_exit) - return {"desktop": app, "aedt_version": aedt_version, "personal_lib": personal_lib} + return {"desktop": aedtapp, "aedt_version": aedt_version, "personal_lib": personal_lib} if __name__ == "__main__": diff --git a/src/ansys/aedt/core/extensions/project/toolkits_catalog.toml b/src/ansys/aedt/core/extensions/project/toolkits_catalog.toml index 1f6f979e106..8a77bd4ac81 100644 --- a/src/ansys/aedt/core/extensions/project/toolkits_catalog.toml +++ b/src/ansys/aedt/core/extensions/project/toolkits_catalog.toml @@ -25,10 +25,3 @@ script = "advanced_fields_calculator.py" icon = "images/large/fields.png" template = "run_pyaedt_toolkit_script" pip = "" - -[VersionManager] -name = "Version Manager" -script = "version_manager.py" -icon = "images/large/version_manager.png" -template = "run_pyaedt_toolkit_script" -pip = "" \ No newline at end of file diff --git a/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build b/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build index 2c30cc74e96..be5c5e43a3f 100644 --- a/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build +++ b/src/ansys/aedt/core/extensions/templates/run_pyaedt_toolkit_script.py_build @@ -34,6 +34,7 @@ is_linux = os.name == "posix" is_iron_python = platform.python_implementation().lower() == "ironpython" + def aedt_script(): try: if is_linux: @@ -78,8 +79,8 @@ def pyaedt_script(): # CPython interpreter python_exe = r"##PYTHON_EXE##" # Python script - pyaedt_script = r"##PYTHON_SCRIPT##" - command = [python_exe, pyaedt_script] + pyaedt_script_file = r"##PYTHON_SCRIPT##" + command = [python_exe, pyaedt_script_file] my_env = dict(os.environ.copy()) subprocess.Popen(command, env=my_env) From 5214e97321e95faffafc316b7dd76babb2784448 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 29 Apr 2025 09:57:55 +0200 Subject: [PATCH 5/8] Update version manager --- doc/source/Getting_started/Installation.rst | 31 ++++++++++++++++++++ doc/source/Resources/toolkits_ribbon.png | Bin 16960 -> 9394 bytes doc/source/Resources/version_manager_ui.png | Bin 0 -> 16841 bytes doc/source/User_guide/extensions.rst | 6 ---- 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 doc/source/Resources/version_manager_ui.png diff --git a/doc/source/Getting_started/Installation.rst b/doc/source/Getting_started/Installation.rst index d1ed5c5b6f1..1b7f157664b 100644 --- a/doc/source/Getting_started/Installation.rst +++ b/doc/source/Getting_started/Installation.rst @@ -70,6 +70,37 @@ The user can select the AEDT application to install the specific workflow. For additional information about AEDT extensions, see `Extensions `_. +Version manager +~~~~~~~~~~~~~~~ +The **Version manager** extension allows users to manage and update **PyAEDT** and **PyEDB** installations. + +There are several available options: + +- **Display environment details**: + - Python virtual environment path + - Python version + - Installed versions of PyAEDT and PyEDB + +- **Check latest releases on PyPI**: + - View the most recent versions of PyAEDT and PyEDB available on PyPI + +- **Update from PyPI**: + - Install the latest official release of PyAEDT and PyEDB from PyPI + +- **Install from a GitHub branch**: + - Uses the `main` development branch by default + - Other existing branch names can be specified + +- **Update from a local wheelhouse**: + - Automatically checks compatibility before installation + +- **Reset and update PyAEDT panels in AEDT**: + - Direct access to reset and update options within the AEDT interface + +.. image:: ../Resources/version_manager_ui.png + :width: 800 + :alt: PyAEDT version manager + Install on CPython from PyPI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/source/Resources/toolkits_ribbon.png b/doc/source/Resources/toolkits_ribbon.png index 5758f592cbbe0d54d25fe454dca14b081529ce12..d8193850a9d066317d23a091847c353b4f01a5d4 100644 GIT binary patch literal 9394 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 literal 0 HcmV?d00001 diff --git a/doc/source/User_guide/extensions.rst b/doc/source/User_guide/extensions.rst index dead1137ba8..f651385a8a4 100644 --- a/doc/source/User_guide/extensions.rst +++ b/doc/source/User_guide/extensions.rst @@ -55,12 +55,6 @@ They are small automated workflows with a simple GUI. Lear how to convert projects from 2022R2 to newer versions. - .. grid-item-card:: Version manager - :link: pyaedt_extensions_doc/project/version_manager - :link-type: doc - :margin: 2 2 0 0 - - Manage pyaedt and pyedb versions. .. grid-item-card:: Point cloud generator :link: pyaedt_extensions_doc/project/point_cloud_generator From f3b56baedd91cea77640aa466acaebb5953c3e20 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Tue, 29 Apr 2025 08:02:57 +0000 Subject: [PATCH 6/8] chore: adding changelog file 6089.added.md [dependabot-skip] --- doc/changelog.d/6089.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/6089.added.md diff --git a/doc/changelog.d/6089.added.md b/doc/changelog.d/6089.added.md new file mode 100644 index 00000000000..958db8d89dd --- /dev/null +++ b/doc/changelog.d/6089.added.md @@ -0,0 +1 @@ +Add Version manager to main panels \ No newline at end of file From d9ba8cc2c141821e9deb9f52bd67bfab6966a9d4 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 29 Apr 2025 11:21:25 +0200 Subject: [PATCH 7/8] Fix Codacy --- src/ansys/aedt/core/extensions/installer/pyaedt_installer.py | 1 - src/ansys/aedt/core/extensions/installer/version_manager.py | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py index c9938477395..c6a7200276b 100644 --- a/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py +++ b/src/ansys/aedt/core/extensions/installer/pyaedt_installer.py @@ -29,7 +29,6 @@ from ansys.aedt.core.generic.file_utils import read_toml from ansys.aedt.core.extensions import customize_automation_tab -import ansys.aedt.core.extensions.templates def add_pyaedt_to_aedt( diff --git a/src/ansys/aedt/core/extensions/installer/version_manager.py b/src/ansys/aedt/core/extensions/installer/version_manager.py index 36adb2e52ce..a247d69608d 100644 --- a/src/ansys/aedt/core/extensions/installer/version_manager.py +++ b/src/ansys/aedt/core/extensions/installer/version_manager.py @@ -38,9 +38,6 @@ import PIL.Image import PIL.ImageTk import ansys.aedt.core -from ansys.aedt.core.extensions.installer.pyaedt_installer import add_pyaedt_to_aedt -from ansys.aedt.core.extensions.customize_automation_tab import add_script_to_menu -from ansys.aedt.core.extensions.customize_automation_tab import available_toolkits from ansys.aedt.core.extensions.misc import get_aedt_version from ansys.aedt.core.extensions.misc import get_port from ansys.aedt.core.extensions.misc import get_process_id From 898d08f7ac75eb7be5905a3fcccfb032397e66f1 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 29 Apr 2025 17:17:44 +0200 Subject: [PATCH 8/8] Add requests --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 53d2d70f49b..8f28f7f0f13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,7 @@ all = [ "tables; python_version >= '3.10'", "scikit-rf>=0.30.0,<1.7", "pyaedt[jupyter]", + "requests", ] examples = [ "imageio>=2.34.0,<2.38",