ADN Club > AutoCAD .NET API

Как получить дерево объектов относительно указанного объекта ? (Python)

(1/2) > >>

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 час а он все собирает список.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии