diff --git a/src/blenderbim/blenderbim/bim/module/web/operator.py b/src/blenderbim/blenderbim/bim/module/web/operator.py
index 6331c851f9..85fa952242 100644
--- a/src/blenderbim/blenderbim/bim/module/web/operator.py
+++ b/src/blenderbim/blenderbim/bim/module/web/operator.py
@@ -15,16 +15,25 @@
#
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see .
+
import os
import bpy
+import blenderbim.core.web as core
+import blenderbim.tool as tool
class ConnectToWebsocketServer(bpy.types.Operator):
- bl_idname = "bim.connect_to_websocket_server"
- bl_label = "Connect to websocket server"
- bl_description = "Connect to a websocket server"
+ bl_idname = "bim.connect_websocket_server"
+ bl_label = "Connect/Start websocket server"
+ bl_description = "Start/Connect to a Websocket server"
def execute(self, context):
+ port = context.scene.WebProperties.Webserver_port
+ if port == 0:
+ context.scene.WebProperties.Webserver_port = core.generate_port_number(tool.Web)
+
+ port = context.scene.WebProperties.Webserver_port
+ core.connect_websocket_server(tool.Web, port)
return {"FINISHED"}
diff --git a/src/blenderbim/blenderbim/bim/module/web/prop.py b/src/blenderbim/blenderbim/bim/module/web/prop.py
index 85dedc1d79..e6b3623914 100644
--- a/src/blenderbim/blenderbim/bim/module/web/prop.py
+++ b/src/blenderbim/blenderbim/bim/module/web/prop.py
@@ -31,4 +31,4 @@ from bpy.props import (
class WebProperties(PropertyGroup):
- Webserver_port: StringProperty(name="Webserver Port")
+ Webserver_port: IntProperty(name="Webserver Port")
diff --git a/src/blenderbim/blenderbim/bim/module/web/ui.py b/src/blenderbim/blenderbim/bim/module/web/ui.py
index 84f8556999..17dc3bff3a 100644
--- a/src/blenderbim/blenderbim/bim/module/web/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/web/ui.py
@@ -38,7 +38,7 @@ class BIM_PT_webui(Panel):
row.prop(props, "Webserver_port", text="Webserver Port")
row = layout.row()
- row.operator("bim.connect_to_websocket_server")
+ row.operator("bim.connect_websocket_server")
row = layout.row()
row.operator("bim.kill_websocket_server")
diff --git a/src/blenderbim/blenderbim/core/web.py b/src/blenderbim/blenderbim/core/web.py
index 47e173ef3f..20cd85908d 100644
--- a/src/blenderbim/blenderbim/core/web.py
+++ b/src/blenderbim/blenderbim/core/web.py
@@ -1,2 +1,14 @@
def open_web_ui(web):
web.open_web_ui()
+
+
+def generate_port_number(web):
+ return web.generate_port_number()
+
+
+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.connect_websocket_server(port)
diff --git a/src/blenderbim/blenderbim/tool/__init__.py b/src/blenderbim/blenderbim/tool/__init__.py
index 80ea55419f..716915f4f5 100644
--- a/src/blenderbim/blenderbim/tool/__init__.py
+++ b/src/blenderbim/blenderbim/tool/__init__.py
@@ -60,3 +60,4 @@ from blenderbim.tool.type import Type
from blenderbim.tool.unit import Unit
from blenderbim.tool.search import Search
from blenderbim.tool.cost import Cost
+from blenderbim.tool.web import Web
diff --git a/src/blenderbim/blenderbim/tool/web.py b/src/blenderbim/blenderbim/tool/web.py
index 23f158c700..acf5f36638 100644
--- a/src/blenderbim/blenderbim/tool/web.py
+++ b/src/blenderbim/blenderbim/tool/web.py
@@ -1,7 +1,26 @@
+# BlenderBIM Add-on - OpenBIM Blender Add-on
+# Copyright (C) 2021 Dion Moult , 2022 Yassine Oualid
+#
+# This file is part of BlenderBIM Add-on.
+#
+# BlenderBIM Add-on is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# BlenderBIM Add-on is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with BlenderBIM Add-on. If not, see .
+
import bpy
import json
import blenderbim.core.tool
from typing import Union, Literal
+import socket
import os
import webbrowser
import asyncio
@@ -14,7 +33,34 @@ connected_sockets = set()
websocket_server: websockets.WebSocketServer
ws_thread_loop = asyncio.new_event_loop()
+
class Web(blenderbim.core.tool.Web):
+ @classmethod
+ def generate_port_number(cls):
+ print("Generating port number")
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
+ s.bind(("localhost", 0)) # Bind to a free port
+ port = s.getsockname()[1] # get the bound port
+ print(f"Port number: {port}")
+ return port
+
+ @classmethod
+ def is_port_available(cls, port):
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
+ # connect_ex returns 0 if the connection succeeds
+ # indicating the port is in use
+ # otherwise returns 10061 if no server is listening
+ # indicating the port is available for use
+ return s.connect_ex(("localhost", port)) == 10061
+
+ @classmethod
+ def start_websocket_server(cls, port):
+ pass
+
+ @classmethod
+ def connect_websocket_server(cls, port):
+ pass
+
@classmethod
def get_webui_data(cls):
data = {}