From 89fb59307c1776f33ef54f174512a96bf2707cf2 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:00:33 +0300 Subject: [PATCH] add disconnection from server functionality had to refactor how the server connects --- .../blenderbim/bim/module/web/__init__.py | 1 + .../blenderbim/bim/module/web/operator.py | 10 +++++++++ .../blenderbim/bim/module/web/ui.py | 3 +++ src/blenderbim/blenderbim/core/web.py | 7 ++++++- src/blenderbim/blenderbim/tool/web.py | 21 +++++++++++++------ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/web/__init__.py b/src/blenderbim/blenderbim/bim/module/web/__init__.py index 920fb01d57..31737cc334 100644 --- a/src/blenderbim/blenderbim/bim/module/web/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/web/__init__.py @@ -21,6 +21,7 @@ from . import ui, prop, operator classes = ( operator.ConnectToWebsocketServer, + operator.DisconnectWebsocketServer, operator.killWebsocketServer, prop.WebProperties, ui.BIM_PT_webui, diff --git a/src/blenderbim/blenderbim/bim/module/web/operator.py b/src/blenderbim/blenderbim/bim/module/web/operator.py index 001b050fd9..25d47a4adb 100644 --- a/src/blenderbim/blenderbim/bim/module/web/operator.py +++ b/src/blenderbim/blenderbim/bim/module/web/operator.py @@ -37,6 +37,16 @@ class ConnectToWebsocketServer(bpy.types.Operator): return {"FINISHED"} +class DisconnectWebsocketServer(bpy.types.Operator): + bl_idname = "bim.disconnect_websocket_server" + bl_label = "Disconnect from websocket server" + bl_description = "disconnect from current websocket server" + + def execute(self, context): + core.disconnect_websocket_server(tool.Web) + return {"FINISHED"} + + class killWebsocketServer(bpy.types.Operator): bl_idname = "bim.kill_websocket_server" bl_label = "Kill websocket server" diff --git a/src/blenderbim/blenderbim/bim/module/web/ui.py b/src/blenderbim/blenderbim/bim/module/web/ui.py index 544ad13cd8..15cc46b774 100644 --- a/src/blenderbim/blenderbim/bim/module/web/ui.py +++ b/src/blenderbim/blenderbim/bim/module/web/ui.py @@ -50,3 +50,6 @@ class BIM_PT_webui(Panel): row = layout.row() row.operator("bim.kill_websocket_server") + + row = layout.row() + row.operator("bim.disconnect_websocket_server") diff --git a/src/blenderbim/blenderbim/core/web.py b/src/blenderbim/blenderbim/core/web.py index 7e787c72d6..dd6cd11911 100644 --- a/src/blenderbim/blenderbim/core/web.py +++ b/src/blenderbim/blenderbim/core/web.py @@ -18,7 +18,12 @@ def connect_websocket_server(web, port): web.set_is_connected(True) +def disconnect_websocket_server(web): + web.disconnect_websocket_server() + web.set_is_connected(False) + + def kill_websocket_server(web): + web.kill_websocket_server() web.set_is_running(False) web.set_is_connected(False) - web.kill_websocket_server() diff --git a/src/blenderbim/blenderbim/tool/web.py b/src/blenderbim/blenderbim/tool/web.py index b56d31ead2..2952cd63b8 100644 --- a/src/blenderbim/blenderbim/tool/web.py +++ b/src/blenderbim/blenderbim/tool/web.py @@ -66,12 +66,13 @@ class Web(blenderbim.core.tool.Web): @classmethod def connect_websocket_server(cls, port): - def set_thread_loop(url): - asyncio.set_event_loop(ws_thread_loop) - asyncio.run(cls.sio_connect(url)) + def start_thread_loop(url): + global ws_thread_loop + ws_thread_loop = asyncio.new_event_loop() + ws_thread_loop.run_until_complete(cls.sio_connect(url)) - ws_url = "ws://localhost:" + str(port) + "/blender" - wserver_thread = threading.Thread(target=set_thread_loop, args=(ws_url)) + ws_url = f"ws://localhost:{port}/blender" + wserver_thread = threading.Thread(target=start_thread_loop, args=(ws_url,)) wserver_thread.daemon = True wserver_thread.start() @@ -83,7 +84,15 @@ class Web(blenderbim.core.tool.Web): # sio.on("data", test.message_handler, namespace="/blender") # await sio.emit("data", {"from": "client"}, namespace="/blender") - await sio.wait() + + @classmethod + def disconnect_websocket_server(cls): + ws_thread_loop.run_until_complete(cls.sio_disconnect()) + print("Disconnected from websocket server") + + @classmethod + async def sio_disconnect(cls): + await sio.disconnect() @classmethod def kill_websocket_server(cls):