BIMviewer

Форк
0
/
SectionTool.js 
224 строки · 7.2 Кб
1
import {Controller} from "../Controller.js";
2
import {SectionToolContextMenu} from "./../contextMenus/SectionToolContextMenu.js";
3
import {math, SectionPlanesPlugin} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
4

5
/** @private */
6
class SectionTool extends Controller { // XX
7

8
    constructor(parent, cfg) {
9

10
        super(parent, cfg);
11

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

16
        if (!cfg.menuButtonElement) {
17
            throw "Missing config: menuButtonElement";
18
        }
19

20
        this._buttonElement = cfg.buttonElement;
21
        this._counterElement = cfg.counterElement;
22
        this._menuButtonElement = cfg.menuButtonElement;
23
        this._menuButtonArrowElement = cfg.menuButtonArrowElement;
24

25
        this._sectionPlanesPlugin = new SectionPlanesPlugin(this.viewer, {});
26

27
        this._sectionToolContextMenu = new SectionToolContextMenu({
28
            sectionPlanesPlugin: this._sectionPlanesPlugin,
29
            hideOnMouseDown: false,
30
            hideOnAction: false
31
        });
32

33
        this._sectionPlanesPlugin.setOverviewVisible(false);
34

35
        this.on("enabled", (enabled) => {
36
            if (!enabled) {
37
                this._buttonElement.classList.add("disabled");
38
                if (this._counterElement) {
39
                    this._counterElement.classList.add("disabled");
40
                }
41
                this._menuButtonElement.classList.add("disabled");
42
                this._menuButtonArrowElement.classList.add("disabled");
43
            } else {
44
                this._buttonElement.classList.remove("disabled");
45
                if (this._counterElement) {
46
                    this._counterElement.classList.remove("disabled");
47
                }
48
                this._menuButtonElement.classList.remove("disabled");
49
                this._menuButtonArrowElement.classList.remove("disabled");
50
            }
51
        });
52

53
        this.on("active", (active) => {
54
            if (active) {
55
                this._buttonElement.classList.add("active");
56
                if (this._counterElement) {
57
                    this._counterElement.classList.add("active");
58
                }
59
                this._menuButtonElement.classList.add("active");
60
                this._menuButtonArrowElement.classList.add("active");
61
            } else {
62
                this._buttonElement.classList.remove("active");
63
                if (this._counterElement) {
64
                    this._counterElement.classList.remove("active");
65
                }
66
                this._menuButtonElement.classList.remove("active");
67
                this._menuButtonArrowElement.classList.remove("active");
68
            }
69
        });
70

71
        this.on("active", (active) => {
72
            if (!active) {
73
                this._sectionPlanesPlugin.hideControl();
74
            }
75
        });
76

77
        this._buttonElement.addEventListener("click", (e) => {
78
            if (!this.getEnabled()) {
79
                return;
80
            }
81
            if (e.target === this._menuButtonElement || e.target.parentNode === this._menuButtonElement) {
82
                if (this._sectionToolContextMenu.shown) {
83
                    this._sectionToolContextMenu.hide();
84
                } else {
85
                    this._sectionToolContextMenu.context = {
86
                        bimViewer: this.bimViewer,
87
                        viewer: this.viewer,
88
                        sectionTool: this
89
                    };
90

91
                    const rect = this._menuButtonElement.getBoundingClientRect();
92

93
                    this._sectionToolContextMenu.show(rect.left, rect.bottom + 5);
94
                }
95
                return;
96
            }
97
            const active = this.getActive();
98
            this.setActive(!active);
99
            e.preventDefault();
100
        });
101

102
        this._sectionToolContextMenu.on("shown", () => {
103
            this._menuButtonArrowElement.classList.remove("xeokit-arrow-down");
104
            this._menuButtonArrowElement.classList.add("xeokit-arrow-up");
105
        });
106

107
        this._sectionToolContextMenu.on("hidden", () => {
108
            this._menuButtonArrowElement.classList.remove("xeokit-arrow-up");
109
            this._menuButtonArrowElement.classList.add("xeokit-arrow-down");
110
        });
111

112
        this.bimViewer.on("reset", () => {
113
            this.clear();
114
            this.setActive(false);
115
        });
116

117
        this.viewer.scene.on("sectionPlaneCreated", () => {
118
            this._updateSectionPlanesCount();
119
        });
120

121
        this.viewer.scene.on("sectionPlaneDestroyed", () => {
122
            this._updateSectionPlanesCount();
123
        });
124

125
        this._initSectionMode();
126
    }
127

128
    _initSectionMode() {
129

130
        document.addEventListener('mouseup', (e) => {
131

132
            if (e.which === 1) {
133

134
                const coords = getMouseCanvasPos(e);
135

136
                if (!this.getActive() || !this.getEnabled()) {
137
                    return;
138
                }
139

140
                const pickResult = this.viewer.scene.pick({
141
                    canvasPos: coords,
142
                    pickSurface: true  // <<------ This causes picking to find the intersection point on the entity
143
                });
144

145
                if (pickResult && pickResult.entity && pickResult.entity.isObject) { // Only slice model objects, not 3D UI helpers
146

147
                    const sectionPlane = this._sectionPlanesPlugin.createSectionPlane({
148
                        pos: pickResult.worldPos,
149
                        dir: math.mulVec3Scalar(pickResult.worldNormal, -1)
150
                    });
151

152
                    this._sectionPlanesPlugin.showControl(sectionPlane.id);
153
                }
154
            }
155
        });
156

157
        this._updateSectionPlanesCount();
158
    }
159

160
    _updateSectionPlanesCount() {
161
        if (this._counterElement) {
162
            this._counterElement.innerText = ("" + this.getNumSections());
163
        }
164
    }
165

166
    getNumSections() {
167
        return Object.keys(this.viewer.scene.sectionPlanes).length;
168
    }
169

170
    clear() {
171
        this._sectionPlanesPlugin.clear();
172
        this._updateSectionPlanesCount();
173
    }
174

175
    flipSections() {
176
        this._sectionPlanesPlugin.flipSectionPlanes();
177
    }
178

179
    enableSections() {
180
        const sectionPlanes = this.viewer.scene.sectionPlanes;
181
        for (let id in sectionPlanes) {
182
            const sectionPlane = sectionPlanes[id];
183
            sectionPlane.active = true;
184
        }
185
    }
186

187
    disableSections() {
188
        const sectionPlanes = this.viewer.scene.sectionPlanes;
189
        for (let id in sectionPlanes) {
190
            const sectionPlane = sectionPlanes[id];
191
            sectionPlane.active = false;
192
        }
193
    }
194

195
    hideControl() {
196
        this._sectionPlanesPlugin.hideControl();
197
    }
198

199
    destroy() {
200
        this._sectionPlanesPlugin.destroy();
201
        this._sectionToolContextMenu.destroy();
202
        super.destroy();
203
    }
204
}
205

206
function getMouseCanvasPos(event) {
207
    if (!event) {
208
        event = window.event;
209
        this.mouseCanvasPos[0] = event.x;
210
        this.mouseCanvasPos[1] = event.y;
211
    } else {
212
        let element = event.target;
213
        let totalOffsetLeft = 0;
214
        let totalOffsetTop = 0;
215
        while (element.offsetParent) {
216
            totalOffsetLeft += element.offsetLeft;
217
            totalOffsetTop += element.offsetTop;
218
            element = element.offsetParent;
219
        }
220
        return [event.pageX - totalOffsetLeft, event.pageY - totalOffsetTop];
221
    }
222
}
223

224
export {SectionTool};

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

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

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

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