21
AutoCAD .NET API / Как получить дерево объектов относительно указанного объекта ? (Python)
« Последний ответ от izhgtumekhanik 14-08-2025, 14:36:58 »Добрый день!
сам код:
столкнулся с проблемой зацикливания - вот пример:
IAcadApplication.ActiveDocument.ActiveDimStyle.Application.ActiveDocument.ActiveDimStyle.Application.ActiveDocument.Application. и так далее
в коде можно понять что идентификаторы объектов:
IAcadApplication.ActiveDocument
и
IAcadApplication.ActiveDocument.ActiveDimStyle.Application.ActiveDocument
разные! не пойму почему так выходит. в общем не как не могу выйти из замкнутого круга..
сам код:
Код - Python [Выбрать]
- 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)}")
столкнулся с проблемой зацикливания - вот пример:
IAcadApplication.ActiveDocument.ActiveDimStyle.Application.ActiveDocument.ActiveDimStyle.Application.ActiveDocument.Application. и так далее
в коде можно понять что идентификаторы объектов:
IAcadApplication.ActiveDocument
и
IAcadApplication.ActiveDocument.ActiveDimStyle.Application.ActiveDocument
разные! не пойму почему так выходит. в общем не как не могу выйти из замкнутого круга..