client/bridge.py

67 lines
2.4 KiB
Python

# 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)