From d9e8597c49f7f03e3901b73f17518b7cb5d655b2 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Thu, 20 Feb 2025 14:22:26 +0100 Subject: [PATCH 01/17] first extension implementation --- .../transformer_loss_distribution.py | 180 ++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py new file mode 100644 index 00000000000..d7834f4abd5 --- /dev/null +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2021 - 2025 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. + +# Extension template to help get started + +from pathlib import Path + +import ansys.aedt.core +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 + +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, "file_path": ""} +extension_description = "Extension template" + + +def frontend(): + import tkinter as tk + 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() + + if not active_project: + active_project_name = "No active project" + else: + active_project_name = active_project.GetName() + active_design_name = app.active_design(active_project_name) + maxwell = ansys.aedt.core.Maxwell3D(active_project_name, active_design_name) + + # Create UI + master = tk.Tk() + + master.geometry() + + master.title(extension_description) + + # Detect if user close the UI + master.flag = False + + # Load the logo for the main window + icon_path = Path(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() + theme = ExtensionTheme() + + theme.apply_light_theme(style) + master.theme = "light" + + # Set background color of the window (optional) + master.configure(bg=theme.light["widget_bg"]) + + # Project name info + project_name_label = ttk.Label(master, text="Project Name:", width=20, style="PyAEDT.TLabel") + project_name_label.grid(row=0, column=0, pady=10) + project_name_entry = tk.Text(master, width=40, height=1) + project_name_entry.insert(tk.INSERT, active_project_name) + project_name_entry.grid(row=0, column=1, pady=15, padx=10) + project_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + + # Design name info + design_name_label = ttk.Label(master, text="Design Name:", width=20, style="PyAEDT.TLabel") + design_name_label.grid(row=1, column=0, pady=10) + design_name_entry = tk.Text(master, width=40, height=1) + design_name_entry.insert(tk.INSERT, active_project_name) + design_name_entry.grid(row=1, column=1, pady=15, padx=10) + design_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + + # Objects list + objects_list = maxwell.modeler.objects + objects_list_label = ttk.Label(master, text="Objects list:", width=20, style="PyAEDT.TLabel") + objects_list_label.grid(row=2, column=0, pady=10) + objects_list_lb = tk.Listbox(master, selectmode=tk.MULTIPLE, height=len(objects_list), width=50) + for obj in objects_list: + objects_list_lb.insert(tk.END, obj) + objects_list_lb.pack() + objects_list_lb.grid(row=2, column=1, pady=15, padx=10) + + # Formats list + formats_list = [".tab", ".csv", ".mat"] + formats_list_label = ttk.Label(master, text="Available output formats:", width=20, style="PyAEDT.TLabel") + formats_list_label.grid(row=3, column=0, pady=10) + formats_list_lb = tk.Listbox(master, selectmode=tk.MULTIPLE, height=len(formats_list), width=50) + for format in formats_list: + formats_list_lb.insert(tk.END, format) + formats_list_lb.pack() + formats_list_lb.grid(row=3, column=1, pady=15, padx=10) + + # Browse output file entry + browse_file_label = ttk.Label(master, text="Output file location:", 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) + + def toggle_theme(): + if master.theme == "light": + set_dark_theme() + master.theme = "dark" + else: + set_light_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 + # ) + 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") + + 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) + 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 c4895757e51220213db836dc98c33a67d2072ed6 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Thu, 20 Feb 2025 19:01:36 +0100 Subject: [PATCH 02/17] first extension implementation --- .../transformer_loss_distribution.py | 144 +++++++++++++++--- 1 file changed, 120 insertions(+), 24 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index d7834f4abd5..0c582e3d49c 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -26,7 +26,9 @@ from pathlib import Path import ansys.aedt.core +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 @@ -43,6 +45,7 @@ def frontend(): import tkinter as tk + from tkinter import filedialog import tkinter.ttk as ttk import PIL.Image @@ -63,8 +66,8 @@ def frontend(): active_project_name = "No active project" else: active_project_name = active_project.GetName() - active_design_name = app.active_design(active_project_name) - maxwell = ansys.aedt.core.Maxwell3D(active_project_name, active_design_name) + active_design_name = app.active_design().GetName() + maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) # Create UI master = tk.Tk() @@ -106,36 +109,37 @@ def frontend(): design_name_label = ttk.Label(master, text="Design Name:", width=20, style="PyAEDT.TLabel") design_name_label.grid(row=1, column=0, pady=10) design_name_entry = tk.Text(master, width=40, height=1) - design_name_entry.insert(tk.INSERT, active_project_name) + design_name_entry.insert(tk.INSERT, active_design_name) design_name_entry.grid(row=1, column=1, pady=15, padx=10) design_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Objects list - objects_list = maxwell.modeler.objects + scroll_bar = tk.Scrollbar(master) + # scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) + objects_list = maxwell.modeler.object_names objects_list_label = ttk.Label(master, text="Objects list:", width=20, style="PyAEDT.TLabel") objects_list_label.grid(row=2, column=0, pady=10) - objects_list_lb = tk.Listbox(master, selectmode=tk.MULTIPLE, height=len(objects_list), width=50) + objects_list_lb = tk.Listbox(master, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set) for obj in objects_list: objects_list_lb.insert(tk.END, obj) - objects_list_lb.pack() - objects_list_lb.grid(row=2, column=1, pady=15, padx=10) - - # Formats list - formats_list = [".tab", ".csv", ".mat"] - formats_list_label = ttk.Label(master, text="Available output formats:", width=20, style="PyAEDT.TLabel") - formats_list_label.grid(row=3, column=0, pady=10) - formats_list_lb = tk.Listbox(master, selectmode=tk.MULTIPLE, height=len(formats_list), width=50) - for format in formats_list: - formats_list_lb.insert(tk.END, format) - formats_list_lb.pack() - formats_list_lb.grid(row=3, column=1, pady=15, padx=10) - - # Browse output file entry - browse_file_label = ttk.Label(master, text="Output file location:", 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) + scroll_bar.config(command=objects_list_lb.yview) + objects_list_lb.grid(row=2, column=1, pady=15, padx=20) + + # Export options + export_options_list = ["Loss - Ohmic loss", "Force"] + export_options_label = ttk.Label(master, text="Export options:", width=20, style="PyAEDT.TLabel") + export_options_label.grid(row=3, column=0, pady=10) + variable = tk.StringVar(master) + variable.set("") # default value + export_options_lb = tk.OptionMenu(master, variable, *export_options_list) + export_options_lb.grid(row=3, column=1, pady=15, padx=10) + + # Export file + export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") + export_file_label.grid(row=4, column=0, pady=10) + export_file_entry = tk.Text(master, width=40, height=1) + export_file_entry.grid(row=4, column=1, pady=15, padx=10) + export_file_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) def toggle_theme(): if master.theme == "light": @@ -178,3 +182,95 @@ def set_dark_theme(): 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") + + 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 save_as_files(): + filename = filedialog.asksaveasfilename( + initialdir="/", + defaultextension=".tab", + filetypes=[ + ("tab data file", ".tab"), + ("csv data file", ".csv"), + ("MATLAB", ".mat"), + ("Numpy array", ".npy"), + ], + ) + export_file_entry.insert(tk.END, filename) + master.file_path = export_file_entry.get("1.0", tk.END).strip() + master.destroy() + + # Create button to save fields data + save_as_button = ttk.Button(master, text="...", command=save_as_files, width=10, style="PyAEDT.TButton") + save_as_button.grid(row=5, column=2, pady=10, padx=15) + + # 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) + + # Get objects list selection + selected_objects = variable.get() + + tk.mainloop() + + app.release_desktop(False, False) + + return {} + + +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) + + # 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"]) + # file_path = extension_args.get("file_path", extension_arguments["file_path"]) + + # 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) + 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 72f82d61d7806f265dca7ada3db3751731446f05 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Thu, 20 Feb 2025 21:11:04 +0100 Subject: [PATCH 03/17] first extension implementation --- .../transformer_loss_distribution.py | 96 ++++++++++--------- 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 0c582e3d49c..7960f09d576 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -26,7 +26,8 @@ from pathlib import Path import ansys.aedt.core -from ansys.aedt.core.generic.design_types 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 @@ -52,23 +53,22 @@ def frontend(): 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() - - if not active_project: - active_project_name = "No active project" - else: - active_project_name = active_project.GetName() - active_design_name = app.active_design().GetName() - maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) - + # 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() + # + # if not active_project: + # active_project_name = "No active project" + # else: + # active_project_name = active_project.GetName() + # active_design_name = app.active_design().GetName() + # maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) # Create UI master = tk.Tk() @@ -101,7 +101,7 @@ def frontend(): project_name_label = ttk.Label(master, text="Project Name:", width=20, style="PyAEDT.TLabel") project_name_label.grid(row=0, column=0, pady=10) project_name_entry = tk.Text(master, width=40, height=1) - project_name_entry.insert(tk.INSERT, active_project_name) + project_name_entry.insert(tk.INSERT, "active_project_name") project_name_entry.grid(row=0, column=1, pady=15, padx=10) project_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) @@ -109,21 +109,28 @@ def frontend(): design_name_label = ttk.Label(master, text="Design Name:", width=20, style="PyAEDT.TLabel") design_name_label.grid(row=1, column=0, pady=10) design_name_entry = tk.Text(master, width=40, height=1) - design_name_entry.insert(tk.INSERT, active_design_name) + design_name_entry.insert(tk.INSERT, "active_design_name") design_name_entry.grid(row=1, column=1, pady=15, padx=10) design_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Objects list - scroll_bar = tk.Scrollbar(master) + frame = tk.Frame(master) + frame.grid(row=2, column=1, columnspan=2, pady=10, padx=10) + scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) + scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) # scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) - objects_list = maxwell.modeler.object_names + # objects_list = maxwell.modeler.object_names + objects_list = ["Object1", "Object2", "Object3", "Object1", "Object2", "Object3", "Object1", "Object2", "Object3"] objects_list_label = ttk.Label(master, text="Objects list:", width=20, style="PyAEDT.TLabel") objects_list_label.grid(row=2, column=0, pady=10) - objects_list_lb = tk.Listbox(master, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set) + objects_list_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, height=20, width=20) + objects_list_lb.pack(expand=True, fill=tk.Y) for obj in objects_list: objects_list_lb.insert(tk.END, obj) + # objects_list_lb.config(height=len(objects_list)) + objects_list_lb.config(height=2) scroll_bar.config(command=objects_list_lb.yview) - objects_list_lb.grid(row=2, column=1, pady=15, padx=20) + # objects_list_lb.grid(row=2, column=1, pady=15, padx=20) # Export options export_options_list = ["Loss - Ohmic loss", "Force"] @@ -220,30 +227,30 @@ def save_as_files(): tk.mainloop() - app.release_desktop(False, False) + # app.release_desktop(False, False) return {} 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) + # 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) # origin_x = extension_args.get("origin_x", extension_arguments["origin_x"]) # origin_y = extension_args.get("origin_y", extension_arguments["origin_y"]) @@ -258,7 +265,8 @@ def main(extension_args): # # 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) + # app.release_desktop(False, False) + pass return True From 2aba6836bcb1156ac00f6480a9d47d764ce1ac8d Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Sat, 22 Feb 2025 18:24:16 +0100 Subject: [PATCH 04/17] improve listbox chioces --- .../transformer_loss_distribution.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 7960f09d576..468e51192a0 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -118,8 +118,6 @@ def frontend(): frame.grid(row=2, column=1, columnspan=2, pady=10, padx=10) scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) - # scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) - # objects_list = maxwell.modeler.object_names objects_list = ["Object1", "Object2", "Object3", "Object1", "Object2", "Object3", "Object1", "Object2", "Object3"] objects_list_label = ttk.Label(master, text="Objects list:", width=20, style="PyAEDT.TLabel") objects_list_label.grid(row=2, column=0, pady=10) @@ -127,19 +125,19 @@ def frontend(): objects_list_lb.pack(expand=True, fill=tk.Y) for obj in objects_list: objects_list_lb.insert(tk.END, obj) - # objects_list_lb.config(height=len(objects_list)) - objects_list_lb.config(height=2) + objects_list_lb.config(height=6, width=30) scroll_bar.config(command=objects_list_lb.yview) - # objects_list_lb.grid(row=2, column=1, pady=15, padx=20) # Export options - export_options_list = ["Loss - Ohmic loss", "Force"] + frame = tk.Frame(master) + frame.grid(row=3, column=1, columnspan=2, pady=10, padx=10) + export_options_list = ["Ohmic loss", "Force"] export_options_label = ttk.Label(master, text="Export options:", width=20, style="PyAEDT.TLabel") export_options_label.grid(row=3, column=0, pady=10) - variable = tk.StringVar(master) - variable.set("") # default value - export_options_lb = tk.OptionMenu(master, variable, *export_options_list) - export_options_lb.grid(row=3, column=1, pady=15, padx=10) + export_options_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, height=2, width=20) + export_options_lb.pack(expand=True, fill=tk.Y) + for opt in export_options_list: + export_options_lb.insert(tk.END, opt) # Export file export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") @@ -223,7 +221,7 @@ def save_as_files(): # change_theme_button.grid(row=6, column=2, pady=10) # Get objects list selection - selected_objects = variable.get() + # selected_objects = variable.get() tk.mainloop() From e669aa9d1f8440353e7362ed2c42b17719d84c1c Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Sun, 23 Feb 2025 16:06:53 +0100 Subject: [PATCH 05/17] first extension implementation --- .../transformer_loss_distribution.py | 104 ++++++++++-------- 1 file changed, 57 insertions(+), 47 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 468e51192a0..8ffc67a3215 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -103,7 +103,9 @@ def frontend(): project_name_entry = tk.Text(master, width=40, height=1) project_name_entry.insert(tk.INSERT, "active_project_name") project_name_entry.grid(row=0, column=1, pady=15, padx=10) - project_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + project_name_entry.configure( + bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font, state=tk.DISABLED + ) # Design name info design_name_label = ttk.Label(master, text="Design Name:", width=20, style="PyAEDT.TLabel") @@ -111,34 +113,40 @@ def frontend(): design_name_entry = tk.Text(master, width=40, height=1) design_name_entry.insert(tk.INSERT, "active_design_name") design_name_entry.grid(row=1, column=1, pady=15, padx=10) - design_name_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + design_name_entry.configure( + bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font, state=tk.DISABLED + ) + + # Export options + frame = tk.Frame(master) + frame.grid(row=2, column=0, pady=10, padx=10) + export_options_list = ["Ohmic loss", "Force"] + export_options_label = ttk.Label( + frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER + ) + export_options_label.pack(side=tk.TOP, fill=tk.BOTH) + export_options_lb = tk.Listbox(frame, selectmode=tk.SINGLE, height=2, width=15, justify=tk.CENTER) + export_options_lb.pack(expand=True, fill=tk.BOTH) + for opt in export_options_list: + export_options_lb.insert(tk.END, opt) # Objects list frame = tk.Frame(master) - frame.grid(row=2, column=1, columnspan=2, pady=10, padx=10) + frame.grid(row=2, column=1, pady=10, padx=10) + objects_list = ["Object1", "Object2", "Object3", "Object1", "Object2", "Object3", "Object1", "Object2", "Object3"] + objects_list_label = ttk.Label( + frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER + ) + objects_list_label.pack(side=tk.TOP, fill=tk.BOTH) scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) - objects_list = ["Object1", "Object2", "Object3", "Object1", "Object2", "Object3", "Object1", "Object2", "Object3"] - objects_list_label = ttk.Label(master, text="Objects list:", width=20, style="PyAEDT.TLabel") - objects_list_label.grid(row=2, column=0, pady=10) - objects_list_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, height=20, width=20) - objects_list_lb.pack(expand=True, fill=tk.Y) + objects_list_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, justify=tk.CENTER) + objects_list_lb.pack(expand=True, fill=tk.BOTH) for obj in objects_list: objects_list_lb.insert(tk.END, obj) objects_list_lb.config(height=6, width=30) scroll_bar.config(command=objects_list_lb.yview) - # Export options - frame = tk.Frame(master) - frame.grid(row=3, column=1, columnspan=2, pady=10, padx=10) - export_options_list = ["Ohmic loss", "Force"] - export_options_label = ttk.Label(master, text="Export options:", width=20, style="PyAEDT.TLabel") - export_options_label.grid(row=3, column=0, pady=10) - export_options_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, height=2, width=20) - export_options_lb.pack(expand=True, fill=tk.Y) - for opt in export_options_list: - export_options_lb.insert(tk.END, opt) - # Export file export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") export_file_label.grid(row=4, column=0, pady=10) @@ -156,34 +164,33 @@ def toggle_theme(): 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 - # ) project_name_entry.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) + design_name_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + export_options_lb.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + objects_list_lb.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + scroll_bar.configure(background=theme.light["pane_bg"]) + export_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) + project_name_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + design_name_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + export_options_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + objects_list_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + scroll_bar.configure(bg=theme.dark["pane_bg"]) + export_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") @@ -208,17 +215,20 @@ def save_as_files(): ) export_file_entry.insert(tk.END, filename) master.file_path = export_file_entry.get("1.0", tk.END).strip() - master.destroy() + # master.destroy() + + # Create button to select output file location + save_as_button = ttk.Button(master, text="Save as...", command=save_as_files, width=10, style="PyAEDT.TButton") + save_as_button.grid(row=4, column=2, pady=10, padx=15) - # Create button to save fields data - save_as_button = ttk.Button(master, text="...", command=save_as_files, width=10, style="PyAEDT.TButton") - save_as_button.grid(row=5, column=2, pady=10, padx=15) + # Create button to export fields data + # In command put the workflow to export the data + export_button = ttk.Button(master, text="Export", width=10, style="PyAEDT.TButton") + export_button.grid(row=5, column=1, pady=10, padx=15) # 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) + change_theme_button = ttk.Button(master, text="\u263D", width=2, command=toggle_theme, style="PyAEDT.TButton") + change_theme_button.grid(row=6, column=2, pady=10) # Get objects list selection # selected_objects = variable.get() From ccac8e05e4ffd2bee50010df11c089736a0fa8f3 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Mon, 24 Feb 2025 10:24:16 +0100 Subject: [PATCH 06/17] improve extension UI --- .../transformer_loss_distribution.py | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 8ffc67a3215..9c94a2e9577 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -72,6 +72,10 @@ def frontend(): # Create UI master = tk.Tk() + # Configure the grid to expand with the window + master.grid_rowconfigure(0, weight=1) + master.grid_columnconfigure(0, weight=1) + master.geometry() master.title(extension_description) @@ -147,6 +151,13 @@ def frontend(): objects_list_lb.config(height=6, width=30) scroll_bar.config(command=objects_list_lb.yview) + # Sample points file + sample_points_label = ttk.Label(master, text="Sample points file:", width=20, style="PyAEDT.TLabel") + sample_points_label.grid(row=3, column=0, pady=10) + sample_points_entry = tk.Text(master, width=40, height=1) + sample_points_entry.grid(row=3, column=1, pady=15, padx=10) + sample_points_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + # Export file export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") export_file_label.grid(row=4, column=0, pady=10) @@ -202,6 +213,20 @@ def callback(): # 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=(("Points file", ".pst"), ("all files", "*.*")), + ) + sample_points_entry.insert(tk.END, filename) + master.file_path = sample_points_entry.get("1.0", tk.END).strip() + master.destroy() + + # Export points file button + export_points_button = ttk.Button(master, text="...", command=browse_files, width=10, style="PyAEDT.TButton") + export_points_button.grid(row=3, column=2, pady=10, padx=15) + def save_as_files(): filename = filedialog.asksaveasfilename( initialdir="/", @@ -209,7 +234,7 @@ def save_as_files(): filetypes=[ ("tab data file", ".tab"), ("csv data file", ".csv"), - ("MATLAB", ".mat"), + # ("MATLAB", ".mat"), ("Numpy array", ".npy"), ], ) @@ -226,9 +251,19 @@ def save_as_files(): export_button = ttk.Button(master, text="Export", width=10, style="PyAEDT.TButton") export_button.grid(row=5, column=1, pady=10, padx=15) + # Configure logging + text_area = tk.Text(master, wrap=tk.WORD, width=40, height=2) + text_area.grid(row=6, column=1, pady=10, sticky="nsew") + text_area.config(state=tk.DISABLED) + if sample_points_entry.get("1.0", tk.END).strip() == "": + text_area.insert( + tk.INSERT, "If a points file is not selected the export fields will be performed on mesh nodes." + ) + text_area.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + # Create buttons to create sphere and change theme color change_theme_button = ttk.Button(master, text="\u263D", width=2, command=toggle_theme, style="PyAEDT.TButton") - change_theme_button.grid(row=6, column=2, pady=10) + change_theme_button.grid(row=7, column=2, pady=10) # Get objects list selection # selected_objects = variable.get() From 2db06f04780b54eb96c314ef28527ccac1330147 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Mon, 24 Feb 2025 11:49:02 +0100 Subject: [PATCH 07/17] add workflow --- .../transformer_loss_distribution.py | 143 ++++++++++-------- 1 file changed, 82 insertions(+), 61 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 9c94a2e9577..d9e20fc8235 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -26,8 +26,7 @@ from pathlib import Path import ansys.aedt.core - -# from ansys.aedt.core.generic.design_types 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 @@ -40,7 +39,7 @@ is_student = is_student() # Extension batch arguments -extension_arguments = {"origin_x": 0, "origin_y": 0, "origin_z": 0, "radius": 1, "file_path": ""} +extension_arguments = {"points_file": "", "export_file": "", "export_option": "Ohmic loss", "objects_list": []} extension_description = "Extension template" @@ -53,22 +52,23 @@ def frontend(): 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() - # - # if not active_project: - # active_project_name = "No active project" - # else: - # active_project_name = active_project.GetName() - # active_design_name = app.active_design().GetName() - # maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) + 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() + + if not active_project: + active_project_name = "No active project" + else: + active_project_name = active_project.GetName() + active_design_name = app.active_design().GetName() + maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) + # Create UI master = tk.Tk() @@ -105,7 +105,7 @@ def frontend(): project_name_label = ttk.Label(master, text="Project Name:", width=20, style="PyAEDT.TLabel") project_name_label.grid(row=0, column=0, pady=10) project_name_entry = tk.Text(master, width=40, height=1) - project_name_entry.insert(tk.INSERT, "active_project_name") + project_name_entry.insert(tk.INSERT, active_project_name) project_name_entry.grid(row=0, column=1, pady=15, padx=10) project_name_entry.configure( bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font, state=tk.DISABLED @@ -115,7 +115,7 @@ def frontend(): design_name_label = ttk.Label(master, text="Design Name:", width=20, style="PyAEDT.TLabel") design_name_label.grid(row=1, column=0, pady=10) design_name_entry = tk.Text(master, width=40, height=1) - design_name_entry.insert(tk.INSERT, "active_design_name") + design_name_entry.insert(tk.INSERT, active_design_name) design_name_entry.grid(row=1, column=1, pady=15, padx=10) design_name_entry.configure( bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font, state=tk.DISABLED @@ -137,7 +137,7 @@ def frontend(): # Objects list frame = tk.Frame(master) frame.grid(row=2, column=1, pady=10, padx=10) - objects_list = ["Object1", "Object2", "Object3", "Object1", "Object2", "Object3", "Object1", "Object2", "Object3"] + objects_list = maxwell.modeler.objects_by_name objects_list_label = ttk.Label( frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER ) @@ -191,6 +191,10 @@ def set_light_theme(): export_file_entry.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) + sample_points_entry.configure( + background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font + ) + text_area.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") @@ -202,15 +206,18 @@ def set_dark_theme(): objects_list_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) scroll_bar.configure(bg=theme.dark["pane_bg"]) export_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) + sample_points_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) + text_area.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.points_file = sample_points_entry.get("1.0", tk.END).strip() + master.export_file = export_file_entry.get("1.0", tk.END).strip() + selected_export = export_options_lb.curselection() + master.export_option = [objects_list_lb.get(i) for i in selected_export] + selected_objects = objects_list_lb.curselection() + master.objects_list = [objects_list_lb.get(i) for i in selected_objects] master.destroy() def browse_files(): @@ -270,46 +277,60 @@ def save_as_files(): tk.mainloop() - # app.release_desktop(False, False) + points_file = getattr(master, "points_file", extension_arguments["points_file"]) + export_file = getattr(master, "export_file", extension_arguments["export_file"]) + export_option = getattr(master, "export_option", extension_arguments["export_option"]) + objects_list = getattr(master, "objects_list", extension_arguments["objects_list"]) + + output_dict = { + "points_file": points_file, + "export_file": export_file, + "export_option": export_option, + "objects_list": objects_list, + } + + app.release_desktop(False, False) - return {} + 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) - - # 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"]) - # file_path = extension_args.get("file_path", extension_arguments["file_path"]) - - # 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) + 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) + + points_file = extension_args.get("points_file", extension_arguments["points_file"]) + export_file = extension_args.get("export_file", extension_arguments["export_file"]) + export_option = extension_args.get("export_option", extension_arguments["export_option"]) + objects_list = extension_args.get("objects_list", extension_arguments["objects_list"]) + + # Your workflow + # Check notes + if not points_file: + points_file = None + elif not objects_list: + objects_list = "AllObjects" + aedtapp.post.export_field_file( + quantity=export_option, output_file=export_file, sample_points=points_file, assignment="AllObjects" + ) if not extension_args["is_test"]: # pragma: no cover - # app.release_desktop(False, False) - pass + app.release_desktop(False, False) return True From 5e6c21c6e8b0710c93bc551c2bf7da9c1563c656 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Mon, 24 Feb 2025 15:49:38 +0100 Subject: [PATCH 08/17] improve workflow --- .../transformer_loss_distribution.py | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index d9e20fc8235..b9071d31c38 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -40,7 +40,7 @@ # Extension batch arguments extension_arguments = {"points_file": "", "export_file": "", "export_option": "Ohmic loss", "objects_list": []} -extension_description = "Extension template" +extension_description = "Export of transformer loss distribution" def frontend(): @@ -61,13 +61,18 @@ def frontend(): ) active_project = app.active_project() + active_design = app.active_design() if not active_project: active_project_name = "No active project" else: active_project_name = active_project.GetName() - active_design_name = app.active_design().GetName() - maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) + active_design_name = active_design.GetName() + design_type = active_design.GetDesignType() + if design_type == "Maxwell 2D": + maxwell = ansys.aedt.core.Maxwell2d(active_project_name, active_design_name) + elif design_type == "Maxwell 3D": + maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) # Create UI master = tk.Tk() @@ -218,7 +223,7 @@ def callback(): master.export_option = [objects_list_lb.get(i) for i in selected_export] selected_objects = objects_list_lb.curselection() master.objects_list = [objects_list_lb.get(i) for i in selected_objects] - master.destroy() + # master.destroy() def browse_files(): filename = filedialog.askopenfilename( @@ -255,7 +260,7 @@ def save_as_files(): # Create button to export fields data # In command put the workflow to export the data - export_button = ttk.Button(master, text="Export", width=10, style="PyAEDT.TButton") + export_button = ttk.Button(master, text="Export", command=callback, width=10, style="PyAEDT.TButton") export_button.grid(row=5, column=1, pady=10, padx=15) # Configure logging @@ -264,7 +269,8 @@ def save_as_files(): text_area.config(state=tk.DISABLED) if sample_points_entry.get("1.0", tk.END).strip() == "": text_area.insert( - tk.INSERT, "If a points file is not selected the export fields will be performed on mesh nodes." + tk.INSERT, + "INFO: If a points file is not selected the export fields will be performed on mesh nodes." + "\n", ) text_area.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) @@ -282,6 +288,11 @@ def save_as_files(): export_option = getattr(master, "export_option", extension_arguments["export_option"]) objects_list = getattr(master, "objects_list", extension_arguments["objects_list"]) + if not objects_list: + text_area.insert( + tk.INSERT, "INFO: If no objects are selected all objects are taken into account for field export." + "\n" + ) + output_dict = { "points_file": points_file, "export_file": export_file, @@ -307,10 +318,7 @@ def main(extension_args): 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() + design_name = active_design.GetName() aedtapp = get_pyaedt_app(project_name, design_name) @@ -326,7 +334,7 @@ def main(extension_args): elif not objects_list: objects_list = "AllObjects" aedtapp.post.export_field_file( - quantity=export_option, output_file=export_file, sample_points=points_file, assignment="AllObjects" + quantity=export_option, output_file=export_file, sample_points=points_file, assignment=objects_list ) if not extension_args["is_test"]: # pragma: no cover From 08150fd55cf638fc87e374d1aaa006674fc971c9 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Tue, 25 Feb 2025 10:30:45 +0100 Subject: [PATCH 09/17] improve workflow --- .../transformer_loss_distribution.py | 27 +++++++++---------- .../templates/template_get_started.py | 5 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index b9071d31c38..18afa0c061a 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -223,6 +223,16 @@ def callback(): master.export_option = [objects_list_lb.get(i) for i in selected_export] selected_objects = objects_list_lb.curselection() master.objects_list = [objects_list_lb.get(i) for i in selected_objects] + if master.points_file == "": + text_area.insert( + tk.INSERT, + "INFO: If a points file is not selected the export fields will be performed on mesh nodes." + "\n", + ) + if not master.objects_list: + text_area.insert( + tk.INSERT, + "INFO: If no objects are selected all objects are taken into account for field export." + "\n", + ) # master.destroy() def browse_files(): @@ -267,11 +277,6 @@ def save_as_files(): text_area = tk.Text(master, wrap=tk.WORD, width=40, height=2) text_area.grid(row=6, column=1, pady=10, sticky="nsew") text_area.config(state=tk.DISABLED) - if sample_points_entry.get("1.0", tk.END).strip() == "": - text_area.insert( - tk.INSERT, - "INFO: If a points file is not selected the export fields will be performed on mesh nodes." + "\n", - ) text_area.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Create buttons to create sphere and change theme color @@ -279,8 +284,6 @@ def save_as_files(): change_theme_button.grid(row=7, column=2, pady=10) # Get objects list selection - # selected_objects = variable.get() - tk.mainloop() points_file = getattr(master, "points_file", extension_arguments["points_file"]) @@ -288,11 +291,6 @@ def save_as_files(): export_option = getattr(master, "export_option", extension_arguments["export_option"]) objects_list = getattr(master, "objects_list", extension_arguments["objects_list"]) - if not objects_list: - text_area.insert( - tk.INSERT, "INFO: If no objects are selected all objects are taken into account for field export." + "\n" - ) - output_dict = { "points_file": points_file, "export_file": export_file, @@ -352,5 +350,6 @@ def main(extension_args): for output_name, output_value in output.items(): if output_name in extension_arguments: args[output_name] = output_value - - main(args) + main(args) + else: + main(args) 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 cbac809c7a2..dc6504bce03 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -274,5 +274,6 @@ def main(extension_args): for output_name, output_value in output.items(): if output_name in extension_arguments: args[output_name] = output_value - - main(args) + main(args) + else: + main(args) From 59eddbdbc8222028efda957a0b73d3403d51ccff Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Wed, 26 Feb 2025 07:58:36 +0100 Subject: [PATCH 10/17] improve workflow --- .../transformer_loss_distribution.py | 106 +++++------------- 1 file changed, 31 insertions(+), 75 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 18afa0c061a..1a54e5038a5 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -62,17 +62,13 @@ def frontend(): active_project = app.active_project() active_design = app.active_design() - - if not active_project: - active_project_name = "No active project" - else: - active_project_name = active_project.GetName() - active_design_name = active_design.GetName() - design_type = active_design.GetDesignType() - if design_type == "Maxwell 2D": - maxwell = ansys.aedt.core.Maxwell2d(active_project_name, active_design_name) - elif design_type == "Maxwell 3D": - maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) + active_project_name = active_project.GetName() + active_design_name = active_design.GetName() + design_type = active_design.GetDesignType() + if design_type == "Maxwell 2D": + maxwell = ansys.aedt.core.Maxwell2d(active_project_name, active_design_name) + elif design_type == "Maxwell 3D": + maxwell = ansys.aedt.core.Maxwell3d(active_project_name, active_design_name) # Create UI master = tk.Tk() @@ -106,42 +102,22 @@ def frontend(): # Set background color of the window (optional) master.configure(bg=theme.light["widget_bg"]) - # Project name info - project_name_label = ttk.Label(master, text="Project Name:", width=20, style="PyAEDT.TLabel") - project_name_label.grid(row=0, column=0, pady=10) - project_name_entry = tk.Text(master, width=40, height=1) - project_name_entry.insert(tk.INSERT, active_project_name) - project_name_entry.grid(row=0, column=1, pady=15, padx=10) - project_name_entry.configure( - bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font, state=tk.DISABLED - ) - - # Design name info - design_name_label = ttk.Label(master, text="Design Name:", width=20, style="PyAEDT.TLabel") - design_name_label.grid(row=1, column=0, pady=10) - design_name_entry = tk.Text(master, width=40, height=1) - design_name_entry.insert(tk.INSERT, active_design_name) - design_name_entry.grid(row=1, column=1, pady=15, padx=10) - design_name_entry.configure( - bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font, state=tk.DISABLED - ) - # Export options frame = tk.Frame(master) - frame.grid(row=2, column=0, pady=10, padx=10) - export_options_list = ["Ohmic loss", "Force"] + frame.grid(row=0, column=0, columnspan=2, pady=10, padx=10) + export_options_list = ["Ohmic loss", "AC Force Density"] export_options_label = ttk.Label( frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER ) export_options_label.pack(side=tk.TOP, fill=tk.BOTH) export_options_lb = tk.Listbox(frame, selectmode=tk.SINGLE, height=2, width=15, justify=tk.CENTER) - export_options_lb.pack(expand=True, fill=tk.BOTH) + export_options_lb.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) for opt in export_options_list: export_options_lb.insert(tk.END, opt) # Objects list frame = tk.Frame(master) - frame.grid(row=2, column=1, pady=10, padx=10) + frame.grid(row=0, column=1, columnspan=3, pady=10, padx=10) objects_list = maxwell.modeler.objects_by_name objects_list_label = ttk.Label( frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER @@ -150,7 +126,7 @@ def frontend(): scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) objects_list_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, justify=tk.CENTER) - objects_list_lb.pack(expand=True, fill=tk.BOTH) + objects_list_lb.pack(expand=True, fill=tk.BOTH, side=tk.RIGHT) for obj in objects_list: objects_list_lb.insert(tk.END, obj) objects_list_lb.config(height=6, width=30) @@ -158,16 +134,16 @@ def frontend(): # Sample points file sample_points_label = ttk.Label(master, text="Sample points file:", width=20, style="PyAEDT.TLabel") - sample_points_label.grid(row=3, column=0, pady=10) + sample_points_label.grid(row=2, column=0, pady=10) sample_points_entry = tk.Text(master, width=40, height=1) - sample_points_entry.grid(row=3, column=1, pady=15, padx=10) + sample_points_entry.grid(row=2, column=1, pady=15, padx=10) sample_points_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Export file export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") - export_file_label.grid(row=4, column=0, pady=10) + export_file_label.grid(row=3, column=0, pady=10) export_file_entry = tk.Text(master, width=40, height=1) - export_file_entry.grid(row=4, column=1, pady=15, padx=10) + export_file_entry.grid(row=3, column=1, pady=15, padx=10) export_file_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) def toggle_theme(): @@ -180,12 +156,6 @@ def toggle_theme(): def set_light_theme(): master.configure(bg=theme.light["widget_bg"]) - project_name_entry.configure( - background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font - ) - design_name_entry.configure( - background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font - ) export_options_lb.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) @@ -199,20 +169,16 @@ def set_light_theme(): sample_points_entry.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) - text_area.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"]) - project_name_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) - design_name_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) export_options_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) objects_list_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) scroll_bar.configure(bg=theme.dark["pane_bg"]) export_file_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) sample_points_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) - text_area.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") @@ -223,23 +189,13 @@ def callback(): master.export_option = [objects_list_lb.get(i) for i in selected_export] selected_objects = objects_list_lb.curselection() master.objects_list = [objects_list_lb.get(i) for i in selected_objects] - if master.points_file == "": - text_area.insert( - tk.INSERT, - "INFO: If a points file is not selected the export fields will be performed on mesh nodes." + "\n", - ) - if not master.objects_list: - text_area.insert( - tk.INSERT, - "INFO: If no objects are selected all objects are taken into account for field export." + "\n", - ) - # master.destroy() + master.destroy() def browse_files(): filename = filedialog.askopenfilename( initialdir="/", title="Select an Electronics File", - filetypes=(("Points file", ".pst"), ("all files", "*.*")), + filetypes=(("Points file", ".pts"), ("all files", "*.*")), ) sample_points_entry.insert(tk.END, filename) master.file_path = sample_points_entry.get("1.0", tk.END).strip() @@ -247,7 +203,7 @@ def browse_files(): # Export points file button export_points_button = ttk.Button(master, text="...", command=browse_files, width=10, style="PyAEDT.TButton") - export_points_button.grid(row=3, column=2, pady=10, padx=15) + export_points_button.grid(row=2, column=2, pady=10, padx=15) def save_as_files(): filename = filedialog.asksaveasfilename( @@ -266,22 +222,15 @@ def save_as_files(): # Create button to select output file location save_as_button = ttk.Button(master, text="Save as...", command=save_as_files, width=10, style="PyAEDT.TButton") - save_as_button.grid(row=4, column=2, pady=10, padx=15) + save_as_button.grid(row=3, column=2, pady=10, padx=15) # Create button to export fields data - # In command put the workflow to export the data export_button = ttk.Button(master, text="Export", command=callback, width=10, style="PyAEDT.TButton") - export_button.grid(row=5, column=1, pady=10, padx=15) - - # Configure logging - text_area = tk.Text(master, wrap=tk.WORD, width=40, height=2) - text_area.grid(row=6, column=1, pady=10, sticky="nsew") - text_area.config(state=tk.DISABLED) - text_area.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) + export_button.grid(row=4, column=1, pady=10, padx=15) # Create buttons to create sphere and change theme color change_theme_button = ttk.Button(master, text="\u263D", width=2, command=toggle_theme, style="PyAEDT.TButton") - change_theme_button.grid(row=7, column=2, pady=10) + change_theme_button.grid(row=5, column=2, pady=10) # Get objects list selection tk.mainloop() @@ -326,13 +275,20 @@ def main(extension_args): objects_list = extension_args.get("objects_list", extension_arguments["objects_list"]) # Your workflow - # Check notes if not points_file: points_file = None elif not objects_list: objects_list = "AllObjects" + elif isinstance(objects_list, list) and len(objects_list) > 1: + objects_list = aedtapp.modeler.create_object_list(objects_list, f"ObjectList{len(aedtapp.modeler.user_lists)}") + + # CHECK NAMES OF QUANITITES + if export_option == "Ohmic loss": + quantity = "Ohmic-Loss" + else: + quantity = "SurfaceAcForceDensity" aedtapp.post.export_field_file( - quantity=export_option, output_file=export_file, sample_points=points_file, assignment=objects_list + quantity=quantity, output_file=export_file, sample_points_file=points_file, assignment=objects_list ) if not extension_args["is_test"]: # pragma: no cover From 32b6be18c5c95167b658d4799ab183a552717610 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Thu, 27 Feb 2025 08:50:14 +0100 Subject: [PATCH 11/17] improve workflow --- .../core/workflows/maxwell3d/transformer_loss_distribution.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 1a54e5038a5..f35f2644e58 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -114,6 +114,7 @@ def frontend(): export_options_lb.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) for opt in export_options_list: export_options_lb.insert(tk.END, opt) + export_options_lb.config(selectmode=tk.SINGLE) # Objects list frame = tk.Frame(master) @@ -247,7 +248,7 @@ def save_as_files(): "objects_list": objects_list, } - app.release_desktop(False, False) + # app.release_desktop(False, False) return output_dict From 8c90a6c1fbbe228948d9f31e763d6ea4a75e8614 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Thu, 27 Feb 2025 18:11:39 +0100 Subject: [PATCH 12/17] export options --- .../transformer_loss_distribution.py | 60 ++++++++++++++++--- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index f35f2644e58..df411fd6ab1 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -32,6 +32,7 @@ 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() version = get_aedt_version() @@ -76,6 +77,8 @@ def frontend(): # Configure the grid to expand with the window master.grid_rowconfigure(0, weight=1) master.grid_columnconfigure(0, weight=1) + master.grid_columnconfigure(1, weight=1) + master.grid_columnconfigure(2, weight=1) master.geometry() @@ -104,13 +107,15 @@ def frontend(): # Export options frame = tk.Frame(master) - frame.grid(row=0, column=0, columnspan=2, pady=10, padx=10) + frame.grid(row=0, column=0, columnspan=1, pady=10, padx=10) export_options_list = ["Ohmic loss", "AC Force Density"] export_options_label = ttk.Label( frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER ) export_options_label.pack(side=tk.TOP, fill=tk.BOTH) - export_options_lb = tk.Listbox(frame, selectmode=tk.SINGLE, height=2, width=15, justify=tk.CENTER) + export_options_lb = tk.Listbox( + frame, selectmode=tk.SINGLE, height=2, width=15, justify=tk.CENTER, exportselection=False + ) export_options_lb.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) for opt in export_options_list: export_options_lb.insert(tk.END, opt) @@ -118,7 +123,7 @@ def frontend(): # Objects list frame = tk.Frame(master) - frame.grid(row=0, column=1, columnspan=3, pady=10, padx=10) + frame.grid(row=0, column=1, pady=10, padx=10) objects_list = maxwell.modeler.objects_by_name objects_list_label = ttk.Label( frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER @@ -126,7 +131,9 @@ def frontend(): objects_list_label.pack(side=tk.TOP, fill=tk.BOTH) scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) - objects_list_lb = tk.Listbox(frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, justify=tk.CENTER) + objects_list_lb = tk.Listbox( + frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, justify=tk.CENTER, exportselection=False + ) objects_list_lb.pack(expand=True, fill=tk.BOTH, side=tk.RIGHT) for obj in objects_list: objects_list_lb.insert(tk.END, obj) @@ -187,7 +194,7 @@ def callback(): master.points_file = sample_points_entry.get("1.0", tk.END).strip() master.export_file = export_file_entry.get("1.0", tk.END).strip() selected_export = export_options_lb.curselection() - master.export_option = [objects_list_lb.get(i) for i in selected_export] + master.export_option = [export_options_lb.get(i) for i in selected_export] selected_objects = objects_list_lb.curselection() master.objects_list = [objects_list_lb.get(i) for i in selected_objects] master.destroy() @@ -279,19 +286,54 @@ def main(extension_args): if not points_file: points_file = None elif not objects_list: - objects_list = "AllObjects" + assignment = "AllObjects" elif isinstance(objects_list, list) and len(objects_list) > 1: - objects_list = aedtapp.modeler.create_object_list(objects_list, f"ObjectList{len(aedtapp.modeler.user_lists)}") + if len(aedtapp.modeler.user_lists) == 0: + objects_list = aedtapp.modeler.create_object_list(objects_list, "ObjectList1") + else: + objects_list = aedtapp.modeler.create_object_list( + objects_list, f"ObjectList{len(aedtapp.modeler.user_lists)+1}" + ) + assignment = objects_list.name - # CHECK NAMES OF QUANITITES if export_option == "Ohmic loss": quantity = "Ohmic-Loss" else: quantity = "SurfaceAcForceDensity" + aedtapp.post.export_field_file( - quantity=quantity, output_file=export_file, sample_points_file=points_file, assignment=objects_list + quantity=quantity, output_file=export_file, sample_points_file=points_file, assignment=assignment ) + # Populate PyVista object + plotter = ansys.aedt.core.visualization.plot.pyvista.ModelPlotter() + plotter.add_field_from_file(export_file) + plotter.populate_pyvista_object() + + file_name = Path(export_file).stem + file_path = str(Path(export_file).parent) + + field_coordinates = np.column_stack((np.array(plotter.pv.mesh.points), np.array(plotter.pv.mesh.active_scalars))) + + if Path(export_file).suffix == ".npy": + np.save(Path(file_path).joinpath(f"{file_name}.npy"), field_coordinates) + elif Path(export_file).suffix == ".csv": + np.savetxt( + Path(file_path).joinpath(f"{file_name}.csv"), + field_coordinates, + delimiter=",", + header="x,y,z,field", + comments="", + ) + elif Path(export_file).suffix == ".tab": + np.savetxt( + Path(file_path).joinpath(f"{file_name}.tab"), + field_coordinates, + delimiter=",", + header="x,y,z,field", + comments="", + ) + if not extension_args["is_test"]: # pragma: no cover app.release_desktop(False, False) return True From 2450d84d17bd07fd2bf77c5eae08171a4797dd30 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Fri, 28 Feb 2025 13:47:50 +0100 Subject: [PATCH 13/17] new UI --- .../transformer_loss_distribution.py | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index df411fd6ab1..03c11e8158a 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -106,8 +106,8 @@ def frontend(): master.configure(bg=theme.light["widget_bg"]) # Export options - frame = tk.Frame(master) - frame.grid(row=0, column=0, columnspan=1, pady=10, padx=10) + frame = tk.Frame(master, width=20) + frame.grid(row=0, column=0, pady=10, padx=10, sticky="ew") export_options_list = ["Ohmic loss", "AC Force Density"] export_options_label = ttk.Label( frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER @@ -122,8 +122,8 @@ def frontend(): export_options_lb.config(selectmode=tk.SINGLE) # Objects list - frame = tk.Frame(master) - frame.grid(row=0, column=1, pady=10, padx=10) + frame = tk.Frame(master, width=20) + frame.grid(row=1, column=0, pady=10, padx=10, sticky="ew") objects_list = maxwell.modeler.objects_by_name objects_list_label = ttk.Label( frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER @@ -137,21 +137,21 @@ def frontend(): objects_list_lb.pack(expand=True, fill=tk.BOTH, side=tk.RIGHT) for obj in objects_list: objects_list_lb.insert(tk.END, obj) - objects_list_lb.config(height=6, width=30) + objects_list_lb.config(height=6) scroll_bar.config(command=objects_list_lb.yview) # Sample points file sample_points_label = ttk.Label(master, text="Sample points file:", width=20, style="PyAEDT.TLabel") sample_points_label.grid(row=2, column=0, pady=10) - sample_points_entry = tk.Text(master, width=40, height=1) - sample_points_entry.grid(row=2, column=1, pady=15, padx=10) + sample_points_entry = tk.Text(master, height=1, width=40) + sample_points_entry.grid(row=3, column=0, pady=15, padx=10) sample_points_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Export file export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") - export_file_label.grid(row=3, column=0, pady=10) + export_file_label.grid(row=4, column=0, pady=10) export_file_entry = tk.Text(master, width=40, height=1) - export_file_entry.grid(row=3, column=1, pady=15, padx=10) + export_file_entry.grid(row=5, column=0, pady=15, padx=10) export_file_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) def toggle_theme(): @@ -211,7 +211,7 @@ def browse_files(): # Export points file button export_points_button = ttk.Button(master, text="...", command=browse_files, width=10, style="PyAEDT.TButton") - export_points_button.grid(row=2, column=2, pady=10, padx=15) + export_points_button.grid(row=3, column=1, pady=10, padx=15) def save_as_files(): filename = filedialog.asksaveasfilename( @@ -230,15 +230,15 @@ def save_as_files(): # Create button to select output file location save_as_button = ttk.Button(master, text="Save as...", command=save_as_files, width=10, style="PyAEDT.TButton") - save_as_button.grid(row=3, column=2, pady=10, padx=15) + save_as_button.grid(row=5, column=1, pady=10, padx=15) # Create button to export fields data export_button = ttk.Button(master, text="Export", command=callback, width=10, style="PyAEDT.TButton") - export_button.grid(row=4, column=1, pady=10, padx=15) + export_button.grid(row=6, column=0, pady=10, padx=15) # Create buttons to create sphere and change theme color change_theme_button = ttk.Button(master, text="\u263D", width=2, command=toggle_theme, style="PyAEDT.TButton") - change_theme_button.grid(row=5, column=2, pady=10) + change_theme_button.grid(row=6, column=1, pady=10) # Get objects list selection tk.mainloop() @@ -298,8 +298,10 @@ def main(extension_args): if export_option == "Ohmic loss": quantity = "Ohmic-Loss" + file_header = "x,y,z,field" else: quantity = "SurfaceAcForceDensity" + file_header = "r", "phi", "z", "fr_real", "fr_imag", "fphi_real", "fphi_imag", "fz_real", "fz_imag" aedtapp.post.export_field_file( quantity=quantity, output_file=export_file, sample_points_file=points_file, assignment=assignment @@ -322,7 +324,7 @@ def main(extension_args): Path(file_path).joinpath(f"{file_name}.csv"), field_coordinates, delimiter=",", - header="x,y,z,field", + header=file_header, comments="", ) elif Path(export_file).suffix == ".tab": @@ -330,7 +332,7 @@ def main(extension_args): Path(file_path).joinpath(f"{file_name}.tab"), field_coordinates, delimiter=",", - header="x,y,z,field", + header=file_header, comments="", ) From 416438b1cd4f57dfc03ee6b24ad83b7781406a24 Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Fri, 28 Feb 2025 16:12:24 +0100 Subject: [PATCH 14/17] update .toml --- .../aedt/core/workflows/maxwell3d/toolkits_catalog.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/toolkits_catalog.toml b/src/ansys/aedt/core/workflows/maxwell3d/toolkits_catalog.toml index ac0264e3b95..df175cdfa8e 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/toolkits_catalog.toml +++ b/src/ansys/aedt/core/workflows/maxwell3d/toolkits_catalog.toml @@ -5,3 +5,10 @@ icon = "images/large/magnet_segmentation.png" template = "run_pyaedt_toolkit_script" pip = "ansys-magnet-segmentation-toolkit" package = "ansys-magnet-segmentation-toolkit" + +[LossDistribution] +name = "Export of loss distribution" +script = "transfomer_loss_distribution.py" +icon = "" +template = "run_pyaedt_toolkit_script" +pip = "" From 326ecdcf30f6fd681bfd5fb7e0e63718a065a68c Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Tue, 4 Mar 2025 10:56:46 +0100 Subject: [PATCH 15/17] fix style --- .../transformer_loss_distribution.py | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 03c11e8158a..4b86571ff41 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -21,8 +21,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# Extension template to help get started - from pathlib import Path import ansys.aedt.core @@ -110,7 +108,7 @@ def frontend(): frame.grid(row=0, column=0, pady=10, padx=10, sticky="ew") export_options_list = ["Ohmic loss", "AC Force Density"] export_options_label = ttk.Label( - frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER + frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" ) export_options_label.pack(side=tk.TOP, fill=tk.BOTH) export_options_lb = tk.Listbox( @@ -126,7 +124,7 @@ def frontend(): frame.grid(row=1, column=0, pady=10, padx=10, sticky="ew") objects_list = maxwell.modeler.objects_by_name objects_list_label = ttk.Label( - frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor=tk.CENTER + frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" ) objects_list_label.pack(side=tk.TOP, fill=tk.BOTH) scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) @@ -141,17 +139,25 @@ def frontend(): scroll_bar.config(command=objects_list_lb.yview) # Sample points file - sample_points_label = ttk.Label(master, text="Sample points file:", width=20, style="PyAEDT.TLabel") - sample_points_label.grid(row=2, column=0, pady=10) - sample_points_entry = tk.Text(master, height=1, width=40) - sample_points_entry.grid(row=3, column=0, pady=15, padx=10) + sample_points_frame = tk.Frame(master, width=20) + sample_points_frame.grid(row=2, column=0, pady=10, padx=10, sticky="ew") + sample_points_label = ttk.Label( + sample_points_frame, text="Sample points file:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" + ) + sample_points_label.pack(side=tk.TOP, fill=tk.BOTH) + sample_points_entry = tk.Text(sample_points_frame, height=1, width=40) + sample_points_entry.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) sample_points_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) # Export file - export_file_label = ttk.Label(master, text="Output file location:", width=20, style="PyAEDT.TLabel") - export_file_label.grid(row=4, column=0, pady=10) - export_file_entry = tk.Text(master, width=40, height=1) - export_file_entry.grid(row=5, column=0, pady=15, padx=10) + export_file_frame = tk.Frame(master, width=20) + export_file_frame.grid(row=3, column=0, pady=10, padx=10, sticky="ew") + export_file_label = ttk.Label( + export_file_frame, text="Output file location:", width=20, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" + ) + export_file_label.pack(side=tk.TOP, fill=tk.BOTH) + export_file_entry = tk.Text(export_file_frame, width=40, height=1) + export_file_entry.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) export_file_entry.configure(bg=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font) def toggle_theme(): @@ -210,8 +216,10 @@ def browse_files(): master.destroy() # Export points file button - export_points_button = ttk.Button(master, text="...", command=browse_files, width=10, style="PyAEDT.TButton") - export_points_button.grid(row=3, column=1, pady=10, padx=15) + export_points_button = ttk.Button( + sample_points_frame, text="...", command=browse_files, width=10, style="PyAEDT.TButton" + ) + export_points_button.pack(side=tk.RIGHT, padx=10) def save_as_files(): filename = filedialog.asksaveasfilename( @@ -229,8 +237,10 @@ def save_as_files(): # master.destroy() # Create button to select output file location - save_as_button = ttk.Button(master, text="Save as...", command=save_as_files, width=10, style="PyAEDT.TButton") - save_as_button.grid(row=5, column=1, pady=10, padx=15) + save_as_button = ttk.Button( + export_file_frame, text="Save as...", command=save_as_files, width=10, style="PyAEDT.TButton" + ) + save_as_button.pack(side=tk.RIGHT, padx=10) # Create button to export fields data export_button = ttk.Button(master, text="Export", command=callback, width=10, style="PyAEDT.TButton") @@ -255,7 +265,7 @@ def save_as_files(): "objects_list": objects_list, } - # app.release_desktop(False, False) + app.release_desktop(False, False) return output_dict From ec08e87c58546bd689c48745b1e9541ddfa0407e Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Thu, 6 Mar 2025 18:15:03 +0100 Subject: [PATCH 16/17] improve UI and workflow + fix template --- .../transformer_loss_distribution.py | 118 ++++++++++++------ .../templates/template_get_started.py | 18 +-- 2 files changed, 93 insertions(+), 43 deletions(-) diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 4b86571ff41..304e13c73a0 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -38,7 +38,13 @@ is_student = is_student() # Extension batch arguments -extension_arguments = {"points_file": "", "export_file": "", "export_option": "Ohmic loss", "objects_list": []} +extension_arguments = { + "points_file": "", + "export_file": "", + "export_option": "Ohmic loss", + "objects_list": [], + "solution_option": "", +} extension_description = "Export of transformer loss distribution" @@ -104,15 +110,15 @@ def frontend(): master.configure(bg=theme.light["widget_bg"]) # Export options - frame = tk.Frame(master, width=20) - frame.grid(row=0, column=0, pady=10, padx=10, sticky="ew") + export_options_frame = tk.Frame(master, width=20) + export_options_frame.grid(row=0, column=0, pady=10, padx=10, sticky="ew") export_options_list = ["Ohmic loss", "AC Force Density"] export_options_label = ttk.Label( - frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" + export_options_frame, text="Export options:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" ) export_options_label.pack(side=tk.TOP, fill=tk.BOTH) export_options_lb = tk.Listbox( - frame, selectmode=tk.SINGLE, height=2, width=15, justify=tk.CENTER, exportselection=False + export_options_frame, selectmode=tk.SINGLE, height=2, width=15, justify=tk.CENTER, exportselection=False ) export_options_lb.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) for opt in export_options_list: @@ -120,27 +126,43 @@ def frontend(): export_options_lb.config(selectmode=tk.SINGLE) # Objects list - frame = tk.Frame(master, width=20) - frame.grid(row=1, column=0, pady=10, padx=10, sticky="ew") + objects_list_frame = tk.Frame(master, width=20) + objects_list_frame.grid(row=1, column=0, pady=10, padx=10, sticky="ew") objects_list = maxwell.modeler.objects_by_name + # Determine the height of the ListBox + listbox_height = min(len(objects_list), 6) objects_list_label = ttk.Label( - frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" + objects_list_frame, text="Objects list:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" ) objects_list_label.pack(side=tk.TOP, fill=tk.BOTH) - scroll_bar = tk.Scrollbar(frame, orient=tk.VERTICAL) - scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) objects_list_lb = tk.Listbox( - frame, selectmode=tk.MULTIPLE, yscrollcommand=scroll_bar.set, justify=tk.CENTER, exportselection=False + objects_list_frame, selectmode=tk.MULTIPLE, justify=tk.CENTER, exportselection=False, height=listbox_height ) - objects_list_lb.pack(expand=True, fill=tk.BOTH, side=tk.RIGHT) + objects_list_lb.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) + if len(objects_list) > 6: + scroll_bar = tk.Scrollbar(objects_list_frame, orient=tk.VERTICAL, command=objects_list_lb.yview) + scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) + objects_list_lb.config(yscrollcommand=scroll_bar.set, height=listbox_height) for obj in objects_list: objects_list_lb.insert(tk.END, obj) - objects_list_lb.config(height=6) - scroll_bar.config(command=objects_list_lb.yview) + + # Solution + solution_frame = tk.Frame(master, width=20) + solution_frame.grid(row=2, column=0, pady=10, padx=10, sticky="ew") + solution_frame.config(bg="white") + solution_label = ttk.Label(solution_frame, text="Solution:", style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w") + solution_label.pack(side=tk.LEFT, fill=tk.BOTH) + selected_value = tk.StringVar(solution_frame) + selected_value.set(maxwell.existing_analysis_sweeps[0]) + solution_options = maxwell.existing_analysis_sweeps + solution_dropdown = tk.OptionMenu(solution_frame, selected_value, *solution_options) + solution_dropdown.config(bg="white", fg="black") + solution_dropdown.pack(pady=20) # Sample points file sample_points_frame = tk.Frame(master, width=20) - sample_points_frame.grid(row=2, column=0, pady=10, padx=10, sticky="ew") + sample_points_frame.grid(row=3, column=0, pady=10, padx=10, sticky="ew") + sample_points_frame.config(bg="white") sample_points_label = ttk.Label( sample_points_frame, text="Sample points file:", width=15, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" ) @@ -151,7 +173,8 @@ def frontend(): # Export file export_file_frame = tk.Frame(master, width=20) - export_file_frame.grid(row=3, column=0, pady=10, padx=10, sticky="ew") + export_file_frame.grid(row=4, column=0, pady=10, padx=10, sticky="ew") + export_file_frame.config(bg="white") export_file_label = ttk.Label( export_file_frame, text="Output file location:", width=20, style="PyAEDT.TLabel", justify=tk.CENTER, anchor="w" ) @@ -170,6 +193,11 @@ def toggle_theme(): def set_light_theme(): master.configure(bg=theme.light["widget_bg"]) + export_options_frame.configure(bg=theme.light["widget_bg"]) + objects_list_frame.configure(bg=theme.light["widget_bg"]) + solution_frame.configure(bg=theme.light["widget_bg"]) + sample_points_frame.configure(bg=theme.light["widget_bg"]) + export_file_frame.configure(bg=theme.light["widget_bg"]) export_options_lb.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) @@ -177,6 +205,7 @@ def set_light_theme(): background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) scroll_bar.configure(background=theme.light["pane_bg"]) + solution_dropdown.configure(background=theme.light["pane_bg"], foreground=theme.light["text"]) export_file_entry.configure( background=theme.light["pane_bg"], foreground=theme.light["text"], font=theme.default_font ) @@ -188,15 +217,22 @@ def set_light_theme(): def set_dark_theme(): master.configure(bg=theme.dark["widget_bg"]) + export_options_frame.configure(bg=theme.dark["widget_bg"]) + objects_list_frame.configure(bg=theme.dark["widget_bg"]) + solution_frame.configure(bg=theme.dark["widget_bg"]) + sample_points_frame.configure(bg=theme.dark["widget_bg"]) + export_file_frame.configure(bg=theme.dark["widget_bg"]) export_options_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) objects_list_lb.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) scroll_bar.configure(bg=theme.dark["pane_bg"]) + solution_dropdown.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"]) export_file_entry.configure(bg=theme.dark["pane_bg"], foreground=theme.dark["text"], font=theme.default_font) sample_points_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.flag = True master.points_file = sample_points_entry.get("1.0", tk.END).strip() master.export_file = export_file_entry.get("1.0", tk.END).strip() selected_export = export_options_lb.curselection() @@ -246,9 +282,9 @@ def save_as_files(): export_button = ttk.Button(master, text="Export", command=callback, width=10, style="PyAEDT.TButton") export_button.grid(row=6, column=0, pady=10, padx=15) - # Create buttons to create sphere and change theme color + # Create buttons to change theme color change_theme_button = ttk.Button(master, text="\u263D", width=2, command=toggle_theme, style="PyAEDT.TButton") - change_theme_button.grid(row=6, column=1, pady=10) + change_theme_button.grid(row=6, column=1, pady=10, padx=15) # Get objects list selection tk.mainloop() @@ -257,16 +293,19 @@ def save_as_files(): export_file = getattr(master, "export_file", extension_arguments["export_file"]) export_option = getattr(master, "export_option", extension_arguments["export_option"]) objects_list = getattr(master, "objects_list", extension_arguments["objects_list"]) - - output_dict = { - "points_file": points_file, - "export_file": export_file, - "export_option": export_option, - "objects_list": objects_list, - } + solution_option = getattr(master, "solution_option", extension_arguments["solution_option"]) app.release_desktop(False, False) + output_dict = {} + if master.flag: + output_dict = { + "points_file": points_file, + "export_file": export_file, + "export_option": export_option, + "objects_list": objects_list, + "solution_option": solution_option, + } return output_dict @@ -289,13 +328,14 @@ def main(extension_args): points_file = extension_args.get("points_file", extension_arguments["points_file"]) export_file = extension_args.get("export_file", extension_arguments["export_file"]) - export_option = extension_args.get("export_option", extension_arguments["export_option"]) + export_option = extension_args.get("export_option", extension_arguments["export_option"])[0] objects_list = extension_args.get("objects_list", extension_arguments["objects_list"]) + solution_option = extension_args.get("solution_option", extension_arguments["solution_option"]) # Your workflow if not points_file: points_file = None - elif not objects_list: + if not objects_list: assignment = "AllObjects" elif isinstance(objects_list, list) and len(objects_list) > 1: if len(aedtapp.modeler.user_lists) == 0: @@ -305,6 +345,8 @@ def main(extension_args): objects_list, f"ObjectList{len(aedtapp.modeler.user_lists)+1}" ) assignment = objects_list.name + else: + assignment = objects_list[0] if export_option == "Ohmic loss": quantity = "Ohmic-Loss" @@ -313,25 +355,31 @@ def main(extension_args): quantity = "SurfaceAcForceDensity" file_header = "r", "phi", "z", "fr_real", "fr_imag", "fphi_real", "fphi_imag", "fz_real", "fz_imag" + setup_name = aedtapp.existing_analysis_sweeps[0].split(":")[0].strip() + is_solved = [s.is_solved for s in aedtapp.setups if s.name == setup_name][0] + if not is_solved: + aedtapp.logger.error("The setup is not solved. Please solve the setup before exporting the field data.") + field_path = str(Path(export_file).with_suffix(".fld")) aedtapp.post.export_field_file( - quantity=quantity, output_file=export_file, sample_points_file=points_file, assignment=assignment + quantity=quantity, + solution=solution_option, + output_file=field_path, + sample_points_file=points_file, + assignment=assignment, ) # Populate PyVista object plotter = ansys.aedt.core.visualization.plot.pyvista.ModelPlotter() - plotter.add_field_from_file(export_file) + plotter.add_field_from_file(field_path) plotter.populate_pyvista_object() - file_name = Path(export_file).stem - file_path = str(Path(export_file).parent) - field_coordinates = np.column_stack((np.array(plotter.pv.mesh.points), np.array(plotter.pv.mesh.active_scalars))) if Path(export_file).suffix == ".npy": - np.save(Path(file_path).joinpath(f"{file_name}.npy"), field_coordinates) + np.save(export_file, field_coordinates) elif Path(export_file).suffix == ".csv": np.savetxt( - Path(file_path).joinpath(f"{file_name}.csv"), + export_file, field_coordinates, delimiter=",", header=file_header, @@ -339,7 +387,7 @@ def main(extension_args): ) elif Path(export_file).suffix == ".tab": np.savetxt( - Path(file_path).joinpath(f"{file_name}.tab"), + export_file, field_coordinates, delimiter=",", header=file_header, 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 dc6504bce03..14468744824 100644 --- a/src/ansys/aedt/core/workflows/templates/template_get_started.py +++ b/src/ansys/aedt/core/workflows/templates/template_get_started.py @@ -180,6 +180,7 @@ def set_dark_theme(): change_theme_button.config(text="\u2600") def callback(): + master.flag = True 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() @@ -214,16 +215,17 @@ def browse_files(): 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, - } - app.release_desktop(False, False) + output_dict = {} + if master.flag: + output_dict = { + "origin_x": origin_x, + "origin_y": origin_y, + "origin_z": origin_z, + "radius": radius, + "file_path": file_path, + } return output_dict From b0e29dec4b201f2c1c27a53e06884336125d569e Mon Sep 17 00:00:00 2001 From: Giulia Malinverno Date: Fri, 7 Mar 2025 16:17:23 +0100 Subject: [PATCH 17/17] fixes --- src/ansys/aedt/core/modules/solve_setup.py | 2 +- src/ansys/aedt/core/visualization/plot/pyvista.py | 3 ++- .../core/workflows/maxwell3d/transformer_loss_distribution.py | 3 ++- tests/system/general/test_12_1_PostProcessing.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ansys/aedt/core/modules/solve_setup.py b/src/ansys/aedt/core/modules/solve_setup.py index 037fe658e2d..a5673ea9448 100644 --- a/src/ansys/aedt/core/modules/solve_setup.py +++ b/src/ansys/aedt/core/modules/solve_setup.py @@ -189,7 +189,7 @@ def default_intrinsics(self): else: intrinsics[i] = "All" elif i == "Phase": - intrinsics[i] = "All" + intrinsics[i] = "0deg" elif i == "Time": intrinsics[i] = "All" return intrinsics diff --git a/src/ansys/aedt/core/visualization/plot/pyvista.py b/src/ansys/aedt/core/visualization/plot/pyvista.py index 68f91c0e3a8..ad17bd0579c 100644 --- a/src/ansys/aedt/core/visualization/plot/pyvista.py +++ b/src/ansys/aedt/core/visualization/plot/pyvista.py @@ -1093,6 +1093,7 @@ def _read_mesh_files(self, read_frames=False): conv = 1 vertices = np.array(nodes) * conv filedata = pv.PolyData(vertices) + field._cached_polydata = filedata if is_vector: vector_scale = (max(filedata.bounds) - min(filedata.bounds)) / ( 20 * (np.vstack(values).max() - np.vstack(values).min()) @@ -1106,7 +1107,7 @@ def _read_mesh_files(self, read_frames=False): filedata = filedata.delaunay_2d(tol=field.surface_mapping_tolerance) filedata.point_data[field.label] = np.array(values) field.scalar_name = filedata.point_data.active_scalars_name - field._cached_polydata = filedata + # field._cached_polydata = filedata @pyaedt_function_handler() def _add_buttons(self): diff --git a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py index 304e13c73a0..d7f16870f4b 100644 --- a/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py +++ b/src/ansys/aedt/core/workflows/maxwell3d/transformer_loss_distribution.py @@ -239,6 +239,7 @@ def callback(): master.export_option = [export_options_lb.get(i) for i in selected_export] selected_objects = objects_list_lb.curselection() master.objects_list = [objects_list_lb.get(i) for i in selected_objects] + master.solution_option = selected_value.get() master.destroy() def browse_files(): @@ -389,7 +390,7 @@ def main(extension_args): np.savetxt( export_file, field_coordinates, - delimiter=",", + delimiter="\t", header=file_header, comments="", ) diff --git a/tests/system/general/test_12_1_PostProcessing.py b/tests/system/general/test_12_1_PostProcessing.py index 8d2e015c110..7c34d29d759 100644 --- a/tests/system/general/test_12_1_PostProcessing.py +++ b/tests/system/general/test_12_1_PostProcessing.py @@ -630,7 +630,7 @@ def test_14B_Field_Ploton_Vector(self, aedtapp, local_scratch): intrinsics=intrinsic, mesh_on_fields=False, view="isometric", - show=False, + show=True, export_path=local_scratch.path, image_format="jpg", )