diff --git a/src/blenderbim/blenderbim/bim/module/web/operator.py b/src/blenderbim/blenderbim/bim/module/web/operator.py index 85fa952242..001b050fd9 100644 --- a/src/blenderbim/blenderbim/bim/module/web/operator.py +++ b/src/blenderbim/blenderbim/bim/module/web/operator.py @@ -28,11 +28,11 @@ class ConnectToWebsocketServer(bpy.types.Operator): bl_description = "Start/Connect to a Websocket server" def execute(self, context): - port = context.scene.WebProperties.Webserver_port + port = context.scene.WebProperties.webserver_port if port == 0: - context.scene.WebProperties.Webserver_port = core.generate_port_number(tool.Web) + context.scene.WebProperties.webserver_port = core.generate_port_number(tool.Web) - port = context.scene.WebProperties.Webserver_port + port = context.scene.WebProperties.webserver_port core.connect_websocket_server(tool.Web, port) return {"FINISHED"} @@ -43,4 +43,5 @@ class killWebsocketServer(bpy.types.Operator): bl_description = "Kill running websocket server" def execute(self, context): + core.kill_websocket_server(tool.Web) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/web/prop.py b/src/blenderbim/blenderbim/bim/module/web/prop.py index e6b3623914..e4014fad6a 100644 --- a/src/blenderbim/blenderbim/bim/module/web/prop.py +++ b/src/blenderbim/blenderbim/bim/module/web/prop.py @@ -31,4 +31,5 @@ from bpy.props import ( class WebProperties(PropertyGroup): - Webserver_port: IntProperty(name="Webserver Port") + webserver_port: IntProperty(name="Webserver Port") + show_webserver_running: BoolProperty(name="Show Webserver Running", default=False) diff --git a/src/blenderbim/blenderbim/bim/module/web/ui.py b/src/blenderbim/blenderbim/bim/module/web/ui.py index 17dc3bff3a..bd0b653bf6 100644 --- a/src/blenderbim/blenderbim/bim/module/web/ui.py +++ b/src/blenderbim/blenderbim/bim/module/web/ui.py @@ -35,7 +35,11 @@ class BIM_PT_webui(Panel): props = scene.WebProperties row = layout.row() - row.prop(props, "Webserver_port", text="Webserver Port") + row.prop(props, "webserver_port", text="Webserver Port") + + if props.show_webserver_running: + row = layout.row() + row.label(text=f"Web Server running on port {props.webserver_port}") row = layout.row() row.operator("bim.connect_websocket_server") diff --git a/src/blenderbim/blenderbim/core/web.py b/src/blenderbim/blenderbim/core/web.py index 20cd85908d..b7255b20f8 100644 --- a/src/blenderbim/blenderbim/core/web.py +++ b/src/blenderbim/blenderbim/core/web.py @@ -10,5 +10,13 @@ def connect_websocket_server(web, port): # check if port already has a server listening to it if web.is_port_available(port): web.start_websocket_server(port) + web.show_webserver_running() + else: + web.hide_webserver_running() web.connect_websocket_server(port) + + +def kill_websocket_server(web): + web.kill_websocket_server() + web.hide_webserver_running() diff --git a/src/blenderbim/blenderbim/tool/web.py b/src/blenderbim/blenderbim/tool/web.py index acf5f36638..790ccb1052 100644 --- a/src/blenderbim/blenderbim/tool/web.py +++ b/src/blenderbim/blenderbim/tool/web.py @@ -22,6 +22,7 @@ import blenderbim.core.tool from typing import Union, Literal import socket import os +import subprocess import webbrowser import asyncio import threading @@ -32,6 +33,7 @@ CONNECTION_CHECK_DELAY = 10 connected_sockets = set() websocket_server: websockets.WebSocketServer ws_thread_loop = asyncio.new_event_loop() +ws_process = None class Web(blenderbim.core.tool.Web): @@ -55,12 +57,39 @@ class Web(blenderbim.core.tool.Web): @classmethod def start_websocket_server(cls, port): - pass + global ws_process + ws_path = os.path.join(bpy.context.scene.BIMProperties.data_dir, "webui", "app.py") + + env = os.environ.copy() + env["FLASK_APP"] = ws_path + + ws_process = subprocess.Popen(["flask", "run", str(port), "--debug"], env=env) @classmethod def connect_websocket_server(cls, port): pass + @classmethod + def kill_websocket_server(cls): + global ws_process + + if ws_process is None: + print("No webserver running") + return + + ws_process.terminate() + ws_process.wait() + print("Webserver terminated successfully") + ws_process = None + + @classmethod + def show_webserver_running(cls): + bpy.context.scene.WebProperties.show_webserver_running = True + + @classmethod + def hide_webserver_running(cls): + bpy.context.scene.WebProperties.show_webserver_running = False + @classmethod def get_webui_data(cls): data = {}