# bridge.py import json import time from PyQt6.QtCore import QObject, QVariant, pyqtSlot, pyqtSignal, QTimer from PyQt6.QtWebChannel import QWebChannel from PyQt6.QtWebEngineWidgets import QWebEngineView from enums import KompasCommand from logger import logger from parser.main import KompasDocumentParser class PythonEventEmitter(QObject): onEvent = pyqtSignal(str, "QVariantMap") # событие: тип + данные def format_response(success: bool, data=None, error: str = None): return json.dumps( {"status": "success" if success else "error", "data": data, "error": error}, ensure_ascii=False, ) class PythonJSBridge(QObject): def __init__(self, browser: QWebEngineView): super().__init__() self.browser = browser self.channel = QWebChannel() self.browser.page().setWebChannel(self.channel) self.emitter = PythonEventEmitter() self.channel.registerObject("pyjs", self) self.channel.registerObject("pyjs_events", self.emitter) self.kompas = KompasDocumentParser() @pyqtSlot(str, str, result=str) def callFromJS(self, command: str, data_json: str): logger.info(f"[Python] Получена команда: {command}") try: if command == KompasCommand.OPEN_KOMPAS: data = self.kompas.get_open_documents() elif command == KompasCommand.GET_AVAILABLE_ACTIONS: data = self.kompas.get_available_actions() elif command == KompasCommand.IGES: data = self.kompas.save_to_iges() # <-- твой метод elif command == KompasCommand.EXPORT_RASTER: data = self.kompas.export_to_raster() elif command == KompasCommand.PROJECT_SUPPORT: data = self.kompas.create_drawing_for_parts() elif command == KompasCommand.STATS: data = self.kompas.collect_statistics() else: return format_response(False, error=f"Неизвестная команда: {command}") return format_response(True, data=data) except Exception as e: logger.error(f"Ошибка при выполнении команды {command}: {e}", exc_info=True) return format_response(False, error=str(e)) def send_event_to_js(self, event_type: str, data: dict): self.emitter.onEvent.emit(event_type, data)