78 lines
2.9 KiB
Python
78 lines
2.9 KiB
Python
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) # Индексация с 1
|
||
|
||
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 |