67 lines
2.4 KiB
Python
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)
|