135 lines
5.0 KiB
Python
135 lines
5.0 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
|
||
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,
|
||
},
|
||
}
|