@@ -1506,7 +1506,7 @@ def oproject(self) -> _OProject:
15061506
15071507 Returns
15081508 -------
1509- Project object
1509+ Project object
15101510
15111511 References
15121512 ----------
@@ -1574,9 +1574,7 @@ def oproject(self, proj_name: str = None) -> None:
15741574 else : # pragma: no cover
15751575 raise RuntimeError ("Project is locked. Close or remove the lock before proceeding." )
15761576 self .logger .info ("AEDT project found. Loading it." )
1577- self ._oproject = self .odesktop .OpenProject (project )
1578- self ._add_handler ()
1579- self .logger .info ("Project %s has been opened." , self ._oproject .GetName ())
1577+ self ._oproject = self ._open_project (project )
15801578 time .sleep (0.5 )
15811579 else :
15821580 oTool = self .odesktop .GetTool ("ImportExport" )
@@ -1602,12 +1600,10 @@ def oproject(self, proj_name: str = None) -> None:
16021600 remove_project_lock (proj_name )
16031601 else : # pragma: no cover
16041602 raise RuntimeError ("Project is locked. Close or remove the lock before proceeding." )
1605- self ._oproject = self .odesktop . OpenProject (proj_name )
1603+ self ._oproject = self ._open_project (proj_name )
16061604 if not is_windows and settings .aedt_version :
16071605 time .sleep (1 )
16081606 self .desktop_class .close_windows ()
1609- self ._add_handler ()
1610- self .logger .info ("Project %s has been opened." , self ._oproject .GetName ())
16111607 time .sleep (0.5 )
16121608 elif settings .force_error_on_missing_project and ".aedt" in proj_name :
16131609 raise Exception ("Project doesn't exist. Check it and retry." )
@@ -1652,6 +1648,43 @@ def _add_handler(self) -> None:
16521648 project_name = self .project_name ,
16531649 )
16541650
1651+ @pyaedt_function_handler ()
1652+ def _open_project (self , project_path : str ) -> _OProject :
1653+ """Open a project and ensure the active project object is resolved.
1654+
1655+ This centralizes logic around calling ``oDesktop.OpenProject`` and
1656+ handling cases where the method does not return the project object
1657+ correctly by falling back to ``check_if_project_is_loaded``.
1658+
1659+ Returns
1660+ -------
1661+ Project object
1662+
1663+ References
1664+ ----------
1665+ >>> oDesktop.OpenProject
1666+
1667+ """
1668+ if is_project_locked (project_path ):
1669+ if self ._remove_lock : # pragma: no cover
1670+ self .logger .warning ("Project is locked. Removing it and opening." )
1671+ remove_project_lock (project_path )
1672+ else : # pragma: no cover
1673+ raise RuntimeError ("Project is locked. Close or remove the lock before proceeding." )
1674+
1675+ proj = self .odesktop .OpenProject (project_path )
1676+ if not proj :
1677+ pname = self .check_if_project_is_loaded (project_path )
1678+ if not pname : # pragma: no cover
1679+ raise Exception ("Failed to open project due to unexpected reason. Check it and retry." )
1680+ proj = self .desktop_class .active_project (pname )
1681+
1682+ # Ensure handlers and logging are set up for the opened project.
1683+ self ._oproject = proj
1684+ self ._add_handler ()
1685+ self .logger .info ("Project %s has been opened." , self ._oproject .GetName ())
1686+ return cast (_OProject , proj )
1687+
16551688 @property
16561689 def desktop_install_dir (self ) -> str :
16571690 """AEDT installation directory.
@@ -3156,7 +3189,7 @@ def load_project(
31563189 >>> app.load_project(r"C:\\ temp\\ project.aedt")
31573190
31583191 """
3159- proj = self .odesktop . OpenProject (file_name )
3192+ proj = self ._open_project (file_name )
31603193 if close_active and self .oproject :
31613194 self ._close_edb ()
31623195 self .close_project (self .project_name , save = set_active )
@@ -4289,7 +4322,7 @@ def copy_design_from(
42894322 project = Path (project )
42904323 # open the origin project
42914324 if project .exists ():
4292- proj_from = self .odesktop . OpenProject (str (project ))
4325+ proj_from = self ._open_project (str (project ))
42934326 proj_from_name = proj_from .GetName ()
42944327 else :
42954328 return None
0 commit comments