From 01b93ebcd6839e18b928488bdac25bef0e0f2262 Mon Sep 17 00:00:00 2001 From: Hui Zhou Date: Fri, 7 Feb 2025 19:41:50 +0100 Subject: [PATCH] FEAT: New extension version manager (#5702) Co-authored-by: ring630 <@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Samuelopez-ansys --- doc/source/User_guide/extensions.rst | 7 + .../project/version_manager.rst | 22 + .../_static/extensions/version_manager.png | Bin 0 -> 17528 bytes .../config/vocabularies/ANSYS/accept.txt | 1 + .../project/images/large/version_manager.png | Bin 0 -> 855 bytes .../workflows/project/toolkits_catalog.toml | 7 + .../core/workflows/project/version_manager.py | 547 ++++++++++++++++++ 7 files changed, 584 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 create mode 100644 src/ansys/aedt/core/workflows/project/images/large/version_manager.png create mode 100644 src/ansys/aedt/core/workflows/project/version_manager.py diff --git a/doc/source/User_guide/extensions.rst b/doc/source/User_guide/extensions.rst index 6d6cb96ae67..2d0a7afe8b8 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 + + Manage 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..9aab70a8795 --- /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 and PyEDB versions +- 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 diff --git a/doc/source/_static/extensions/version_manager.png b/doc/source/_static/extensions/version_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..f4998bf1fac7295cce0b68abea2b65fdbd07f3e1 GIT binary patch literal 17528 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 literal 0 HcmV?d00001 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 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 latest_version: + 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) # nosec + + 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.pyedb_version > latest_version: + 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) # nosec + + print("Pyedb has been updated") + self.clicked_refresh(need_restart=True) + + def get_pyaedt_branch(self): + if not self.is_git_available(): + return + + response = messagebox.askyesno("Disclaimer", DISCLAIMER) + + if response: + branch_name = self.pyaedt_branch_name.get() + 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): + if not self.is_git_available(): + return + + response = messagebox.askyesno("Disclaimer", DISCLAIMER) + + 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}"], + check=True, + ) # nosec + 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_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( + [ + "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(["", "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, + ) # nosec + 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.askyesno("Confirm Action", "Are you sure you want to proceed?") + + if response: + toolkit_path = os.path.join(self.personal_lib, "Toolkits") + + if os.path.isdir(toolkit_path) and os.path.exists(toolkit_path): + msg = [f"Toolkits path {toolkit_path} already exists.", "Are you sure you want to reset toolkits?"] + msg = "\n".join(msg) + response = messagebox.askyesno("Confirm Action", msg) + if response: + shutil.rmtree(toolkit_path, onerror=handle_remove_error) + else: + return + + from ansys.aedt.core.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: # nosec + 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')})") + 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 = 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) + + 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 = tkinter.Tk() + app = VersionManager(root, **kwargs) + root.mainloop()