import os import traceback import pythoncom from win32com.client import Dispatch, gencache ids = { "api_5": "{0422828C-F174-495E-AC5D-D31014DBBE87}", "api_7": "{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", "const": "{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", } class KompasDocumentParser: def __init__(self): self.api5 = None self.api7 = None self.constants = None self.application = None self._init_kompas() def _init_kompas(self): """Инициализация API КОМПАС версий 5 и 7""" try: import pythoncom pythoncom.CoInitialize() # Получаем API версии 5 self.api5_module = gencache.EnsureModule(ids["api_5"], 0, 1, 0) self.api5 = self.api5_module.KompasObject( Dispatch("Kompas.Application.5")._oleobj_.QueryInterface( self.api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch ) ) # Получаем API версии 7 self.api7_module = gencache.EnsureModule(ids["api_7"], 0, 1, 0) self.api7 = self.api7_module.IKompasAPIObject( Dispatch("Kompas.Application.7")._oleobj_.QueryInterface( self.api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch ) ) # Получаем константы constants_module = gencache.EnsureModule(ids["const"], 0, 1, 0) self.constants = constants_module.constants # Правильное получение IApplication self.application = self.api7_module.IApplication(self.api7) self.application.Visible = True except Exception as e: # Выводим полный traceback и сообщение об ошибке print("[ERROR] Ошибка при подключении к КОМПАС:") traceback.print_exc() # <-- Выводит номер строки, файл и стек raise RuntimeError(f"Ошибка при подключении к КОМПАС: {e}") def get_open_documents(self): """Возвращает список информации о всех открытых документах""" documents = [] docs_collection = self.application.Documents for i in range(docs_collection.Count): try: doc = docs_collection.Item(i) # Индексация с 1 if doc is None: continue documents.append( { "type": doc.DocumentType, "name": doc.Name, "path": doc.Path, "active": doc.Active, } ) except Exception as e: print(f"Ошибка при обработке документа #{i + 1}: {e}") return documents # --- Заглушки для действий --- def get_all_sheets(self): """Заглушка: Извлечение данных о листовых деталях""" pass def save_to_iges(self): """Заглушка: Экспорт в IGES""" pass def collect_statistics(self): """Заглушка: Сбор статистики по элементам, гибам и сваркам""" pass def export_to_raster(self): """Заглушка: Экспорт в растровый формат""" pass def get_available_actions(self): """ Возвращает список доступных действий и допустимые типы документов Формат: { action_key: { 'label': str, 'allowed_types': list } } """ # Допустимые типы документов ALLOWED_TYPES_3D = [ self.constants.ksDocumentPart, self.constants.ksDocumentAssembly, ] ALLOWED_TYPES_2D = [ self.constants.ksDocumentDrawing, self.constants.ksDocumentFragment, ] ALLOWED_TYPES_SPEC = [self.constants.ksDocumentSpecification] ALLOWED_TYPES_ALL = ALLOWED_TYPES_3D + ALLOWED_TYPES_2D + ALLOWED_TYPES_SPEC return { "iges": { "label": "Сохранить как IGES", "allowed_types": ALLOWED_TYPES_3D, }, "stats": { "label": "Собрать статистику по элементам", "allowed_types": ALLOWED_TYPES_3D, }, "export_pdf": { "label": "Экспортировать в PDF", "allowed_types": ALLOWED_TYPES_2D + ALLOWED_TYPES_SPEC, }, "project_support": { "label": "Создать чертежи деталей", "allowed_types": ALLOWED_TYPES_3D, }, }