From 60a06138d2c710b0798159affdf02cbe049469e7 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:34:15 +0300 Subject: [PATCH 1/9] edit index.css for color consistency --- .../bonsai/bim/data/webui/static/css/index.css | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/bonsai/bonsai/bim/data/webui/static/css/index.css b/src/bonsai/bonsai/bim/data/webui/static/css/index.css index 02cb6cf3e4..f83fac08e1 100644 --- a/src/bonsai/bonsai/bim/data/webui/static/css/index.css +++ b/src/bonsai/bonsai/bim/data/webui/static/css/index.css @@ -281,22 +281,29 @@ button:hover { -:root.blender .tabulator-selected .tabulator-cell { +:root.blender .tabulator-selected .tabulator-cell, +:root.blender .tabulator-row.tabulator-selected { background-color: var(--blender-active-highlight) !important; color: var(--blender-active-text-highlight) !important; } -:root.blender .tabulator-selected:hover .tabulator-cell { +:root.blender .tabulator-selected:hover .tabulator-cell, +:root.blender .tabulator-row.tabulator-selected:hover { filter: brightness(1.2) } -.tabulator-menu-item { +:root.blender .tabulator-popup-container { + background: var(--blender-panel-background); + border: var(--blender-tab-outline); +} + +:root.blender .tabulator-menu-item { color: var(--blender-text) !important; background-color: var(--blender-panel-background) !important; transition: filter 0.1s ease; } -.tabulator-menu-item:hover { +:root.blender .tabulator-menu-item:hover { filter: brightness(1.4); -} +} \ No newline at end of file From 2ca3f86fc94068d5222a4b076697dc852447fd1b Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Fri, 23 Aug 2024 21:30:21 +0300 Subject: [PATCH 2/9] add RMB context menu to tables to set top calc type --- .../bonsai/bim/data/webui/static/js/index.js | 54 +++++++++++++++---- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/src/bonsai/bonsai/bim/data/webui/static/js/index.js b/src/bonsai/bonsai/bim/data/webui/static/js/index.js index 3fac376f28..d4b6d7fb73 100644 --- a/src/bonsai/bonsai/bim/data/webui/static/js/index.js +++ b/src/bonsai/bonsai/bim/data/webui/static/js/index.js @@ -207,8 +207,35 @@ function addTableElement(blenderId, csvData, filename) { return menu; } - var containerHeight=$('.table-container').height(); - var h3Height=$('.table-container>h3').height(); + // create right click context menu for choosing column top calculation + function createColumnContextMenu(column) { + const field = column.field; + const calculations = ["sum", "avg", "max", "min"]; + + // label is the item label in the menu + // update column defination on clicking an item + // specifically the topCalc and pass calc type to the topCalcFormatter function + // uisng the topCalcFormatterParams field + return calculations.map((calc) => ({ + label: `Show ${ + calc.charAt(0).toUpperCase() + calc.slice(1) + } for ${field}`, + action: (e, cell) => + cell + .getColumn() + .updateDefinition({ topCalc: calc, topCalcFormatterParams: calc }), + })); + } + + function calcFormatter(cell, formatterParams, onRendered) { + // formatterParams is anything in the topCalcFormatterParams field in the column definition + // so we pass the calculation type to display what the calculation type is + return `${formatterParams}: ${cell.getValue()}`; + } + + var containerHeight = $(".table-container").height(); + var h3Height = $(".table-container>h3").height(); + var table = new Tabulator("#table-" + blenderId, { placeholder: "No data to display", resizableColumnGuide: true, @@ -222,14 +249,21 @@ function addTableElement(blenderId, csvData, filename) { movableColumns: true, // Our fields are never nested, and we use the "." character in queries nestedFieldSeparator: false, + // defines column defualts that are applied to all columns + columnDefaults: { + visible: true, + headerFilter: true, + topCalc: "sum", + topCalcFormatter: calcFormatter, + topCalcFormatterParams: "sum", + }, + // defines a callback to edit the column definition generated by autoColumns + // that cannot be set as default autoColumnsDefinitions: function (definitions) { - menu = createHeaderMenu(definitions, table); + headerMenu = createHeaderMenu(definitions, table); definitions.forEach((column) => { - column.visible = true; - column.headerFilter = true; - column.headerMenu = menu; - // TODO: more user control to choose function, style at bottomCalc - column.topCalc = 'sum'; + column.headerMenu = headerMenu; + column.contextMenu = createColumnContextMenu(column); }); return definitions; }, @@ -239,7 +273,9 @@ function addTableElement(blenderId, csvData, filename) { .css("margin-left", "10px") .css("cursor", "pointer"); tableTitle.append(downloadCsv); - downloadCsv.on('click', function() { table.download("csv", "data.csv"); }) + downloadCsv.on("click", function () { + table.download("csv", "data.csv"); + }); table.on("rowSelected", function (row) { var index = row.getIndex(); // the guid of the object From 42fc72bd4f4c6ea08cf0376541b4f66b814b08fa Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Sat, 24 Aug 2024 18:12:13 +0300 Subject: [PATCH 3/9] add favicon to web UI --- src/bonsai/bonsai/bim/data/webui/templates/demo.html | 5 +++++ src/bonsai/bonsai/bim/data/webui/templates/drawings.html | 5 +++++ src/bonsai/bonsai/bim/data/webui/templates/gantt.html | 5 +++++ src/bonsai/bonsai/bim/data/webui/templates/index.html | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/bonsai/bonsai/bim/data/webui/templates/demo.html b/src/bonsai/bonsai/bim/data/webui/templates/demo.html index 151a7948e8..da67d65d5c 100644 --- a/src/bonsai/bonsai/bim/data/webui/templates/demo.html +++ b/src/bonsai/bonsai/bim/data/webui/templates/demo.html @@ -5,6 +5,11 @@ Bonsai Web UI + diff --git a/src/bonsai/bonsai/bim/data/webui/templates/drawings.html b/src/bonsai/bonsai/bim/data/webui/templates/drawings.html index 858f1edcf9..9d70584ed1 100644 --- a/src/bonsai/bonsai/bim/data/webui/templates/drawings.html +++ b/src/bonsai/bonsai/bim/data/webui/templates/drawings.html @@ -4,6 +4,11 @@ Bonsai Web UI + Bonsai Web UI + Bonsai Web UI + Date: Sat, 24 Aug 2024 18:48:58 +0300 Subject: [PATCH 4/9] make container padding/margin consistent over all pages --- src/bonsai/bonsai/bim/data/webui/static/css/demo.css | 5 +---- src/bonsai/bonsai/bim/data/webui/static/css/drawings.css | 5 +---- src/bonsai/bonsai/bim/data/webui/static/css/gantt.css | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/bonsai/bonsai/bim/data/webui/static/css/demo.css b/src/bonsai/bonsai/bim/data/webui/static/css/demo.css index 9a2460c90f..975bb318d1 100644 --- a/src/bonsai/bonsai/bim/data/webui/static/css/demo.css +++ b/src/bonsai/bonsai/bim/data/webui/static/css/demo.css @@ -54,10 +54,7 @@ body { #container { flex: 1; - margin-top: var(--margin-medium); - margin-left: var(--margin-small); - margin-right: var(--margin-small); - margin-bottom: var(--margin-medium); + padding: var(--margin-small); } h3 { diff --git a/src/bonsai/bonsai/bim/data/webui/static/css/drawings.css b/src/bonsai/bonsai/bim/data/webui/static/css/drawings.css index c2779d7e9e..17485412d3 100644 --- a/src/bonsai/bonsai/bim/data/webui/static/css/drawings.css +++ b/src/bonsai/bonsai/bim/data/webui/static/css/drawings.css @@ -55,10 +55,7 @@ body { } #container { - margin-top: var(--margin-medium); - margin-left: var(--margin-tiny); - margin-right: var(--margin-tiny); - margin-bottom: var(--margin-medium); + padding: var(--margin-small); height: calc(100vh - var(--nav-height)); box-sizing: border-box; display: flex; diff --git a/src/bonsai/bonsai/bim/data/webui/static/css/gantt.css b/src/bonsai/bonsai/bim/data/webui/static/css/gantt.css index 9f97eb6b82..c90d2dbcb4 100644 --- a/src/bonsai/bonsai/bim/data/webui/static/css/gantt.css +++ b/src/bonsai/bonsai/bim/data/webui/static/css/gantt.css @@ -72,10 +72,7 @@ body { #container { flex: 1; - margin-top: var(--margin-medium); - margin-left: var(--margin-small); - margin-right: var(--margin-small); - margin-bottom: var(--margin-medium); + padding: var(--margin-small); } h3 { From 1745a4fd39c1b2edb5312fb3d473b69201ca4342 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Sun, 25 Aug 2024 17:50:26 +0300 Subject: [PATCH 5/9] fix theme data not being sent when all Bonsai's are disconnected --- src/bonsai/bonsai/bim/data/webui/sioserver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bonsai/bonsai/bim/data/webui/sioserver.py b/src/bonsai/bonsai/bim/data/webui/sioserver.py index c663e7d091..29f373f750 100644 --- a/src/bonsai/bonsai/bim/data/webui/sioserver.py +++ b/src/bonsai/bonsai/bim/data/webui/sioserver.py @@ -38,9 +38,9 @@ class WebNamespace(socketio.AsyncNamespace): async def on_connect(self, sid, environ): print(f"Web client connected: {sid}") + await sio.emit("theme_data", blender_theme, namespace="/web", room=sid) if blender_messages: await sio.emit("connected_clients", list(blender_messages.keys()), namespace="/web", room=sid) - await sio.emit("theme_data", blender_theme, namespace="/web", room=sid) await self.send_cached_messages(sid) async def on_disconnect(self, sid): @@ -71,6 +71,7 @@ class WebNamespace(socketio.AsyncNamespace): if "demo_data" in messages: await self.emit("demo_data", {"blenderId": blenderId, "data": messages["demo_data"]}, room=sid) + # Blender namespace class BlenderNamespace(socketio.AsyncNamespace): def __init__(self, namespace): @@ -115,8 +116,7 @@ class BlenderNamespace(socketio.AsyncNamespace): blender_theme = data await sio.emit("theme_data", data, namespace="/web") - - # this function will be called when the event demo_data is emitted + # this function will be called when the event demo_data is emitted async def on_demo_data(self, sid, data): print(f"Demo data from Blender client {sid}") blender_messages[sid]["demo_data"] = data From f26f6dfe5e5a12575bbbfd83b7ad498e9358ed62 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Sun, 25 Aug 2024 20:30:20 +0300 Subject: [PATCH 6/9] fix broken display for multiple spreadsheets due to absolute position removed absolute positioning as it made spreadsheets on top of each other and made the spreadsheet's width and height as full screen as possible. also, add a separating margin between two spreadsheets. --- src/bonsai/bonsai/bim/data/webui/static/css/index.css | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/bonsai/bonsai/bim/data/webui/static/css/index.css b/src/bonsai/bonsai/bim/data/webui/static/css/index.css index f83fac08e1..510354f2bd 100644 --- a/src/bonsai/bonsai/bim/data/webui/static/css/index.css +++ b/src/bonsai/bonsai/bim/data/webui/static/css/index.css @@ -202,11 +202,10 @@ footer p { } .table-container { - position: absolute; display: block; - height: calc(100% - var(--margin-small) * 2); - width: calc(100% - var(--margin-small) * 2); - overflow-x: scroll; + height: calc(100vh - var(--margin-small)); + width: 100%; + margin-bottom: var(--margin-medium); } .csv-table { From 47a15011f62b010d58ac7ff9cd6e1aba5a76c2b1 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Sun, 25 Aug 2024 21:38:15 +0300 Subject: [PATCH 7/9] add button to drawings panel to open documentation web ui page might need a different icon since the URL icon is used by the open_drawing button --- src/bonsai/bonsai/bim/module/drawing/__init__.py | 1 + src/bonsai/bonsai/bim/module/drawing/operator.py | 13 +++++++++++++ src/bonsai/bonsai/bim/module/drawing/ui.py | 3 +++ 3 files changed, 17 insertions(+) diff --git a/src/bonsai/bonsai/bim/module/drawing/__init__.py b/src/bonsai/bonsai/bim/module/drawing/__init__.py index cb7bb771d5..a3578ed702 100644 --- a/src/bonsai/bonsai/bim/module/drawing/__init__.py +++ b/src/bonsai/bonsai/bim/module/drawing/__init__.py @@ -88,6 +88,7 @@ classes = ( operator.SelectAllDrawings, operator.SelectAssignedProduct, operator.SelectDocIfcFile, + operator.OpenDocumentationWebUi, prop.Variable, prop.Drawing, prop.Document, diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py index 72014d838c..07738f425a 100644 --- a/src/bonsai/bonsai/bim/module/drawing/operator.py +++ b/src/bonsai/bonsai/bim/module/drawing/operator.py @@ -2857,3 +2857,16 @@ class ConvertSVGToDXF(bpy.types.Operator): self.report({"INFO"}, f"{len(drawing_uris)} drawings were converted to .dxf.") return {"FINISHED"} + + +class OpenDocumentationWebUi(bpy.types.Operator): + bl_idname = "bim.open_documentation_web_ui" + bl_label = "Open Documentation Web UI" + bl_description = "Open the documentation web UI page" + + def execute(self, context): + if not context.scene.WebProperties.is_connected: + bpy.ops.bim.connect_websocket_server(page="documentation") + else: + bpy.ops.bim.bim.open_web_browser(page="documentation") + return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/drawing/ui.py b/src/bonsai/bonsai/bim/module/drawing/ui.py index 47a6f67b70..398e4cbb45 100644 --- a/src/bonsai/bonsai/bim/module/drawing/ui.py +++ b/src/bonsai/bonsai/bim/module/drawing/ui.py @@ -289,6 +289,9 @@ class BIM_PT_drawings(Panel): create_drawing_button = row.row(align=True) create_drawing_button.operator("bim.create_drawing", text="", icon="OUTPUT") create_drawing_button.enabled = active_drawing.ifc_definition_id > 0 + + # might need a different icon since the URL icon is already used by the open_drawing + row.operator("bim.open_documentation_web_ui", icon="URL", text="") self.layout.template_list( "BIM_UL_drawinglist", "", self.props, "drawings", self.props, "active_drawing_index" ) From 5831c563802fa977bfafc3af3a9f0bf425129be3 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:29:09 +0300 Subject: [PATCH 8/9] remove left over print :) --- src/bonsai/bonsai/bim/data/webui/sioserver.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bonsai/bonsai/bim/data/webui/sioserver.py b/src/bonsai/bonsai/bim/data/webui/sioserver.py index 29f373f750..3764da1824 100644 --- a/src/bonsai/bonsai/bim/data/webui/sioserver.py +++ b/src/bonsai/bonsai/bim/data/webui/sioserver.py @@ -55,7 +55,6 @@ class WebNamespace(socketio.AsyncNamespace): ) async def on_get_svg(self, sid, data): - print("hello world!") file_path = data["path"] with open(file_path, "r") as file: svg_data = file.read() From 8c19b695ea6c96e957722489e3f62013e792cee8 Mon Sep 17 00:00:00 2001 From: Ziad-I <68874104+Ziad-I@users.noreply.github.com> Date: Mon, 26 Aug 2024 20:07:50 +0300 Subject: [PATCH 9/9] fix drawings and sheets paths not being normalized which lead to the paths sometimes having both / and \\ --- src/bonsai/bonsai/tool/web.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bonsai/bonsai/tool/web.py b/src/bonsai/bonsai/tool/web.py index ebb1c3fd6d..8ee49093ab 100644 --- a/src/bonsai/bonsai/tool/web.py +++ b/src/bonsai/bonsai/tool/web.py @@ -387,6 +387,7 @@ class Web(bonsai.core.tool.Web): continue reference_name = os.path.basename(reference.Location) reference_path = os.path.join(ifc_file_dir, reference.Location) + reference_path = os.path.normpath(reference_path) sheets_data.append({"name": reference_name, "path": reference_path}) drawings = [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"] @@ -394,6 +395,7 @@ class Web(bonsai.core.tool.Web): document = tool.Drawing.get_drawing_document(drawing) reference_name = os.path.basename(document.Location) reference_path = os.path.join(ifc_file_dir, document.Location) + reference_path = os.path.normpath(reference_path) drawings_data.append({"name": reference_name, "path": reference_path}) cls.send_webui_data(