mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 06:39:13 +00:00
add tool methods to generate port and check port availability
This commit is contained in:
@@ -15,16 +15,25 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import bpy
|
import bpy
|
||||||
|
import blenderbim.core.web as core
|
||||||
|
import blenderbim.tool as tool
|
||||||
|
|
||||||
|
|
||||||
class ConnectToWebsocketServer(bpy.types.Operator):
|
class ConnectToWebsocketServer(bpy.types.Operator):
|
||||||
bl_idname = "bim.connect_to_websocket_server"
|
bl_idname = "bim.connect_websocket_server"
|
||||||
bl_label = "Connect to websocket server"
|
bl_label = "Connect/Start websocket server"
|
||||||
bl_description = "Connect to a websocket server"
|
bl_description = "Start/Connect to a Websocket server"
|
||||||
|
|
||||||
def execute(self, context):
|
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"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,4 +31,4 @@ from bpy.props import (
|
|||||||
|
|
||||||
|
|
||||||
class WebProperties(PropertyGroup):
|
class WebProperties(PropertyGroup):
|
||||||
Webserver_port: StringProperty(name="Webserver Port")
|
Webserver_port: IntProperty(name="Webserver Port")
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class BIM_PT_webui(Panel):
|
|||||||
row.prop(props, "Webserver_port", text="Webserver Port")
|
row.prop(props, "Webserver_port", text="Webserver Port")
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.operator("bim.connect_to_websocket_server")
|
row.operator("bim.connect_websocket_server")
|
||||||
|
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.operator("bim.kill_websocket_server")
|
row.operator("bim.kill_websocket_server")
|
||||||
|
|||||||
@@ -1,2 +1,14 @@
|
|||||||
def open_web_ui(web):
|
def open_web_ui(web):
|
||||||
web.open_web_ui()
|
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)
|
||||||
|
|||||||
@@ -60,3 +60,4 @@ from blenderbim.tool.type import Type
|
|||||||
from blenderbim.tool.unit import Unit
|
from blenderbim.tool.unit import Unit
|
||||||
from blenderbim.tool.search import Search
|
from blenderbim.tool.search import Search
|
||||||
from blenderbim.tool.cost import Cost
|
from blenderbim.tool.cost import Cost
|
||||||
|
from blenderbim.tool.web import Web
|
||||||
|
|||||||
@@ -1,7 +1,26 @@
|
|||||||
|
# BlenderBIM Add-on - OpenBIM Blender Add-on
|
||||||
|
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>, 2022 Yassine Oualid <yassine@sigmadimensions.com>
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import bpy
|
import bpy
|
||||||
import json
|
import json
|
||||||
import blenderbim.core.tool
|
import blenderbim.core.tool
|
||||||
from typing import Union, Literal
|
from typing import Union, Literal
|
||||||
|
import socket
|
||||||
import os
|
import os
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import asyncio
|
import asyncio
|
||||||
@@ -14,7 +33,34 @@ connected_sockets = set()
|
|||||||
websocket_server: websockets.WebSocketServer
|
websocket_server: websockets.WebSocketServer
|
||||||
ws_thread_loop = asyncio.new_event_loop()
|
ws_thread_loop = asyncio.new_event_loop()
|
||||||
|
|
||||||
|
|
||||||
class Web(blenderbim.core.tool.Web):
|
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
|
@classmethod
|
||||||
def get_webui_data(cls):
|
def get_webui_data(cls):
|
||||||
data = {}
|
data = {}
|
||||||
|
|||||||
Reference in New Issue
Block a user