From 9b3fc02357e344ed5492fc3f5a392946e7e73447 Mon Sep 17 00:00:00 2001 From: kovacsv Date: Sat, 11 Dec 2021 11:59:41 +0100 Subject: [PATCH] Measure tool experiment. --- assets/icons/measure.svg | 66 ++++++++++++ sandbox/embed_edges.html | 1 + sandbox/embed_selfhost_errors.html | 1 + sandbox/embed_selfhost_externallibs.html | 1 + sandbox/embed_selfhost_fullscreen.html | 1 + sandbox/embed_selfhost_manual.html | 1 + sandbox/embed_selfhost_multiple.html | 1 + sandbox/embed_selfhost_single.html | 1 + sandbox/embed_selfhost_single_scroll.html | 1 + source/viewer/domutils.js | 13 ++- source/viewer/measuretool.js | 120 ++++++++++++++++++++++ source/viewer/viewer.js | 20 +++- tools/config.json | 2 + website/embed.html | 2 + website/index.html | 2 + website/o3dv/css/O3DVIcons/O3DVIcons.woff | Bin 6916 -> 7036 bytes website/o3dv/css/icons.css | 35 ++++--- website/o3dv/css/sidebar.css | 17 +++ website/o3dv/js/featureset.js | 1 + website/o3dv/js/navigator.js | 6 +- website/o3dv/js/navigatormeshespanel.js | 13 +-- website/o3dv/js/panelset.js | 12 +-- website/o3dv/js/sidebar.js | 21 +++- website/o3dv/js/sidebarmeasurepanel.js | 97 +++++++++++++++++ website/o3dv/js/sidebarsettingspanel.js | 18 +--- website/o3dv/js/toolbar.js | 16 +++ website/o3dv/js/treeview.js | 8 +- website/o3dv/js/website.js | 51 ++++++--- 28 files changed, 446 insertions(+), 82 deletions(-) create mode 100644 assets/icons/measure.svg create mode 100644 source/viewer/measuretool.js create mode 100644 website/o3dv/js/sidebarmeasurepanel.js diff --git a/assets/icons/measure.svg b/assets/icons/measure.svg new file mode 100644 index 0000000..df29db6 --- /dev/null +++ b/assets/icons/measure.svg @@ -0,0 +1,66 @@ + +image/svg+xml \ No newline at end of file diff --git a/sandbox/embed_edges.html b/sandbox/embed_edges.html index 1d4df26..c2040cc 100644 --- a/sandbox/embed_edges.html +++ b/sandbox/embed_edges.html @@ -71,6 +71,7 @@ + diff --git a/sandbox/embed_selfhost_errors.html b/sandbox/embed_selfhost_errors.html index dfee977..a74f59d 100644 --- a/sandbox/embed_selfhost_errors.html +++ b/sandbox/embed_selfhost_errors.html @@ -71,6 +71,7 @@ + diff --git a/sandbox/embed_selfhost_externallibs.html b/sandbox/embed_selfhost_externallibs.html index 3306850..f12633b 100644 --- a/sandbox/embed_selfhost_externallibs.html +++ b/sandbox/embed_selfhost_externallibs.html @@ -71,6 +71,7 @@ + diff --git a/sandbox/embed_selfhost_fullscreen.html b/sandbox/embed_selfhost_fullscreen.html index c5df813..061b8ac 100644 --- a/sandbox/embed_selfhost_fullscreen.html +++ b/sandbox/embed_selfhost_fullscreen.html @@ -70,6 +70,7 @@ + diff --git a/sandbox/embed_selfhost_manual.html b/sandbox/embed_selfhost_manual.html index 77260e5..110afed 100644 --- a/sandbox/embed_selfhost_manual.html +++ b/sandbox/embed_selfhost_manual.html @@ -71,6 +71,7 @@ + diff --git a/sandbox/embed_selfhost_multiple.html b/sandbox/embed_selfhost_multiple.html index cacbee9..dab88ab 100644 --- a/sandbox/embed_selfhost_multiple.html +++ b/sandbox/embed_selfhost_multiple.html @@ -71,6 +71,7 @@ + diff --git a/sandbox/embed_selfhost_single.html b/sandbox/embed_selfhost_single.html index 29ff348..be2c242 100644 --- a/sandbox/embed_selfhost_single.html +++ b/sandbox/embed_selfhost_single.html @@ -70,6 +70,7 @@ + + + @@ -115,6 +116,7 @@ + diff --git a/website/index.html b/website/index.html index 6570473..0ba7512 100644 --- a/website/index.html +++ b/website/index.html @@ -79,6 +79,7 @@ + @@ -117,6 +118,7 @@ + diff --git a/website/o3dv/css/O3DVIcons/O3DVIcons.woff b/website/o3dv/css/O3DVIcons/O3DVIcons.woff index 2046bcb660713803287ac47a4c7f946425f77631..491c5b445a32c296a0291d4775f799cfd54eba93 100644 GIT binary patch delta 6565 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 { - if (this.panelSet.IsPanelsVisible ()) { - OV.ShowDomElement (this.splitterDiv); - } else { - OV.HideDomElement (this.splitterDiv); - } + OV.ShowDomElement (this.splitterDiv, this.panelSet.IsPanelsVisible ()); this.callbacks.onResize (); }, onShowHidePanels : (show) => { diff --git a/website/o3dv/js/navigatormeshespanel.js b/website/o3dv/js/navigatormeshespanel.js index 6d1be07..b1126b1 100644 --- a/website/o3dv/js/navigatormeshespanel.js +++ b/website/o3dv/js/navigatormeshespanel.js @@ -157,15 +157,10 @@ OV.NavigatorMeshesPanel = class extends OV.NavigatorPanel buttons.flatList.iconDiv.classList.add ('selected'); buttons.treeView.iconDiv.classList.remove ('selected'); } - if (showTree && isHierarchical) { - OV.ShowDomElement (buttons.separator); - OV.ShowDomElement (buttons.expandAll.div); - OV.ShowDomElement (buttons.collapseAll.div); - } else { - OV.HideDomElement (buttons.separator); - OV.HideDomElement (buttons.expandAll.div); - OV.HideDomElement (buttons.collapseAll.div); - } + let showExpandButtons = showTree && isHierarchical; + OV.ShowDomElement (buttons.separator, showExpandButtons); + OV.ShowDomElement (buttons.expandAll.div, showExpandButtons); + OV.ShowDomElement (buttons.collapseAll.div, showExpandButtons); } function UpdateView (panel, importResult, isHierarchical) diff --git a/website/o3dv/js/panelset.js b/website/o3dv/js/panelset.js index 7b5ab84..8668eee 100644 --- a/website/o3dv/js/panelset.js +++ b/website/o3dv/js/panelset.js @@ -4,7 +4,7 @@ OV.Panel = class { this.parentDiv = parentDiv; this.panelDiv = OV.AddDiv (parentDiv); - OV.HideDomElement (this.panelDiv); + OV.ShowDomElement (this.panelDiv, false); this.visible = false; } @@ -25,11 +25,7 @@ OV.Panel = class } this.visible = show; - if (this.visible) { - OV.ShowDomElement (this.panelDiv); - } else { - OV.HideDomElement (this.panelDiv); - } + OV.ShowDomElement (this.panelDiv, this.visible); } Resize () @@ -101,7 +97,7 @@ OV.PanelSet = class this.panelsVisible = show; if (this.panelsVisible) { - OV.ShowDomElement (this.contentDiv); + OV.ShowDomElement (this.contentDiv, true); OV.SetDomElementWidth (this.parentDiv, this.menuDiv.offsetWidth + this.panelsPrevWidth); } else { for (let panelButton of this.panelButtons) { @@ -112,7 +108,7 @@ OV.PanelSet = class } this.panelsPrevWidth = this.contentDiv.offsetWidth; OV.SetDomElementWidth (this.parentDiv, this.menuDiv.offsetWidth); - OV.HideDomElement (this.contentDiv); + OV.ShowDomElement (this.contentDiv, false); } this.callbacks.onShowHidePanels (this.panelsVisible); diff --git a/website/o3dv/js/sidebar.js b/website/o3dv/js/sidebar.js index 64ef49d..5a995cb 100644 --- a/website/o3dv/js/sidebar.js +++ b/website/o3dv/js/sidebar.js @@ -8,9 +8,13 @@ OV.Sidebar = class this.detailsPanel = new OV.SidebarDetailsPanel (this.panelSet.GetContentDiv ()); this.settingsPanel = new OV.SidebarSettingsPanel (this.panelSet.GetContentDiv (), settings); + this.measurePanel = new OV.SidebarMeasurePanel (this.panelSet.GetContentDiv ()); this.panelSet.AddPanel (this.detailsPanel); this.panelSet.AddPanel (this.settingsPanel); + if (OV.FeatureSet.MeasureTool) { + this.panelSet.AddPanel (this.measurePanel); + } this.panelSet.ShowPanel (this.detailsPanel); } @@ -30,11 +34,7 @@ OV.Sidebar = class this.panelSet.Init ({ onResize : () => { - if (this.panelSet.IsPanelsVisible ()) { - OV.ShowDomElement (this.splitterDiv); - } else { - OV.HideDomElement (this.splitterDiv); - } + OV.ShowDomElement (this.splitterDiv, this.panelSet.IsPanelsVisible ()); this.callbacks.onResize (); }, onShowHidePanels : (show) => { @@ -57,6 +57,12 @@ OV.Sidebar = class } }); + this.measurePanel.Init ({ + onActivatedChange : (isActivated) => { + this.callbacks.onMeasureToolActivedChange (isActivated); + } + }); + OV.InstallVerticalSplitter (this.splitterDiv, this.mainDiv, true, () => { this.callbacks.onResize (); }); @@ -67,6 +73,11 @@ OV.Sidebar = class this.settingsPanel.UpdateSettings (hasDefaultMaterial); } + UpdateMeasureTool (measureTool) + { + this.measurePanel.UpdateMeasureTool (measureTool); + } + Resize (height) { OV.SetDomElementOuterHeight (this.mainDiv, height); diff --git a/website/o3dv/js/sidebarmeasurepanel.js b/website/o3dv/js/sidebarmeasurepanel.js new file mode 100644 index 0000000..64a6f0c --- /dev/null +++ b/website/o3dv/js/sidebarmeasurepanel.js @@ -0,0 +1,97 @@ +OV.SidebarMeasurePanel = class extends OV.SidebarPanel +{ + constructor (parentDiv) + { + super (parentDiv); + + this.helpSection = null; + this.resultSection = null; + } + + GetName () + { + return 'Measure'; + } + + GetIcon () + { + return 'measure'; + } + + Init (callbacks) + { + super.Init (callbacks); + + let isActive = false; + let activateButton = OV.AddDiv (this.contentDiv, 'ov_button ov_sidebar_button', 'Activate'); + activateButton.addEventListener ('click', () => { + isActive = !isActive; + if (isActive) { + activateButton.classList.add ('outline'); + activateButton.innerHTML = 'Deactivate'; + } else { + activateButton.classList.remove ('outline'); + activateButton.innerHTML = 'Activate'; + } + this.callbacks.onActivatedChange (isActive); + }); + + this.helpSection = OV.AddDiv (this.contentDiv, 'ov_sidebar_section'); + this.resultSection = OV.AddDiv (this.contentDiv, 'ov_sidebar_section'); + } + + UpdateMeasureTool (measureTool) + { + OV.ClearDomElement (this.helpSection); + OV.ClearDomElement (this.resultSection); + + OV.ShowDomElement (this.helpSection, true); + OV.ShowDomElement (this.resultSection, false); + + if (measureTool.IsActive ()) { + let markerCount = measureTool.GetMarkerCount (); + if (markerCount === 0) { + this.helpSection.innerHTML = 'Select a model point to start measure.'; + } else if (markerCount === 1) { + this.helpSection.innerHTML = 'Select another model point to start measure.'; + } else if (markerCount === 2) { + OV.ShowDomElement (this.helpSection, false); + OV.ShowDomElement (this.resultSection, true); + + let calculatedValues = measureTool.Calculate (); + + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_name', 'Distance of points'); + let pointsDistanceStr = calculatedValues.pointsDistance.toLocaleString (undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 6 + }); + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_value', pointsDistanceStr); + + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_name', 'Distance of parallel faces'); + if (calculatedValues.parallelFacesDistance !== null) { + let facesDistanceStr = calculatedValues.parallelFacesDistance.toLocaleString (undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 6 + }); + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_value', facesDistanceStr); + } else { + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_value', 'Faces are not parallel'); + } + + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_name', 'Angle of faces'); + let facesAngleDegree = calculatedValues.facesAngle * OV.RadDeg; + let facesAngleStr = facesAngleDegree.toLocaleString (undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 6 + }); + OV.AddDiv (this.resultSection, 'ov_sidebar_measure_value', facesAngleStr + '°'); + + } + } + } + + Clear () + { + + } +}; diff --git a/website/o3dv/js/sidebarsettingspanel.js b/website/o3dv/js/sidebarsettingspanel.js index 27ff8e2..6a10f85 100644 --- a/website/o3dv/js/sidebarsettingspanel.js +++ b/website/o3dv/js/sidebarsettingspanel.js @@ -58,11 +58,7 @@ OV.SettingsColorSection = class Show (show) { - if (show) { - OV.ShowDomElement (this.contentDiv); - } else { - OV.HideDomElement (this.contentDiv); - } + OV.ShowDomElement (this.contentDiv, show); } Update (color) @@ -139,11 +135,11 @@ OV.SettingsEdgeDisplaySection = class this.buttons = []; let offButton = AddRadioButton (buttonsDiv, 'off', 'Don\'t Show Edges', () => { - OV.HideDomElement (this.edgeSettingsDiv); + OV.ShowDomElement (this.edgeSettingsDiv, false); callbacks.onShowEdgesChange (false); }); let onButton = AddRadioButton (buttonsDiv, 'on', 'Show Edges', () => { - OV.ShowDomElement (this.edgeSettingsDiv); + OV.ShowDomElement (this.edgeSettingsDiv, true); callbacks.onShowEdgesChange (true); }); this.buttons.push (offButton); @@ -166,11 +162,7 @@ OV.SettingsEdgeDisplaySection = class ShowEdgeSettings (show) { - if (show) { - OV.ShowDomElement (this.edgeSettingsDiv); - } else { - OV.HideDomElement (this.edgeSettingsDiv); - } + OV.ShowDomElement (this.edgeSettingsDiv, show); } Clear () @@ -338,7 +330,7 @@ OV.SidebarSettingsPanel = class extends OV.SidebarPanel AddResetToDefaultsButton () { let defaultSettings = new OV.Settings (); - let resetToDefaultsButton = OV.AddDiv (this.contentDiv, 'ov_button outline ov_sidebar_button', 'Reset to Default'); + let resetToDefaultsButton = OV.AddDiv (this.contentDiv, 'ov_button ov_sidebar_button outline', 'Reset to Default'); resetToDefaultsButton.addEventListener ('click', () => { this.settings.backgroundColor = defaultSettings.backgroundColor; this.settings.defaultColor = defaultSettings.defaultColor; diff --git a/website/o3dv/js/toolbar.js b/website/o3dv/js/toolbar.js index 968caf1..4319446 100644 --- a/website/o3dv/js/toolbar.js +++ b/website/o3dv/js/toolbar.js @@ -41,6 +41,11 @@ OV.ToolbarButton = class this.buttonImg.classList.remove (className); } + IsSelected () + { + return this.selected; + } + SetSelected (selected) { this.selected = selected; @@ -66,6 +71,17 @@ OV.Toolbar = class return button; } + AddImagePushButton (image, imageTitle, isSelected, onClick) + { + let button = new OV.ToolbarButton (image, imageTitle, () => { + button.SetSelected (!button.IsSelected ()); + onClick (); + }); + button.AddDomElements (this.mainDiv); + button.SetSelected (isSelected); + return button; + } + AddImageRadioButton (buttonData, selectedIndex, onClick) { let buttons = []; diff --git a/website/o3dv/js/treeview.js b/website/o3dv/js/treeview.js index e30a22b..ff3a46c 100644 --- a/website/o3dv/js/treeview.js +++ b/website/o3dv/js/treeview.js @@ -154,10 +154,10 @@ OV.TreeViewGroupItem = class extends OV.TreeViewItem return; } if (this.isVisible) { - OV.ShowDomElement (this.mainElement); + OV.ShowDomElement (this.mainElement, true); this.childrenDiv.classList.add ('ov_tree_view_children'); } else { - OV.HideDomElement (this.mainElement); + OV.ShowDomElement (this.mainElement, false); this.childrenDiv.classList.remove ('ov_tree_view_children'); } } @@ -170,10 +170,10 @@ OV.TreeViewGroupItem = class extends OV.TreeViewItem } if (show) { OV.SetSvgIconImageElement (this.openCloseButton, this.openButtonIcon); - OV.ShowDomElement (this.childrenDiv); + OV.ShowDomElement (this.childrenDiv, true); } else { OV.SetSvgIconImageElement (this.openCloseButton, this.closeButtonIcon); - OV.HideDomElement (this.childrenDiv); + OV.ShowDomElement (this.childrenDiv, false); } } diff --git a/website/o3dv/js/website.js b/website/o3dv/js/website.js index c131bd7..d215fe4 100644 --- a/website/o3dv/js/website.js +++ b/website/o3dv/js/website.js @@ -13,6 +13,7 @@ OV.Website = class this.parameters = parameters; this.settings = new OV.Settings (); this.viewer = new OV.Viewer (); + this.measureTool = new OV.MeasureTool (); this.hashHandler = new OV.HashHandler (); this.cookieHandler = new OV.CookieHandler (); this.toolbar = new OV.Toolbar (this.parameters.toolbarDiv); @@ -33,6 +34,7 @@ OV.Website = class this.SwitchTheme (this.settings.themeId, false); this.InitViewer (); + this.InitMeasureTool (); this.InitToolbar (); this.InitDragAndDrop (); this.InitSidebar (); @@ -111,17 +113,17 @@ OV.Website = class this.uiState = uiState; if (this.uiState === OV.WebsiteUIState.Intro) { - OV.ShowDomElement (this.parameters.introDiv); - OV.HideDomElement (this.parameters.mainDiv); + OV.ShowDomElement (this.parameters.introDiv, true); + OV.ShowDomElement (this.parameters.mainDiv, false); ShowOnlyOnModelElements (false); } else if (this.uiState === OV.WebsiteUIState.Model) { - OV.HideDomElement (this.parameters.introDiv); - OV.ShowDomElement (this.parameters.mainDiv); + OV.ShowDomElement (this.parameters.introDiv, false); + OV.ShowDomElement (this.parameters.mainDiv, true); ShowOnlyOnModelElements (true); this.UpdatePanelsVisibility (); } else if (this.uiState === OV.WebsiteUIState.Loading) { - OV.HideDomElement (this.parameters.introDiv); - OV.HideDomElement (this.parameters.mainDiv); + OV.ShowDomElement (this.parameters.introDiv, false); + OV.ShowDomElement (this.parameters.mainDiv, false); ShowOnlyOnModelElements (false); } @@ -133,6 +135,7 @@ OV.Website = class this.HidePopups (); this.model = null; this.parameters.fileNameDiv.innerHTML = ''; + this.measureTool.Clear (); this.viewer.Clear (); this.navigator.Clear (); this.sidebar.Clear (); @@ -151,13 +154,21 @@ OV.Website = class OnModelClicked (button, mouseCoordinates) { - if (button === 1) { - let meshUserData = this.viewer.GetMeshUserDataUnderMouse (mouseCoordinates); - if (meshUserData === null) { - this.navigator.SetSelection (null); - } else { - this.navigator.SetSelection (new OV.Selection (OV.SelectionType.Mesh, meshUserData.originalMeshId)); - } + if (button !== 1) { + return; + } + + if (this.measureTool.IsActive ()) { + this.measureTool.Click (mouseCoordinates); + this.sidebar.UpdateMeasureTool (this.measureTool); + return; + } + + let meshUserData = this.viewer.GetMeshUserDataUnderMouse (mouseCoordinates); + if (meshUserData === null) { + this.navigator.SetSelection (null); + } else { + this.navigator.SetSelection (new OV.Selection (OV.SelectionType.Mesh, meshUserData.originalMeshId)); } } @@ -422,6 +433,11 @@ OV.Website = class ]); } + InitMeasureTool () + { + this.measureTool.Init (this.viewer, this.highlightColor); + } + InitToolbar () { function AddButton (toolbar, eventHandler, imageName, imageTitle, classNames, onClick) @@ -568,6 +584,15 @@ OV.Website = class onThemeChange : () => { this.SwitchTheme (this.settings.themeId, true); }, + onMeasureToolActivedChange : (isActivated) => { + if (isActivated) { + this.navigator.SetSelection (null); + this.measureTool.SetActive (true); + } else { + this.measureTool.SetActive (false); + } + this.sidebar.UpdateMeasureTool (this.measureTool); + }, onResize : () => { this.Resize (); },