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";
6
class SectionTool extends Controller {
8
constructor(parent, cfg) {
12
if (!cfg.buttonElement) {
13
throw "Missing config: buttonElement";
16
if (!cfg.menuButtonElement) {
17
throw "Missing config: menuButtonElement";
20
this._buttonElement = cfg.buttonElement;
21
this._counterElement = cfg.counterElement;
22
this._menuButtonElement = cfg.menuButtonElement;
23
this._menuButtonArrowElement = cfg.menuButtonArrowElement;
25
this._sectionPlanesPlugin = new SectionPlanesPlugin(this.viewer, {});
27
this._sectionToolContextMenu = new SectionToolContextMenu({
28
sectionPlanesPlugin: this._sectionPlanesPlugin,
29
hideOnMouseDown: false,
33
this._sectionPlanesPlugin.setOverviewVisible(false);
35
this.on("enabled", (enabled) => {
37
this._buttonElement.classList.add("disabled");
38
if (this._counterElement) {
39
this._counterElement.classList.add("disabled");
41
this._menuButtonElement.classList.add("disabled");
42
this._menuButtonArrowElement.classList.add("disabled");
44
this._buttonElement.classList.remove("disabled");
45
if (this._counterElement) {
46
this._counterElement.classList.remove("disabled");
48
this._menuButtonElement.classList.remove("disabled");
49
this._menuButtonArrowElement.classList.remove("disabled");
53
this.on("active", (active) => {
55
this._buttonElement.classList.add("active");
56
if (this._counterElement) {
57
this._counterElement.classList.add("active");
59
this._menuButtonElement.classList.add("active");
60
this._menuButtonArrowElement.classList.add("active");
62
this._buttonElement.classList.remove("active");
63
if (this._counterElement) {
64
this._counterElement.classList.remove("active");
66
this._menuButtonElement.classList.remove("active");
67
this._menuButtonArrowElement.classList.remove("active");
71
this.on("active", (active) => {
73
this._sectionPlanesPlugin.hideControl();
77
this._buttonElement.addEventListener("click", (e) => {
78
if (!this.getEnabled()) {
81
if (e.target === this._menuButtonElement || e.target.parentNode === this._menuButtonElement) {
82
if (this._sectionToolContextMenu.shown) {
83
this._sectionToolContextMenu.hide();
85
this._sectionToolContextMenu.context = {
86
bimViewer: this.bimViewer,
91
const rect = this._menuButtonElement.getBoundingClientRect();
93
this._sectionToolContextMenu.show(rect.left, rect.bottom + 5);
97
const active = this.getActive();
98
this.setActive(!active);
102
this._sectionToolContextMenu.on("shown", () => {
103
this._menuButtonArrowElement.classList.remove("xeokit-arrow-down");
104
this._menuButtonArrowElement.classList.add("xeokit-arrow-up");
107
this._sectionToolContextMenu.on("hidden", () => {
108
this._menuButtonArrowElement.classList.remove("xeokit-arrow-up");
109
this._menuButtonArrowElement.classList.add("xeokit-arrow-down");
112
this.bimViewer.on("reset", () => {
114
this.setActive(false);
117
this.viewer.scene.on("sectionPlaneCreated", () => {
118
this._updateSectionPlanesCount();
121
this.viewer.scene.on("sectionPlaneDestroyed", () => {
122
this._updateSectionPlanesCount();
125
this._initSectionMode();
130
document.addEventListener('mouseup', (e) => {
134
const coords = getMouseCanvasPos(e);
136
if (!this.getActive() || !this.getEnabled()) {
140
const pickResult = this.viewer.scene.pick({
145
if (pickResult && pickResult.entity && pickResult.entity.isObject) {
147
const sectionPlane = this._sectionPlanesPlugin.createSectionPlane({
148
pos: pickResult.worldPos,
149
dir: math.mulVec3Scalar(pickResult.worldNormal, -1)
152
this._sectionPlanesPlugin.showControl(sectionPlane.id);
157
this._updateSectionPlanesCount();
160
_updateSectionPlanesCount() {
161
if (this._counterElement) {
162
this._counterElement.innerText = ("" + this.getNumSections());
167
return Object.keys(this.viewer.scene.sectionPlanes).length;
171
this._sectionPlanesPlugin.clear();
172
this._updateSectionPlanesCount();
176
this._sectionPlanesPlugin.flipSectionPlanes();
180
const sectionPlanes = this.viewer.scene.sectionPlanes;
181
for (let id in sectionPlanes) {
182
const sectionPlane = sectionPlanes[id];
183
sectionPlane.active = true;
188
const sectionPlanes = this.viewer.scene.sectionPlanes;
189
for (let id in sectionPlanes) {
190
const sectionPlane = sectionPlanes[id];
191
sectionPlane.active = false;
196
this._sectionPlanesPlugin.hideControl();
200
this._sectionPlanesPlugin.destroy();
201
this._sectionToolContextMenu.destroy();
206
function getMouseCanvasPos(event) {
208
event = window.event;
209
this.mouseCanvasPos[0] = event.x;
210
this.mouseCanvasPos[1] = event.y;
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;
220
return [event.pageX - totalOffsetLeft, event.pageY - totalOffsetTop];