ADN Club > AutoCAD .NET API
Как получить дерево объектов относительно указанного объекта ? (Python)
izhgtumekhanik:
Добрый день!
сам код:
--- Код - Python [Выбрать] ---from win32com.client import Dispatch, gencacheimport 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
разные! не пойму почему так выходит. в общем не как не могу выйти из замкнутого круга..
izhgtumekhanik:
Ау, вы что же там прячетесь ?
izhgtumekhanik:
Усе, пропало?
izhgtumekhanik:
В общем сделал проверку на уникальность str(type(obj)) в строке объектов - тут есть риск что часть полей объектов -> пропущено.
Больше не вижу вариантов.
izhgtumekhanik:
Но есть но, код очень медленный из за проверок что уже 2 час а он все собирает список.
Навигация
Перейти к полной версии