From d38160c8dcf053cfec3d738fae6744b78240e9af Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Tue, 28 Jan 2025 16:53:39 +0100 Subject: [PATCH 01/25] FEAT: new extension --- .../workflows/project/toolkits_catalog.toml | 7 + .../core/workflows/project/version_manager.py | 520 ++++++++++++++++++ 2 files changed, 527 insertions(+) create mode 100644 src/ansys/aedt/core/workflows/project/version_manager.py diff --git a/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml b/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml index 8a77bd4ac81..0e75e302de1 100644 --- a/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml +++ b/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml @@ -25,3 +25,10 @@ script = "advanced_fields_calculator.py" icon = "images/large/fields.png" template = "run_pyaedt_toolkit_script" pip = "" + +[VersionManager] +name = "Version Manager" +script = "version_manager.py" +icon = "" +template = "run_pyaedt_toolkit_script" +pip = "" \ No newline at end of file diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py new file mode 100644 index 00000000000..59609a3a5de --- /dev/null +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -0,0 +1,520 @@ +# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +VERSION = "0.3.0" + +import os +import sys +import platform +import shutil +import tkinter as tk +import webbrowser +import zipfile +import subprocess +import xml.etree.ElementTree as ET + +from pathlib import Path +from tkinter import messagebox, filedialog, ttk + +import ansys.aedt.core as pyaedt +import requests +import pyedb + +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.customize_automation_tab import add_script_to_menu +from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits + +DISCLAIMER = ( + "This script will download and install certain third-party software and/or " + "open-source software (collectively, 'Third-Party Software'). Such Third-Party " + "Software is subject to separate terms and conditions and not the terms of your " + "Ansys software license agreement. Ansys does not warrant or support such " + "Third-Party Software.\n" + "Do you want to proceed ?" +) + + +def is_git_installed(): + try: + # Run the command `git --version` + result = subprocess.run(["git", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + + # Check if the command ran successfully + if result.returncode == 0: + print(f"Git is installed: {result.stdout.strip()}") + return True + else: + print("Git is not installed.") + return False + except FileNotFoundError: + print("Git is not installed.") + return False + + +def get_latest_version(package_name): + response = requests.get(f"https://pypi.org/pypi/{package_name}/json") + if response.status_code == 200: + data = response.json() + return data["info"]["version"] + else: + return "Unknown" + + +class VersionManager: + TITLE = "Version Manager {}".format(VERSION) + USER_GUIDE = "https://github.com/ansys-internal/pyaedt_version_manager" + UI_WIDTH = 800 + UI_HEIGHT = 400 + + @property + def venv_path(self): + return sys.prefix + + @property + def python_exe(self): + return os.path.join(self.venv_path, "Scripts", "python.exe") + + @property + def python_version(self): + temp = platform.python_version().split(".")[0:2] + return ".".join(temp) + + @property + def pyaedt_version(self): + return pyaedt.version + + @property + def pyedb_version(self): + return pyedb.version + + def __init__(self, ui, desktop, aedt_version, personal_lib): + self.desktop = desktop + self.aedt_version = aedt_version + self.personal_lib = personal_lib + + style = ttk.Style() + + # Define the custom style for TLabel (ttk.Label) + style.configure("TLabel", + font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold + foreground="darkblue", # Text color + background="lightyellow", # Background color + padding=(10, 5), # Padding inside the label + anchor="w") + + self.venv_information = tk.StringVar() + self.pyaedt_info = tk.StringVar() + self.pyedb_info = tk.StringVar() + self.venv_information.set("Venv Information") + + self.pyaedt_branch_name = tk.StringVar() + self.pyaedt_branch_name.set("main") + self.pyedb_branch_name = tk.StringVar() + self.pyedb_branch_name.set("main") + + self.ini_file_path = os.path.join(os.path.dirname(__file__), "settings.ini") + + self.root = ui + self.root.title(self.TITLE) + self.root.geometry(f"{self.UI_WIDTH}x{self.UI_HEIGHT}") + + notebook = ttk.Notebook(self.root) + notebook.pack(fill="both", expand=True, padx=10, pady=10) + + tab_basic = ttk.Frame(notebook) + tab_advanced = ttk.Frame(notebook) + tab_extensions = ttk.Frame(notebook) + + notebook.add(tab_basic, text="Basic") + notebook.add(tab_advanced, text="Advanced") + # notebook.add(tab_extensions, text="Extensions") + + self.create_file_menu() + self.create_ui_basic(tab_basic) + self.create_ui_advanced(tab_advanced) + self.create_ui_extensions(tab_extensions) + + self.clicked_refresh() + + def create_file_menu(self): + menu_bar = tk.Menu(root) + help_menu = tk.Menu(menu_bar, tearoff=0) + help_menu.add_command(label="User Guide", command=lambda: webbrowser.open(self.USER_GUIDE)) + menu_bar.add_cascade(label="Help", menu=help_menu) + self.root.config(menu=menu_bar) + + def create_ui_basic(self, parent): + def create_ui_wheelhouse(frame): + buttons = [ + ["Update from wheelhouse", self.update_from_wheelhouse], + ["Update extensions", self.update_extensions] + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=40, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + + def create_ui_pyaedt(frame): + label = ttk.Label(frame, textvariable=self.pyaedt_info, width=30, style="TLabel") + label.pack(side="left") + + buttons = [ + ["Update", self.update_pyaedt], + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=20, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + + def create_ui_pyedb(frame): + label = ttk.Label(frame, textvariable=self.pyedb_info, width=30, style="TLabel") + label.pack(side="left") + + buttons = [ + ["Update", self.update_pyedb], + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=20, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + + def create_ui_info(frame): + label = ttk.Label(frame, textvariable=self.venv_information, style="TLabel") + label.pack(anchor="w") + + frame0 = tk.Frame(parent) + frame1 = tk.Frame(parent) + frame2 = tk.Frame(parent) + frame3 = tk.Frame(parent) + + frame0.pack(padx=5, pady=5) + frame1.pack(padx=5, pady=5) + frame2.pack(side="top", padx=5, pady=5) + frame3.pack(side="top", padx=20, pady=20, fill="x") + + create_ui_pyaedt(frame0) + create_ui_pyedb(frame1) + create_ui_wheelhouse(frame2) + create_ui_info(frame3) + + def create_ui_advanced(self, parent): + def create_ui_pyaedt(frame): + label = ttk.Label(frame, text="PyAEDT", width=10, style="TLabel") + label.pack(side="left") + + buttons = [ + ["Get Branch", self.get_pyaedt_branch], + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=20, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + entry = tk.Entry(frame, width=30, textvariable=self.pyaedt_branch_name) + entry.pack(side="left") + + def create_ui_pyedb(frame): + label = ttk.Label(frame, text="PyEDB", width=10, style="TLabel") + label.pack(side="left") + + buttons = [ + ["Get Branch", self.get_pyedb_branch], + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=20, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + entry = tk.Entry(frame, width=30, textvariable=self.pyedb_branch_name) + entry.pack(side="left") + + def create_ui_pyaedt_buttons(frame): + buttons = [ + ["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt] + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=40, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + + frame0 = tk.Frame(parent) + frame1 = tk.Frame(parent) + frame2 = tk.Frame(parent) + + frame0.pack(padx=5, pady=5) + frame1.pack(padx=5, pady=5) + frame2.pack(padx=5, pady=5) + + create_ui_pyaedt(frame0) + create_ui_pyedb(frame1) + create_ui_pyaedt_buttons(frame2) + + def create_ui_extensions(self, parent): + frame = tk.Frame(parent) + frame.pack(padx=5, pady=5) + + buttons = [ + ["Update Configure Layout", self.update_extensions], + ] + for text, cmd in buttons: + button = tk.Button(frame, text=text, width=20, height=2, command=cmd) + button.pack(side="left", padx=10, pady=10) + + def update_extensions(self): + response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") + if response == 'yes': + toolkits_path = Path(self.personal_lib, "Toolkits") + temp = [] + for product in toolkits_path.iterdir(): + if not product.is_dir(): + continue + xml_file = product / "TabConfig.xml" + if xml_file.exists(): + tree = ET.parse(xml_file) + root = tree.getroot() + panel_label = "Panel_PyAEDT_Extensions" + for panel in root.findall("panel"): + if panel.get("label") == panel_label: + for button in panel.findall("button"): + name = button.get("label") + temp.append([product, name]) + + atk = available_toolkits() + msg = ["Below extensions are updated.", ""] + for product, name in temp: + product_name = product.stem + if product_name not in atk: + continue + for i, j in atk[product_name].items(): + extension_dir = product / name + if j["name"] == name: + shutil.rmtree(extension_dir, ignore_errors=True) + + workflow_dir = Path(pyaedt.workflows.__file__).parent + + add_script_to_menu( + name=name, + script_file=str(workflow_dir / product_name.lower() / j["script"]), + icon_file=str(workflow_dir / product_name.lower() / j["icon"]), + product=product_name, + template_file=j.get("template", "run_pyaedt_toolkit_script"), + copy_to_personal_lib=True, + executable_interpreter=self.python_exe, + personal_lib=self.personal_lib, + aedt_version=self.aedt_version, + ) + msg.append(f"{product_name} {name}") + messagebox.showinfo("Message", "\n".join(msg)) + + def update_pyaedt(self): + response = messagebox.askquestion("Disclaimer", DISCLAIMER) + + if response == 'yes': + url = f"https://pypi.org/pypi/pyaedt/json" + response = requests.get(url) + + if response.status_code == 200: + data = response.json() + released_version = data["info"]["version"] + else: + released_version = 0 + + if self.pyaedt_version > released_version: + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) + else: + subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) + + self.clicked_refresh(need_restart=True) + + def get_pyaedt_branch(self): + if not is_git_installed(): + messagebox.showinfo("Git is not installed") + return + + response = messagebox.askquestion("Disclaimer", DISCLAIMER) + + if response == 'yes': + branch_name = self.pyaedt_branch_name.get() + subprocess.run( + [self.python_exe, "-m", "pip", "install", + #"--force-reinstall", + f"git+https://github.com/ansys/pyaedt.git@{branch_name}"], + check=True) + self.clicked_refresh(need_restart=True) + + def get_pyedb_branch(self): + if not is_git_installed(): + messagebox.showinfo("Git is not installed") + return + + response = messagebox.askquestion("Disclaimer", DISCLAIMER) + + if response == 'yes': + branch_name = self.pyedb_branch_name.get() + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyedb.git@{branch_name}"], + check=True) + self.clicked_refresh(need_restart=True) + + def update_pyedb(self): + response = messagebox.askquestion("Disclaimer", DISCLAIMER) + if response == 'yes': + url = f"https://pypi.org/pypi/pyedb/json" + response = requests.get(url) + + if response.status_code == 200: + data = response.json() + released_version = data["info"]["version"] + else: + released_version = 0 + + if self.pyedb_version > released_version: + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) + else: + subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) + + self.clicked_refresh(need_restart=True) + + def update_from_wheelhouse(self): + file_selected = filedialog.askopenfilename(title="Select Wheelhouse") + + if file_selected: + fpath = Path(file_selected) + file_name = fpath.stem + _, wh_pyaedt_version, wh_pkg_type, _, _, _, wh_python_version = file_name.split("-") + + msg = [] + correct_wheelhouse = file_name + # Check Python version + if not wh_python_version == self.python_version: + msg.extend([ + f"Wrong Python version", + f"Wheelhouse: {wh_python_version}", + f"Expected version: {self.python_version}", + ]) + correct_wheelhouse = correct_wheelhouse.replace(wh_python_version, self.python_version) + + if wh_pkg_type != "installer": + correct_wheelhouse = correct_wheelhouse.replace(f'-{wh_pkg_type}-', '-installer-') + msg.extend([ + "", + f"This wheelhouse doesn't contain required packages to add PyAEDT buttons." + ]) + + if msg is not []: + msg.extend(["", + f"Please download {correct_wheelhouse}."]) + msg = "\n".join(msg) + messagebox.showerror("Confirm Action", msg) + return + + # Check wheelhouse type + + unzipped_path = fpath.parent / fpath.stem + if unzipped_path.exists(): + shutil.rmtree(unzipped_path, ignore_errors=True) + with zipfile.ZipFile(fpath, "r") as zip_ref: + # Extract all contents to a directory. (You can specify a different extraction path if needed.) + zip_ref.extractall(unzipped_path) + + subprocess.run( + [self.python_exe, "-m", "pip", "install", "--no-cache-dir", "--no-index", + f"--find-links=file:///{str(unzipped_path)}", + "pyaedt[installer]"], check=True) + self.clicked_refresh(need_restart=True) + + def reset_pyaedt_buttons_in_aedt(self): + def handle_remove_error(func, path, exc_info): + # Attempt to fix permission issues + import stat + os.chmod(path, stat.S_IWRITE) # Add write permission + func(path) # Retry the operation + + response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") + + if response == 'yes': + toolkit_path = os.path.join(self.personal_lib, "Toolkits") + + if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): + msg = [ + f"Toolkits path {toolkit_path} already exists.", + "Are you sure you want to reset toolkits?" + ] + msg = "\n".join(msg) + response = messagebox.askquestion("Confirm Action", msg) + if response == 'yes': + shutil.rmtree(toolkit_path, onerror=handle_remove_error) + else: + return + + from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt + try: + add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) + messagebox.showinfo("Success", "PyAEDT buttons added in AEDT.") + except subprocess.CalledProcessError as e: + messagebox.showerror("Error", f"Error adding buttons to AEDT: {e}") + + def clicked_refresh(self, need_restart=False): + msg = [ + f"Venv path: {self.venv_path}", + f"Python version: {self.python_version}" + ] + msg = "\n".join(msg) + self.venv_information.set(msg) + + if need_restart is False: + self.pyaedt_info.set(f"PyAEDT: {self.pyaedt_version} (Latest {get_latest_version('pyaedt')})") + self.pyedb_info.set(f"PyEDB: {self.pyedb_version} (Latest {get_latest_version('pyedb')})") + # messagebox.showinfo("Success", msg) + else: + self.pyaedt_info.set(f"PyAEDT: {'Please restart'}") + self.pyedb_info.set(f"PyEDB: {'Please restart'}") + messagebox.showinfo("Message", "Done") + + +def get_desktop_info(release_desktop=True): + port = get_port() + aedt_version = get_aedt_version() + aedt_process_id = get_process_id() + + if aedt_process_id is not None: + new_desktop = False + ng = False + close_project = False + close_on_exit = False + else: + new_desktop = True + ng = True + close_project = True + close_on_exit = True + + app = pyaedt.Desktop(new_desktop=new_desktop, version=aedt_version, port=port, non_graphical=ng) + personal_lib = app.personallib + if release_desktop: + app.release_desktop(close_project, close_on_exit) + return {"desktop": app, + "aedt_version": aedt_version, + "personal_lib": personal_lib} + + +if __name__ == "__main__": + kwargs = get_desktop_info() + # Initialize tkinter root window and run the app + root = tk.Tk() + app = VersionManager(root, **kwargs) + root.mainloop() From a094381f2114e2cadd673bf33fa8c4760562ef53 Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Tue, 28 Jan 2025 17:00:02 +0100 Subject: [PATCH 02/25] minor --- src/pyaedt/workflows/project/toolkits_catalog.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pyaedt/workflows/project/toolkits_catalog.toml b/src/pyaedt/workflows/project/toolkits_catalog.toml index 8a77bd4ac81..0e75e302de1 100644 --- a/src/pyaedt/workflows/project/toolkits_catalog.toml +++ b/src/pyaedt/workflows/project/toolkits_catalog.toml @@ -25,3 +25,10 @@ script = "advanced_fields_calculator.py" icon = "images/large/fields.png" template = "run_pyaedt_toolkit_script" pip = "" + +[VersionManager] +name = "Version Manager" +script = "version_manager.py" +icon = "" +template = "run_pyaedt_toolkit_script" +pip = "" \ No newline at end of file From 69034cb9b621fcb8d2a2fb0dee329a8ae4225ee3 Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Tue, 28 Jan 2025 17:05:30 +0100 Subject: [PATCH 03/25] minor --- .../workflows/project/images/large/logo.png | Bin 0 -> 35360 bytes .../workflows/project/toolkits_catalog.toml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/pyaedt/workflows/project/images/large/logo.png diff --git a/src/pyaedt/workflows/project/images/large/logo.png b/src/pyaedt/workflows/project/images/large/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..554dc38242dcab3628c396b3e55fbb1342fc2d9a GIT binary patch literal 35360 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 literal 0 HcmV?d00001 diff --git a/src/pyaedt/workflows/project/toolkits_catalog.toml b/src/pyaedt/workflows/project/toolkits_catalog.toml index 0e75e302de1..3733d86c384 100644 --- a/src/pyaedt/workflows/project/toolkits_catalog.toml +++ b/src/pyaedt/workflows/project/toolkits_catalog.toml @@ -29,6 +29,6 @@ pip = "" [VersionManager] name = "Version Manager" script = "version_manager.py" -icon = "" +icon = "images/large/logo.png" template = "run_pyaedt_toolkit_script" pip = "" \ No newline at end of file From acb3df8fd5140324d9dd851958cf42b2f7812cf2 Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Wed, 29 Jan 2025 09:20:20 +0100 Subject: [PATCH 04/25] minor --- src/ansys/aedt/core/workflows/project/toolkits_catalog.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml b/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml index 0e75e302de1..3733d86c384 100644 --- a/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml +++ b/src/ansys/aedt/core/workflows/project/toolkits_catalog.toml @@ -29,6 +29,6 @@ pip = "" [VersionManager] name = "Version Manager" script = "version_manager.py" -icon = "" +icon = "images/large/logo.png" template = "run_pyaedt_toolkit_script" pip = "" \ No newline at end of file From dd67fffaab6c670019d30625bb51a0552be80cba Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Wed, 29 Jan 2025 10:16:19 +0100 Subject: [PATCH 05/25] minor --- .../workflows/project/images/large/logo.png | Bin 0 -> 35360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/ansys/aedt/core/workflows/project/images/large/logo.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/logo.png b/src/ansys/aedt/core/workflows/project/images/large/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..554dc38242dcab3628c396b3e55fbb1342fc2d9a GIT binary patch literal 35360 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 literal 0 HcmV?d00001 From e3aae6d2b17c77a9eafd39a8f5907107fd5db718 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 09:22:05 +0000 Subject: [PATCH 06/25] CHORE: Auto fixes from pre-commit.com hooks For more information, see https://pre-commit.ci --- .../core/workflows/project/version_manager.py | 137 +++++++++--------- 1 file changed, 72 insertions(+), 65 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 59609a3a5de..f6e2fcbbb5b 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -1,6 +1,7 @@ -# Copyright (C) 2023 - 2024 ANSYS, Inc. and/or its affiliates. -# SPDX-License-Identifier: MIT +# -*- 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 @@ -23,27 +24,27 @@ VERSION = "0.3.0" import os -import sys +from pathlib import Path import platform import shutil +import subprocess +import sys import tkinter as tk +from tkinter import filedialog +from tkinter import messagebox +from tkinter import ttk import webbrowser -import zipfile -import subprocess import xml.etree.ElementTree as ET - -from pathlib import Path -from tkinter import messagebox, filedialog, ttk +import zipfile import ansys.aedt.core as pyaedt -import requests -import pyedb - +from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu +from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits from ansys.aedt.core.workflows.misc import get_aedt_version from ansys.aedt.core.workflows.misc import get_port from ansys.aedt.core.workflows.misc import get_process_id -from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu -from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits +import pyedb +import requests DISCLAIMER = ( "This script will download and install certain third-party software and/or " @@ -116,12 +117,14 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): style = ttk.Style() # Define the custom style for TLabel (ttk.Label) - style.configure("TLabel", - font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold - foreground="darkblue", # Text color - background="lightyellow", # Background color - padding=(10, 5), # Padding inside the label - anchor="w") + style.configure( + "TLabel", + font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold + foreground="darkblue", # Text color + background="lightyellow", # Background color + padding=(10, 5), # Padding inside the label + anchor="w", + ) self.venv_information = tk.StringVar() self.pyaedt_info = tk.StringVar() @@ -168,7 +171,7 @@ def create_ui_basic(self, parent): def create_ui_wheelhouse(frame): buttons = [ ["Update from wheelhouse", self.update_from_wheelhouse], - ["Update extensions", self.update_extensions] + ["Update extensions", self.update_extensions], ] for text, cmd in buttons: button = tk.Button(frame, text=text, width=40, height=2, command=cmd) @@ -243,9 +246,7 @@ def create_ui_pyedb(frame): entry.pack(side="left") def create_ui_pyaedt_buttons(frame): - buttons = [ - ["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt] - ] + buttons = [["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt]] for text, cmd in buttons: button = tk.Button(frame, text=text, width=40, height=2, command=cmd) button.pack(side="left", padx=10, pady=10) @@ -275,7 +276,7 @@ def create_ui_extensions(self, parent): def update_extensions(self): response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == 'yes': + if response == "yes": toolkits_path = Path(self.personal_lib, "Toolkits") temp = [] for product in toolkits_path.iterdir(): @@ -322,7 +323,7 @@ def update_extensions(self): def update_pyaedt(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": url = f"https://pypi.org/pypi/pyaedt/json" response = requests.get(url) @@ -333,8 +334,7 @@ def update_pyaedt(self): released_version = 0 if self.pyaedt_version > released_version: - subprocess.run( - [self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) else: subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) @@ -347,13 +347,19 @@ def get_pyaedt_branch(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": branch_name = self.pyaedt_branch_name.get() subprocess.run( - [self.python_exe, "-m", "pip", "install", - #"--force-reinstall", - f"git+https://github.com/ansys/pyaedt.git@{branch_name}"], - check=True) + [ + self.python_exe, + "-m", + "pip", + "install", + # "--force-reinstall", + f"git+https://github.com/ansys/pyaedt.git@{branch_name}", + ], + check=True, + ) self.clicked_refresh(need_restart=True) def get_pyedb_branch(self): @@ -363,16 +369,17 @@ def get_pyedb_branch(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": branch_name = self.pyedb_branch_name.get() subprocess.run( [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyedb.git@{branch_name}"], - check=True) + check=True, + ) self.clicked_refresh(need_restart=True) def update_pyedb(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": url = f"https://pypi.org/pypi/pyedb/json" response = requests.get(url) @@ -383,8 +390,7 @@ def update_pyedb(self): released_version = 0 if self.pyedb_version > released_version: - subprocess.run( - [self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) else: subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) @@ -402,23 +408,21 @@ def update_from_wheelhouse(self): correct_wheelhouse = file_name # Check Python version if not wh_python_version == self.python_version: - msg.extend([ - f"Wrong Python version", - f"Wheelhouse: {wh_python_version}", - f"Expected version: {self.python_version}", - ]) + msg.extend( + [ + f"Wrong Python version", + f"Wheelhouse: {wh_python_version}", + f"Expected version: {self.python_version}", + ] + ) correct_wheelhouse = correct_wheelhouse.replace(wh_python_version, self.python_version) if wh_pkg_type != "installer": - correct_wheelhouse = correct_wheelhouse.replace(f'-{wh_pkg_type}-', '-installer-') - msg.extend([ - "", - f"This wheelhouse doesn't contain required packages to add PyAEDT buttons." - ]) + correct_wheelhouse = correct_wheelhouse.replace(f"-{wh_pkg_type}-", "-installer-") + msg.extend(["", f"This wheelhouse doesn't contain required packages to add PyAEDT buttons."]) if msg is not []: - msg.extend(["", - f"Please download {correct_wheelhouse}."]) + msg.extend(["", f"Please download {correct_wheelhouse}."]) msg = "\n".join(msg) messagebox.showerror("Confirm Action", msg) return @@ -433,36 +437,44 @@ def update_from_wheelhouse(self): zip_ref.extractall(unzipped_path) subprocess.run( - [self.python_exe, "-m", "pip", "install", "--no-cache-dir", "--no-index", - f"--find-links=file:///{str(unzipped_path)}", - "pyaedt[installer]"], check=True) + [ + self.python_exe, + "-m", + "pip", + "install", + "--no-cache-dir", + "--no-index", + f"--find-links=file:///{str(unzipped_path)}", + "pyaedt[installer]", + ], + check=True, + ) self.clicked_refresh(need_restart=True) def reset_pyaedt_buttons_in_aedt(self): def handle_remove_error(func, path, exc_info): # Attempt to fix permission issues import stat + os.chmod(path, stat.S_IWRITE) # Add write permission func(path) # Retry the operation response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == 'yes': + if response == "yes": toolkit_path = os.path.join(self.personal_lib, "Toolkits") if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): - msg = [ - f"Toolkits path {toolkit_path} already exists.", - "Are you sure you want to reset toolkits?" - ] + msg = [f"Toolkits path {toolkit_path} already exists.", "Are you sure you want to reset toolkits?"] msg = "\n".join(msg) response = messagebox.askquestion("Confirm Action", msg) - if response == 'yes': + if response == "yes": shutil.rmtree(toolkit_path, onerror=handle_remove_error) else: return from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt + try: add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) messagebox.showinfo("Success", "PyAEDT buttons added in AEDT.") @@ -470,10 +482,7 @@ def handle_remove_error(func, path, exc_info): messagebox.showerror("Error", f"Error adding buttons to AEDT: {e}") def clicked_refresh(self, need_restart=False): - msg = [ - f"Venv path: {self.venv_path}", - f"Python version: {self.python_version}" - ] + msg = [f"Venv path: {self.venv_path}", f"Python version: {self.python_version}"] msg = "\n".join(msg) self.venv_information.set(msg) @@ -507,9 +516,7 @@ def get_desktop_info(release_desktop=True): personal_lib = app.personallib if release_desktop: app.release_desktop(close_project, close_on_exit) - return {"desktop": app, - "aedt_version": aedt_version, - "personal_lib": personal_lib} + return {"desktop": app, "aedt_version": aedt_version, "personal_lib": personal_lib} if __name__ == "__main__": From 10ee72d0afac81e280c67907c21d0ed18ea93eec Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Wed, 29 Jan 2025 10:35:04 +0100 Subject: [PATCH 07/25] update doc --- doc/source/User_guide/extensions.rst | 7 ++++++ .../project/version_manager.rst | 22 ++++++++++++++++++ .../_static/extensions/version_manager.png | Bin 0 -> 22662 bytes 3 files changed, 29 insertions(+) create mode 100644 doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst create mode 100644 doc/source/_static/extensions/version_manager.png diff --git a/doc/source/User_guide/extensions.rst b/doc/source/User_guide/extensions.rst index fd44381e690..1c58b7d1caa 100644 --- a/doc/source/User_guide/extensions.rst +++ b/doc/source/User_guide/extensions.rst @@ -55,6 +55,13 @@ They are small automated workflows with a simple GUI. Lear how to convert projects from 2022R2 to newer versions. + .. grid-item-card:: Version manager + :link: pyaedt_extensions_doc/project/version_manager + :link-type: doc + :margin: 2 2 0 0 + + Manager pyaedt and pyedb versions. + HFSS 3D Layout extensions ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst b/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst new file mode 100644 index 00000000000..71331af9d31 --- /dev/null +++ b/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst @@ -0,0 +1,22 @@ +The extension allows users to update PyAEDT and PyEDB through GUI +----------------------------------------------------------------- + +.. image:: ../../../_static/extensions/version_manager.png + :width: 800 + :alt: Version manager + +---------- +Features +---------- + +- Show Python virtual environment path +- Show Python version +- Show the current PyAEDT&PyEDB versions +- Show the latest PyAEDT&PyEDB release +- Update PyAEDT&PyEDB to the latest version +- Replace PyAEDT&PyEDB with specific version + - Default is main, which is the developer version + - Accepted inputs are branch name and version (0.34.0 for example) +- Update PyAEDT&PyEDB from wheelhouse + - Check compatibility +- Reset and update PyAEDT buttons in AEDT diff --git a/doc/source/_static/extensions/version_manager.png b/doc/source/_static/extensions/version_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..ab412f908358979d5ad2b21a0a1ddfd01f54d8a9 GIT binary patch literal 22662 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 z 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 Date: Thu, 30 Jan 2025 12:17:18 +0100 Subject: [PATCH 08/25] change theme --- .../core/workflows/project/version_manager.py | 153 +++++++++++------- 1 file changed, 91 insertions(+), 62 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index f6e2fcbbb5b..82b2e2c63f9 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -43,6 +43,8 @@ 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 ExtensionTheme + import pyedb import requests @@ -86,7 +88,7 @@ class VersionManager: TITLE = "Version Manager {}".format(VERSION) USER_GUIDE = "https://github.com/ansys-internal/pyaedt_version_manager" UI_WIDTH = 800 - UI_HEIGHT = 400 + UI_HEIGHT = 500 @property def venv_path(self): @@ -114,17 +116,19 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.aedt_version = aedt_version self.personal_lib = personal_lib - style = ttk.Style() + self.style = ttk.Style() # Define the custom style for TLabel (ttk.Label) - style.configure( - "TLabel", - font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold - foreground="darkblue", # Text color - background="lightyellow", # Background color - padding=(10, 5), # Padding inside the label - anchor="w", - ) + self.style.configure("PyAEDT", + font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold + foreground="darkblue", # Text color + background="lightyellow", # Background color + padding=(10, 5), # Padding inside the label + anchor="w") + self.theme = ExtensionTheme() + + self.theme.apply_light_theme(self.style) + ui.theme = "light" self.venv_information = tk.StringVar() self.pyaedt_info = tk.StringVar() @@ -142,8 +146,11 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.root.title(self.TITLE) self.root.geometry(f"{self.UI_WIDTH}x{self.UI_HEIGHT}") - notebook = ttk.Notebook(self.root) - notebook.pack(fill="both", expand=True, padx=10, pady=10) + main_frame = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL, style="TPanedwindow") + main_frame.pack(fill=tk.BOTH, expand=True) + notebook = ttk.Notebook(self.root, style="TNotebook") + main_frame.add(notebook, weight=3) + #notebook.pack(fill="both", expand=True, padx=10, pady=10) tab_basic = ttk.Frame(notebook) tab_advanced = ttk.Frame(notebook) @@ -154,10 +161,12 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): # notebook.add(tab_extensions, text="Extensions") self.create_file_menu() + self.create_button_frame(self.root) self.create_ui_basic(tab_basic) self.create_ui_advanced(tab_advanced) self.create_ui_extensions(tab_extensions) + self.clicked_refresh() def create_file_menu(self): @@ -171,7 +180,7 @@ def create_ui_basic(self, parent): def create_ui_wheelhouse(frame): buttons = [ ["Update from wheelhouse", self.update_from_wheelhouse], - ["Update extensions", self.update_extensions], + ["Update extensions", self.update_extensions] ] for text, cmd in buttons: button = tk.Button(frame, text=text, width=40, height=2, command=cmd) @@ -246,7 +255,9 @@ def create_ui_pyedb(frame): entry.pack(side="left") def create_ui_pyaedt_buttons(frame): - buttons = [["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt]] + buttons = [ + ["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt] + ] for text, cmd in buttons: button = tk.Button(frame, text=text, width=40, height=2, command=cmd) button.pack(side="left", padx=10, pady=10) @@ -274,9 +285,33 @@ def create_ui_extensions(self, parent): button = tk.Button(frame, text=text, width=20, height=2, command=cmd) button.pack(side="left", padx=10, pady=10) + def create_button_frame(self, parent): + def set_light_theme(): + self.root.configure(bg=self.theme.light["widget_bg"]) + self.theme.apply_light_theme(self.style) + change_theme_button.config(text="\u263D") + + def set_dark_theme(): + self.root.configure(bg=self.theme.dark["widget_bg"]) + self.theme.apply_dark_theme(self.style) + change_theme_button.config(text="\u2600") + + def toggle_theme(): + if self.root.theme == "light": + set_dark_theme() + self.root.theme = "dark" + else: + set_light_theme() + self.root.theme = "light" + + button_frame = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tk.SUNKEN, borderwidth=2) + button_frame.pack(fill=tk.X, pady=0) + change_theme_button = ttk.Button(button_frame, text="\u263D", command=toggle_theme, style="PyAEDT.TButton") + change_theme_button.pack(side=tk.RIGHT, padx=5, pady=40) + def update_extensions(self): response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == "yes": + if response == 'yes': toolkits_path = Path(self.personal_lib, "Toolkits") temp = [] for product in toolkits_path.iterdir(): @@ -323,7 +358,7 @@ def update_extensions(self): def update_pyaedt(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == "yes": + if response == 'yes': url = f"https://pypi.org/pypi/pyaedt/json" response = requests.get(url) @@ -334,7 +369,8 @@ def update_pyaedt(self): released_version = 0 if self.pyaedt_version > released_version: - subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) else: subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) @@ -347,19 +383,13 @@ def get_pyaedt_branch(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == "yes": + if response == 'yes': branch_name = self.pyaedt_branch_name.get() subprocess.run( - [ - self.python_exe, - "-m", - "pip", - "install", - # "--force-reinstall", - f"git+https://github.com/ansys/pyaedt.git@{branch_name}", - ], - check=True, - ) + [self.python_exe, "-m", "pip", "install", + #"--force-reinstall", + f"git+https://github.com/ansys/pyaedt.git@{branch_name}"], + check=True) self.clicked_refresh(need_restart=True) def get_pyedb_branch(self): @@ -369,17 +399,16 @@ def get_pyedb_branch(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == "yes": + if response == 'yes': branch_name = self.pyedb_branch_name.get() subprocess.run( [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyedb.git@{branch_name}"], - check=True, - ) + check=True) self.clicked_refresh(need_restart=True) def update_pyedb(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == "yes": + if response == 'yes': url = f"https://pypi.org/pypi/pyedb/json" response = requests.get(url) @@ -390,7 +419,8 @@ def update_pyedb(self): released_version = 0 if self.pyedb_version > released_version: - subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) else: subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) @@ -408,21 +438,23 @@ def update_from_wheelhouse(self): correct_wheelhouse = file_name # Check Python version if not wh_python_version == self.python_version: - msg.extend( - [ - f"Wrong Python version", - f"Wheelhouse: {wh_python_version}", - f"Expected version: {self.python_version}", - ] - ) + msg.extend([ + f"Wrong Python version", + f"Wheelhouse: {wh_python_version}", + f"Expected version: {self.python_version}", + ]) correct_wheelhouse = correct_wheelhouse.replace(wh_python_version, self.python_version) if wh_pkg_type != "installer": - correct_wheelhouse = correct_wheelhouse.replace(f"-{wh_pkg_type}-", "-installer-") - msg.extend(["", f"This wheelhouse doesn't contain required packages to add PyAEDT buttons."]) + correct_wheelhouse = correct_wheelhouse.replace(f'-{wh_pkg_type}-', '-installer-') + msg.extend([ + "", + f"This wheelhouse doesn't contain required packages to add PyAEDT buttons." + ]) if msg is not []: - msg.extend(["", f"Please download {correct_wheelhouse}."]) + msg.extend(["", + f"Please download {correct_wheelhouse}."]) msg = "\n".join(msg) messagebox.showerror("Confirm Action", msg) return @@ -437,44 +469,36 @@ def update_from_wheelhouse(self): zip_ref.extractall(unzipped_path) subprocess.run( - [ - self.python_exe, - "-m", - "pip", - "install", - "--no-cache-dir", - "--no-index", - f"--find-links=file:///{str(unzipped_path)}", - "pyaedt[installer]", - ], - check=True, - ) + [self.python_exe, "-m", "pip", "install", "--no-cache-dir", "--no-index", + f"--find-links=file:///{str(unzipped_path)}", + "pyaedt[installer]"], check=True) self.clicked_refresh(need_restart=True) def reset_pyaedt_buttons_in_aedt(self): def handle_remove_error(func, path, exc_info): # Attempt to fix permission issues import stat - os.chmod(path, stat.S_IWRITE) # Add write permission func(path) # Retry the operation response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == "yes": + if response == 'yes': toolkit_path = os.path.join(self.personal_lib, "Toolkits") if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): - msg = [f"Toolkits path {toolkit_path} already exists.", "Are you sure you want to reset toolkits?"] + msg = [ + f"Toolkits path {toolkit_path} already exists.", + "Are you sure you want to reset toolkits?" + ] msg = "\n".join(msg) response = messagebox.askquestion("Confirm Action", msg) - if response == "yes": + if response == 'yes': shutil.rmtree(toolkit_path, onerror=handle_remove_error) else: return from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt - try: add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) messagebox.showinfo("Success", "PyAEDT buttons added in AEDT.") @@ -482,7 +506,10 @@ def handle_remove_error(func, path, exc_info): messagebox.showerror("Error", f"Error adding buttons to AEDT: {e}") def clicked_refresh(self, need_restart=False): - msg = [f"Venv path: {self.venv_path}", f"Python version: {self.python_version}"] + msg = [ + f"Venv path: {self.venv_path}", + f"Python version: {self.python_version}" + ] msg = "\n".join(msg) self.venv_information.set(msg) @@ -516,7 +543,9 @@ def get_desktop_info(release_desktop=True): personal_lib = app.personallib if release_desktop: app.release_desktop(close_project, close_on_exit) - return {"desktop": app, "aedt_version": aedt_version, "personal_lib": personal_lib} + return {"desktop": app, + "aedt_version": aedt_version, + "personal_lib": personal_lib} if __name__ == "__main__": From 2ca4d8ec1d0fae15dd57333782c4e844caab8579 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:19:11 +0000 Subject: [PATCH 09/25] CHORE: Auto fixes from pre-commit.com hooks For more information, see https://pre-commit.ci --- .../core/workflows/project/version_manager.py | 116 +++++++++--------- 1 file changed, 60 insertions(+), 56 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 82b2e2c63f9..f5a9d6f35aa 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -40,11 +40,10 @@ import ansys.aedt.core as pyaedt from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits +from ansys.aedt.core.workflows.misc import ExtensionTheme 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 ExtensionTheme - import pyedb import requests @@ -119,12 +118,14 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.style = ttk.Style() # Define the custom style for TLabel (ttk.Label) - self.style.configure("PyAEDT", - font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold - foreground="darkblue", # Text color - background="lightyellow", # Background color - padding=(10, 5), # Padding inside the label - anchor="w") + self.style.configure( + "PyAEDT", + font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold + foreground="darkblue", # Text color + background="lightyellow", # Background color + padding=(10, 5), # Padding inside the label + anchor="w", + ) self.theme = ExtensionTheme() self.theme.apply_light_theme(self.style) @@ -150,7 +151,7 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): main_frame.pack(fill=tk.BOTH, expand=True) notebook = ttk.Notebook(self.root, style="TNotebook") main_frame.add(notebook, weight=3) - #notebook.pack(fill="both", expand=True, padx=10, pady=10) + # notebook.pack(fill="both", expand=True, padx=10, pady=10) tab_basic = ttk.Frame(notebook) tab_advanced = ttk.Frame(notebook) @@ -166,7 +167,6 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.create_ui_advanced(tab_advanced) self.create_ui_extensions(tab_extensions) - self.clicked_refresh() def create_file_menu(self): @@ -180,7 +180,7 @@ def create_ui_basic(self, parent): def create_ui_wheelhouse(frame): buttons = [ ["Update from wheelhouse", self.update_from_wheelhouse], - ["Update extensions", self.update_extensions] + ["Update extensions", self.update_extensions], ] for text, cmd in buttons: button = tk.Button(frame, text=text, width=40, height=2, command=cmd) @@ -255,9 +255,7 @@ def create_ui_pyedb(frame): entry.pack(side="left") def create_ui_pyaedt_buttons(frame): - buttons = [ - ["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt] - ] + buttons = [["Reset PyAEDT Buttons", self.reset_pyaedt_buttons_in_aedt]] for text, cmd in buttons: button = tk.Button(frame, text=text, width=40, height=2, command=cmd) button.pack(side="left", padx=10, pady=10) @@ -311,7 +309,7 @@ def toggle_theme(): def update_extensions(self): response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == 'yes': + if response == "yes": toolkits_path = Path(self.personal_lib, "Toolkits") temp = [] for product in toolkits_path.iterdir(): @@ -358,7 +356,7 @@ def update_extensions(self): def update_pyaedt(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": url = f"https://pypi.org/pypi/pyaedt/json" response = requests.get(url) @@ -369,8 +367,7 @@ def update_pyaedt(self): released_version = 0 if self.pyaedt_version > released_version: - subprocess.run( - [self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) else: subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) @@ -383,13 +380,19 @@ def get_pyaedt_branch(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": branch_name = self.pyaedt_branch_name.get() subprocess.run( - [self.python_exe, "-m", "pip", "install", - #"--force-reinstall", - f"git+https://github.com/ansys/pyaedt.git@{branch_name}"], - check=True) + [ + self.python_exe, + "-m", + "pip", + "install", + # "--force-reinstall", + f"git+https://github.com/ansys/pyaedt.git@{branch_name}", + ], + check=True, + ) self.clicked_refresh(need_restart=True) def get_pyedb_branch(self): @@ -399,16 +402,17 @@ def get_pyedb_branch(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": branch_name = self.pyedb_branch_name.get() subprocess.run( [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyedb.git@{branch_name}"], - check=True) + check=True, + ) self.clicked_refresh(need_restart=True) def update_pyedb(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == 'yes': + if response == "yes": url = f"https://pypi.org/pypi/pyedb/json" response = requests.get(url) @@ -419,8 +423,7 @@ def update_pyedb(self): released_version = 0 if self.pyedb_version > released_version: - subprocess.run( - [self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) else: subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) @@ -438,23 +441,21 @@ def update_from_wheelhouse(self): correct_wheelhouse = file_name # Check Python version if not wh_python_version == self.python_version: - msg.extend([ - f"Wrong Python version", - f"Wheelhouse: {wh_python_version}", - f"Expected version: {self.python_version}", - ]) + msg.extend( + [ + f"Wrong Python version", + f"Wheelhouse: {wh_python_version}", + f"Expected version: {self.python_version}", + ] + ) correct_wheelhouse = correct_wheelhouse.replace(wh_python_version, self.python_version) if wh_pkg_type != "installer": - correct_wheelhouse = correct_wheelhouse.replace(f'-{wh_pkg_type}-', '-installer-') - msg.extend([ - "", - f"This wheelhouse doesn't contain required packages to add PyAEDT buttons." - ]) + correct_wheelhouse = correct_wheelhouse.replace(f"-{wh_pkg_type}-", "-installer-") + msg.extend(["", f"This wheelhouse doesn't contain required packages to add PyAEDT buttons."]) if msg is not []: - msg.extend(["", - f"Please download {correct_wheelhouse}."]) + msg.extend(["", f"Please download {correct_wheelhouse}."]) msg = "\n".join(msg) messagebox.showerror("Confirm Action", msg) return @@ -469,36 +470,44 @@ def update_from_wheelhouse(self): zip_ref.extractall(unzipped_path) subprocess.run( - [self.python_exe, "-m", "pip", "install", "--no-cache-dir", "--no-index", - f"--find-links=file:///{str(unzipped_path)}", - "pyaedt[installer]"], check=True) + [ + self.python_exe, + "-m", + "pip", + "install", + "--no-cache-dir", + "--no-index", + f"--find-links=file:///{str(unzipped_path)}", + "pyaedt[installer]", + ], + check=True, + ) self.clicked_refresh(need_restart=True) def reset_pyaedt_buttons_in_aedt(self): def handle_remove_error(func, path, exc_info): # Attempt to fix permission issues import stat + os.chmod(path, stat.S_IWRITE) # Add write permission func(path) # Retry the operation response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == 'yes': + if response == "yes": toolkit_path = os.path.join(self.personal_lib, "Toolkits") if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): - msg = [ - f"Toolkits path {toolkit_path} already exists.", - "Are you sure you want to reset toolkits?" - ] + msg = [f"Toolkits path {toolkit_path} already exists.", "Are you sure you want to reset toolkits?"] msg = "\n".join(msg) response = messagebox.askquestion("Confirm Action", msg) - if response == 'yes': + if response == "yes": shutil.rmtree(toolkit_path, onerror=handle_remove_error) else: return from ansys.aedt.core.workflows.installer.pyaedt_installer import add_pyaedt_to_aedt + try: add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) messagebox.showinfo("Success", "PyAEDT buttons added in AEDT.") @@ -506,10 +515,7 @@ def handle_remove_error(func, path, exc_info): messagebox.showerror("Error", f"Error adding buttons to AEDT: {e}") def clicked_refresh(self, need_restart=False): - msg = [ - f"Venv path: {self.venv_path}", - f"Python version: {self.python_version}" - ] + msg = [f"Venv path: {self.venv_path}", f"Python version: {self.python_version}"] msg = "\n".join(msg) self.venv_information.set(msg) @@ -543,9 +549,7 @@ def get_desktop_info(release_desktop=True): personal_lib = app.personallib if release_desktop: app.release_desktop(close_project, close_on_exit) - return {"desktop": app, - "aedt_version": aedt_version, - "personal_lib": personal_lib} + return {"desktop": app, "aedt_version": aedt_version, "personal_lib": personal_lib} if __name__ == "__main__": From 8ffe344871c330894bfe1a05fd51a29d93991808 Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Mon, 3 Feb 2025 16:32:05 +0100 Subject: [PATCH 10/25] remove help --- src/ansys/aedt/core/workflows/project/version_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index f5a9d6f35aa..13a4c1f8b5f 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -85,7 +85,7 @@ def get_latest_version(package_name): class VersionManager: TITLE = "Version Manager {}".format(VERSION) - USER_GUIDE = "https://github.com/ansys-internal/pyaedt_version_manager" + USER_GUIDE = "https://github.com/" UI_WIDTH = 800 UI_HEIGHT = 500 @@ -172,7 +172,7 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): def create_file_menu(self): menu_bar = tk.Menu(root) help_menu = tk.Menu(menu_bar, tearoff=0) - help_menu.add_command(label="User Guide", command=lambda: webbrowser.open(self.USER_GUIDE)) + #help_menu.add_command(label="User Guide", command=lambda: webbrowser.open(self.USER_GUIDE)) menu_bar.add_cascade(label="Help", menu=help_menu) self.root.config(menu=menu_bar) From 01b00db4b331562ea25aca4d5c299cd4236b7cc9 Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Mon, 3 Feb 2025 16:47:29 +0100 Subject: [PATCH 11/25] revert --- .../core/workflows/project/version_manager.py | 51 ++++--------------- 1 file changed, 9 insertions(+), 42 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 13a4c1f8b5f..be37d1a739f 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -40,7 +40,6 @@ import ansys.aedt.core as pyaedt from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits -from ansys.aedt.core.workflows.misc import ExtensionTheme 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 @@ -85,9 +84,9 @@ def get_latest_version(package_name): class VersionManager: TITLE = "Version Manager {}".format(VERSION) - USER_GUIDE = "https://github.com/" + USER_GUIDE = "https://github.com/ansys-internal/pyaedt_version_manager" UI_WIDTH = 800 - UI_HEIGHT = 500 + UI_HEIGHT = 400 @property def venv_path(self): @@ -115,21 +114,17 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.aedt_version = aedt_version self.personal_lib = personal_lib - self.style = ttk.Style() + style = ttk.Style() # Define the custom style for TLabel (ttk.Label) - self.style.configure( - "PyAEDT", + style.configure( + "TLabel", font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold foreground="darkblue", # Text color background="lightyellow", # Background color padding=(10, 5), # Padding inside the label anchor="w", ) - self.theme = ExtensionTheme() - - self.theme.apply_light_theme(self.style) - ui.theme = "light" self.venv_information = tk.StringVar() self.pyaedt_info = tk.StringVar() @@ -147,11 +142,8 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.root.title(self.TITLE) self.root.geometry(f"{self.UI_WIDTH}x{self.UI_HEIGHT}") - main_frame = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL, style="TPanedwindow") - main_frame.pack(fill=tk.BOTH, expand=True) - notebook = ttk.Notebook(self.root, style="TNotebook") - main_frame.add(notebook, weight=3) - # notebook.pack(fill="both", expand=True, padx=10, pady=10) + notebook = ttk.Notebook(self.root) + notebook.pack(fill="both", expand=True, padx=10, pady=10) tab_basic = ttk.Frame(notebook) tab_advanced = ttk.Frame(notebook) @@ -162,7 +154,6 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): # notebook.add(tab_extensions, text="Extensions") self.create_file_menu() - self.create_button_frame(self.root) self.create_ui_basic(tab_basic) self.create_ui_advanced(tab_advanced) self.create_ui_extensions(tab_extensions) @@ -172,9 +163,9 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): def create_file_menu(self): menu_bar = tk.Menu(root) help_menu = tk.Menu(menu_bar, tearoff=0) - #help_menu.add_command(label="User Guide", command=lambda: webbrowser.open(self.USER_GUIDE)) + help_menu.add_command(label="User Guide", command=lambda: webbrowser.open(self.USER_GUIDE)) menu_bar.add_cascade(label="Help", menu=help_menu) - self.root.config(menu=menu_bar) + #self.root.config(menu=menu_bar) def create_ui_basic(self, parent): def create_ui_wheelhouse(frame): @@ -283,30 +274,6 @@ def create_ui_extensions(self, parent): button = tk.Button(frame, text=text, width=20, height=2, command=cmd) button.pack(side="left", padx=10, pady=10) - def create_button_frame(self, parent): - def set_light_theme(): - self.root.configure(bg=self.theme.light["widget_bg"]) - self.theme.apply_light_theme(self.style) - change_theme_button.config(text="\u263D") - - def set_dark_theme(): - self.root.configure(bg=self.theme.dark["widget_bg"]) - self.theme.apply_dark_theme(self.style) - change_theme_button.config(text="\u2600") - - def toggle_theme(): - if self.root.theme == "light": - set_dark_theme() - self.root.theme = "dark" - else: - set_light_theme() - self.root.theme = "light" - - button_frame = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tk.SUNKEN, borderwidth=2) - button_frame.pack(fill=tk.X, pady=0) - change_theme_button = ttk.Button(button_frame, text="\u263D", command=toggle_theme, style="PyAEDT.TButton") - change_theme_button.pack(side=tk.RIGHT, padx=5, pady=40) - def update_extensions(self): response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") if response == "yes": From 4a89516e6beaea1eace7f89112ef12702e65308d Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Mon, 3 Feb 2025 16:48:58 +0100 Subject: [PATCH 12/25] fix --- doc/source/User_guide/extensions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/User_guide/extensions.rst b/doc/source/User_guide/extensions.rst index 1c58b7d1caa..ad491232b63 100644 --- a/doc/source/User_guide/extensions.rst +++ b/doc/source/User_guide/extensions.rst @@ -60,7 +60,7 @@ They are small automated workflows with a simple GUI. :link-type: doc :margin: 2 2 0 0 - Manager pyaedt and pyedb versions. + Manage pyaedt and pyedb versions. HFSS 3D Layout extensions From cd7d4c83dc952e72b8cc9d86d5aeb490103a2894 Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Mon, 3 Feb 2025 17:28:24 +0100 Subject: [PATCH 13/25] fix pyansys icon --- .../core/workflows/project/version_manager.py | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index be37d1a739f..477160613f8 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -37,7 +37,10 @@ import xml.etree.ElementTree as ET import zipfile -import ansys.aedt.core as pyaedt +import PIL.Image +import PIL.ImageTk + +import ansys.aedt.core from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits from ansys.aedt.core.workflows.misc import get_aedt_version @@ -103,7 +106,7 @@ def python_version(self): @property def pyaedt_version(self): - return pyaedt.version + return ansys.aedt.core.version @property def pyedb_version(self): @@ -118,8 +121,8 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): # Define the custom style for TLabel (ttk.Label) style.configure( - "TLabel", - font=("Helvetica", 14, "bold"), # Font style: Helvetica, size 14, bold + "PyAEDT", + font=("Helvetica", 20, "bold"), # Font style: Helvetica, size 14, bold foreground="darkblue", # Text color background="lightyellow", # Background color padding=(10, 5), # Padding inside the label @@ -138,7 +141,13 @@ def __init__(self, ui, desktop, aedt_version, personal_lib): self.ini_file_path = os.path.join(os.path.dirname(__file__), "settings.ini") + # Load the logo for the main window + icon_path = Path(ansys.aedt.core.workflows.__path__[0]) / "images" / "large" / "logo.png" + im = PIL.Image.open(icon_path) + photo = PIL.ImageTk.PhotoImage(im) + self.root = ui + self.root.iconphoto(True, photo) self.root.title(self.TITLE) self.root.geometry(f"{self.UI_WIDTH}x{self.UI_HEIGHT}") @@ -304,7 +313,7 @@ def update_extensions(self): if j["name"] == name: shutil.rmtree(extension_dir, ignore_errors=True) - workflow_dir = Path(pyaedt.workflows.__file__).parent + workflow_dir = Path(ansys.aedt.core.workflows.__file__).parent add_script_to_menu( name=name, @@ -512,7 +521,7 @@ def get_desktop_info(release_desktop=True): close_project = True close_on_exit = True - app = pyaedt.Desktop(new_desktop=new_desktop, version=aedt_version, port=port, non_graphical=ng) + app = ansys.aedt.core.Desktop(new_desktop=new_desktop, version=aedt_version, port=port, non_graphical=ng) personal_lib = app.personallib if release_desktop: app.release_desktop(close_project, close_on_exit) From 54918de95c231b1bdcb1d856d9bb4ef4fcbcd01d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:32:48 +0000 Subject: [PATCH 14/25] CHORE: Auto fixes from pre-commit.com hooks For more information, see https://pre-commit.ci --- src/ansys/aedt/core/workflows/project/version_manager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 477160613f8..37650b0011f 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -39,7 +39,6 @@ import PIL.Image import PIL.ImageTk - import ansys.aedt.core from ansys.aedt.core.workflows.customize_automation_tab import add_script_to_menu from ansys.aedt.core.workflows.customize_automation_tab import available_toolkits @@ -174,7 +173,7 @@ def create_file_menu(self): help_menu = tk.Menu(menu_bar, tearoff=0) help_menu.add_command(label="User Guide", command=lambda: webbrowser.open(self.USER_GUIDE)) menu_bar.add_cascade(label="Help", menu=help_menu) - #self.root.config(menu=menu_bar) + # self.root.config(menu=menu_bar) def create_ui_basic(self, parent): def create_ui_wheelhouse(frame): From 15ae9da9367633bc74034d7ac131ccf9efb51c94 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 4 Feb 2025 17:58:59 +0100 Subject: [PATCH 15/25] Version manager style --- .../_static/extensions/version_manager.png | Bin 22662 -> 17528 bytes .../core/workflows/project/version_manager.py | 139 +++++++++++------- 2 files changed, 83 insertions(+), 56 deletions(-) diff --git a/doc/source/_static/extensions/version_manager.png b/doc/source/_static/extensions/version_manager.png index ab412f908358979d5ad2b21a0a1ddfd01f54d8a9..f4998bf1fac7295cce0b68abea2b65fdbd07f3e1 100644 GIT binary patch literal 17528 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 literal 22662 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 z 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 Date: Tue, 4 Feb 2025 18:05:24 +0100 Subject: [PATCH 16/25] Remove unused pictures --- .../workflows/project/images/large/logo.png | Bin 35360 -> 0 bytes .../workflows/project/images/large/logo.png | Bin 35360 -> 0 bytes .../workflows/project/toolkits_catalog.toml | 7 ------- 3 files changed, 7 deletions(-) delete mode 100644 src/ansys/aedt/core/workflows/project/images/large/logo.png delete mode 100644 src/pyaedt/workflows/project/images/large/logo.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/logo.png b/src/ansys/aedt/core/workflows/project/images/large/logo.png deleted file mode 100644 index 554dc38242dcab3628c396b3e55fbb1342fc2d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35360 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 diff --git a/src/pyaedt/workflows/project/images/large/logo.png b/src/pyaedt/workflows/project/images/large/logo.png deleted file mode 100644 index 554dc38242dcab3628c396b3e55fbb1342fc2d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35360 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 diff --git a/src/pyaedt/workflows/project/toolkits_catalog.toml b/src/pyaedt/workflows/project/toolkits_catalog.toml index 3733d86c384..8a77bd4ac81 100644 --- a/src/pyaedt/workflows/project/toolkits_catalog.toml +++ b/src/pyaedt/workflows/project/toolkits_catalog.toml @@ -25,10 +25,3 @@ script = "advanced_fields_calculator.py" icon = "images/large/fields.png" template = "run_pyaedt_toolkit_script" pip = "" - -[VersionManager] -name = "Version Manager" -script = "version_manager.py" -icon = "images/large/logo.png" -template = "run_pyaedt_toolkit_script" -pip = "" \ No newline at end of file From cc45e3f10a0e4f26ed8c9798daa5daffc568df39 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 4 Feb 2025 18:12:34 +0100 Subject: [PATCH 17/25] Fix codacy --- .../aedt/core/workflows/project/version_manager.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 9ee150066e0..a329bb2fdb3 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -27,14 +27,14 @@ from pathlib import Path import platform import shutil -import subprocess +import subprocess # nosec import sys import tkinter from tkinter import filedialog from tkinter import messagebox from tkinter import ttk import webbrowser -import xml.etree.ElementTree as ET +import xml.etree.ElementTree as ET # nosec import zipfile import PIL.Image @@ -333,7 +333,7 @@ def update_extensions(self): product_name = product.stem if product_name not in atk: continue - for i, j in atk[product_name].items(): + for _, j in atk[product_name].items(): extension_dir = product / name if j["name"] == name: shutil.rmtree(extension_dir, ignore_errors=True) @@ -358,7 +358,7 @@ def update_pyaedt(self): response = messagebox.askquestion("Disclaimer", DISCLAIMER) if response == "yes": - url = f"https://pypi.org/pypi/pyaedt/json" + url = "https://pypi.org/pypi/pyaedt/json" response = requests.get(url) if response.status_code == 200: @@ -436,7 +436,7 @@ def update_from_wheelhouse(self): if file_selected: fpath = Path(file_selected) file_name = fpath.stem - _, wh_pyaedt_version, wh_pkg_type, _, _, _, wh_python_version = file_name.split("-") + _, _, wh_pkg_type, _, _, _, wh_python_version = file_name.split("-") msg = [] correct_wheelhouse = file_name @@ -444,7 +444,7 @@ def update_from_wheelhouse(self): if not wh_python_version == self.python_version: msg.extend( [ - f"Wrong Python version", + "Wrong Python version", f"Wheelhouse: {wh_python_version}", f"Expected version: {self.python_version}", ] @@ -453,7 +453,7 @@ def update_from_wheelhouse(self): if wh_pkg_type != "installer": correct_wheelhouse = correct_wheelhouse.replace(f"-{wh_pkg_type}-", "-installer-") - msg.extend(["", f"This wheelhouse doesn't contain required packages to add PyAEDT buttons."]) + msg.extend(["", "This wheelhouse doesn't contain required packages to add PyAEDT buttons."]) if msg is not []: msg.extend(["", f"Please download {correct_wheelhouse}."]) From d1b49e22beed69b30101822c982b536248625dae Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Wed, 5 Feb 2025 09:54:18 +0100 Subject: [PATCH 18/25] minor fix on UI --- .../aedt/core/workflows/project/version_manager.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index a329bb2fdb3..934bec4a1c2 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -237,9 +237,9 @@ def create_ui_info(frame): label = ttk.Label(frame, textvariable=self.venv_information, style="PyAEDT.TLabel") label.pack(anchor="w") - frame0 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) - frame1 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) - frame2 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) + frame0 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=0) + frame1 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=0) + frame2 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=0) frame3 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) frame0.pack(padx=5, pady=5) @@ -285,9 +285,9 @@ def create_ui_pyaedt_buttons(frame): button = ttk.Button(frame, text=text, width=40, command=cmd, style="PyAEDT.TButton") button.pack(side="left", padx=10, pady=10) - frame0 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) - frame1 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) - frame2 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=2) + frame0 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=0) + frame1 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=0) + frame2 = ttk.Frame(parent, style="PyAEDT.TFrame", relief=tkinter.SUNKEN, borderwidth=0) frame0.pack(padx=5, pady=5) frame1.pack(padx=5, pady=5) From f9fffdf3f3c70a2fc881d50f84d5fbe09c75199b Mon Sep 17 00:00:00 2001 From: ring630 <@gmail.com> Date: Thu, 6 Feb 2025 12:26:08 +0100 Subject: [PATCH 19/25] fix icon --- .../project/images/large/version_manager.png | Bin 0 -> 855 bytes .../core/workflows/project/toolkits_catalog.toml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/ansys/aedt/core/workflows/project/images/large/version_manager.png diff --git a/src/ansys/aedt/core/workflows/project/images/large/version_manager.png b/src/ansys/aedt/core/workflows/project/images/large/version_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..f02292deeb72a7dd5da83466b01e1772d4dad86b GIT binary patch literal 855 zcmV-d1E~CoP)70ZTF(@pSI!jy0uGCa2y#}KNUIqlmE!y|5yfNia3~xJM?_?DYI6EkkzDJo zSnM2V4)?xH6X1as#@Hx3k#T>1gr{>427`|tKN=h!OukJH4G*>KZOOV>Ypow(t@S+5 zKlemhwuc-RYu%i6o7T@Az7{{$vZ`jq+MLZ5r(?A7=UqG+7f*V7AJo>?KJR}nB2`PO z0BF_>4mg35c_l_0MJ60HeH|4QrE>rUsC%c%b6t_k=a1j+?gQW`$M^J)ADTRwnRFZ{ zkw`?N(T^WK?%uU~U|;}*>gwuOgRko9>T+(@innuP@b&xL=-3p%YpUjKsW(^ePpSC2 z#;x@$m#-`?qOgLoPh;tHdSqmz|5^X$hRtP*%0;AUN7KCmBs3b&SK;1e~zG+R+ zZ(QfTh4NzQh6I{-?h%oW(`TkV^Uj3;*L81Pzfp+qy4f`}IFw4I+K;yb0G#^OC3jAi z6BM8#L6f?^BzdWVLGyy4)L80s>T@g-VWJrTrLj^G>Au_T@4LU)u(3fzthJRDl>h!Zfo?@Xy3Eo-2O!XjKjuJfCiL;4rmk5hQ4iVpr8leKUX3u`ad&qbbhq6 zqqC={N3jBEG-Z1Sz9`Zpz7Yv{+Sh0!B1At-kz&&#`NKoA_BSo-dH@CT{=cPP0RCM6 h@VK4@%mV%&z*iKG6ksd Date: Thu, 6 Feb 2025 18:16:32 +0100 Subject: [PATCH 20/25] fix --- .../project/version_manager.rst | 12 ++++++------ .../core/workflows/project/version_manager.py | 15 ++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst b/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst index 71331af9d31..604ca105df3 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst @@ -11,12 +11,12 @@ Features - Show Python virtual environment path - Show Python version -- Show the current PyAEDT&PyEDB versions -- Show the latest PyAEDT&PyEDB release -- Update PyAEDT&PyEDB to the latest version -- Replace PyAEDT&PyEDB with specific version +- Show the current PyAEDT and PyEDB versions +- Show the latest PyAEDT and PyEDB release available (if connected) +- Update PyAEDT and PyEDB to the latest version +- Install PyAEDT and PyEDB with a specific version - Default is main, which is the developer version - - Accepted inputs are branch name and version (0.34.0 for example) -- Update PyAEDT&PyEDB from wheelhouse + - Accepted inputs is branch name +- Update PyAEDT and PyEDB from wheelhouse - Check compatibility - Reset and update PyAEDT buttons in AEDT diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 934bec4a1c2..14aa7a58308 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -34,7 +34,7 @@ from tkinter import messagebox from tkinter import ttk import webbrowser -import xml.etree.ElementTree as ET # nosec +from defusedxml.ElementTree import parse as defused_parse import zipfile import PIL.Image @@ -61,7 +61,8 @@ def is_git_installed(): try: # Run the command `git --version` - result = subprocess.run(["git", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + result = subprocess.run(["git", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, + check=True) # Check if the command ran successfully if result.returncode == 0: @@ -318,10 +319,10 @@ def update_extensions(self): continue xml_file = product / "TabConfig.xml" if xml_file.exists(): - tree = ET.parse(xml_file) - root = tree.getroot() + tree = defused_parse(xml_file) + root2 = tree.getroot() panel_label = "Panel_PyAEDT_Extensions" - for panel in root.findall("panel"): + for panel in root2.findall("panel"): if panel.get("label") == panel_label: for button in panel.findall("button"): name = button.get("label") @@ -365,7 +366,7 @@ def update_pyaedt(self): data = response.json() released_version = data["info"]["version"] else: - released_version = 0 + return if self.pyaedt_version > released_version: subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) @@ -421,7 +422,7 @@ def update_pyedb(self): data = response.json() released_version = data["info"]["version"] else: - released_version = 0 + return if self.pyedb_version > released_version: subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) From 35d72754c1aca035a79a377fd5b4993ae05d11a1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:18:30 +0000 Subject: [PATCH 21/25] CHORE: Auto fixes from pre-commit.com hooks For more information, see https://pre-commit.ci --- src/ansys/aedt/core/workflows/project/version_manager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 14aa7a58308..8679396b0aa 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -34,7 +34,6 @@ from tkinter import messagebox from tkinter import ttk import webbrowser -from defusedxml.ElementTree import parse as defused_parse import zipfile import PIL.Image @@ -45,6 +44,7 @@ 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 defusedxml.ElementTree import parse as defused_parse import pyedb import requests @@ -61,8 +61,9 @@ def is_git_installed(): try: # Run the command `git --version` - result = subprocess.run(["git", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, - check=True) + result = subprocess.run( + ["git", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True + ) # Check if the command ran successfully if result.returncode == 0: From 9a82b32f59eb3fb2a9e85c2cbbc4544803af57df Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Fri, 7 Feb 2025 15:27:03 +0100 Subject: [PATCH 22/25] DOCS: Update documentation --- .../pyaedt_extensions_doc/project/version_manager.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst b/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst index 604ca105df3..9aab70a8795 100644 --- a/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst +++ b/doc/source/User_guide/pyaedt_extensions_doc/project/version_manager.rst @@ -12,11 +12,11 @@ Features - Show Python virtual environment path - Show Python version - Show the current PyAEDT and PyEDB versions -- Show the latest PyAEDT and PyEDB release available (if connected) -- Update PyAEDT and PyEDB to the latest version -- Install PyAEDT and PyEDB with a specific version - - Default is main, which is the developer version - - Accepted inputs is branch name +- Show the latest PyAEDT and PyEDB release available on PyPI +- Update PyAEDT and PyEDB to the latest version on PyPI +- Install PyAEDT and PyEDB with a branch available on Github + - By default the main development branch is used + - Other existing branch names can be provided - Update PyAEDT and PyEDB from wheelhouse - Check compatibility - Reset and update PyAEDT buttons in AEDT From 7c59c9db0f646fe0927ffef5ec9c26ff07fda88e Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Fri, 7 Feb 2025 15:30:01 +0100 Subject: [PATCH 23/25] REFACTOR: Clean up and extend defusedxml --- .../core/workflows/project/version_manager.py | 138 ++++++++---------- 1 file changed, 59 insertions(+), 79 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index 8679396b0aa..f4bec746207 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -21,8 +21,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -VERSION = "0.3.0" - import os from pathlib import Path import platform @@ -44,7 +42,11 @@ 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 +import defusedxml from defusedxml.ElementTree import parse as defused_parse + +defusedxml.defuse_stdlib() + import pyedb import requests @@ -56,25 +58,7 @@ "Third-Party Software.\n" "Do you want to proceed ?" ) - - -def is_git_installed(): - try: - # Run the command `git --version` - result = subprocess.run( - ["git", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True - ) - - # Check if the command ran successfully - if result.returncode == 0: - print(f"Git is installed: {result.stdout.strip()}") - return True - else: - print("Git is not installed.") - return False - except FileNotFoundError: - print("Git is not installed.") - return False +UNKNOWN_VERSION = "Unknown" def get_latest_version(package_name): @@ -83,13 +67,13 @@ def get_latest_version(package_name): data = response.json() return data["info"]["version"] else: - return "Unknown" + return UNKNOWN_VERSION class VersionManager: - TITLE = "Version Manager {}".format(VERSION) + TITLE = "Version Manager" USER_GUIDE = ( - "https://aedt.docs.pyansys.com/version/stable/User_guide/pyaedt_extensions_doc/project" "/version_manager.html" + "https://aedt.docs.pyansys.com/version/stable/User_guide/pyaedt_extensions_doc/project/version_manager.html" ) UI_WIDTH = 800 UI_HEIGHT = 400 @@ -116,12 +100,12 @@ def pyedb_version(self): return pyedb.version def __init__(self, ui, desktop, aedt_version, personal_lib): + from ansys.aedt.core.workflows.misc import ExtensionTheme + self.desktop = desktop self.aedt_version = aedt_version self.personal_lib = personal_lib - from ansys.aedt.core.workflows.misc import ExtensionTheme - # Configure style for ttk buttons self.style = ttk.Style() self.theme = ExtensionTheme() @@ -310,9 +294,15 @@ def create_ui_extensions(self, parent): button = ttk.Button(frame, text=text, width=20, command=cmd, style="PyAEDT.TButton") button.pack(side="left", padx=10, pady=10) + def is_git_available(self): + res = shutil.which("git") is not None + if not res: + messagebox.showerror("Error: Git Not Found", "Git does not seem to be installed or is not accessible.") + return res + def update_extensions(self): - response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") - if response == "yes": + response = messagebox.askyesno("Confirm Action", "Are you sure you want to proceed?") + if response: toolkits_path = Path(self.personal_lib, "Toolkits") temp = [] for product in toolkits_path.iterdir(): @@ -357,55 +347,65 @@ def update_extensions(self): messagebox.showinfo("Message", "\n".join(msg)) def update_pyaedt(self): - response = messagebox.askquestion("Disclaimer", DISCLAIMER) - - if response == "yes": - url = "https://pypi.org/pypi/pyaedt/json" - response = requests.get(url) + response = messagebox.askyesno("Disclaimer", DISCLAIMER) + + if response: + self.desktop + latest_version = get_latest_version("pyaedt") + if latest_version == UNKNOWN_VERSION: + messagebox.showerror( + "Error: Installation Failed", "PyAEDT version was not correctly retrieved from PyPI." + ) + return - if response.status_code == 200: - data = response.json() - released_version = data["info"]["version"] + if self.pyaedt_version > latest_version: + subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={latest_version}"], check=True) else: + subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) + + self.clicked_refresh(need_restart=True) + + def update_pyedb(self): + response = messagebox.askyesno("Disclaimer", DISCLAIMER) + + if response: + print("Updating pyedb version") + latest_version = get_latest_version("pyedb") + if latest_version == UNKNOWN_VERSION: + messagebox.showerror( + "Error: Installation Failed", "PyEDB version was not correctly retrieved from PyPI." + ) return - if self.pyaedt_version > released_version: - subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={released_version}"], check=True) + if self.pyedb_version > latest_version: + subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={latest_version}"], check=True) else: - subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) + print("Pyedb has been updated") self.clicked_refresh(need_restart=True) def get_pyaedt_branch(self): - if not is_git_installed(): - messagebox.showinfo("Git is not installed") + if not self.is_git_available(): return - response = messagebox.askquestion("Disclaimer", DISCLAIMER) + response = messagebox.askyesno("Disclaimer", DISCLAIMER) - if response == "yes": + if response: branch_name = self.pyaedt_branch_name.get() subprocess.run( - [ - self.python_exe, - "-m", - "pip", - "install", - # "--force-reinstall", - f"git+https://github.com/ansys/pyaedt.git@{branch_name}", - ], + [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyaedt.git@{branch_name}"], check=True, ) self.clicked_refresh(need_restart=True) def get_pyedb_branch(self): - if not is_git_installed(): - messagebox.showinfo("Git is not installed") + if not self.is_git_available(): return - response = messagebox.askquestion("Disclaimer", DISCLAIMER) + response = messagebox.askyesno("Disclaimer", DISCLAIMER) - if response == "yes": + if response: branch_name = self.pyedb_branch_name.get() subprocess.run( [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyedb.git@{branch_name}"], @@ -413,25 +413,6 @@ def get_pyedb_branch(self): ) self.clicked_refresh(need_restart=True) - def update_pyedb(self): - response = messagebox.askquestion("Disclaimer", DISCLAIMER) - if response == "yes": - url = f"https://pypi.org/pypi/pyedb/json" - response = requests.get(url) - - if response.status_code == 200: - data = response.json() - released_version = data["info"]["version"] - else: - return - - if self.pyedb_version > released_version: - subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={released_version}"], check=True) - else: - subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) - - self.clicked_refresh(need_restart=True) - def update_from_wheelhouse(self): file_selected = filedialog.askopenfilename(title="Select Wheelhouse") @@ -495,16 +476,16 @@ def handle_remove_error(func, path, exc_info): os.chmod(path, stat.S_IWRITE) # Add write permission func(path) # Retry the operation - response = messagebox.askquestion("Confirm Action", "Are you sure you want to proceed?") + response = messagebox.askyesno("Confirm Action", "Are you sure you want to proceed?") - if response == "yes": + if response: toolkit_path = os.path.join(self.personal_lib, "Toolkits") if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): msg = [f"Toolkits path {toolkit_path} already exists.", "Are you sure you want to reset toolkits?"] msg = "\n".join(msg) - response = messagebox.askquestion("Confirm Action", msg) - if response == "yes": + response = messagebox.askyesno("Confirm Action", msg) + if response: shutil.rmtree(toolkit_path, onerror=handle_remove_error) else: return @@ -525,7 +506,6 @@ def clicked_refresh(self, need_restart=False): if need_restart is False: self.pyaedt_info.set(f"PyAEDT: {self.pyaedt_version} (Latest {get_latest_version('pyaedt')})") self.pyedb_info.set(f"PyEDB: {self.pyedb_version} (Latest {get_latest_version('pyedb')})") - # messagebox.showinfo("Success", msg) else: self.pyaedt_info.set(f"PyAEDT: {'Please restart'}") self.pyedb_info.set(f"PyEDB: {'Please restart'}") From ab9e9f9a8031d81348cd79830cb1b042ede08296 Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Fri, 7 Feb 2025 15:37:16 +0100 Subject: [PATCH 24/25] FIX: Commit style --- doc/styles/config/vocabularies/ANSYS/accept.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/styles/config/vocabularies/ANSYS/accept.txt b/doc/styles/config/vocabularies/ANSYS/accept.txt index 1bb72d7046b..f1a0a496a82 100644 --- a/doc/styles/config/vocabularies/ANSYS/accept.txt +++ b/doc/styles/config/vocabularies/ANSYS/accept.txt @@ -33,6 +33,7 @@ FEBI FE-BI file_path getters +Github globals [Gg]RPC HDM From 664416975cc3539225ae7b337af63aa07f247b3f Mon Sep 17 00:00:00 2001 From: Sebastien Morais Date: Fri, 7 Feb 2025 16:22:28 +0100 Subject: [PATCH 25/25] CHORE: Fix codacy issues --- .../core/workflows/project/version_manager.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/ansys/aedt/core/workflows/project/version_manager.py b/src/ansys/aedt/core/workflows/project/version_manager.py index f4bec746207..589d3729455 100644 --- a/src/ansys/aedt/core/workflows/project/version_manager.py +++ b/src/ansys/aedt/core/workflows/project/version_manager.py @@ -350,7 +350,6 @@ def update_pyaedt(self): response = messagebox.askyesno("Disclaimer", DISCLAIMER) if response: - self.desktop latest_version = get_latest_version("pyaedt") if latest_version == UNKNOWN_VERSION: messagebox.showerror( @@ -359,9 +358,11 @@ def update_pyaedt(self): return if self.pyaedt_version > latest_version: - subprocess.run([self.python_exe, "-m", "pip", "install", f"pyaedt=={latest_version}"], check=True) + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"pyaedt=={latest_version}"], check=True + ) # nosec else: - subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyaedt"], check=True) # nosec self.clicked_refresh(need_restart=True) @@ -378,9 +379,11 @@ def update_pyedb(self): return if self.pyedb_version > latest_version: - subprocess.run([self.python_exe, "-m", "pip", "install", f"pyedb=={latest_version}"], check=True) + subprocess.run( + [self.python_exe, "-m", "pip", "install", f"pyedb=={latest_version}"], check=True + ) # nosec else: - subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) + subprocess.run([self.python_exe, "-m", "pip", "install", "-U", "pyedb"], check=True) # nosec print("Pyedb has been updated") self.clicked_refresh(need_restart=True) @@ -396,7 +399,7 @@ def get_pyaedt_branch(self): subprocess.run( [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyaedt.git@{branch_name}"], check=True, - ) + ) # nosec self.clicked_refresh(need_restart=True) def get_pyedb_branch(self): @@ -410,7 +413,7 @@ def get_pyedb_branch(self): subprocess.run( [self.python_exe, "-m", "pip", "install", f"git+https://github.com/ansys/pyedb.git@{branch_name}"], check=True, - ) + ) # nosec self.clicked_refresh(need_restart=True) def update_from_wheelhouse(self): @@ -465,7 +468,7 @@ def update_from_wheelhouse(self): "pyaedt[installer]", ], check=True, - ) + ) # nosec self.clicked_refresh(need_restart=True) def reset_pyaedt_buttons_in_aedt(self): @@ -495,7 +498,7 @@ def handle_remove_error(func, path, exc_info): try: add_pyaedt_to_aedt(self.aedt_version, self.personal_lib) messagebox.showinfo("Success", "PyAEDT buttons added in AEDT.") - except subprocess.CalledProcessError as e: + except subprocess.CalledProcessError as e: # nosec messagebox.showerror("Error", f"Error adding buttons to AEDT: {e}") def clicked_refresh(self, need_restart=False):