1
import {Controller} from "../Controller.js";
2
import {ModelMemento, math} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
4
const tempVec3a = math.vec3();
7
class ResetAction extends Controller {
9
constructor(parent, cfg = {}) {
13
if (!cfg.buttonElement) {
14
throw "Missing config: buttonElement";
17
const buttonElement = cfg.buttonElement;
18
const camera = this.viewer.camera;
20
this._modelMementos = {};
24
camera.eye = [0.577, 0.577, 0.577];
25
camera.look = [0,0,0];
26
camera.up = [-1, 1, -1];
28
this.bimViewer._modelsExplorer.on("modelLoaded", (modelId) => {
29
this._saveModelMemento(modelId);
32
this.bimViewer._modelsExplorer.on("modelUnloaded", (modelId) => {
33
this._destroyModelMemento(modelId);
36
this.on("enabled", (enabled) => {
38
buttonElement.classList.add("disabled");
40
buttonElement.classList.remove("disabled");
44
this.on("active", (active) => {
46
buttonElement.classList.add("active");
48
buttonElement.classList.remove("active");
52
buttonElement.addEventListener("click", (event) => {
53
if (this.getEnabled()) {
56
event.preventDefault();
60
_saveModelMemento(modelId) {
61
const metaModel = this.viewer.metaScene.metaModels[modelId];
65
const modelMemento = new ModelMemento();
66
modelMemento.saveObjects(this.viewer.scene, metaModel, {
77
this._modelMementos[modelId] = modelMemento;
80
_restoreModelMemento(modelId) {
81
const metaModel = this.viewer.metaScene.metaModels[modelId];
85
const modelMemento = this._modelMementos[modelId];
86
modelMemento.restoreObjects(this.viewer.scene, metaModel);
89
_destroyModelMemento(modelId) {
90
delete this._modelMementos[modelId];
94
const scene = this.viewer.scene;
95
const modelIds = scene.modelIds;
96
for (var i = 0, len = modelIds.length; i < len; i++) {
97
const modelId = modelIds[i];
98
this._restoreModelMemento(modelId);
100
this.bimViewer.unShowObjectInExplorers();
101
this.fire("reset", true);
106
const viewer = this.viewer;
107
const scene = viewer.scene;
108
const aabb = scene.getAABB(scene.visibleObjectIds);
109
const diag = math.getAABB3Diag(aabb);
110
const center = math.getAABB3Center(aabb, tempVec3a);
111
const camera = scene.camera;
112
const fitFOV = camera.perspective.fov;
113
const dist = Math.abs(diag / Math.tan(45 * math.DEGTORAD));
114
const dir = math.normalizeVec3((camera.yUp) ? [-0.5, -0.7071, -0.5] : [-1, 1, -1]);
115
const up = math.normalizeVec3((camera.yUp) ? [-0.5, 0.7071, -0.5] : [-1, 1, 1]);
116
viewer.cameraControl.pivotPos = center;
117
viewer.cameraControl.planView = false;
118
viewer.cameraFlight.flyTo({
120
eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
122
orthoScale: diag * 1.3,
123
projection: "perspective",