- from win32com.client import Dispatch, gencache 
- import inspect 
-   
- def filtr_obj(obj): 
-     """Возвращает список имён COM-объектов, в которые можно зайти.""" 
-     tmp = [] 
-      
-     # получаем тип объекта 
-     type_obj = str(type(obj)) 
-      
-     # если это com объект а не штатная функция 
-     if "win32com" in type_obj and not inspect.isbuiltin(obj) and not inspect.isfunction(obj): 
-          
-         listNames = dir(obj) 
-         for iName in listNames: 
-             if not iName.startswith("_") or not iName.endswith("_"): 
-                 tmp.append(iName) 
-      
-     return tmp 
-   
- def explore(obj, path, depth, max_depth, results, visited): 
-     """Рекурсивно обходит дерево объектов COM API.""" 
-     if depth > max_depth: 
-         return 
-   
-     for name in filtr_obj(obj): 
-         full_path = f"{path}.{name}" if path else name 
-   
-         try: 
-             value = getattr(obj, name) 
-         except Exception: 
-             # Если не удаётся получить атрибут — просто записываем путь и идём дальше 
-             results.append(full_path) 
-             continue 
-   
-         results.append(full_path) 
-   
-         # Чтобы избежать зацикливания (одни и те же объекты в разных местах) 
-         if id(value) not in visited: 
-             visited.add(id(value)) 
-             explore(value, full_path, depth + 1, max_depth, results, visited) 
-   
- # ------------------- Запуск ------------------- 
- AcadAPI = gencache.EnsureModule('{5B3245BE-661C-4324-BB55-3AD94EBBFDD7}', 0, 1, 0) 
- AcadObject = Dispatch('AutoCAD.Application.21', None, AcadAPI.IAcadApplication.CLSID) 
-   
- results = [] 
- visited = set() 
- explore(AcadObject, AcadObject.__class__.__name__, 1, max_depth=30, results=results, visited=visited) 
-   
- with open("acad_object_tree.txt", "w", encoding="utf-8") as f: 
-     f.write("\n".join(results)) 
-   
- print(f"Объектов собрано: {len(results)}") 
-