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)}")