From fba021d3325dc9387bc3c36755b0e8436ec83e5d Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Sun, 8 Dec 2024 08:06:08 +0100 Subject: [PATCH 01/12] Add template extension - get started --- .../aedt/core/workflows/templates/template.py | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 src/ansys/aedt/core/workflows/templates/template.py diff --git a/src/ansys/aedt/core/workflows/templates/template.py b/src/ansys/aedt/core/workflows/templates/template.py new file mode 100644 index 00000000000..8ab7cfc0082 --- /dev/null +++ b/src/ansys/aedt/core/workflows/templates/template.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2021 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Toolkit template if the user does not pass any valid script in the toolkit manager + +import os + +import ansys.aedt.core +from ansys.aedt.core 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() +aedt_process_id = get_process_id() +is_student = is_student() + +# Extension batch arguments +extension_arguments = {"origin_x": 0, "origin_y": 0, "origin_z": 0, "radius": 1} +extension_description = "Extension template - Create sphere" + + +def frontend(): + import tkinter + from tkinter import ttk + + import PIL.Image + import PIL.ImageTk + + # Create UI + master = tkinter.Tk() + + master.geometry() + + master.title("Create sphere") + + # Load the logo for the main window + icon_path = os.path.join(ansys.aedt.core.workflows.__path__[0], "images", "large", "logo.png") + im = PIL.Image.open(icon_path) + photo = PIL.ImageTk.PhotoImage(im) + + # Set the icon for the main window + master.iconphoto(True, photo) + + # Configure style for ttk buttons + style = ttk.Style() + style.configure("Toolbutton.TButton", padding=6, font=("Helvetica", 8)) + + # Origin x entry + var = tkinter.StringVar() + label = tkinter.Label(master, textvariable=var) + var.set("Origin X:") + label.grid(row=0, column=0, padx=15, pady=10) + origin_x = ttk.Entry(master) + origin_x.grid(row=0, column=1, padx=15, pady=10) + + # Origin y entry + var = tkinter.StringVar() + label = tkinter.Label(master, textvariable=var) + var.set("Origin Y:") + label.grid(row=1, column=0, padx=15, pady=10) + origin_x = ttk.Entry(master) + origin_x.grid(row=1, column=1, padx=15, pady=10) + + # Origin z entry + var = tkinter.StringVar() + label = tkinter.Label(master, textvariable=var) + var.set("Origin Z:") + label.grid(row=2, column=0, padx=15, pady=10) + origin_x = ttk.Entry(master) + origin_x.grid(row=2, column=1, padx=15, pady=10) + + # Radius entry + var = tkinter.StringVar() + label = tkinter.Label(master, textvariable=var) + var.set("Radius:") + label.grid(row=3, column=0, padx=15, pady=10) + origin_x = ttk.Entry(master) + origin_x.grid(row=3, column=1, padx=15, pady=10) + + def callback(): + master.destroy() + + # Add "Create" button + b = ttk.Button(master, text="Create", width=20, command=callback, style="PyAEDT.TButton") + b.grid(row=4, column=1, pady=15) + + tkinter.mainloop() + + origin_x = getattr(master, "origin_x", extension_arguments["origin_x"]) + origin_y = getattr(master, "origin_y", extension_arguments["origin_y"]) + origin_z = getattr(master, "origin_z", extension_arguments["origin_z"]) + radius = getattr(master, "radius", extension_arguments["radius"]) + + output_dict = {"origin_x": origin_x, "origin_y": origin_y, "origin_z": origin_z, "radius": radius} + + return output_dict + + +def main(extension_args): + app = ansys.aedt.core.Desktop( + new_desktop=False, + version=version, + port=port, + aedt_process_id=aedt_process_id, + student_version=is_student, + ) + + active_project = app.active_project() + active_design = app.active_design() + + project_name = active_project.GetName() + if active_design.GetDesignType() == "HFSS 3D Layout Design": + design_name = active_design.GetDesignName() + else: + design_name = active_design.GetName() + + aedtapp = get_pyaedt_app(project_name, design_name) + + # Your PyAEDT script + aedtapp.modeler.create_sphere( + [extension_args["origin_x"], extension_args["origin_y"], extension_args["origin_z"]], extension_args["radius"] + ) + + if not extension_args["is_test"]: # pragma: no cover + app.release_desktop(False, False) + return True + + +if __name__ == "__main__": + args = get_arguments(extension_arguments, extension_description) + + # Open UI + if not args["is_batch"]: # pragma: no cover + output = frontend() + if output: + for output_name, output_value in output.items(): + if output_name in extension_arguments: + args[output_name] = output_value + + main(args) From 724187b29291e57adb35e0dce453c984e6b28ced Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Sun, 8 Dec 2024 08:35:44 +0100 Subject: [PATCH 02/12] title --- src/ansys/aedt/core/workflows/templates/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/workflows/templates/template.py b/src/ansys/aedt/core/workflows/templates/template.py index 8ab7cfc0082..f65444dbcca 100644 --- a/src/ansys/aedt/core/workflows/templates/template.py +++ b/src/ansys/aedt/core/workflows/templates/template.py @@ -21,7 +21,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# Toolkit template if the user does not pass any valid script in the toolkit manager +# Extension template to help get started import os From dfacf68fe72ad08e1a7875fbcec89b3cb6830707 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Mon, 9 Dec 2024 09:32:02 +0100 Subject: [PATCH 03/12] add test and rename file --- .../{template.py => template_get_started.py} | 9 ++++++--- tests/system/solvers/test_45_workflows.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) rename src/ansys/aedt/core/workflows/templates/{template.py => template_get_started.py} (93%) diff --git a/src/ansys/aedt/core/workflows/templates/template.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py similarity index 93% rename from src/ansys/aedt/core/workflows/templates/template.py rename to src/ansys/aedt/core/workflows/templates/template_get_started.py index f65444dbcca..697b27809a3 100644 --- a/src/ansys/aedt/core/workflows/templates/template.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -140,10 +140,13 @@ def main(extension_args): aedtapp = get_pyaedt_app(project_name, design_name) + origin_x = extension_args.get("origin_x", extension_arguments["origin_x"]) + origin_y = extension_args.get("origin_y", extension_arguments["origin_y"]) + origin_z = extension_args.get("origin_z", extension_arguments["origin_z"]) + radius = extension_args.get("radius", extension_arguments["radius"]) + # Your PyAEDT script - aedtapp.modeler.create_sphere( - [extension_args["origin_x"], extension_args["origin_y"], extension_args["origin_z"]], extension_args["radius"] - ) + aedtapp.modeler.create_sphere([origin_x, origin_y, origin_z], radius) if not extension_args["is_test"]: # pragma: no cover app.release_desktop(False, False) diff --git a/tests/system/solvers/test_45_workflows.py b/tests/system/solvers/test_45_workflows.py index 016aef68a55..e6db841a67c 100644 --- a/tests/system/solvers/test_45_workflows.py +++ b/tests/system/solvers/test_45_workflows.py @@ -58,6 +58,18 @@ def test_01_template(self, add_app): assert main({"is_test": True}) assert len(aedtapp.modeler.object_list) == 1 + + aedtapp.close_project(aedtapp.project_name) + + def test_01a_template_get_started(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 + + assert main({"is_test": True, "origin_x": 2}) + + assert len(aedtapp.modeler.object_list) == 1 + aedtapp.close_project(aedtapp.project_name) def test_02_hfss_push(self, add_app): From 8d52223e6b42ec354e810f187a027addfcdae1c7 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Mon, 9 Dec 2024 10:48:58 +0100 Subject: [PATCH 04/12] update UI --- .../templates/template_get_started.py | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index 697b27809a3..b2636221e2c 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -49,6 +49,7 @@ def frontend(): import PIL.Image import PIL.ImageTk + from ansys.aedt.core.workflows.misc import ExtensionTheme # Create UI master = tkinter.Tk() @@ -57,6 +58,9 @@ def frontend(): master.title("Create sphere") + # Detect if user close the UI + master.flag = False + # Load the logo for the main window icon_path = os.path.join(ansys.aedt.core.workflows.__path__[0], "images", "large", "logo.png") im = PIL.Image.open(icon_path) @@ -67,46 +71,69 @@ def frontend(): # Configure style for ttk buttons style = ttk.Style() - style.configure("Toolbutton.TButton", padding=6, font=("Helvetica", 8)) + theme = ExtensionTheme() + + theme.apply_light_theme(style) + master.theme = "light" # Origin x entry var = tkinter.StringVar() label = tkinter.Label(master, textvariable=var) var.set("Origin X:") - label.grid(row=0, column=0, padx=15, pady=10) + label.pack(side=tkinter.LEFT) origin_x = ttk.Entry(master) - origin_x.grid(row=0, column=1, padx=15, pady=10) + origin_x.pack(side=tkinter.LEFT, padx=5) # Origin y entry var = tkinter.StringVar() label = tkinter.Label(master, textvariable=var) var.set("Origin Y:") - label.grid(row=1, column=0, padx=15, pady=10) + label.pack(side=tkinter.LEFT) origin_x = ttk.Entry(master) - origin_x.grid(row=1, column=1, padx=15, pady=10) + origin_x.pack(side=tkinter.LEFT, padx=5) # Origin z entry var = tkinter.StringVar() label = tkinter.Label(master, textvariable=var) var.set("Origin Z:") - label.grid(row=2, column=0, padx=15, pady=10) + label.pack(side=tkinter.LEFT) origin_x = ttk.Entry(master) - origin_x.grid(row=2, column=1, padx=15, pady=10) + origin_x.pack(side=tkinter.LEFT, padx=5) # Radius entry var = tkinter.StringVar() label = tkinter.Label(master, textvariable=var) var.set("Radius:") - label.grid(row=3, column=0, padx=15, pady=10) + label.pack(side=tkinter.LEFT) origin_x = ttk.Entry(master) - origin_x.grid(row=3, column=1, padx=15, pady=10) + origin_x.pack(side=tkinter.LEFT, padx=5) + + def toggle_theme(): + if master.theme == "light": + set_dark_theme() + master.theme = "dark" + else: + set_light_theme() + master.theme = "light" + + def set_light_theme(): + theme.apply_light_theme(style) + change_theme_button.config(text="\u263D") + + def set_dark_theme(): + theme.apply_dark_theme(style) + change_theme_button.config(text="\u2600") def callback(): master.destroy() - # Add "Create" button - b = ttk.Button(master, text="Create", width=20, command=callback, style="PyAEDT.TButton") - b.grid(row=4, column=1, pady=15) + button_frame = ttk.Frame(master, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) + button_frame.pack(side=tkinter.LEFT, padx=5) + + create_button = ttk.Button(button_frame, text="Create Sphere", command=callback, style="PyAEDT.TButton") + change_theme_button = ttk.Button(button_frame, text="\u263D", command=toggle_theme, style="PyAEDT.TButton") + create_button.pack(side=tkinter.LEFT, padx=5) + change_theme_button.pack(side=tkinter.RIGHT, padx=5, pady=40) tkinter.mainloop() From 42300c77a1f454c081a4940a9f0e98acb27cb926 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Mon, 9 Dec 2024 14:01:18 +0100 Subject: [PATCH 05/12] update UI and tests --- .../templates/template_get_started.py | 59 +++++++++---------- tests/system/solvers/test_45_workflows.py | 22 +++---- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index b2636221e2c..af9ee916d45 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -76,37 +76,37 @@ def frontend(): theme.apply_light_theme(style) master.theme = "light" + # Main frame + main_frame = ttk.PanedWindow(master, style="PyAEDT.TFrame") + main_frame.pack(fill=tkinter.BOTH, expand=True) + + # Buttons frame + buttons_frame = ttk.Frame(master, style="PyAEDT.TFrame") + buttons_frame.pack(side=tkinter.BOTTOM, expand=True) + # Origin x entry - var = tkinter.StringVar() - label = tkinter.Label(master, textvariable=var) - var.set("Origin X:") - label.pack(side=tkinter.LEFT) - origin_x = ttk.Entry(master) - origin_x.pack(side=tkinter.LEFT, padx=5) + label = ttk.Label(main_frame, text="Origin X:", width=20, style="PyAEDT.TLabel") + label.grid(row=0, column=0, padx=15, pady=10) + origin_x = ttk.Entry(main_frame, font=theme.default_font) + origin_x.grid(row=0, column=1, padx=15, pady=10) # Origin y entry - var = tkinter.StringVar() - label = tkinter.Label(master, textvariable=var) - var.set("Origin Y:") - label.pack(side=tkinter.LEFT) - origin_x = ttk.Entry(master) - origin_x.pack(side=tkinter.LEFT, padx=5) + label = ttk.Label(main_frame, text="Origin Y:", width=20, style="PyAEDT.TLabel") + label.grid(row=1, column=0, padx=15, pady=10) + origin_x = ttk.Entry(main_frame, font=theme.default_font) + origin_x.grid(row=1, column=1, padx=15, pady=10) # Origin z entry - var = tkinter.StringVar() - label = tkinter.Label(master, textvariable=var) - var.set("Origin Z:") - label.pack(side=tkinter.LEFT) - origin_x = ttk.Entry(master) - origin_x.pack(side=tkinter.LEFT, padx=5) + label = ttk.Label(main_frame, text="Origin Y:", width=20, style="PyAEDT.TLabel") + label.grid(row=2, column=0, padx=15, pady=10) + origin_x = ttk.Entry(main_frame, font=theme.default_font) + origin_x.grid(row=2, column=1, padx=15, pady=10) # Radius entry - var = tkinter.StringVar() - label = tkinter.Label(master, textvariable=var) - var.set("Radius:") - label.pack(side=tkinter.LEFT) - origin_x = ttk.Entry(master) - origin_x.pack(side=tkinter.LEFT, padx=5) + label = ttk.Label(main_frame, text="Radius:", width=20, style="PyAEDT.TLabel") + label.grid(row=3, column=0, padx=15, pady=10) + origin_x = ttk.Entry(main_frame, font=theme.default_font) + origin_x.grid(row=3, column=1, padx=15, pady=10) def toggle_theme(): if master.theme == "light": @@ -127,13 +127,10 @@ def set_dark_theme(): def callback(): master.destroy() - button_frame = ttk.Frame(master, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) - button_frame.pack(side=tkinter.LEFT, padx=5) - - create_button = ttk.Button(button_frame, text="Create Sphere", command=callback, style="PyAEDT.TButton") - change_theme_button = ttk.Button(button_frame, text="\u263D", command=toggle_theme, style="PyAEDT.TButton") - create_button.pack(side=tkinter.LEFT, padx=5) - change_theme_button.pack(side=tkinter.RIGHT, padx=5, pady=40) + create_button = ttk.Button(buttons_frame, text="Create Sphere", command=callback, style="PyAEDT.TButton") + change_theme_button = ttk.Button(buttons_frame, text="\u263D", command=toggle_theme, style="PyAEDT.TButton") + create_button.grid(row=0, column=0, padx=15, pady=10) + change_theme_button.grid(row=1, column=0, padx=15, pady=10) tkinter.mainloop() diff --git a/tests/system/solvers/test_45_workflows.py b/tests/system/solvers/test_45_workflows.py index e6db841a67c..4289cfbb6ba 100644 --- a/tests/system/solvers/test_45_workflows.py +++ b/tests/system/solvers/test_45_workflows.py @@ -61,17 +61,6 @@ def test_01_template(self, add_app): aedtapp.close_project(aedtapp.project_name) - def test_01a_template_get_started(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 - - assert main({"is_test": True, "origin_x": 2}) - - assert len(aedtapp.modeler.object_list) == 1 - - aedtapp.close_project(aedtapp.project_name) - def test_02_hfss_push(self, add_app): aedtapp = add_app(project_name=push_project, subfolder=test_subfolder) @@ -585,3 +574,14 @@ def test_17_choke_designer(self, local_scratch): } extension_args = {"is_test": True, "choke_config": choke_config} assert main(extension_args) + + def test_18_template_get_started(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 + + assert main({"is_test": True, "origin_x": 2}) + + assert len(aedtapp.modeler.object_list) == 1 + + aedtapp.close_project(aedtapp.project_name) From 824d6102082292d67667934778246412b5d9c977 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Tue, 10 Dec 2024 15:27:36 +0100 Subject: [PATCH 06/12] update UI and tests --- .../workflows/project/kernel_converter.py | 2 +- .../templates/template_get_started.py | 151 +++++++++++++----- tests/system/solvers/test_45_workflows.py | 5 +- 3 files changed, 120 insertions(+), 38 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/kernel_converter.py b/src/ansys/aedt/core/workflows/project/kernel_converter.py index 8adb60ef14e..f65cac87e79 100644 --- a/src/ansys/aedt/core/workflows/project/kernel_converter.py +++ b/src/ansys/aedt/core/workflows/project/kernel_converter.py @@ -111,7 +111,7 @@ def edit_sols(self): def browseFiles(): filename = filedialog.askopenfilename( initialdir="/", - title="Select a Electronics File", + title="Select an Electronics File", filetypes=(("AEDT", ".aedt *.a3dcomp"), ("all files", "*.*")), ) text.insert(tkinter.END, filename) diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index af9ee916d45..0c6c6e03a24 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -26,7 +26,7 @@ import os import ansys.aedt.core -from ansys.aedt.core import get_pyaedt_app +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 @@ -39,20 +39,31 @@ is_student = is_student() # Extension batch arguments -extension_arguments = {"origin_x": 0, "origin_y": 0, "origin_z": 0, "radius": 1} +extension_arguments = {"origin_x": 0, "origin_y": 0, "origin_z": 0, "radius": 1, "file_path": ""} extension_description = "Extension template - Create sphere" def frontend(): - import tkinter - from tkinter import ttk + import tkinter as tk + from tkinter import filedialog + import tkinter.ttk as ttk import PIL.Image import PIL.ImageTk from ansys.aedt.core.workflows.misc import ExtensionTheme + app = ansys.aedt.core.Desktop( + new_desktop=False, + specified_version=version, + port=port, + aedt_process_id=aedt_process_id, + student_version=is_student, + ) + + active_project = app.active_project() + # Create UI - master = tkinter.Tk() + master = tk.Tk() master.geometry() @@ -76,37 +87,51 @@ def frontend(): theme.apply_light_theme(style) master.theme = "light" - # Main frame - main_frame = ttk.PanedWindow(master, style="PyAEDT.TFrame") - main_frame.pack(fill=tkinter.BOTH, expand=True) - - # Buttons frame - buttons_frame = ttk.Frame(master, style="PyAEDT.TFrame") - buttons_frame.pack(side=tkinter.BOTTOM, expand=True) + # Set background color of the window (optional) + master.configure(bg=theme.light["widget_bg"]) # Origin x entry - label = ttk.Label(main_frame, text="Origin X:", width=20, style="PyAEDT.TLabel") - label.grid(row=0, column=0, padx=15, pady=10) - origin_x = ttk.Entry(main_frame, font=theme.default_font) - origin_x.grid(row=0, column=1, padx=15, pady=10) + origin_x_label = ttk.Label(master, text="Origin X:", width=20, style="PyAEDT.TLabel") + origin_x_label.grid(row=0, column=0, padx=15, pady=10) + origin_x_entry = tk.Text(master, width=40, height=1) + origin_x_entry.grid(row=0, column=1, pady=15, padx=10) + origin_x_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Origin y entry - label = ttk.Label(main_frame, text="Origin Y:", width=20, style="PyAEDT.TLabel") - label.grid(row=1, column=0, padx=15, pady=10) - origin_x = ttk.Entry(main_frame, font=theme.default_font) - origin_x.grid(row=1, column=1, padx=15, pady=10) + origin_y_label = ttk.Label(master, text="Origin Y:", width=20, style="PyAEDT.TLabel") + origin_y_label.grid(row=1, column=0, padx=15, pady=10) + origin_y_entry = tk.Text(master, width=40, height=1) + origin_y_entry.grid(row=1, column=1, pady=15, padx=10) + origin_y_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Origin z entry - label = ttk.Label(main_frame, text="Origin Y:", width=20, style="PyAEDT.TLabel") - label.grid(row=2, column=0, padx=15, pady=10) - origin_x = ttk.Entry(main_frame, font=theme.default_font) - origin_x.grid(row=2, column=1, padx=15, pady=10) + origin_z_label = ttk.Label(master, text="Origin Y:", width=20, style="PyAEDT.TLabel") + origin_z_label.grid(row=2, column=0, padx=15, pady=10) + origin_z_entry = tk.Text(master, width=40, height=1) + origin_z_entry.grid(row=2, column=1, pady=15, padx=10) + origin_z_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Radius entry - label = ttk.Label(main_frame, text="Radius:", width=20, style="PyAEDT.TLabel") - label.grid(row=3, column=0, padx=15, pady=10) - origin_x = ttk.Entry(main_frame, font=theme.default_font) - origin_x.grid(row=3, column=1, padx=15, pady=10) + radius_label = ttk.Label(master, text="Radius:", width=20, style="PyAEDT.TLabel") + radius_label.grid(row=3, column=0, padx=15, pady=10) + radius_entry = tk.Text(master, width=40, height=1) + radius_entry.grid(row=3, column=1, pady=15, padx=10) + radius_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + + # Browse file entry + browse_file_label = ttk.Label(master, text="Browse File:", width=20, style="PyAEDT.TLabel") + browse_file_label.grid(row=4, column=0, pady=10) + browse_file_entry = tk.Text(master, width=40, height=1) + browse_file_entry.grid(row=4, column=1, pady=15, padx=10) + browse_file_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + + # Project name info + project_name_label = ttk.Label(master, text="Project Name:", width=20, style="PyAEDT.TLabel") + project_name_label.grid(row=5, column=0, pady=10) + project_name_entry = tk.Text(master, width=40, height=1) + project_name_entry.insert(tk.INSERT, active_project.GetName()) + project_name_entry.grid(row=5, column=1, pady=15, padx=10) + project_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) def toggle_theme(): if master.theme == "light": @@ -117,29 +142,79 @@ def toggle_theme(): master.theme = "light" def set_light_theme(): + master.configure(bg=theme.light["widget_bg"]) + origin_x_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + origin_y_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + origin_z_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + radius_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + browse_file_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) theme.apply_light_theme(style) change_theme_button.config(text="\u263D") def set_dark_theme(): + master.configure(bg=theme.dark["widget_bg"]) + origin_x_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + origin_y_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + origin_z_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + radius_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + browse_file_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) theme.apply_dark_theme(style) change_theme_button.config(text="\u2600") def callback(): + master.origin_x = origin_x_entry.get("1.0", tk.END).strip() + master.origin_y = origin_y_entry.get("1.0", tk.END).strip() + master.origin_z = origin_z_entry.get("1.0", tk.END).strip() + master.radius = radius_entry.get("1.0", tk.END).strip() + master.destroy() + + def browse_files(): + filename = filedialog.askopenfilename( + initialdir="/", + title="Select an Electronics File", + filetypes=(("AEDT", ".aedt"), ("all files", "*.*")), + ) + browse_file_entry.insert(tk.END, filename) + master.file_path = browse_file_entry.get("1.0", tk.END).strip() master.destroy() - create_button = ttk.Button(buttons_frame, text="Create Sphere", command=callback, style="PyAEDT.TButton") - change_theme_button = ttk.Button(buttons_frame, text="\u263D", command=toggle_theme, style="PyAEDT.TButton") - create_button.grid(row=0, column=0, padx=15, pady=10) - change_theme_button.grid(row=1, column=0, padx=15, pady=10) + # Create button to browse an AEDT file + browse_button = ttk.Button(master, text="...", command=browse_files, width=10, style="PyAEDT.TButton") + browse_button.grid(row=4, column=2, pady=10, padx=15) - tkinter.mainloop() + # Create buttons to create sphere and change theme color + create_button = ttk.Button(master, text="Create Sphere", command=callback, style="PyAEDT.TButton") + change_theme_button = ttk.Button(master, text="\u263D", width=2, command=toggle_theme, style="PyAEDT.TButton") + create_button.grid(row=6, column=0, padx=15, pady=10) + change_theme_button.grid(row=6, column=2, pady=10) + + tk.mainloop() origin_x = getattr(master, "origin_x", extension_arguments["origin_x"]) origin_y = getattr(master, "origin_y", extension_arguments["origin_y"]) origin_z = getattr(master, "origin_z", extension_arguments["origin_z"]) radius = getattr(master, "radius", extension_arguments["radius"]) + file_path = getattr(master, "file_path", extension_arguments["file_path"]) + + output_dict = { + "origin_x": origin_x, + "origin_y": origin_y, + "origin_z": origin_z, + "radius": radius, + "file_path": file_path, + } - output_dict = {"origin_x": origin_x, "origin_y": origin_y, "origin_z": origin_z, "radius": radius} + app.release_desktop(False, False) return output_dict @@ -168,9 +243,13 @@ def main(extension_args): origin_y = extension_args.get("origin_y", extension_arguments["origin_y"]) origin_z = extension_args.get("origin_z", extension_arguments["origin_z"]) radius = extension_args.get("radius", extension_arguments["radius"]) + file_path = extension_args.get("file_path", extension_arguments["file_path"]) - # Your PyAEDT script - aedtapp.modeler.create_sphere([origin_x, origin_y, origin_z], radius) + # Your script + if file_path: + aedtapp.load_project(file_path, set_active=True) + else: + aedtapp.modeler.create_sphere([origin_x, origin_y, origin_z], radius) if not extension_args["is_test"]: # pragma: no cover app.release_desktop(False, False) diff --git a/tests/system/solvers/test_45_workflows.py b/tests/system/solvers/test_45_workflows.py index 4289cfbb6ba..c3527f2238c 100644 --- a/tests/system/solvers/test_45_workflows.py +++ b/tests/system/solvers/test_45_workflows.py @@ -581,7 +581,10 @@ def test_18_template_get_started(self, add_app): from ansys.aedt.core.workflows.templates.template_get_started import main assert main({"is_test": True, "origin_x": 2}) - assert len(aedtapp.modeler.object_list) == 1 + file_path = os.path.join(solver_local_path, "example_models", "T00", "test_solve.aedt") + assert main({"is_test": True, "file_path": file_path}) + assert len(aedtapp.project_list) == 2 + aedtapp.close_project(aedtapp.project_name) From 57a9f137c8f9843d6531e269020c3377c6478e90 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Tue, 10 Dec 2024 15:46:10 +0100 Subject: [PATCH 07/12] update Path --- .../aedt/core/workflows/templates/template_get_started.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index 0c6c6e03a24..d8f8f74066e 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -23,7 +23,7 @@ # Extension template to help get started -import os +from pathlib import Path import ansys.aedt.core from ansys.aedt.core.generic.design_types import get_pyaedt_app @@ -73,7 +73,7 @@ def frontend(): master.flag = False # Load the logo for the main window - icon_path = os.path.join(ansys.aedt.core.workflows.__path__[0], "images", "large", "logo.png") + icon_path = Path(ansys.aedt.core.workflows.__path__[0], "images", "large", "logo.png") im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) From 586fd9bfcbf931d2421a6ce44c4281e8040a5558 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Tue, 10 Dec 2024 17:30:46 +0100 Subject: [PATCH 08/12] fix path + first draft of doc --- doc/source/User_guide/extensions.rst | 14 ++++++++++++++ .../templates/getting_started.rst | 0 .../pyaedt_extensions_doc/templates/index.rst | 11 +++++++++++ .../workflows/templates/template_get_started.py | 2 +- 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 doc/source/User_guide/pyaedt_extensions_doc/templates/getting_started.rst create mode 100644 doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst diff --git a/doc/source/User_guide/extensions.rst b/doc/source/User_guide/extensions.rst index 8c1ddb02ba0..79391d061f2 100644 --- a/doc/source/User_guide/extensions.rst +++ b/doc/source/User_guide/extensions.rst @@ -112,6 +112,19 @@ They are small automated workflow with a simple UI. Import a CSV file containing sources layout and power dissipation information. +Templates +~~~~~~~~~ +Templates to show how to build an extension consisting of a small automated workflow with a simple UI. + +.. grid:: 2 + + .. grid-item-card:: Extension template + :link: pyaedt_extensions_doc/templates/getting_started + :link-type: doc + :margin: 2 2 0 0 + + Simple extension template to get started. + .. toctree:: :hidden: :maxdepth: 1 @@ -120,6 +133,7 @@ They are small automated workflow with a simple UI. pyaedt_extensions_doc/hfss3dlayout/index pyaedt_extensions_doc/hfss/index pyaedt_extensions_doc/icepak/index + pyaedt_extensions_doc/templates/index Open source toolkits 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 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst b/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst new file mode 100644 index 00000000000..658cb269bd5 --- /dev/null +++ b/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst @@ -0,0 +1,11 @@ +Extension Templates +=================== + +.. grid:: 2 + + .. grid-item-card:: Extension getting started + :link: getting_started + :link-type: doc + :margin: 2 2 0 0 + + Simple extension template to get started. \ No newline at end of file diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index d8f8f74066e..653d96463cb 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -73,7 +73,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.workflows.__path__[0]) / "images" / "large" / "logo.png" im = PIL.Image.open(icon_path) photo = PIL.ImageTk.PhotoImage(im) From 4fbe9481a67ef72101284b8c13fab2fe753b36ff Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Wed, 11 Dec 2024 09:33:22 +0100 Subject: [PATCH 09/12] small fixes --- .../aedt/core/workflows/templates/template_get_started.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index 653d96463cb..df0362d2fcb 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -40,7 +40,7 @@ # Extension batch arguments extension_arguments = {"origin_x": 0, "origin_y": 0, "origin_z": 0, "radius": 1, "file_path": ""} -extension_description = "Extension template - Create sphere" +extension_description = "Extension template" def frontend(): @@ -67,7 +67,7 @@ def frontend(): master.geometry() - master.title("Create sphere") + master.title(extension_description) # Detect if user close the UI master.flag = False @@ -158,6 +158,9 @@ def set_light_theme(): browse_file_entry.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) + project_name_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) theme.apply_light_theme(style) change_theme_button.config(text="\u263D") @@ -168,6 +171,7 @@ def set_dark_theme(): origin_z_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) radius_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) browse_file_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + project_name_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) theme.apply_dark_theme(style) change_theme_button.config(text="\u2600") From 03ab615849d3d8d672c594d929aee7648beba04b Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Wed, 11 Dec 2024 09:39:04 +0100 Subject: [PATCH 10/12] small fixes --- .../aedt/core/workflows/templates/template_get_started.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/workflows/templates/template_get_started.py b/src/ansys/aedt/core/workflows/templates/template_get_started.py index df0362d2fcb..0b9b1002888 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -61,6 +61,10 @@ def frontend(): ) active_project = app.active_project() + if not active_project: + active_project_name = "No active project" + else: + active_project_name = active_project.GetName() # Create UI master = tk.Tk() @@ -129,7 +133,7 @@ def frontend(): project_name_label = ttk.Label(master, text="Project Name:", width=20, style="PyAEDT.TLabel") project_name_label.grid(row=5, column=0, pady=10) project_name_entry = tk.Text(master, width=40, height=1) - project_name_entry.insert(tk.INSERT, active_project.GetName()) + project_name_entry.insert(tk.INSERT, active_project_name) project_name_entry.grid(row=5, column=1, pady=15, padx=10) project_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) From c650482e91ecab830d5ac48f5b3ed951148bad89 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Wed, 11 Dec 2024 11:11:06 +0100 Subject: [PATCH 11/12] doc + image ui --- .../templates/getting_started.rst | 60 ++++++++++++++++++ .../pyaedt_extensions_doc/templates/index.rst | 2 +- .../_static/extensions/extension_template.png | Bin 0 -> 97818 bytes 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 doc/source/_static/extensions/extension_template.png 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 e69de29bb2d..743aeee20bc 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 @@ -0,0 +1,60 @@ +Extension template +================== + +Template to help the user create an extension from scratch. + +The extension provides a graphical user interface for configuration, or it can be used in batch mode via command line arguments. + +The following image shows the extension user interface: + +.. image:: ../../../_static/extensions/extension_template.png + :width: 800 + :alt: Extension template UI + + +Features +-------- + +- Create a sphere providing information such as the origin coordinates and radius. +- Allow users to browse and select an **.aedt** file to load in AEDT. +- Display name of the active project. +- Support of light and dark themes for the GUI. + +Run the extension +----------------- + +The extension can be run from a Python script in the following way: + +.. code:: python + + import ansys.aedt.core + import os + + from ansys.aedt.core.workflows.templates.template_get_started import main + + hfss = ansys.aedt.core.Hfss() + + # Specify the AEDT session to connect + os.environ["PYAEDT_SCRIPT_PORT"] = str(hfss.desktop_class.port) + os.environ["PYAEDT_SCRIPT_VERSION"] = hfss.desktop_class.aedt_version_id + + main({"origin_x": 2, "radius": 6, "is_test": True}) + +Command line +------------ + +The extension can also be run directly via the command line for batch processing. + +The script accepts the following arguments: +- ``**origin_x**`` : x origin coordinate. +- ``**origin_y**`` : y origin coordinate. +- ``**origin_z**`` : z origin coordinate. +- ``**radius**`` : radius. +- ``**file_path**`` : file path to the **.aedt** file. + +Use the following syntax to run the extension: + +.. toctree:: + :maxdepth: 2 + + ../commandline \ No newline at end of file diff --git a/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst b/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst index 658cb269bd5..bb1836ad21f 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/templates/index.rst @@ -1,4 +1,4 @@ -Extension Templates +Extension templates =================== .. grid:: 2 diff --git a/doc/source/_static/extensions/extension_template.png b/doc/source/_static/extensions/extension_template.png new file mode 100644 index 0000000000000000000000000000000000000000..21aa21245953b4aa71e8a72c266c0b3b9f9ca542 GIT binary patch literal 97818 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

Y9R;(jZ=g(%}GjU9V8~owA*b zYa_sGzaD-ECEeh-JPc6TFi>|F?)iW;v-E`UOKN@*iQB!HuNG`GrvDAPA3d^Z?`kVG z1N`Vw7RTgY>m4xW;#2vNA;p`kRO#uzg&eT)2yf<3+R#t^0O#cARiOUk#i5D`W zb4XAXgF3X_-o|Bj>GJCGU`fz*RS4}VYQ5CoXifl=Xr#*CHay$U^%P&THGy>umQ;#d zq?3T5o!C{J@XS|#6`h#aPoahON%+ZRXoY?IWMo6p&k%ADHb1F0fB= zpg|3c=B{(`!x;g9&R!H9BMs~RWg!+b&jpKJg;FW2h4($K0jx&ye(YdWld@RFhajaR zPuwBL+3#vc1NX8)<6YUs5|Qi_+R5!~*QW?2QJ>_Ev7wlW$eNG{}u> z@A2x8cH1+7-)u5$bv)WaHdh~sWy1!4f0jD9UFPFKr*puoj;mZZOiF6n^90@N?Aql< zAeR3A{bN?J=ga)``lr@Nmlil#89J{LeB)*e8GK3vnZPSZQE8mjHZ!{p0zVy1%3rR) zue-zkRsr=UrogKbX4~9>Wis`HY%7Bqyu4>X@&2R%FH-5DQsL1{(=e^MvJj$0bn7gf z7!fp$lM_3Qd%N2c0AtUZ=b;|smvtLY7yu zumftB9-I)PYTvX}SN84meC|<{lWliv^IF%+$;Q0bW#u|s4S5Y{k>`!<+7MBnn6|j+ z#~N6gxy9<(Qx@F;agAEre6^sh1*_5)bAw$LN>1_m?rRrqJrQtgV{T>Viif%iE=0{4 zhpuH?lZwSt^8LgDM!+O2V`}fXgYM-Ej?d5nX8>b~ZA~?Q9W+Pe2d&?KD~t0OWe2YrXbyU<%!ocqmH&dYKO%Y zV7~6eZHS?hlOBvuN&xM5l+~V~emvwnl2@Lf?e#?OOmxT@XRbM<+%M_%bfqo;o#_Xa zuV&hRdQ6G=Omlrgo!Q`1P^z#Ovx51+!CIll4~RczlZ3?yhVBY{qLSh{ru0dFh6lks z8JXJrdGq}r_~MADsNnmg-GF<2mNb1U9}X$bPhUt>^$rLK0wUp~)w26RJ%t`+Nrd z%ktqn+jrX!<>W`-!rK?QAYOt#NQOdz!7a$^#!7|Wix)-H`c}7F%&i`OArM3-CMS(L z++I&1OJ{1(iOLA_EMjw)CXHYq=1v1fECUHC-U=y^GAq^w`{-Kc%Cu)AGX;!QIImF{ z?O5fg6R3kC`}Z!m+LE<&ayG9=`#7nm*>6s!vBt>{ z65hDd01<53=yYKY)GuQF>FbD&SooT4tM86m(^_@t(YHX{b`wNji413+#U@rA7E>D=zkzCTt*K zBgg+KH0wr39&X~4L~~GgM)F7;fnJfy0@hNR=T*4`mjHS`nHuAb(>Z?%&q z6&OD~cMlbga+HotYUE@#*Gwx}Ss?BsbF+}iD{WW%Y=ub{VGiOEe^ch8{mXz+_yIw- zg-6aL%3(W;R@e%eoeT{I*;5(ZQbCe9^o6~zeaWZ*3u>s$7`J5Xx5x%^)bh_c_Gw>@ zfZw-SaYssm~9s%{VMOyn|^RE3KntS5#bWKHG zy-NJ$`UcvW(iHQzy=2f;jCSXbv{&L%0Due|?qbD*LRP1PMw$+jx6tHCU>A$JB+Jum zWVGbnu%pbMr8o&2m?58nPX0_&z0EKw26(gTvVeSk4I29Cs`Oifhb(Zqe@RiTCGX5+ zo$-~`pxGbjh4P>a2MrvT=ht=MOF?(3V~@OjeGNb$P?U_2-TvM_s}bj4$n*~>P2dHd zwwuXHZ*nhjx3!r`A83-Lk#*=wrGNW9@W#z9YGZW? z!zMNulu79skP82Lofys-K|pISCDSXi51-*{jNFAIl! zYvnECKmNXCS_HwvJp~lk$(pbg!adMu7 zhYQ?Kwh)9++dh-rH$E{9&yY6$)%}c4-A;?Ez!kD5x+enoRS)nJb+Z+2ec7DmfP2#3w>E4G+IW{oHUOga-EG7IcSHJTUjg)&!lj<`!_n;yrk z*6QWE8!Kek8;8xYC_wJKJr{bjf80Q1UOqUM3?=XuFM@Cc zYA){_C)&-2lfZC!HKh8XmTNP7Q#H4>!asU?`VYULHm~AD&m4_IosG)@r|`X!irnD9 za##Um%wev|@oP$vQh9K{EQYMM>3Kc(nIkAqHh1cAmOfSX>aXH1tkykt(2qN0(i8|= zgoz(c5qI4G#fm3vMAIsTwV1t~ygYK44Ihd&JXBMr(g!GJ?#KMpJ!mDjwc< zEp=}9-#sfOWf^YVj4A+QTNlWSIy4G(#u8Ch&1kHwR#O&Hv8p@2WRU66`#$8lOK%ID z@|)#FxlcpY<}bVIP-F_*7feXOjt3ogbraf{Mcn>8=RoHUMykQ{XHkieFhyLjAL=b!Th>7zpCgT_y0N6K(NY0Ke1w?Vb7ju_8ZY&w(-RwZc~}Q#I5r~z>vNqWe6SUbF+nm8Oe?zZ6Kn8SifOo?7TXCOzNlzlaGI2 zyMIWck1RU)Yk5p}{{mAM3#mTOL7j*FKGjHvHBgYVJn6IIa~g*uUYjg({C!OqxcVEStJ zkJLq@0V98TQYOoXH2hVp8d-JXB!5O$LBYH*na|NbdVeXZoKqIwD%H*=+jK~Z%VTwS z0BYXS2%T3f8K{T|@y9%y~p;lx)`fIuoJw*2d_2x7$^@P7jfv&VlX$@!wmY zNT_L)EswQ8Iii_EuUo@i^f79IKWmtcoBv2N9_f9+TjUAa3xXAaX{z*&$UOZ=`CW7{ zHqUP<5x)Q|Pvb*@Wb|b;Z*6F@C;R<8$5-LhJQ^rvB?@d82oxQ>A#PH8>=r)&kR^%} zW$7LRb{r1)n{hB2<9pTC?nBFKQbY>*O1K2)#ENMUbI#c0yyn09q`ZP4AOoWG+xIWlY_5T z0H7*h82kD&x)`8l92Q$OY!)0UQ_UG~E{6%fXN$2y1N%}31PL1{_-_fXj2a(I%&5T% zx&l+)Uir|#cVT3CHZc?BtVzE$xQbBJ2@YPQ)QuX;FIkM#sIs-3O>$g4ol5FPLys!m zZCF%53XX*l4Db7B}F#Fa9~u(q#GRT~c21uXY82Ujs>r z6AMDYspF_M#}Sdq*T`;|tqqLX_Qce17pRlr^=c3%#S!2myyF9;Cbh6o#G9#JQjo}X zfAQ#Nna+_EU8A$s-OIw{Z?Qap?@b1{PlrcG-K{48>wXVy?H&xgSC5V~P>_-wD^mJQ zAV{f#rTH;N2KX4~{L%B;psL=|fzEU-zRC}l(q_O;f_Yr{i9bN>2_xAh4emG0AVeXN?t+0vJU8u^oL4rA`jh+HN z1*n;W6-1*s0j;S^r@CbiIJvA&#pHI^Wgh|62ZEdq4dy8xWqmyY<}&)Q5ntZ&2T^gk zcBY0{DL{NlQ+n`Ysxp)ZkR{f0IbLmOmxv7EbTU!|U$oL^3(mr4Yc&F7s|{$&F$9l1 zVT&4rT>mC^)!#G&@F98b}K*DeP-Q;IokWOvGz^w{`50~Z#9duRnNNqB>$jV z8vP_7-Ed#?rtL_dT@pup-|c|oPG`4~ynt1%RP1fPL2(C^86e9T2EJ~}#)@`#AYgh%;1$VQU79qy;~c{4ybb{ zw9488u8Xm@C}&B_Y2D;sDp-^c@bOUJXaAl$NLw>dRyB=F _mcc0mS@~FvRx}LHS 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%0AJ{htpU>-lX6&C5r{ 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 Date: Wed, 11 Dec 2024 18:12:16 +0100 Subject: [PATCH 12/12] update extension manager + test --- .../workflows/installer/extension_manager.py | 9 ++- .../workflows/templates/extension_template.py | 71 ------------------- .../workflows/templates/extension_template.py | 1 - .../workflows/templates/pyaedt_utils.py | 2 +- .../templates/template_get_started.py | 1 + tests/system/solvers/test_45_workflows.py | 23 ++---- 6 files changed, 15 insertions(+), 92 deletions(-) delete mode 100644 src/ansys/aedt/core/workflows/templates/extension_template.py delete mode 100644 src/pyaedt/workflows/templates/extension_template.py create mode 100644 src/pyaedt/workflows/templates/template_get_started.py diff --git a/src/ansys/aedt/core/workflows/installer/extension_manager.py b/src/ansys/aedt/core/workflows/installer/extension_manager.py index 7435a06562f..4c611c6a66c 100644 --- a/src/ansys/aedt/core/workflows/installer/extension_manager.py +++ b/src/ansys/aedt/core/workflows/installer/extension_manager.py @@ -257,7 +257,12 @@ def button_is_clicked( icon = os.path.abspath(os.path.join(product_path, selected_toolkit_info.get("icon"))) valid_name = name is not None and not os.path.isdir(name) - valid_file = file is not None and os.path.isfile(file) + + valid_file = False + if not file: + valid_file = True + elif os.path.isfile(file): + valid_file = True if selected_toolkit_name != "Custom" and selected_toolkit_info.get("pip"): if is_toolkit_installed(selected_toolkit_name, toolkit_level) and install_action: @@ -289,7 +294,7 @@ def button_is_clicked( if not file: file = os.path.join( - os.path.dirname(ansys.aedt.core.workflows.templates.__file__), "extension_template.py" + os.path.dirname(ansys.aedt.core.workflows.templates.__file__), "template_get_started.py" ) if os.path.isfile(executable_interpreter): diff --git a/src/ansys/aedt/core/workflows/templates/extension_template.py b/src/ansys/aedt/core/workflows/templates/extension_template.py deleted file mode 100644 index 81ff6a6a815..00000000000 --- a/src/ansys/aedt/core/workflows/templates/extension_template.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2021 - 2024 ANSYS, Inc. and/or its affiliates. -# SPDX-License-Identifier: MIT -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# Toolkit template if the user does not pass any valid script in the toolkit manager - -import ansys.aedt.core -from ansys.aedt.core 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() -aedt_process_id = get_process_id() -is_student = is_student() - -# Extension batch arguments -extension_arguments = {"dummy_argument": True} -extension_description = "Extension template" - - -def main(extension_args): - app = ansys.aedt.core.Desktop( - new_desktop=False, - version=version, - port=port, - aedt_process_id=aedt_process_id, - student_version=is_student, - ) - - # active_project = app.active_project() - active_design = app.active_design() - - # project_name = active_project.GetName() - design_name = active_design.GetName() - - aedtapp = get_pyaedt_app(design_name=design_name, desktop=app) - - # Your PyAEDT script - aedtapp.modeler.create_sphere([0, 0, 0], 3) - - if not extension_args["is_test"]: # pragma: no cover - app.release_desktop(False, False) - return True - - -if __name__ == "__main__": - args = get_arguments(extension_arguments, extension_description) - main(args) diff --git a/src/pyaedt/workflows/templates/extension_template.py b/src/pyaedt/workflows/templates/extension_template.py deleted file mode 100644 index 98a6ffe0c22..00000000000 --- a/src/pyaedt/workflows/templates/extension_template.py +++ /dev/null @@ -1 +0,0 @@ -from ansys.aedt.core.workflows.templates.extension_template import * diff --git a/src/pyaedt/workflows/templates/pyaedt_utils.py b/src/pyaedt/workflows/templates/pyaedt_utils.py index 14c47de7bf6..193bb8d840a 100644 --- a/src/pyaedt/workflows/templates/pyaedt_utils.py +++ b/src/pyaedt/workflows/templates/pyaedt_utils.py @@ -1 +1 @@ -from ansys.aedt.core.workflows.templatesaedt_utils import * +from ansys.aedt.core.workflows.templates.pyaedt_utils import * diff --git a/src/pyaedt/workflows/templates/template_get_started.py b/src/pyaedt/workflows/templates/template_get_started.py new file mode 100644 index 00000000000..9dec129452a --- /dev/null +++ b/src/pyaedt/workflows/templates/template_get_started.py @@ -0,0 +1 @@ +from ansys.aedt.core.workflows.templates.template_get_started import * \ No newline at end of file diff --git a/tests/system/solvers/test_45_workflows.py b/tests/system/solvers/test_45_workflows.py index c3527f2238c..640a1daaaab 100644 --- a/tests/system/solvers/test_45_workflows.py +++ b/tests/system/solvers/test_45_workflows.py @@ -53,12 +53,15 @@ 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.extension_template import main - - assert main({"is_test": True}) + from ansys.aedt.core.workflows.templates.template_get_started import main + assert main({"is_test": True, "origin_x": 2}) assert len(aedtapp.modeler.object_list) == 1 + file_path = os.path.join(solver_local_path, "example_models", "T00", "test_solve.aedt") + assert main({"is_test": True, "file_path": file_path}) + assert len(aedtapp.project_list) == 2 + aedtapp.close_project(aedtapp.project_name) def test_02_hfss_push(self, add_app): @@ -574,17 +577,3 @@ def test_17_choke_designer(self, local_scratch): } extension_args = {"is_test": True, "choke_config": choke_config} assert main(extension_args) - - def test_18_template_get_started(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 - - assert main({"is_test": True, "origin_x": 2}) - assert len(aedtapp.modeler.object_list) == 1 - - file_path = os.path.join(solver_local_path, "example_models", "T00", "test_solve.aedt") - assert main({"is_test": True, "file_path": file_path}) - assert len(aedtapp.project_list) == 2 - - aedtapp.close_project(aedtapp.project_name)