From 3c2fcffd0d7c263aa655ea4e0d0f4c3aafbd1eb7 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:54:49 +0300 Subject: [PATCH] moved web ui logic to web tool/core --- src/blenderbim/blenderbim/core/search.py | 4 -- src/blenderbim/blenderbim/core/tool.py | 5 ++ src/blenderbim/blenderbim/core/web.py | 2 + src/blenderbim/blenderbim/tool/search.py | 62 -------------------- src/blenderbim/blenderbim/tool/web.py | 73 ++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 66 deletions(-) create mode 100644 src/blenderbim/blenderbim/core/web.py create mode 100644 src/blenderbim/blenderbim/tool/web.py diff --git a/src/blenderbim/blenderbim/core/search.py b/src/blenderbim/blenderbim/core/search.py index 11644d128e..0fe60fdb65 100644 --- a/src/blenderbim/blenderbim/core/search.py +++ b/src/blenderbim/blenderbim/core/search.py @@ -1,6 +1,2 @@ def show_scene_elements(spatial): spatial.show_scene_objects() - - -def open_web_ui(search): - search.open_web_ui() diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index ef9bba0159..1cbe4ef714 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -1015,3 +1015,8 @@ class Voider: def set_void_display(cls, opening_obj): pass def unvoid(cls, opening_obj): pass def void(cls, opening_obj, building_obj): pass + + +@interface +class Web: + pass \ No newline at end of file diff --git a/src/blenderbim/blenderbim/core/web.py b/src/blenderbim/blenderbim/core/web.py new file mode 100644 index 0000000000..47e173ef3f --- /dev/null +++ b/src/blenderbim/blenderbim/core/web.py @@ -0,0 +1,2 @@ +def open_web_ui(web): + web.open_web_ui() diff --git a/src/blenderbim/blenderbim/tool/search.py b/src/blenderbim/blenderbim/tool/search.py index 950a057816..b88a254254 100644 --- a/src/blenderbim/blenderbim/tool/search.py +++ b/src/blenderbim/blenderbim/tool/search.py @@ -13,11 +13,6 @@ import threading import websockets import json -CONNECTION_CHECK_DELAY = 10 -connected_sockets = set() -websocket_server: websockets.WebSocketServer -ws_thread_loop = asyncio.new_event_loop() - class Search(blenderbim.core.tool.Search): @classmethod @@ -124,63 +119,6 @@ class Search(blenderbim.core.tool.Search): return value return '"' + value.replace('"', '\\"') + '"' - @classmethod - def get_webui_data(cls): - data = {} - data["ifc_file"] = bpy.context.scene.BIMProperties.ifc_file - return json.dumps(data) - - @classmethod - async def broadcast(cls, message): - for sock in connected_sockets: - await sock.send(message) - - @classmethod - async def ws_server_handler(cls, websocket): - connected_sockets.add(websocket) - intial_data = cls.get_webui_data() - await cls.broadcast(intial_data) - try: - async for message in websocket: - # TODO: handle incoming messages - continue - finally: - connected_sockets.remove(websocket) - - @classmethod - async def run_ws_server(cls): - websocket_server = await websockets.serve(cls.ws_server_handler, "localhost", 8765) - print("Web-UI WebSocket server started.") - - # Check if a client is connected every 10 seconds - async def check_connections(): - while True: - await asyncio.sleep(CONNECTION_CHECK_DELAY) - if not connected_sockets: - print("No Web-UI connected, shutting down the WebSocket server") - websocket_server.close() - break - - await check_connections() - await websocket_server.wait_closed() - - @classmethod - def open_web_ui(cls): - def set_thread_loop(): - asyncio.set_event_loop(ws_thread_loop) - asyncio.run(cls.run_ws_server()) - - wserver_thread = threading.Thread(target=set_thread_loop) - wserver_thread.daemon = True - wserver_thread.start() - - def open_browser(): - webbrowser.open("file://" + os.path.join(bpy.context.scene.BIMProperties.data_dir, "webui", "index.html")) - - # Delay for 2 seconds before openning browser - timer = threading.Timer(2.0, open_browser) - timer.start() - class ImportFilterQueryTransformer(lark.Transformer): def __init__(self, filter_groups): diff --git a/src/blenderbim/blenderbim/tool/web.py b/src/blenderbim/blenderbim/tool/web.py new file mode 100644 index 0000000000..23f158c700 --- /dev/null +++ b/src/blenderbim/blenderbim/tool/web.py @@ -0,0 +1,73 @@ +import bpy +import json +import blenderbim.core.tool +from typing import Union, Literal +import os +import webbrowser +import asyncio +import threading +import websockets +import json + +CONNECTION_CHECK_DELAY = 10 +connected_sockets = set() +websocket_server: websockets.WebSocketServer +ws_thread_loop = asyncio.new_event_loop() + +class Web(blenderbim.core.tool.Web): + @classmethod + def get_webui_data(cls): + data = {} + data["ifc_file"] = bpy.context.scene.BIMProperties.ifc_file + return json.dumps(data) + + @classmethod + async def broadcast(cls, message): + for sock in connected_sockets: + await sock.send(message) + + @classmethod + async def ws_server_handler(cls, websocket): + connected_sockets.add(websocket) + intial_data = cls.get_webui_data() + await cls.broadcast(intial_data) + try: + async for message in websocket: + # TODO: handle incoming messages + continue + finally: + connected_sockets.remove(websocket) + + @classmethod + async def run_ws_server(cls): + websocket_server = await websockets.serve(cls.ws_server_handler, "localhost", 8765) + print("Web-UI WebSocket server started.") + + # Check if a client is connected every 10 seconds + async def check_connections(): + while True: + await asyncio.sleep(CONNECTION_CHECK_DELAY) + if not connected_sockets: + print("No Web-UI connected, shutting down the WebSocket server") + websocket_server.close() + break + + await check_connections() + await websocket_server.wait_closed() + + @classmethod + def open_web_ui(cls): + def set_thread_loop(): + asyncio.set_event_loop(ws_thread_loop) + asyncio.run(cls.run_ws_server()) + + wserver_thread = threading.Thread(target=set_thread_loop) + wserver_thread.daemon = True + wserver_thread.start() + + def open_browser(): + webbrowser.open("file://" + os.path.join(bpy.context.scene.BIMProperties.data_dir, "webui", "index.html")) + + # Delay for 2 seconds before openning browser + timer = threading.Timer(2.0, open_browser) + timer.start()