UNPKG

@i3yun/viewergallery

Version:

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

381 lines (360 loc) 15.3 kB
//创建三维视图 let viewerPromise = SippreepViewer.CreateViewer(document.getElementById("viewer1")); /** * @type {Promise<Sippreep.Extensions.EEPTools.EEPToolExtension>} */ let toolPromise = viewerPromise.then(v => v.loadExtension("Sippreep.Extensions.EEPTools.EEPToolExtension")); /** * @type { Promise<Sippreep.Extensions.PickPoint.PickPointExtension> } */ let pickPointPromise = viewerPromise.then(v => { return v.loadExtension("Sippreep.Extensions.PickPoint.PickPointExtension"); }); /** * @type {Promise<Sippreep.Extensions.Markup.Markup3DExtension>} */ let Markup3DPromise = viewerPromise.then((viewer) => { return viewer.loadExtension("Sippreep.Extensions.Markup.Markup3DExtension"); }); /** * @type {Promise<Sippreep.Extensions.ModelMan.ModelManExtension>} */ let modelManPromise = viewerPromise.then((viewer) => { return viewer.loadExtension("Sippreep.Extensions.ModelMan.ModelManExtension"); }); //场景配置 Promise.all([viewerPromise]).then(([viewer]) => { document.getElementById("updateScene").onclick = () => { let host = document.getElementById("DATABASE").value; let sceneID = document.getElementById("SCENEID").value; let sceneState = document.getElementById("sceneState"); sceneState.innerHTML = "正在加载……"; /** * @type { Promise<Sippreep.Viewing.Model> } */ let modelPromise = new Promise((s, f) => { if (viewer.model) { viewer.unloadModel(viewer.model); } viewer.loadModel(`${host}/api/UserSpace/ViewFile/${sceneID}?path=/3d.svf`, null, s, f); }); modelPromise.then((model) => { return new Promise((s, f) => model.getExternalIdMapping(s, f)); }).then(e => { let objCount = 0; for (let key in e) { objCount++; } sceneState.innerHTML = `${objCount}个对象`; }).catch((e) => { sceneState.innerHTML = JSON.stringify(e); }); }; document.getElementById("updateScene").onclick(); }); //三维操控 Promise.all([viewerPromise, toolPromise]).then(([viewer, eeptool]) => { _eeptool = eeptool; let modeBTs = document.getElementsByClassName("ToolMode"); for (let i = 0; i < modeBTs.length; i++) { modeBTs[i].onclick = (e) => { eeptool.set3DCommand(parseInt(e.target.getAttribute("data"))); } } //订阅视图选中项改变事件 viewer.addEventListener(Sippreep.Viewing.SELECTION_CHANGED_EVENT, () => { let elements = viewer.getSelection(); document.getElementById("MySelectionValue").innerHTML = elements.length == 1 ? ("ID:" + elements[0]) : (elements.length + "项"); }); viewer.addEventListener(Sippreep.Viewing.MODEL_ADDED_EVENT, () => { _eeptool.set3DCommand(Sippreep.Extensions.EEPTools.EEPToolCommand.ROTATE); }); }); //三维标记 Promise.all([pickPointPromise, Markup3DPromise, viewerPromise]).then(([pickPoint, markup3d, viewer]) => { /** * @type {(point: THREE.Vector3) => void)} */ let pickHandle = null; /** * @type { Sippreep.Extensions.Markup.IMarkup3D} */ let newMarkupItem = null; let orderNumber = 1000; /** * @type { Array<string>} */ let selectNames = null; /** * * @param {null|Sippreep.Extensions.Markup.IMarkup3D[]} ifNoSelect */ let getSelectItems = (ifNoSelect) => { if (selectNames && selectNames.length > 0) { return markup3d.getItems().toArray().filter((v) => { return selectNames.indexOf(v.tag) >= 0; }) } else { return ifNoSelect; } }; pickPoint.registerPointCallback((p) => { /** * 防止与碰撞物体重叠 */ let t = viewer.navigation.getEyeVector().normalize(); pickHandle(p.sub(t.multiplyScalar(0.01))); }); document.getElementById("selectNames").onchange = (e) => { if (e.target.value) { selectNames = e.target.value.split(','); } else { selectNames = null; } } document.getElementById("fitViewMarkup").onclick = (e) => { let getBox = () => { let box = new THREE.Box3(); getSelectItems(markup3d.getItems().toArray()).forEach(v => { box.union(markup3d.getBox(v)); }); return box; }; viewer.navigation.fitBounds(true, getBox()); let showMarkItem = () => { let markItem = getSelectItems(markup3d.getItems().toArray())[0]; if (markItem) { if (markItem.offset) document.getElementById("item_offset").value = JSON.stringify(markItem.offset.toArray()); else document.getElementById("item_offset").value = null; if (markItem.contentOffset) document.getElementById("item_contentOffset").value = JSON.stringify(markItem.contentOffset.toArray()); else document.getElementById("item_contentOffset").value = null; if (markItem.appearance.anchorColor) document.getElementById("item_anchorColor").value = JSON.stringify(markItem.appearance.anchorColor.toArray()); else document.getElementById("item_anchorColor").value = null; if (markItem.appearance && markItem.appearance.offsetColor) document.getElementById("item_offsetColor").value = JSON.stringify(markItem.appearance.offsetColor.toArray()); else document.getElementById("item_offsetColor").value = null; } }; showMarkItem(); } document.getElementById("updateMarkup").onclick = (e) => { getSelectItems(markup3d.getItems().toArray()).forEach(v => { ((value) => { if (value) v.offset = new THREE.Vector3(...(JSON.parse(value))); })(document.getElementById("item_offset").value); ((value) => { if (value) v.contentOffset = new THREE.Vector2(...(JSON.parse(value))); })(document.getElementById("item_contentOffset").value); ((value) => { if (value) v.appearance.anchorColor = new THREE.Color(...(JSON.parse(value))); })(document.getElementById("item_anchorColor").value); ((value) => { if (value) v.appearance.offsetColor = new THREE.Color(...(JSON.parse(value))); })(document.getElementById("item_offsetColor").value); }) }; document.getElementById("deleteMarkup").onclick = (e) => { let selectItems = getSelectItems(null); if (selectItems) { selectItems.forEach(v => { markup3d.getItems().remove(v); }); } else { markup3d.getItems().clear(); } } document.getElementById("newPoint").onclick = (e) => { if (newMarkupItem) { newMarkupItem = null; } pickPoint.enableMode(); pickHandle = (p) => { orderNumber++; newMarkupItem = markup3d.getItems().add(); newMarkupItem.tag = orderNumber.toString(); let a = new Sippreep.Extensions.Markup.Point(); a.value = p; newMarkupItem.anchor = a; var t = document.createElement("div"); t.innerHTML = `<div style="background-color:rgba(255, 255, 255, 0.8);">编号:${newMarkupItem.tag}</div>`; newMarkupItem.content = t.firstChild; }; }; document.getElementById("newPolyline").onclick = (e) => { if (newMarkupItem && !checkType(newMarkupItem.anchor, Sippreep.Extensions.Markup.Polyline)) { newMarkupItem = null; } pickPoint.enableMode(); pickHandle = (p) => { if (!newMarkupItem) { newMarkupItem = markup3d.getItems().add(); orderNumber++; newMarkupItem.tag = orderNumber.toString(); let a = new Sippreep.Extensions.Markup.Polyline(); a.path = new Array(); a.path.push(p); newMarkupItem.anchor = a; newMarkupItem.content = `<div style="background-color:rgba(255, 255, 255, 0.8);">编号:${newMarkupItem.tag}</div>`; } else { let a = newMarkupItem.anchor; a.path.push(p); newMarkupItem.anchor = a; } }; }; document.getElementById("newPolygon").onclick = (e) => { if (newMarkupItem && !checkType(newMarkupItem.anchor, Sippreep.Extensions.Markup.Polygon)) { newMarkupItem = null; } pickPoint.enableMode(); pickHandle = (p) => { if (!newMarkupItem) { orderNumber++; newMarkupItem = markup3d.getItems().add(); newMarkupItem.tag = orderNumber.toString(); let a = new Sippreep.Extensions.Markup.Polygon(); a.vertices = new Array(); a.vertices.push(p); newMarkupItem.anchor = a; newMarkupItem.content = `<div style="background-color:rgba(255, 255, 255, 0.8);">编号:${newMarkupItem.tag}</div>`; } else { let a = newMarkupItem.anchor; a.vertices.push(p); newMarkupItem.anchor = a; } }; }; document.getElementById("exportTo2").onclick = (e) => { let convertArray = (list1, convert) => { let list2 = []; for (let item of list1) { list2.push(convert(item)); } return list2; } let convertColor = (color) => { return { r: color.r, g: color.g, b: color.b }; } let convertVector2 = (vector2) => { return { x: vector2.x, y: vector2.y }; } let convertVector3 = (vector3) => { return { x: vector3.x, y: vector3.y, z: vector3.z }; } let convertAnchor = (anchor) => { if (anchor instanceof Sippreep.Extensions.Markup.Point) return { type: "Point", value: convertVector3(anchor.value) }; else if (anchor instanceof Sippreep.Extensions.Markup.Polyline) { return { type: "Polyline", path: convertArray(anchor.path, convertVector3) }; } else if (anchor instanceof Sippreep.Extensions.Markup.Polygon) { return { type: "Polygon", vertices: convertArray(anchor.vertices, convertVector3) }; } } let convertAppearance = (app) => { let json = {}; if (app.anchorColor) json.anchorColor = convertColor(app.anchorColor); if (app.offsetColor) json.offsetColor = convertColor(app.offsetColor); return json; } let convertItem = (item) => { let data = { anchor: convertAnchor(item.anchor) }; data.anchorDbid = item.anchorDbid; if (item.offset) data.offset = convertVector3(item.offset); if (item.content) data.content = item.content; if (item.contentOffset) data.contentOffset = convertVector2(item.contentOffset); if (item.appearance) { data.appearance = convertAppearance(item.appearance); } data.tag = item.tag; return data; } let data = {}; data.version = "1.0.0"; data.items = convertArray(markup3d.getItems().toArray(), convertItem); document.getElementById("jsonData").value = JSON.stringify(data); }; document.getElementById("importTo2").onclick = (e) => { let convertArray = (list1, convert) => { let list2 = []; for (let item of list1) { list2.push(convert(item)); } return list2; } let convertColor = (json) => { return new THREE.Color(json.r, json.g, json.b); } let convertVector2 = (json) => { return new THREE.Vector2(json.x, json.y); } let convertVector3 = (json) => { return new THREE.Vector3(json.x, json.y, json.z); } let convertAnchor = (json) => { if (json.type == "Point") { return new Sippreep.Extensions.Markup.Point(convertVector3(json.value)); } else if (json.type == "Polyline") { let line = new Sippreep.Extensions.Markup.Polyline(); line.path = new Array(); json.path.forEach(_ => { line.path.push(convertVector3(_)); }); return line; } else if (json.type == "Polygon") { let line = new Sippreep.Extensions.Markup.Polygon(); line.vertices = new Array(); json.vertices.forEach(_ => { line.vertices.push(convertVector3(_)); }); return line; } } let convertAppearance = (json, oldValue) => { if (!oldValue) oldValue = {}; if (json.anchorColor) oldValue.anchorColor = convertColor(json.anchorColor); if (json.offsetColor) oldValue.offsetColor = convertColor(json.offsetColor); return oldValue; } let convertItem = (json) => { let itemData = markup3d.getItems().add(); itemData.anchor = convertAnchor(json.anchor); itemData.anchorDbid = json.anchorDbid; if (json.offset) itemData.offset = convertVector3(json.offset); if (json.content) itemData.content = json.content; if (json.contentOffset) itemData.contentOffset = convertVector2(json.contentOffset); if (json.appearance) { itemData.appearance = convertAppearance(json.appearance, itemData.appearance); } itemData.tag = json.tag; return itemData; } let data = JSON.parse(document.getElementById("jsonData").value); convertArray(data.items, convertItem); }; }); //其他功能 Promise.all([viewerPromise, modelManPromise]).then(([viewer, modelMan]) => { document.getElementById("setTrans").onclick = (e) => { modelMan.GetManager().then((v) => { v.setTransparents((v.getAppearance(v.getDbids()[0]).transparent > 0) ? 0 : 0.5); }); } }); function checkType(value, valueType) { if (valueType) { if (value instanceof valueType) { return true; } } return false; }