first method

This commit is contained in:
ksenia_mikhailova 2025-06-24 10:57:05 +03:00
parent 6f0a50ccff
commit a922331793
6 changed files with 134 additions and 22 deletions

View File

@ -5,6 +5,8 @@ from PyQt6.QtCore import QObject, QVariant, pyqtSlot, pyqtSignal, QTimer
from PyQt6.QtWebChannel import QWebChannel from PyQt6.QtWebChannel import QWebChannel
from PyQt6.QtWebEngineWidgets import QWebEngineView from PyQt6.QtWebEngineWidgets import QWebEngineView
from enums import KompasCommand
from parser.main import KompasDocumentParser
class PythonEventEmitter(QObject): class PythonEventEmitter(QObject):
onEvent = pyqtSignal(str, "QVariantMap") # событие: тип + данные onEvent = pyqtSignal(str, "QVariantMap") # событие: тип + данные
@ -22,31 +24,17 @@ class PythonJSBridge(QObject):
self.channel.registerObject("pyjs", self) self.channel.registerObject("pyjs", self)
self.channel.registerObject("pyjs_events", self.emitter) self.channel.registerObject("pyjs_events", self.emitter)
# Запуск таймера для отправки событий self.kompas = KompasDocumentParser()
self.timer = QTimer()
self.timer.timeout.connect(self.send_timer_event)
self.timer.start(1000) # раз в секунду
@pyqtSlot(str, str, result=str) @pyqtSlot(str, str, result=str)
def callFromJS(self, command: str, data_json: str): def callFromJS(self, command: str, data_json: str):
print(f"[Python] Получена команда: {command}") print(f"[Python] Получена команда: {command}")
data = None
if command == KompasCommand.OPEN_KOMPAS:
data = self.kompas.get_open_documents()
if command == "init": return json.dumps(data)
return json.dumps({"status": "ok", "message": "Инициализация завершена"})
elif command == "get_data":
return json.dumps([["A1", "B1"], ["A2", "B2"]])
elif command == "get_sheets":
return json.dumps(["Sheet1", "Sheet2"])
return json.dumps(None)
def send_event_to_js(self, event_type: str, data: dict): def send_event_to_js(self, event_type: str, data: dict):
self.emitter.onEvent.emit(event_type, data) self.emitter.onEvent.emit(event_type, data)
def send_timer_event(self):
current_time = time.strftime("%H:%M:%S")
print(f"[Python] Отправка события: {current_time}")
self.emitter.onEvent.emit("timer", {"time": current_time})

8
enums.py Normal file
View File

@ -0,0 +1,8 @@
from enum import Enum
class KompasCommand(str, Enum):
OPEN_KOMPAS = "open_kompas"
@classmethod
def has_value(cls, value):
return any(value == item.value for item in cls)

13
main.py
View File

@ -1,11 +1,19 @@
# main.py # main.py
import sys import sys
import pythoncom
from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt6.QtWebEngineWidgets import QWebEngineView from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl from PyQt6.QtCore import QUrl, QThread
from config import MAIN_URL from config import MAIN_URL
from bridge import PythonJSBridge from bridge import PythonJSBridge
from parser.main import KompasDocumentParser
class KompasWorker(QThread):
def run(self):
pythoncom.CoInitialize()
self.parser = KompasDocumentParser()
class BrowserWindow(QMainWindow): class BrowserWindow(QMainWindow):
@ -14,6 +22,9 @@ class BrowserWindow(QMainWindow):
self.setWindowTitle("QT6 Браузер") self.setWindowTitle("QT6 Браузер")
self.resize(1000, 800) self.resize(1000, 800)
self.kompas_thread = KompasWorker()
self.kompas_thread.start()
container = QWidget() container = QWidget()
layout = QVBoxLayout() layout = QVBoxLayout()

0
parser/__init__.py Normal file
View File

78
parser/main.py Normal file
View File

@ -0,0 +1,78 @@
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

27
parser/worker.py Normal file
View File

@ -0,0 +1,27 @@
# kompas_worker.py
from PyQt6.QtCore import QObject, pyqtSignal
import pythoncom
from parser.main import KompasDocumentParser
class KompasWorker(QObject):
result_ready = pyqtSignal(object)
error_occurred = pyqtSignal(str)
def run_kompas(self):
try:
# Инициализируем COM правильно
pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
# Выполняем работу с КОМПАС
parser = KompasDocumentParser()
documents = parser.get_open_documents()
# Отправляем результат обратно
self.result_ready.emit(documents)
except Exception as e:
import traceback
error_msg = f"[Ошибка] {e}\n{traceback.format_exc()}"
self.error_occurred.emit(error_msg)
finally:
pythoncom.CoUninitialize()