UNPKG

@i3yun/viewergallery

Version:

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

195 lines (188 loc) 6.67 kB
//创建三维视图 var viewerPromise = SippreepViewer.CreateViewer(document.getElementById("viewer1")); var servicePromise = viewerPromise.then((v) => { return new Service(v); }); //场景配置 Promise.all([servicePromise]).then(([service]) => { document.getElementById("updateScene").onclick = () => { var host = document.getElementById("DATABASE").value; var ID = document.getElementById("SCENEID").value; var sceneState = document.getElementById("sceneState"); sceneState.innerHTML = "正在加载……"; var modelPromise = document.getElementById("dbType").value == "I3DB" ? service.loadModel(host, ID) : service.loadModelForFamily(host, ID); modelPromise.then(() => { return service.getObjs(); }).then(e => { var objCount = 0; for (var key in e) { if (key.length > 0) { objCount++; } } sceneState.innerHTML = `${objCount}个对象`; }).catch((e) => { sceneState.innerHTML = JSON.stringify(e); }); }; document.getElementById("updateScene").onclick(); }); //对象状态模拟 Promise.all([viewerPromise, servicePromise]).then(([viewer, service]) => { toggleFun = (records, fun) => { var dbids = viewer.getSelection(); if (dbids.length > 0) { dbids.forEach(element => { var index = records.indexOf(element); if (index < 0) { records.push(element); } else { records.splice(index, 1); } fun(element, index < 0); }); } else { if (records.length > 0) { records.forEach(element => { fun(element, false) }); records.splice(0, records.length); } else { service.getObjs().then(e => { for (var key in e) { fun(e[key], true); records.push(e[key]); } }); } } }; var hides = []; document.getElementById("objHide").onclick = () => { toggleFun(hides, service.setHide); } var objTrans = [] document.getElementById("objTrans").onclick = (e) => { toggleFun(objTrans, service.setTran); } var objReds = []; document.getElementById("objRed").onclick = (e) => { toggleFun(objReds, service.setColor); } //订阅视图选中项改变事件 viewer.addEventListener(Sippreep.Viewing.SELECTION_CHANGED_EVENT, () => { var elements = viewer.getSelection(); if (elements.length == 1) { service.getObjs().then(e => { for (var key in e) { if (e[key] == elements[0]) { document.getElementById("selectionState").innerHTML = `{dbid:${elements[0]},unique:${key}}`; } } }); } else { document.getElementById("selectionState").innerHTML = (elements.length + "项"); } }); }); //辅助功能 Promise.all([viewerPromise, servicePromise]).then(([viewer, service]) => { function isInteger(obj) { return obj % 1 === 0 } document.getElementById("findObj").onclick = () => { var ID = document.getElementById("obj_value").value; service.getObjs().then(e => { if (isInteger(ID)) { var dbid = parseInt(ID); // for (var key in e) { // service.setHide(e[key], e[key] != dbid); // } viewer.select(dbid); viewer.fitToView([dbid]); } else { // for (var key in e) { // service.setHide(e[key], key != ID); // } viewer.select(e[ID]); viewer.fitToView([e[ID]]); } }); } }) /** * * @param {Sippreep.Viewing.Viewer3D} viewer */ function Service(viewer) { /** * 加载模型 * @type { (url:string) => Promise<Sippreep.Viewing.Model> } */ this.loadModel = (host, ID) => { return new Promise((s, f) => { if (viewer.model) { viewer.unloadModel(viewer.model); } var url = `${host}/api/UserSpace/ViewFile/${ID}?path=/3d.svf`; viewer.loadModel(url, null, s, f); }); } /** * 加载族模型 * @type { (url:string) => Promise<Sippreep.Viewing.Model> } */ this.loadModelForFamily = (host, ID) => { return new Promise((s, f) => { if (viewer.model) { viewer.unloadModel(viewer.model); } var url = `${host}/api/Revit/ViewFile/?ID=${ID}&Path=/3d.svf`; viewer.loadModel(url, null, s, f); }); } /** * 所有对象集合 * @type { () => Promise<{ [key: string]: number; }> } */ this.getObjs = () => { return new Promise((s, f) => { viewer.model.getExternalIdMapping((e) => { s(e); }, f); }); } /** * 启用对象隐藏 * @type { (dbid:number, value:boolean) =>void } */ this.setHide = (dbid, value) => { viewer.model.visibilityManager.setNodeOff(dbid, value); } /** * 启用对象透明 * @type { (dbid:number, value:boolean) =>void } */ this.setTran = (dbid, value) => { if (value) viewer.model.visibilityManager.hide(dbid); else viewer.model.visibilityManager.show(dbid); } /** * 启用对象颜色 * @type { (dbid:number, value:boolean) =>void } */ this.setColor = (dbid, value) => { if (value) { viewer.setThemingColor(dbid, this.color); } else { viewer.setThemingColor(dbid, null); } } /** * 启用对象颜色的值 */ this.color = new THREE.Vector4(1, 0, 0, 1); }