UNPKG

xeokit-viewer

Version:

BIM viewer built on xeokit and Bootstrap

97 lines (82 loc) 3.06 kB
import {Controller} from "../Controller.js"; import {ModelMemento} from "../../lib/xeokit/viewer/scene/mementos/ModelMemento.js"; import {math} from "../../lib/xeokit/viewer/scene/math/math.js"; const tempVec3a = math.vec3(); class ResetAction extends Controller { /** @private */ constructor(parent, cfg = {}) { super(parent, cfg); this._modelMementos = {}; this.viewerUI.explorer.models.on("modelLoaded", (modelId) => { this._saveModelMemento(modelId); }); this.viewerUI.explorer.models.on("modelUnloaded", (modelId) => { this._destroyModelMemento(modelId); }); $("#reset").on('click', (event) => { this.reset(); event.preventDefault(); }); this.on("enabled", (enabled) => { if (!enabled) { $("#reset").addClass("disabled"); } else { $("#reset").removeClass("disabled"); } }); } reset() { const scene = this.viewer.scene; const modelIds = scene.modelIds; for (var i = 0, len = modelIds.length; i < len; i++) { const modelId = modelIds[i]; this._restoreModelMemento(modelId); } // this._restoreDefaultCamera(() => { this.fire("reset"); // }); } _saveModelMemento(modelId) { const metaModel = this.viewer.metaScene.metaModels[modelId]; if (!metaModel) { this.error("MetaModel not found: " + modelId); return; } const modelMemento = new ModelMemento(); modelMemento.saveObjects(this.viewer.scene, metaModel); this._modelMementos[modelId] = modelMemento; } _restoreModelMemento(modelId) { const metaModel = this.viewer.metaScene.metaModels[modelId]; if (!metaModel) { this.error("MetaModel not found: " + modelId); return; } const modelMemento = this._modelMementos[modelId]; modelMemento.restoreObjects(this.viewer.scene, metaModel); } _destroyModelMemento(modelId) { delete this._modelMementos[modelId]; } _restoreDefaultCamera(done) { 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 dist = Math.abs(diag / Math.tan(55.0 / 2)); const camera = scene.camera; const dir = (camera.yUp) ? [1, -1, 1] : [1, 1, 1]; const up = (camera.yUp) ? [-1, 1, -1] : [-1, 1, 1]; viewer.cameraControl.pivotPos = center; 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.3, projection: "perspective", duration: 1 }, done); } } export {ResetAction};