Initial import of NODEDC BIM Viewer

This commit is contained in:
CODEX
2026-06-04 13:25:42 +03:00
commit 9aaf82862f
2075 changed files with 3592575 additions and 0 deletions
+163
View File
@@ -0,0 +1,163 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/Classes.js | xeokit-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-viewer"><meta property="og:site_name" content="xeokit-viewer"><meta property="og:title" content="xeokit-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/ViewerUI.js~ViewerUI.html">ViewerUI</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#ifcobjectdefaults">IFCObjectDefaults</a><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-IFCObjectDefaults">IFCObjectDefaults</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/Classes.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {Controller} from &quot;../Controller.js&quot;;
import {TreeViewPlugin} from &quot;@xeokit/xeokit-sdk/src/plugins/TreeViewPlugin/TreeViewPlugin.js&quot;;
import {ContextMenu} from &quot;@xeokit/xeokit-sdk/src/extras/ContextMenu/ContextMenu.js&quot;;
import {TreeViewContextMenuItems} from &quot;../contextMenuItems/TreeViewContextMenuItems.js&quot;;
/** @private */
class Classes extends Controller {
constructor(parent, cfg = {}) {
super(parent);
if (!cfg.classesTabElement) {
throw &quot;Missing config: classesTabElement&quot;;
}
if (!cfg.showAllClassesButtonElement) {
throw &quot;Missing config: showAllClassesButtonElement&quot;;
}
if (!cfg.hideAllClassesButtonElement) {
throw &quot;Missing config: hideAllClassesButtonElement&quot;;
}
if (!cfg.classesElement) {
throw &quot;Missing config: classesElement&quot;;
}
this._classesTabElement = cfg.classesTabElement;
this._showAllClassesButtonElement = cfg.showAllClassesButtonElement;
this._hideAllClassesButtonElement = cfg.hideAllClassesButtonElement;
this._classesTabButtonElement = this._classesTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._classesTabButtonElement) {
throw &quot;Missing DOM element: xeokit-tab-btn&quot;;
}
const classesElement = cfg.classesElement;
this._treeView = new TreeViewPlugin(this.viewer, {
containerElement: classesElement,
hierarchy: &quot;types&quot;,
autoAddModels: false
});
this._treeViewContextMenu = new ContextMenu({
items: TreeViewContextMenuItems
});
this._treeView.on(&quot;contextmenu&quot;, (e) =&gt; {
this._treeViewContextMenu.show(e.event.pageX, e.event.pageY);
this._treeViewContextMenu.context = {
viewer: e.viewer,
treeViewPlugin: e.treeViewPlugin,
treeViewNode: e.treeViewNode
};
});
this._onModelLoaded = this.viewer.scene.on(&quot;modelLoaded&quot;, (modelId) =&gt;{
if (this.viewer.metaScene.metaModels[modelId]) {
const modelInfo = this.viewerUI._controllers.models.getModelInfo(modelId);
if (!modelInfo) {
return;
}
this._treeView.addModel(modelId, {
rootName: modelInfo.name
});
}
});
this._onModelUnloaded = this.viewer.scene.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
this._treeView.removeModel(modelId);
}
});
this.viewerUI.on(&quot;reset&quot;, () =&gt; {
this._treeView.collapse();
});
}
setEnabled(enabled) {
if (!enabled) {
this._classesTabButtonElement.classList.add(&quot;disabled&quot;);
this._showAllClassesButtonElement.classList.add(&quot;disabled&quot;);
this._hideAllClassesButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._classesTabButtonElement.classList.remove(&quot;disabled&quot;);
this._showAllClassesButtonElement.classList.remove(&quot;disabled&quot;);
this._hideAllClassesButtonElement.classList.remove(&quot;disabled&quot;);
}
}
showNodeInTreeView(objectId) {
this._treeView.collapse();
this._treeView.showNode(objectId);
}
destroy() {
super.destroy();
this._treeView.destroy();
this._treeViewContextMenu.destroy();
this.viewer.scene.off(this._onModelLoaded);
this.viewer.scene.off(this._onModelUnloaded);
}
}
export {Classes};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
@@ -0,0 +1,192 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/ClassesExplorer.js | xeokit-bim-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-bim-viewer"><meta property="og:site_name" content="xeokit-bim-viewer"><meta property="og:title" content="xeokit-bim-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-bim-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-bim-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/BIMViewer.js~BIMViewer.html">BIMViewer</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#collision">collision</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/collision/ObjectsKdTree3.js~ObjectsKdTree3.html">ObjectsKdTree3</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/ClassesExplorer.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {TreeViewPlugin, math} from &quot;@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js&quot;;
import {Controller} from &quot;../Controller.js&quot;;
import {TreeViewContextMenu} from &quot;../contextMenus/TreeViewContextMenu.js&quot;;
/** @private */
class ClassesExplorer extends Controller {
constructor(parent, cfg = {}) {
super(parent);
if (!cfg.classesTabElement) {
throw &quot;Missing config: classesTabElement&quot;;
}
if (!cfg.showAllClassesButtonElement) {
throw &quot;Missing config: showAllClassesButtonElement&quot;;
}
if (!cfg.hideAllClassesButtonElement) {
throw &quot;Missing config: hideAllClassesButtonElement&quot;;
}
if (!cfg.classesElement) {
throw &quot;Missing config: classesElement&quot;;
}
this._classesTabElement = cfg.classesTabElement;
this._showAllClassesButtonElement = cfg.showAllClassesButtonElement;
this._hideAllClassesButtonElement = cfg.hideAllClassesButtonElement;
this._classesTabButtonElement = this._classesTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._classesTabButtonElement) {
throw &quot;Missing DOM element: xeokit-tab-btn&quot;;
}
const classesElement = cfg.classesElement;
this._treeView = new TreeViewPlugin(this.viewer, {
containerElement: classesElement,
hierarchy: &quot;types&quot;,
autoAddModels: false,
pruneEmptyNodes: true
});
this._treeViewContextMenu = new TreeViewContextMenu(this.bimViewer, {
hideOnAction: true
});
this._treeView.on(&quot;contextmenu&quot;, (e) =&gt; {
this._treeViewContextMenu.context = {
bimViewer: this.bimViewer,
viewer: e.viewer,
treeViewPlugin: e.treeViewPlugin,
treeViewNode: e.treeViewNode
};
this._treeViewContextMenu.show(e.event.pageX, e.event.pageY);
});
this._treeView.on(&quot;nodeTitleClicked&quot;, (e) =&gt; {
const scene = this.viewer.scene;
const objectIds = [];
e.treeViewPlugin.withNodeTree(e.treeViewNode, (treeViewNode) =&gt; {
if (treeViewNode.objectId) {
objectIds.push(treeViewNode.objectId);
}
});
const checked = e.treeViewNode.checked;
if (checked) {
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, false);
scene.setObjectsPickable(objectIds, true);
} else {
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, true);
scene.setObjectsPickable(objectIds, true);
}
});
this._onModelLoaded = this.viewer.scene.on(&quot;modelLoaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
const modelInfo = this.bimViewer._modelsExplorer.getModelInfo(modelId);
if (!modelInfo) {
return;
}
this._treeView.addModel(modelId, {
rootName: modelInfo.name
});
}
});
this._onModelUnloaded = this.viewer.scene.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
this._treeView.removeModel(modelId);
}
});
this.bimViewer.on(&quot;reset&quot;, () =&gt; {
this._treeView.collapse();
});
}
setEnabled(enabled) {
if (!enabled) {
this._classesTabButtonElement.classList.add(&quot;disabled&quot;);
this._showAllClassesButtonElement.classList.add(&quot;disabled&quot;);
this._hideAllClassesButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._classesTabButtonElement.classList.remove(&quot;disabled&quot;);
this._showAllClassesButtonElement.classList.remove(&quot;disabled&quot;);
this._hideAllClassesButtonElement.classList.remove(&quot;disabled&quot;);
}
}
expandTreeViewToDepth(depth) {
this._treeView.expandToDepth(depth);
}
showNodeInTreeView(objectId) {
this._treeView.collapse();
this._treeView.showNode(objectId);
}
unShowNodeInTreeView() {
this._treeView.unShowNode();
}
destroy() {
super.destroy();
this._treeView.destroy();
this._treeViewContextMenu.destroy();
this.viewer.scene.off(this._onModelLoaded);
this.viewer.scene.off(this._onModelUnloaded);
}
}
export {ClassesExplorer};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
+191
View File
@@ -0,0 +1,191 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/Explorer.js | xeokit-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="View large 3D BIM models in all major browsers and collaborate on issues using BCF"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-viewer"><meta property="og:site_name" content="xeokit-viewer"><meta property="og:title" content="xeokit-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="View large 3D BIM models in all major browsers and collaborate on issues using BCF"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-viewer"><meta property="twitter:description" content="View large 3D BIM models in all major browsers and collaborate on issues using BCF"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/Controller.js~Controller.html">Controller</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/ViewerUI.js~ViewerUI.html">ViewerUI</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#explorer">explorer</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/explorer/Classes.js~Classes.html">Classes</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/explorer/Explorer.js~Explorer.html">Explorer</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/explorer/Models.js~Models.html">Models</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/explorer/Objects.js~Objects.html">Objects</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/explorer/Storeys.js~Storeys.html">Storeys</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#toolbar">toolbar</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/BCFMode.js~BCFMode.html">BCFMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/FirstPersonMode.js~FirstPersonMode.html">FirstPersonMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/FitAction.js~FitAction.html">FitAction</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/HideMode.js~HideMode.html">HideMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/NavCubeMode.js~NavCubeMode.html">NavCubeMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/OrthoMode.js~OrthoMode.html">OrthoMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/QueryMode.js~QueryMode.html">QueryMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/ResetAction.js~ResetAction.html">ResetAction</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/SectionMode.js~SectionMode.html">SectionMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/SelectMode.js~SelectMode.html">SelectMode</a></span></span></li>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/toolbar/Toolbar.js~Toolbar.html">Toolbar</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/Explorer.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {Controller} from &quot;../Controller.js&quot;;
import {Classes} from &quot;./Classes.js&quot;;
import {Objects} from &quot;./Objects.js&quot;;
import {Models} from &quot;./Models.js&quot;;
/**
* Manages the explorer trees.
*
* Located at {@link Toolbar#explorer}.
*/
class Explorer extends Controller {
/** @private */
constructor(parent, cfg = {}) {
super(parent);
/**
*
* @type {Models}
*/
this.models = new Models(this, cfg);
/**
*
* @type {Objects}
*/
this.objects = new Objects(this, cfg);
/**
*
* @type {Classes}
*/
this.classes = new Classes(this, cfg);
// /**
// *
// * @type {Storeys}
// */
// this.storeys = new Storeys(this, cfg);
$(&quot;#unloadAllModels&quot;).on(&apos;click&apos;, (event) =&gt; {
this._unloadAllModels();
event.preventDefault();
});
$(&quot;#showAllObjects&quot;).on(&apos;click&apos;, (event) =&gt; {
this._showAllObjects();
event.preventDefault();
});
$(&quot;#hideAllObjects&quot;).on(&apos;click&apos;, (event) =&gt; {
this._hideAllObjects();
event.preventDefault();
});
$(&quot;#showAllClasses&quot;).on(&apos;click&apos;, (event) =&gt; {
this._showAllObjects();
event.preventDefault();
});
$(&quot;#hideAllClasses&quot;).on(&apos;click&apos;, (event) =&gt; {
this._hideAllObjects();
event.preventDefault();
});
// Handling model load events here ensures that we
// are able to fire &quot;modelLoaded&quot; after both trees updated.
this.models.on(&quot;modelLoaded&quot;, (modelId) =&gt; {
this.objects._addModel(modelId);
this.classes._addModel(modelId);
this.fire(&quot;modelLoaded&quot;, modelId);
});
this.models.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
this.objects._removeModel(modelId);
this.classes._removeModel(modelId);
this.fire(&quot;modelUnloaded&quot;, modelId);
});
}
_unloadAllModels() {
// TODO
}
_showAllObjects() {
this.objects.muteEvents();
this.classes.muteEvents();
this.viewer.scene.setObjectsVisible(this.viewer.scene.objectIds, true);
this.objects.selectAll();
this.classes.selectAll();
this.objects.unmuteEvents();
this.classes.unmuteEvents();
}
_hideAllObjects() {
this.objects.muteEvents();
this.classes.muteEvents();
this.viewer.scene.setObjectsVisible(this.viewer.scene.visibleObjectIds, false);
this.objects.deselectAll();
this.classes.deselectAll();
this.objects.unmuteEvents();
this.classes.unmuteEvents();
}
destroy() {
super.destroy();
}
}
export {Explorer};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
+264
View File
@@ -0,0 +1,264 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/Models.js | xeokit-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-viewer"><meta property="og:site_name" content="xeokit-viewer"><meta property="og:title" content="xeokit-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/ViewerUI.js~ViewerUI.html">ViewerUI</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#ifcobjectdefaults">IFCObjectDefaults</a><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-IFCObjectDefaults">IFCObjectDefaults</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/Models.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {Controller} from &quot;../Controller.js&quot;;
import {XKTLoaderPlugin} from &quot;@xeokit/xeokit-sdk/src/plugins/XKTLoaderPlugin/XKTLoaderPlugin.js&quot;;
import {math} from &quot;@xeokit/xeokit-sdk/src/viewer/scene/math/math.js&quot;;
import {IFCObjectDefaults} from &quot;../IFCObjectDefaults/IFCObjectDefaults.js&quot;;
const tempVec3 = math.vec3();
/** @private */
class Models extends Controller {
constructor(parent, cfg) {
super(parent, cfg);
if (!cfg.modelsTabElement) {
throw &quot;Missing config: modelsTabElement&quot;;
}
if (!cfg.unloadModelsButtonElement) {
throw &quot;Missing config: unloadModelsButtonElement&quot;;
}
if (!cfg.modelsElement) {
throw &quot;Missing config: modelsElement&quot;;
}
this._modelsTabElement = cfg.modelsTabElement;
this._unloadModelsButtonElement = cfg.unloadModelsButtonElement;
this._modelsElement = cfg.modelsElement;
this._modelsTabButtonElement = this._modelsTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._modelsTabButtonElement) {
throw &quot;Missing DOM element: ,xeokit-tab-btn&quot;;
}
this._xktLoader = new XKTLoaderPlugin(this.viewer, {
// objectDefaults: IFCObjectDefaults
});
this._modelsInfo = {};
this._numModelsLoaded = 0;
this._projectId = null;
}
_loadProject(projectId, done, error) {
const params = {};
this.server.getProject(projectId, (projectInfo) =&gt; {
this._projectId = projectId;
var html = &quot;&quot;;
const modelsInfo = projectInfo.models || [];
this._modelsInfo = {};
for (let i = 0, len = modelsInfo.length; i &lt; len; i++) {
const modelInfo = modelsInfo[i];
this._modelsInfo[modelInfo.id] = modelInfo;
html += &quot;&lt;div class=&apos;xeokit-form-check&apos;&gt;&quot;;
html += &quot;&lt;input id=&apos;&quot; + modelInfo.id + &quot;&apos; type=&apos;checkbox&apos; value=&apos;&apos;&gt;&quot; + modelInfo.name;
html += &quot;&lt;/div&gt;&quot;;
}
this._modelsElement.innerHTML = html;
for (let i = 0, len = modelsInfo.length; i &lt; len; i++) {
const modelInfo = modelsInfo[i];
const modelId = modelInfo.id;
const checkBox = document.getElementById(&quot;&quot; + modelId);
checkBox.addEventListener(&quot;click&quot;, () =&gt; {
if (checkBox.checked) {
this._loadModel(modelId);
} else {
this._unloadModel(modelInfo.id);
}
});
if (modelInfo.default) {
checkBox.checked = true;
this._loadModel(modelId, done, error); // TODO: buffer and load at end
}
}
}, (errMsg) =&gt; {
this.error(errMsg);
if (error) {
error(errMsg);
}
});
}
_loadModel(modelId, done, error) {
const modelInfo = this._modelsInfo[modelId];
if (!modelInfo) {
if (error) {
error(&quot;Model not in current project&quot;);
}
return;
}
this.viewerUI._controllers.busyModal.show(&quot;Loading &quot; + modelInfo.name);
this.server.getMetadata(this._projectId, modelId,
(json) =&gt; {
this.server.getGeometry(this._projectId, modelId,
(arraybuffer) =&gt; {
const model = this._xktLoader.load({
id: modelId,
metaModelData: json,
xkt: arraybuffer,
excludeUnclassifiedObjects: true,
edges: true,
position: modelInfo.position,
scale: modelInfo.scale,
rotation: modelInfo.rotation,
matrix: modelInfo.matrix
});
model.on(&quot;loaded&quot;, () =&gt; {
const scene = this.viewer.scene;
const aabb = scene.getAABB(scene.visibleObjectIds);
this._numModelsLoaded++;
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
if (this._numModelsLoaded === 1) { // Jump camera when only one model
this.viewer.cameraFlight.jumpTo({
aabb: aabb
});
this.viewer.cameraControl.pivotPos = math.getAABB3Center(aabb, tempVec3);
this.fire(&quot;modelLoaded&quot;, modelId);
this.viewerUI._controllers.busyModal.hide();
if (done) {
done();
}
} else { // Fly camera when multiple models
this.viewer.cameraFlight.flyTo({
aabb: aabb
}, () =&gt; {
this.viewer.cameraControl.pivotPos = math.getAABB3Center(aabb, tempVec3);
this.fire(&quot;modelLoaded&quot;, modelId);
this.viewerUI._controllers.busyModal.hide();
if (done) {
done();
}
});
}
});
},
(errMsg) =&gt; {
this.error(errMsg);
this.viewerUI._controllers.busyModal.hide();
});
},
(errMsg) =&gt; {
this.error(errMsg);
this.viewerUI._controllers.busyModal.hide();
});
}
_unloadModel(modelId) {
const model = this.viewer.scene.models[modelId];
if (!model) {
this.error(&quot;Model not loaded: &quot; + modelId);
return;
}
model.destroy();
const scene = this.viewer.scene;
const aabb = scene.getAABB(scene.visibleObjectIds);
document.getElementById(&quot;&quot; + modelId).checked = false;
this._numModelsLoaded--;
if (this._numModelsLoaded &gt; 0) {
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
} else {
this._unloadModelsButtonElement.classList.add(&quot;disabled&quot;);
}
this.viewer.cameraFlight.flyTo({
aabb: aabb
}, () =&gt; {
this.viewer.cameraControl.pivotPos = math.getAABB3Center(aabb, tempVec3);
this.fire(&quot;modelUnloaded&quot;, modelId);
});
}
_unloadModels() {
const models = this.viewer.scene.models;
const modelIds = Object.keys(models);
for (var i = 0, len = modelIds.length; i &lt; len; i++) {
const modelId = modelIds[i];
this._unloadModel(modelId);
}
}
getNumModelsLoaded() {
return this._numModelsLoaded;
}
getModelsInfo() {
return this._modelsInfo;
}
getModelInfo(modelId) {
return this._modelsInfo[modelId];
}
setEnabled(enabled) {
if (!enabled) {
this._modelsTabButtonElement.classList.add(&quot;disabled&quot;);
this._unloadModelsButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._modelsTabButtonElement.classList.remove(&quot;disabled&quot;);
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
}
}
/** @private */
destroy() {
super.destroy();
this._xktLoader.destroy();
}
}
export {Models};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
@@ -0,0 +1,533 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/ModelsExplorer.js | xeokit-bim-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-bim-viewer"><meta property="og:site_name" content="xeokit-bim-viewer"><meta property="og:title" content="xeokit-bim-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-bim-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-bim-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/BIMViewer.js~BIMViewer.html">BIMViewer</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#collision">collision</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/collision/ObjectsKdTree3.js~ObjectsKdTree3.html">ObjectsKdTree3</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/ModelsExplorer.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {math, XKTLoaderPlugin} from &quot;@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js&quot;;
import {Controller} from &quot;../Controller.js&quot;;
import {ModelsContextMenu} from &quot;../contextMenus/ModelsContextMenu.js&quot;;
const tempVec3a = math.vec3();
/**
* Custom data access strategy for {@link XKTLoaderPlugin}.
* @private
*/
class BIMViewerDataSource {
constructor(server) {
this._server = server;
}
setProjectId(projectId) {
this._projectId = projectId;
}
setModelId(modelId) {
this._modelId = modelId;
}
getManifest(src, ok, error) {
this._server.getSplitModelManifest(this._projectId, this._modelId, src, ok, error);
}
getMetaModel(src, ok, error) {
this._server.getSplitModelMetadata(this._projectId, this._modelId, src, ok, error);
}
getXKT(src, ok, error) {
this._server.getSplitModelGeometry(this._projectId, this._modelId, src, ok, error)
}
}
/** @private */
class ModelsExplorer extends Controller {
constructor(parent, cfg) {
super(parent, cfg);
if (!cfg.modelsTabElement) {
throw &quot;Missing config: modelsTabElement&quot;;
}
if (!cfg.unloadModelsButtonElement) {
throw &quot;Missing config: unloadModelsButtonElement&quot;;
}
if (!cfg.modelsElement) {
throw &quot;Missing config: modelsElement&quot;;
}
this._enableAddModels = !!cfg.enableEditModels;
this._modelsTabElement = cfg.modelsTabElement;
this._loadModelsButtonElement = cfg.loadModelsButtonElement;
this._unloadModelsButtonElement = cfg.unloadModelsButtonElement;
this._addModelButtonElement = cfg.addModelButtonElement;
this._modelsElement = cfg.modelsElement;
this._modelsTabButtonElement = this._modelsTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._modelsTabButtonElement) {
throw &quot;Missing DOM element: ,xeokit-tab-btn&quot;;
}
this._dataSource = new BIMViewerDataSource(this.server);
this._xktLoader = new XKTLoaderPlugin(this.viewer, {
dataSource: this._dataSource
});
this._modelsContextMenu = new ModelsContextMenu({
enableEditModels: cfg.enableEditModels,
hideOnAction: true
});
this._modelsInfo = {};
this._numModels = 0;
this._numModelsLoaded = 0;
this._projectId = null;
}
setObjectColors(objectColors) {
this._xktLoader.objectDefaults = objectColors;
}
loadProject(projectId, done, error) {
this.server.getProject(projectId, (projectInfo) =&gt; {
this.unloadProject();
this._projectId = projectId;
this._modelsInfo = {};
this._numModels = 0;
this._parseProject(projectInfo, done);
if (this._numModelsLoaded &lt; this._numModels) {
this._loadModelsButtonElement.classList.remove(&quot;disabled&quot;);
}
if (this._numModelsLoaded &gt; 0) {
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
}
if (this._enableAddModels) {
this._addModelButtonElement.classList.remove(&quot;disabled&quot;);
}
}, (errMsg) =&gt; {
this.error(errMsg);
if (error) {
error(errMsg);
}
});
}
_parseProject(projectInfo, done) {
this._buildModelsMenu(projectInfo);
this._parseViewerConfigs(projectInfo);
this._parseViewerContent(projectInfo, () =&gt; {
this._parseViewerState(projectInfo, () =&gt; {
done();
});
});
}
_buildModelsMenu(projectInfo) {
var html = &quot;&quot;;
const modelsInfo = projectInfo.models || [];
this._modelsInfo = {};
this._numModels = modelsInfo.length;
for (let i = 0, len = modelsInfo.length; i &lt; len; i++) {
const modelInfo = modelsInfo[i];
this._modelsInfo[modelInfo.id] = modelInfo;
html += &quot;&lt;div class=&apos;xeokit-form-check&apos;&gt;&quot;;
html += &quot;&lt;input id=&apos;&quot; + modelInfo.id + &quot;&apos; type=&apos;checkbox&apos; value=&apos;&apos;&gt;&lt;span id=&apos;span-&quot; + modelInfo.id + &quot;&apos; class=&apos;disabled&apos;&gt;&quot; + modelInfo.name + &quot;&lt;/span&gt;&quot;;
html += &quot;&lt;/div&gt;&quot;;
}
this._modelsElement.innerHTML = html;
for (let i = 0, len = modelsInfo.length; i &lt; len; i++) {
const modelInfo = modelsInfo[i];
const modelId = modelInfo.id;
const checkBox = document.getElementById(&quot;&quot; + modelId);
const span = document.getElementById(&quot;span-&quot; + modelId);
checkBox.addEventListener(&quot;click&quot;, () =&gt; {
if (checkBox.checked) {
this.loadModel(modelId);
} else {
this.unloadModel(modelInfo.id);
}
});
span.addEventListener(&quot;click&quot;, () =&gt; {
const model = this.viewer.scene.models[modelId];
const modelLoaded = (!!model);
if (!modelLoaded) {
this.loadModel(modelId);
} else {
this.unloadModel(modelInfo.id);
}
});
span.oncontextmenu = (e) =&gt; {
this._modelsContextMenu.context = {
bimViewer: this.bimViewer,
viewer: this.viewer,
modelId: modelId
};
this._modelsContextMenu.show(e.pageX, e.pageY);
e.preventDefault();
};
}
}
_parseViewerConfigs(projectInfo) {
const viewerConfigs = projectInfo.viewerConfigs;
if (viewerConfigs) {
this.bimViewer.setConfigs(viewerConfigs);
}
}
_parseViewerContent(projectInfo, done) {
const viewerContent = projectInfo.viewerContent;
if (!viewerContent) {
done();
return;
}
this._parseModelsLoaded(viewerContent, () =&gt; {
done();
});
}
_parseModelsLoaded(viewerContent, done) {
const modelsLoaded = viewerContent.modelsLoaded;
if (!modelsLoaded || (modelsLoaded.length === 0)) {
done();
return;
}
this._loadNextModel(modelsLoaded.slice(0), done);
}
_loadNextModel(modelsLoaded, done) {
if (modelsLoaded.length === 0) {
done();
return;
}
const modelId = modelsLoaded.pop();
this.loadModel(modelId,
() =&gt; { // Done
this._loadNextModel(modelsLoaded, done);
},
() =&gt; { // Error - recover and attempt to load next model
this._loadNextModel(modelsLoaded, done);
});
}
_parseViewerState(projectInfo, done) {
const viewerState = projectInfo.viewerState;
if (!viewerState) {
done();
return;
}
this.bimViewer.setViewerState(viewerState, done);
}
unloadProject() {
if (!this._projectId) {
return;
}
const models = this.viewer.scene.models;
for (var modelId in models) {
if (models.hasOwnProperty(modelId)) {
const model = models[modelId];
model.destroy();
}
}
this._modelsElement.innerHTML = &quot;&quot;;
this._numModelsLoaded = 0;
this._loadModelsButtonElement.classList.add(&quot;disabled&quot;);
this._unloadModelsButtonElement.classList.add(&quot;disabled&quot;);
if (this._enableAddModels) {
this._addModelButtonElement.classList.add(&quot;disabled&quot;);
}
const lastProjectId = this._projectId;
this._projectId = null;
this.fire(&quot;projectUnloaded&quot;, {
projectId: lastProjectId
});
}
getLoadedProjectId() {
return this._projectId;
}
getModelIds() {
return Object.keys(this._modelsInfo);
}
loadModel(modelId, done, error) {
if (!this._projectId) {
const errMsg = &quot;No project currently loaded&quot;;
this.error(errMsg);
if (error) {
error(errMsg);
}
return;
}
const modelInfo = this._modelsInfo[modelId];
if (!modelInfo) {
const errMsg = &quot;Model not in currently loaded project&quot;;
this.error(errMsg);
if (error) {
error(errMsg);
}
return;
}
this.bimViewer._busyModal.show(`${this.viewer.localeService.translate(&quot;busyModal.loading&quot;) || &quot;Loading&quot;} ${modelInfo.name}`);
const externalMetadata = this.bimViewer.getConfig(&quot;externalMetadata&quot;);
if (externalMetadata &amp;&amp; !modelInfo.manifest) {
this.server.getMetadata(this._projectId, modelId, (json) =&gt; {
this._loadGeometry(modelId, modelInfo, json, done, error);
},
(errMsg) =&gt; {
this.bimViewer._busyModal.hide();
this.error(errMsg);
if (error) {
error(errMsg);
}
});
} else {
this._loadGeometry(modelId, modelInfo, null, done, error);
}
}
_loadGeometry(modelId, modelInfo, json, done, error) {
const modelLoaded = () =&gt; {
const checkbox = document.getElementById(&quot;&quot; + modelId);
checkbox.checked = true;
this._numModelsLoaded++;
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
if (this._numModelsLoaded &lt; this._numModels) {
this._loadModelsButtonElement.classList.remove(&quot;disabled&quot;);
} else {
this._loadModelsButtonElement.classList.add(&quot;disabled&quot;);
}
if (this._numModelsLoaded === 1) { // Jump camera to view-fit first model loaded
this._jumpToInitialCamera();
this.fire(&quot;modelLoaded&quot;, modelId);
this.bimViewer._busyModal.hide();
if (done) {
done();
}
} else {
this.fire(&quot;modelLoaded&quot;, modelId);
this.bimViewer._busyModal.hide();
if (done) {
done();
}
}
};
const loadError = (errMsg) =&gt; {
this.bimViewer._busyModal.hide();
this.error(errMsg);
if (error) {
error(errMsg);
}
};
if (modelInfo.manifest) {
// Load multi-part split model;
// Uses the BIMViewerDataSource, which then uses the BIMViewer&apos;s Server strategy
this._dataSource.setProjectId(this._projectId);
this._dataSource.setModelId(modelId);
const model = this._xktLoader.load({
id: modelId,
manifestSrc: modelInfo.manifest,
excludeUnclassifiedObjects: true,
origin: modelInfo.origin || modelInfo.position,
scale: modelInfo.scale,
rotation: modelInfo.rotation,
matrix: modelInfo.matrix,
edges: (modelInfo.edges !== false),
saoEnabled: modelInfo.saoEnabled,
pbrEnabled: modelInfo.pbrEnabled,
backfaces: modelInfo.backfaces,
globalizeObjectIds: modelInfo.globalizeObjectIds,
reuseGeometries: (modelInfo.reuseGeometries !== false)
});
model.on(&quot;loaded&quot;, modelLoaded);
model.on(&quot;error&quot;, loadError);
} else {
// Load single XKT/Metamodel file model;
// Uses the BIMViewer&apos;s Server strategy directly
this.server.getGeometry(this._projectId, modelId, (arraybuffer) =&gt; {
const model = this._xktLoader.load({
id: modelId,
metaModelData: json,
xkt: arraybuffer,
excludeUnclassifiedObjects: true,
origin: modelInfo.origin || modelInfo.position,
scale: modelInfo.scale,
rotation: modelInfo.rotation,
matrix: modelInfo.matrix,
edges: (modelInfo.edges !== false),
saoEnabled: modelInfo.saoEnabled,
pbrEnabled: modelInfo.pbrEnabled,
backfaces: modelInfo.backfaces,
globalizeObjectIds: modelInfo.globalizeObjectIds,
reuseGeometries: (modelInfo.reuseGeometries !== false)
});
model.on(&quot;loaded&quot;, modelLoaded);
model.on(&quot;error&quot;, loadError);
}, loadError);
}
}
_jumpToInitialCamera() {
const viewer = this.viewer;
const scene = viewer.scene;
const aabb = scene.getAABB(scene.visibleObjectIds);
const diag = math.getAABB3Diag(aabb);
const center = math.getAABB3Center(aabb, tempVec3a);
const camera = scene.camera;
const fitFOV = camera.perspective.fov;
const dist = Math.abs(diag / Math.tan(45 * math.DEGTORAD));
const dir = math.normalizeVec3((camera.yUp) ? [-0.5, -0.7071, -0.5] : [-1, 1, -1]);
const up = math.normalizeVec3((camera.yUp) ? [-0.5, 0.7071, -0.5] : [-1, 1, 1]);
viewer.cameraControl.pivotPos = center;
viewer.cameraControl.planView = false;
viewer.cameraFlight.jumpTo({
look: center,
eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
up: up,
orthoScale: diag * 1.1
});
}
unloadModel(modelId) {
const model = this.viewer.scene.models[modelId];
if (!model) {
this.error(&quot;Model not loaded: &quot; + modelId);
return;
}
model.destroy();
const checkbox = document.getElementById(&quot;&quot; + modelId);
checkbox.checked = false;
const span = document.getElementById(&quot;span-&quot; + modelId);
this._numModelsLoaded--;
if (this._numModelsLoaded &gt; 0) {
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
} else {
this._unloadModelsButtonElement.classList.add(&quot;disabled&quot;);
}
if (this._numModelsLoaded &lt; this._numModels) {
this._loadModelsButtonElement.classList.remove(&quot;disabled&quot;);
} else {
this._loadModelsButtonElement.classList.add(&quot;disabled&quot;);
}
this.fire(&quot;modelUnloaded&quot;, modelId);
}
unloadAllModels() {
const models = this.viewer.scene.models;
const modelIds = Object.keys(models);
for (var i = 0, len = modelIds.length; i &lt; len; i++) {
const modelId = modelIds[i];
this.unloadModel(modelId);
}
}
getNumModelsLoaded() {
return this._numModelsLoaded;
}
_getLoadedModelIds() {
return Object.keys(this.viewer.scene.models);
}
isModelLoaded(modelId) {
return (!!this.viewer.scene.models[modelId]);
}
getModelsInfo() {
return this._modelsInfo;
}
getModelInfo(modelId) {
return this._modelsInfo[modelId];
}
setEnabled(enabled) {
if (!enabled) {
this._modelsTabButtonElement.classList.add(&quot;disabled&quot;);
this._unloadModelsButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._modelsTabButtonElement.classList.remove(&quot;disabled&quot;);
this._unloadModelsButtonElement.classList.remove(&quot;disabled&quot;);
}
}
/** @private */
destroy() {
super.destroy();
this._xktLoader.destroy();
}
}
export {ModelsExplorer};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
+163
View File
@@ -0,0 +1,163 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/Objects.js | xeokit-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-viewer"><meta property="og:site_name" content="xeokit-viewer"><meta property="og:title" content="xeokit-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/ViewerUI.js~ViewerUI.html">ViewerUI</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#ifcobjectdefaults">IFCObjectDefaults</a><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-IFCObjectDefaults">IFCObjectDefaults</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/Objects.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {Controller} from &quot;../Controller.js&quot;;
import {TreeViewPlugin} from &quot;@xeokit/xeokit-sdk/src/plugins/TreeViewPlugin/TreeViewPlugin.js&quot;;
import {TreeViewContextMenuItems} from &quot;../contextMenuItems/TreeViewContextMenuItems.js&quot;;
import {ContextMenu} from &quot;@xeokit/xeokit-sdk/src/extras/ContextMenu/ContextMenu.js&quot;;
/** @private */
class Objects extends Controller {
constructor(parent, cfg = {}) {
super(parent);
if (!cfg.objectsTabElement) {
throw &quot;Missing config: objectsTabElement&quot;;
}
if (!cfg.showAllObjectsButtonElement) {
throw &quot;Missing config: showAllObjectsButtonElement&quot;;
}
if (!cfg.hideAllObjectsButtonElement) {
throw &quot;Missing config: hideAllObjectsButtonElement&quot;;
}
if (!cfg.objectsElement) {
throw &quot;Missing config: objectsElement&quot;;
}
this._objectsTabElement = cfg.objectsTabElement;
this._showAllObjectsButtonElement = cfg.showAllObjectsButtonElement;
this._hideAllObjectsButtonElement = cfg.hideAllObjectsButtonElement;
this._objectsTabButtonElement = this._objectsTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._objectsTabButtonElement) {
throw &quot;Missing DOM element: ,xeokit-tab-btn&quot;;
}
const objectsElement = cfg.objectsElement;
this._treeView = new TreeViewPlugin(this.viewer, {
containerElement: objectsElement,
hierarchy: &quot;containment&quot;,
autoAddModels: false
});
this._treeViewContextMenu = new ContextMenu({
items: TreeViewContextMenuItems
});
this._treeView.on(&quot;contextmenu&quot;, (e) =&gt; {
this._treeViewContextMenu.show(e.event.pageX, e.event.pageY);
this._treeViewContextMenu.context = {
viewer: e.viewer,
treeViewPlugin: e.treeViewPlugin,
treeViewNode: e.treeViewNode
};
});
this._onModelLoaded = this.viewer.scene.on(&quot;modelLoaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
const modelInfo = this.viewerUI._controllers.models.getModelInfo(modelId);
if (!modelInfo) {
return;
}
this._treeView.addModel(modelId, {
rootName: modelInfo.name
});
}
});
this._onModelUnloaded = this.viewer.scene.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
this._treeView.removeModel(modelId);
}
});
this.viewerUI.on(&quot;reset&quot;, ()=&gt;{
this._treeView.collapse();
});
}
setEnabled(enabled) {
if (!enabled) {
this._objectsTabButtonElement.classList.add(&quot;disabled&quot;);
this._showAllObjectsButtonElement.classList.add(&quot;disabled&quot;);
this._hideAllObjectsButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._objectsTabButtonElement.classList.remove(&quot;disabled&quot;);
this._showAllObjectsButtonElement.classList.remove(&quot;disabled&quot;);
this._hideAllObjectsButtonElement.classList.remove(&quot;disabled&quot;);
}
}
showNodeInTreeView(objectId) {
this._treeView.collapse();
this._treeView.showNode(objectId);
}
destroy() {
super.destroy();
this._treeView.destroy();
this._treeViewContextMenu.destroy();
this.viewer.scene.off(this._onModelLoaded);
this.viewer.scene.off(this._onModelUnloaded);
}
}
export {Objects};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
@@ -0,0 +1,192 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/ObjectsExplorer.js | xeokit-bim-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-bim-viewer"><meta property="og:site_name" content="xeokit-bim-viewer"><meta property="og:title" content="xeokit-bim-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-bim-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-bim-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/BIMViewer.js~BIMViewer.html">BIMViewer</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#collision">collision</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/collision/ObjectsKdTree3.js~ObjectsKdTree3.html">ObjectsKdTree3</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/ObjectsExplorer.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {TreeViewPlugin} from &quot;@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js&quot;;
import {TreeViewContextMenu} from &quot;../contextMenus/TreeViewContextMenu.js&quot;;
import {Controller} from &quot;../Controller.js&quot;;
/** @private */
class ObjectsExplorer extends Controller {
constructor(parent, cfg = {}) {
super(parent);
if (!cfg.objectsTabElement) {
throw &quot;Missing config: objectsTabElement&quot;;
}
if (!cfg.showAllObjectsButtonElement) {
throw &quot;Missing config: showAllObjectsButtonElement&quot;;
}
if (!cfg.hideAllObjectsButtonElement) {
throw &quot;Missing config: hideAllObjectsButtonElement&quot;;
}
if (!cfg.objectsElement) {
throw &quot;Missing config: objectsElement&quot;;
}
this._objectsTabElement = cfg.objectsTabElement;
this._showAllObjectsButtonElement = cfg.showAllObjectsButtonElement;
this._hideAllObjectsButtonElement = cfg.hideAllObjectsButtonElement;
this._objectsTabButtonElement = this._objectsTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._objectsTabButtonElement) {
throw &quot;Missing DOM element: ,xeokit-tab-btn&quot;;
}
const objectsElement = cfg.objectsElement;
this._treeView = new TreeViewPlugin(this.viewer, {
containerElement: objectsElement,
hierarchy: &quot;containment&quot;,
autoAddModels: false,
pruneEmptyNodes: true
});
this._treeViewContextMenu = new TreeViewContextMenu(this.bimViewer, {
hideOnAction: true
});
this._treeView.on(&quot;contextmenu&quot;, (e) =&gt; {
this._treeViewContextMenu.context = {
bimViewer: this.bimViewer,
viewer: e.viewer,
treeViewPlugin: e.treeViewPlugin,
treeViewNode: e.treeViewNode
};
this._treeViewContextMenu.show(e.event.pageX, e.event.pageY);
});
this._treeView.on(&quot;nodeTitleClicked&quot;, (e) =&gt; {
const scene = this.viewer.scene;
const objectIds = [];
e.treeViewPlugin.withNodeTree(e.treeViewNode, (treeViewNode) =&gt; {
if (treeViewNode.objectId) {
objectIds.push(treeViewNode.objectId);
}
});
const checked = e.treeViewNode.checked;
if (checked) {
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, false);
scene.setObjectsPickable(objectIds, true);
} else {
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, true);
scene.setObjectsPickable(objectIds, true);
}
});
this._onModelLoaded = this.viewer.scene.on(&quot;modelLoaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
const modelInfo = this.bimViewer._modelsExplorer.getModelInfo(modelId);
if (!modelInfo) {
return;
}
this._treeView.addModel(modelId, {
rootName: modelInfo.name
});
}
});
this._onModelUnloaded = this.viewer.scene.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
this._treeView.removeModel(modelId);
}
});
this.bimViewer.on(&quot;reset&quot;, () =&gt; {
this._treeView.collapse();
});
}
setEnabled(enabled) {
if (!enabled) {
this._objectsTabButtonElement.classList.add(&quot;disabled&quot;);
this._showAllObjectsButtonElement.classList.add(&quot;disabled&quot;);
this._hideAllObjectsButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._objectsTabButtonElement.classList.remove(&quot;disabled&quot;);
this._showAllObjectsButtonElement.classList.remove(&quot;disabled&quot;);
this._hideAllObjectsButtonElement.classList.remove(&quot;disabled&quot;);
}
}
expandTreeViewToDepth(depth) {
this._treeView.expandToDepth(depth);
}
showNodeInTreeView(objectId) {
this._treeView.collapse();
this._treeView.showNode(objectId);
}
unShowNodeInTreeView() {
this._treeView.unShowNode();
}
destroy() {
super.destroy();
this._treeView.destroy();
this._treeViewContextMenu.destroy();
this.viewer.scene.off(this._onModelLoaded);
this.viewer.scene.off(this._onModelUnloaded);
}
}
export {ObjectsExplorer};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
+162
View File
@@ -0,0 +1,162 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/Storeys.js | xeokit-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-viewer"><meta property="og:site_name" content="xeokit-viewer"><meta property="og:title" content="xeokit-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/ViewerUI.js~ViewerUI.html">ViewerUI</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#ifcobjectdefaults">IFCObjectDefaults</a><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-IFCObjectDefaults">IFCObjectDefaults</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/Storeys.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {Controller} from &quot;../Controller.js&quot;;
import {TreeViewPlugin} from &quot;@xeokit/xeokit-sdk/src/plugins/TreeViewPlugin/TreeViewPlugin.js&quot;;
import {ContextMenu} from &quot;@xeokit/xeokit-sdk/src/extras/ContextMenu/ContextMenu.js&quot;;
import {TreeViewContextMenuItems} from &quot;../contextMenuItems/TreeViewContextMenuItems.js&quot;;
/** @private */
class Storeys extends Controller {
constructor(parent, cfg = {}) {
super(parent);
if (!cfg.storeysTabElement) {
throw &quot;Missing config: storeysTabElement&quot;;
}
if (!cfg.showAllStoreysButtonElement) {
throw &quot;Missing config: showAllStoreysButtonElement&quot;;
}
if (!cfg.hideAllStoreysButtonElement) {
throw &quot;Missing config: hideAllStoreysButtonElement&quot;;
}
if (!cfg.storeysElement) {
throw &quot;Missing config: storeysElement&quot;;
}
this._storeysTabElement = cfg.storeysTabElement;
this._showAllStoreysButtonElement = cfg.showAllStoreysButtonElement;
this._hideAllStoreysButtonElement = cfg.hideAllStoreysButtonElement;
this._storeysTabButtonElement = this._storeysTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._storeysTabButtonElement) {
throw &quot;Missing DOM element: .xeokit-tab-btn&quot;;
}
const storeysElement = cfg.storeysElement;
this._treeView = new TreeViewPlugin(this.viewer, {
containerElement: storeysElement,
autoAddModels: false,
hierarchy: &quot;storeys&quot;
});
this._treeViewContextMenu = new ContextMenu({
items: TreeViewContextMenuItems
});
this._treeView.on(&quot;contextmenu&quot;, (e) =&gt; {
this._treeViewContextMenu.show(e.event.pageX, e.event.pageY);
this._treeViewContextMenu.context = {
viewer: e.viewer,
treeViewPlugin: e.treeViewPlugin,
treeViewNode: e.treeViewNode
};
});
this._onModelLoaded = this.viewer.scene.on(&quot;modelLoaded&quot;, (modelId) =&gt;{
const modelInfo = this.viewerUI._controllers.models.getModelInfo(modelId);
if (!modelInfo) {
return;
}
this._treeView.addModel(modelId, {
rootName: modelInfo.name
});
});
this._onModelUnloaded = this.viewer.scene.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
this._treeView.removeModel(modelId);
}
});
this.viewerUI.on(&quot;reset&quot;, () =&gt; {
this._treeView.collapse();
this._treeView.expandToDepth(1);
});
}
setEnabled(enabled) {
if (!enabled) {
this._storeysTabButtonElement.classList.add(&quot;disabled&quot;);
this._showAllStoreysButtonElement.classList.add(&quot;disabled&quot;);
this._hideAllStoreysButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._storeysTabButtonElement.classList.remove(&quot;disabled&quot;);
this._showAllStoreysButtonElement.classList.remove(&quot;disabled&quot;);
this._hideAllStoreysButtonElement.classList.remove(&quot;disabled&quot;);
}
}
showNodeInTreeView(objectId) {
this._treeView.collapse();
this._treeView.showNode(objectId);
}
destroy() {
super.destroy();
this._treeView.destroy();
this._treeViewContextMenu.destroy();
this.viewer.scene.off(this._onModelLoaded);
this.viewer.scene.off(this._onModelUnloaded);
}
}
export {Storeys};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>
@@ -0,0 +1,250 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<base data-ice="baseUrl" href="../../../">
<title data-ice="title">src/explorer/StoreysExplorer.js | xeokit-bim-viewer</title>
<link type="text/css" rel="stylesheet" href="css/style.css">
<link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css">
<script src="script/prettify/prettify.js"></script>
<script src="script/manual.js"></script>
<meta name="description" content="BIM viewer built on xeokit"><meta property="og:type" content="website"><meta property="og:url" content="https://github.com/xeokit/xeokit-bim-viewer"><meta property="og:site_name" content="xeokit-bim-viewer"><meta property="og:title" content="xeokit-bim-viewer"><meta property="og:image" content="./images/logo.jpg"><meta property="og:description" content="BIM viewer built on xeokit"><meta property="og:author" content="http://xeolabs.com"><meta property="twitter:card" content="summary"><meta property="twitter:title" content="xeokit-bim-viewer"><meta property="twitter:description" content="BIM viewer built on xeokit"><meta property="twitter:image" content="./images/logo.jpg"></head>
<body class="layout-container" data-ice="rootContainer">
<header>
<a href="./" style="display: flex; align-items: center;"><img src="./image/brand_logo.jpg" style="width:34px;"></a>
<a href="identifiers.html">Reference</a>
<a href="source.html">Source</a>
<div class="search-box">
<span>
<img src="./image/search.png">
<span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span>
</span>
<ul class="search-result"></ul>
</div>
<a style="position:relative; top:3px;" href="https://github.com/xeokit/xeokit-bim-viewer"><img width="20px" src="./image/github.png"></a></header>
<nav class="navigation" data-ice="nav"><div>
<ul>
<li data-ice="doc"><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/BIMViewer.js~BIMViewer.html">BIMViewer</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#collision">collision</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/collision/ObjectsKdTree3.js~ObjectsKdTree3.html">ObjectsKdTree3</a></span></span></li>
<li data-ice="doc"><a data-ice="dirPath" class="nav-dir-path" href="identifiers.html#server">server</a><span data-ice="kind" class="kind-class">C</span><span data-ice="name"><span><a href="class/src/server/Server.js~Server.html">Server</a></span></span></li>
</ul>
</div>
</nav>
<div class="content" data-ice="content"><h1 data-ice="title">src/explorer/StoreysExplorer.js</h1>
<pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">import {TreeViewPlugin, math} from &quot;@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js&quot;;
import {Controller} from &quot;../Controller.js&quot;;
import {TreeViewContextMenu} from &quot;../contextMenus/TreeViewContextMenu.js&quot;;
const tempVec3 = math.vec3();
/** @private */
class StoreysExplorer extends Controller {
constructor(parent, cfg = {}) {
super(parent);
if (!cfg.storeysTabElement) {
throw &quot;Missing config: storeysTabElement&quot;;
}
if (!cfg.showAllStoreysButtonElement) {
throw &quot;Missing config: showAllStoreysButtonElement&quot;;
}
if (!cfg.hideAllStoreysButtonElement) {
throw &quot;Missing config: hideAllStoreysButtonElement&quot;;
}
if (!cfg.storeysElement) {
throw &quot;Missing config: storeysElement&quot;;
}
this._storeysTabElement = cfg.storeysTabElement;
this._showAllStoreysButtonElement = cfg.showAllStoreysButtonElement;
this._hideAllStoreysButtonElement = cfg.hideAllStoreysButtonElement;
this._storeysTabButtonElement = this._storeysTabElement.querySelector(&quot;.xeokit-tab-btn&quot;);
if (!this._storeysTabButtonElement) {
throw &quot;Missing DOM element: .xeokit-tab-btn&quot;;
}
const storeysElement = cfg.storeysElement;
this._treeView = new TreeViewPlugin(this.viewer, {
containerElement: storeysElement,
autoAddModels: false,
hierarchy: &quot;storeys&quot;,
autoExpandDepth: 1
});
this._treeViewContextMenu = new TreeViewContextMenu(this.bimViewer, {
hideOnAction: true
});
this._treeView.on(&quot;contextmenu&quot;, (e) =&gt; {
this._treeViewContextMenu.context = {
bimViewer: this.bimViewer,
viewer: e.viewer,
treeViewPlugin: e.treeViewPlugin,
treeViewNode: e.treeViewNode,
pruneEmptyNodes: true
};
this._treeViewContextMenu.show(e.event.pageX, e.event.pageY);
});
this._treeView.on(&quot;nodeTitleClicked&quot;, (e) =&gt; {
const scene = this.viewer.scene;
const objectIds = [];
e.treeViewPlugin.withNodeTree(e.treeViewNode, (treeViewNode) =&gt; {
if (treeViewNode.objectId) {
objectIds.push(treeViewNode.objectId);
}
});
const checked = e.treeViewNode.checked;
if (checked) {
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, false);
scene.setObjectsPickable(objectIds, true);
} else {
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, true);
scene.setObjectsPickable(objectIds, true);
}
});
this._onModelLoaded = this.viewer.scene.on(&quot;modelLoaded&quot;, (modelId) =&gt;{
const modelInfo = this.bimViewer._modelsExplorer.getModelInfo(modelId);
if (!modelInfo) {
return;
}
this._treeView.addModel(modelId, {
rootName: modelInfo.name
});
});
this._onModelUnloaded = this.viewer.scene.on(&quot;modelUnloaded&quot;, (modelId) =&gt; {
if (this.viewer.metaScene.metaModels[modelId]) {
this._treeView.removeModel(modelId);
}
});
this.bimViewer.on(&quot;reset&quot;, () =&gt; {
this._treeView.collapse();
this._treeView.expandToDepth(1);
});
}
setEnabled(enabled) {
if (!enabled) {
this._storeysTabButtonElement.classList.add(&quot;disabled&quot;);
this._showAllStoreysButtonElement.classList.add(&quot;disabled&quot;);
this._hideAllStoreysButtonElement.classList.add(&quot;disabled&quot;);
} else {
this._storeysTabButtonElement.classList.remove(&quot;disabled&quot;);
this._showAllStoreysButtonElement.classList.remove(&quot;disabled&quot;);
this._hideAllStoreysButtonElement.classList.remove(&quot;disabled&quot;);
}
}
expandTreeViewToDepth(depth) {
this._treeView.expandToDepth(depth);
}
showNodeInTreeView(objectId) {
this._treeView.collapse();
this._treeView.showNode(objectId);
}
unShowNodeInTreeView() {
this._treeView.unShowNode();
}
selectStorey(storeyObjectId, done) {
const metaScene = this.viewer.metaScene;
const storeyMetaObject = metaScene.metaObjects[storeyObjectId];
if (!storeyMetaObject) {
this.error(&quot;selectStorey() - object is not found: &apos;&quot; + storeyObjectId + &quot;&apos;&quot;);
return;
}
if (storeyMetaObject.type !== &quot;IfcBuildingStorey&quot;) {
this.error(&quot;selectStorey() - object is not found: &apos;&quot; + storeyObjectId + &quot;&apos;&quot;);
return;
}
const objectIds = storeyMetaObject.getObjectIDsInSubtree();
this._selectObjects(objectIds, done);
}
_selectObjects(objectIds, done) {
const scene = this.viewer.scene;
const aabb = scene.getAABB(objectIds);
this.viewer.cameraControl.pivotPos = math.getAABB3Center(aabb, tempVec3);
if (done) {
scene.setObjectsXRayed(scene.objectIds, true);
scene.setObjectsVisible(scene.objectIds, true);
scene.setObjectsPickable(scene.objectIds, false);
scene.setObjectsSelected(scene.selectedObjectIds, false);
scene.setObjectsXRayed(objectIds, false);
scene.setObjectsVisible(objectIds, true);
scene.setObjectsPickable(objectIds, true);
this.viewer.cameraFlight.flyTo({
aabb: aabb
}, () =&gt; {
setTimeout(function () {
scene.setObjectsVisible(scene.xrayedObjectIds, false);
scene.setObjectsXRayed(scene.xrayedObjectIds, false);
}, 500);
done();
});
} else {
scene.setObjectsVisible(scene.objectIds, false);
scene.setObjectsPickable(scene.xrayedObjectIds, true);
scene.setObjectsXRayed(scene.xrayedObjectIds, false);
scene.setObjectsSelected(scene.selectedObjectIds, false);
scene.setObjectsVisible(objectIds, true);
this.viewer.cameraFlight.jumpTo({
aabb: aabb
});
}
}
destroy() {
super.destroy();
this._treeView.destroy();
this._treeViewContextMenu.destroy();
this.viewer.scene.off(this._onModelLoaded);
this.viewer.scene.off(this._onModelUnloaded);
}
}
export {StoreysExplorer};</code></pre>
</div>
<footer class="footer">
Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(1.1.0)</span><img src="./image/esdoc-logo-mini-black.png"></a>
</footer>
<script src="script/search_index.js"></script>
<script src="script/search.js"></script>
<script src="script/pretty-print.js"></script>
<script src="script/inherited-summary.js"></script>
<script src="script/test-summary.js"></script>
<script src="script/inner-link.js"></script>
<script src="script/patch-for-local.js"></script>
</body>
</html>