UNPKG

@i3yun/viewergallery

Version:

BIM轻量化平台是一个互联网三维可视化解决方案。包括BIM轻量化引擎和业务组件。

254 lines (236 loc) 11.3 kB
var host = "http://bimdb.aisanwei.cn"; var token = "eyJhbHQiOiJTSEExIiwidHlwIjoiSldUIn0=.eyJpc3MiOm51bGwsImV4cCI6bnVsbCwiYXVkIjpudWxsLCJpYXQiOm51bGwsIlVzZXJJRCI6Imx5b24wMDIiLCJUaW1lb3V0IjoiMjAzMS0xMS0xN1QwNjozODoyNi4wMDk0NzQxKzA4OjAwIiwiU2NvcGVzIjpbIlByb2plY3RSZWFkIl19.VbT+tp1FhvMADxzskWfhWVsT3CWmUdFNUIXFflEwrQOpiQnseUQKgxxOFpxCnIl6xdDI2uFtpJ0U5qxMw02P0ToSedsxYD/xhujPosrq2K41Q1R7hijmPQIeF99iR0HhIP4N3y9pm+nwiYOlHxI3OplVGDXN9s5kfMnbp/te+R8=" var sceneID = "P2006200001"; //创建三维视图 var viewerPromise = SippreepViewer.CreateViewer(document.getElementById("viewer1")); //获取场景加载插件 var TidbLoaderExtensionPromise = viewerPromise.then((viewer) => { return viewer.loadExtension("Sippreep.Extensions.TidbLoader.TidbLoaderExtension"); }); /** * @type {Promise<Sippreep.Extensions.Markup.Markup3DExtension>} */ var Markup3DPromise = viewerPromise.then((viewer) => { return viewer.loadExtension("Sippreep.Extensions.Markup.Markup3DExtension"); }); /** * 加载模型 * @type {Promise<Sippreep.Viewing.Model>} */ var modelPromise = TidbLoaderExtensionPromise.then((v) => { //let v1 = <any>v as Sippreep.Extensions.TidbLoader.TidbLoaderExtension; var v1 = v; v1.getConfig().host = host; v1.getConfig().token = token return v1.loadScene(sceneID); }); /** * 加载模型 * @type {Promise<{ [key: string]: number; }>} */ var objectsPromise = modelPromise.then((m) => { return new Promise((s, f) => { m.getExternalIdMapping(s, f); }); }); Promise.all([viewerPromise, modelPromise, objectsPromise, Markup3DPromise]).then(([viewer, model, objects, markup3d]) => { viewerHelper = new ViewerHelper(viewer, model, objects); service = new Service(); document.getElementById("AllElements").onclick = () => { viewerHelper.SetVisible(true); viewerHelper.SetLevel(); viewer.fitToView(); } document.getElementById("BuildingElements").onclick = (e) => { var buildingElements = viewerHelper.GetOther([].concat(service.Other2Elements, service.ColorsElements)); viewerHelper.SetVisible(true, buildingElements); var buildingVisible = e.target.state1 = e.target.state1 ? false : true; viewerHelper.SetTrans(buildingVisible, buildingElements); } document.getElementById("Level1").onclick = (e) => { var data = e.target.getAttribute("data"); var level = eval(`(${data})`); viewerHelper.SetLevel(level); viewer.fitToView(); } document.getElementById("Level2").onclick = (e) => { var data = e.target.getAttribute("data"); var level = eval(`(${data})`); viewerHelper.SetLevel(level); viewer.fitToView(); } document.getElementById("Other2Elements").onclick = (e) => { var visible = e.target.state1 = e.target.state1 ? false : true; viewerHelper.SetVisible(!visible, service.Other2Elements); //viewer.fitToView(service.Other2Elements); } document.getElementById("ColorsElements").onclick = (e) => { var visible = e.target.state1 = e.target.state1 ? false : true; viewerHelper.SetVisible(!visible, service.ColorsElements); //viewer.fitToView(service.ColorsElements); } document.getElementById("SimulatedColors").onclick = () => { //document.getElementById("ColorsElements").click(); service.SimulatedColors(); viewerHelper.SetColor(null); } document.getElementById("ShowMark3D").onclick = () => { if (markup3d.getItems().toArray().length > 0) markup3d.getItems().clear(); else { var elements = [].concat(service.LabelElements, service.Other2Elements); elements.forEach(element => { var markupItem = markup3d.getItems().add(); markupItem.anchor = element; markupItem.offset = new THREE.Vector3(0, 0, 15); markupItem.content = service.getMessage(element); markupItem.contentOffset = new THREE.Vector2(-8, -8); markupItem.appearance.anchorColor = new THREE.Color(1, 1, 1); markupItem.appearance.offsetColor = new THREE.Color(1, 1, 1); }); } } document.getElementById("saveState").onclick = (e) => { document.getElementById("loadState").setAttribute("data", viewerHelper.GetState()); alert("保存视角成功"); } document.getElementById("loadState").onclick = (e) => { viewerHelper.SetState(e.target.getAttribute("data")); } //订阅服务温度颜色 service.ElementColorChanged = (element, themingColor) => { var showmarkUp3d = false; markup3d.getItems().toArray().forEach(v => { if (v.anchor == element) { showmarkUp3d = true; v.appearance.anchorColor = themingColor; v.appearance.offsetColor = themingColor; v.content.style.backgroundColor = `rgb(${themingColor.r * 255}, ${themingColor.g * 255}, ${themingColor.b * 255})` } }); if (showmarkUp3d) { viewerHelper.SetColor(null, [element]); } else viewerHelper.SetColor(new THREE.Vector4(themingColor.r, themingColor.g, themingColor.b, 1), [element]); } //订阅视图选中项改变事件 viewer.addEventListener(Sippreep.Viewing.SELECTION_CHANGED_EVENT, () => { var elements = viewer.getSelection(); document.getElementById("MySelectionValue").innerHTML = elements.length == 1 ? elements[0] : (elements.length + "项"); }); document.getElementById("ShowMark3D").click(); document.getElementById("SimulatedColors").click(); //document.getElementById("BuildingElements").click(); document.getElementById("Level2").click(); //设置视图最佳视角 document.getElementById("loadState").click(); }) /** * * @param {Sippreep.Viewing.Viewer3D} viewer * @param {Sippreep.Viewing.Model} model * @param {{ [key: string]: number; }} objects */ function ViewerHelper(viewer, model, objects) { this.SetVisible = function(isVisible, dbids) { if (dbids) { for (let dbid of dbids) { //model.visibilityManager.setVisibilityOnNode(dbid, isVisible); model.visibilityManager.setNodeOff(dbid, !isVisible); } } else { for (let name in objects) { //model.visibilityManager.setVisibilityOnNode(objects[name], isVisible); model.visibilityManager.setNodeOff(objects[name], !isVisible); } } } this.SetColor = function(color, dbids) { if (dbids) { for (let dbid of dbids) { viewer.setThemingColor(dbid, color); } } else { for (let name in objects) { viewer.setThemingColor(objects[name], color); } } } this.SetTrans = function(isTrans, dbids) { if (dbids) { for (let dbid of dbids) { isTrans ? model.visibilityManager.hide(dbid) : model.visibilityManager.show(dbid); } } else { for (let name in objects) { isTrans ? model.visibilityManager.hide(objects[name]) : model.visibilityManager.show(objects[name]); } } } this.SetLevel = function(value) { if (value) viewer.setCutPlanes([new THREE.Vector4(0, 0, 1, value.max), new THREE.Vector4(0, 0, -1, value.min)]); else viewer.setCutPlanes([]); } this.GetState = function() { var state = viewer.getState({ viewport: true }); return btoa(JSON.stringify(state)); } this.SetState = function(value) { var state = JSON.parse(atob(value)); viewer.restoreState(state, { viewport: true }); } this.GetOther = function(dbids) { var temp = []; for (let name in objects) { if (dbids && dbids.indexOf(objects[name]) < 0) temp.push(objects[name]) } return temp; } } function Service() { //配置颜色(依次是红、绿、蓝) this.ThemingColors = [new THREE.Color(1, 0, 0), new THREE.Color(0, 1, 0), new THREE.Color(0, 0, 1)]; this.Other1Elements = [3399]; this.Other2Elements = [2979, 2991, 2996, 3003]; this.ColorsElements = [1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576]; this.LabelElements = [1564, 1567, 1568, 1570, 1572, 1573]; this.BuildingElements = [1, 1508, 2169, 1586, 1658, 2104, 2067, 2145, 1917, 1973, 2189, 2157, 140, 131]; this.ElementColorChanged = function(element, themingColor) { } this.SimulatedColors = function() { var globe = window; if (globe.SimulatedHandle) { globe.SimulatedHandle = null; clearTimeout(globe.SimulatedHandler); } else { globe.SimulatedHandle = () => { for (var i = 0; i < this.ColorsElements.length; i++) { this.ElementColorChanged(this.ColorsElements[i], this.ThemingColors[Random(0, this.ThemingColors.length)]); } if (globe.SimulatedHandle) globe.SimulatedHandler = setTimeout(globe.SimulatedHandle, 1000); } globe.SimulatedHandle(); } } this.getMessage = function(element) { var typestring = this.LabelElements.indexOf(element) > 0 ? "功能间" : "消防箱"; var innerHTML = `<div class='my-markup3D'> ${document.getElementById("label").innerHTML}<div>编号:${element} 类型:${typestring}</div></div>`; var t = document.createElement("div"); t.innerHTML = innerHTML; return t.firstChild; } this.getViewState = function() { var stateBase64 = "eyJ2aWV3cG9ydCI6eyJuYW1lIjoiIiwiZXllIjpbLTE0Mi44NzY3ODkyMzY0MTg5NCwxLjIzNjQzMDIyMjA1NTQ3NDgsODkuMDIyNDY5MTAxMjMzN10sInRhcmdldCI6Wy0yNi44NzAzMjAzODY0NjUwMjUsLTMuNTQzNzQ4MzUwNDgzNjI5NiwxMS41OTEzMjY3Nzg4MzcyN10sInVwIjpbMC41NTQzNjc5ODUzODQ1MjAzLC0wLjAyMjg0MzM2Mzc0Nzc5NTE1LDAuODMxOTU4MTIyNDUxNzIxOF0sIndvcmxkVXBWZWN0b3IiOlswLDAsMV0sInBpdm90UG9pbnQiOls4LjU0NzIzMTY0NDMwMDA0MSwyMy4yMjgwMjI1MDU0NDQxNDQsNDAuMTU5MjY4MzUxMjg2NDZdLCJkaXN0YW5jZVRvT3JiaXQiOjE1Mi4yMjk1Mzc2NTUyMjYsImFzcGVjdFJhdGlvIjoyLjA4NDY5MDU1Mzc0NTkyODQsInByb2plY3Rpb24iOiJwZXJzcGVjdGl2ZSIsImlzT3J0aG9ncmFwaGljIjpmYWxzZSwiZmllbGRPZlZpZXciOjQ1fX0="; return JSON.parse(atob(stateBase64)); } } function Random(min, max) { return Math.floor(Math.random() * (max - min)) + min } function E(value) { return document.getElementById(value); }