BIMviewer

Форк
0
/
ResetAction.js 
129 строк · 4.1 Кб
1
import {Controller} from "../Controller.js";
2
import {ModelMemento, math} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
3

4
const tempVec3a = math.vec3();
5

6
/** @private */
7
class ResetAction extends Controller {
8

9
    constructor(parent, cfg = {}) {
10

11
        super(parent, cfg);
12

13
        if (!cfg.buttonElement) {
14
            throw "Missing config: buttonElement";
15
        }
16

17
        const buttonElement = cfg.buttonElement;
18
        const camera = this.viewer.camera;
19

20
        this._modelMementos = {};
21

22
        // Initial camera position - looking down negative diagonal
23

24
        camera.eye = [0.577, 0.577, 0.577];
25
        camera.look = [0,0,0];
26
        camera.up = [-1, 1, -1];
27

28
        this.bimViewer._modelsExplorer.on("modelLoaded", (modelId) => {
29
            this._saveModelMemento(modelId);
30
        });
31

32
        this.bimViewer._modelsExplorer.on("modelUnloaded", (modelId) => {
33
            this._destroyModelMemento(modelId);
34
        });
35

36
        this.on("enabled", (enabled) => {
37
            if (!enabled) {
38
                buttonElement.classList.add("disabled");
39
            } else {
40
                buttonElement.classList.remove("disabled");
41
            }
42
        });
43

44
        this.on("active", (active) => {
45
            if (active) {
46
                buttonElement.classList.add("active");
47
            } else {
48
                buttonElement.classList.remove("active");
49
            }
50
        });
51

52
        buttonElement.addEventListener("click", (event) => {
53
            if (this.getEnabled()) {
54
                this.reset();
55
            }
56
            event.preventDefault();
57
        });
58
    }
59

60
    _saveModelMemento(modelId) {
61
        const metaModel = this.viewer.metaScene.metaModels[modelId];
62
        if (!metaModel) {
63
            return;
64
        }
65
        const modelMemento = new ModelMemento();
66
        modelMemento.saveObjects(this.viewer.scene, metaModel, {
67
            visible: true,
68
            edges: true,
69
            xrayed: true,
70
            highlighted: true,
71
            selected: true,
72
            clippable: true,
73
            pickable: true,
74
            colorize: false, // We don't colorize objects yet - also messes up point clouds
75
            opacity: false // FIXME: Restoring opacity broken by colorize fix - details at https://github.com/xeokit/xeokit-sdk/issues/239
76
        });
77
        this._modelMementos[modelId] = modelMemento;
78
    }
79

80
    _restoreModelMemento(modelId) {
81
        const metaModel = this.viewer.metaScene.metaModels[modelId];
82
        if (!metaModel) {
83
            return;
84
        }
85
        const modelMemento = this._modelMementos[modelId];
86
        modelMemento.restoreObjects(this.viewer.scene, metaModel);
87
    }
88

89
    _destroyModelMemento(modelId) {
90
        delete this._modelMementos[modelId];
91
    }
92

93
    reset() {
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);
99
        }
100
        this.bimViewer.unShowObjectInExplorers();
101
        this.fire("reset", true);
102
        this._resetCamera();
103
    }
104

105
    _resetCamera() {
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({
119
            look: center,
120
            eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
121
            up: up,
122
            orthoScale: diag * 1.3,
123
            projection: "perspective",
124
            duration: 1
125
        });
126
    }
127
}
128

129
export {ResetAction};

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.