1
import {Controller} from "../Controller.js";
2
import {AngleMeasurementsPlugin, AngleMeasurementsMouseControl, ContextMenu} from "@xeokit/xeokit-sdk";
5
export class MeasureAngleTool extends Controller {
7
constructor(parent, cfg) {
11
if (!cfg.buttonElement) {
12
throw "Missing config: buttonElement";
15
const buttonElement = cfg.buttonElement;
17
this._contextMenu = new ContextMenu({
21
getTitle: (context) => {
22
return context.measurement.labelsVisible ? "Hide Measurement Label" : "Show Measurement Label";
24
doAction: function (context) {
25
context.measurement.labelsVisible = !context.measurement.labelsVisible;
30
title: "Delete Measurement",
31
doAction: function (context) {
32
context.measurement.destroy();
39
this._contextMenu.on("hidden", () => {
40
if (this._contextMenu.context.measurement) {
41
this._contextMenu.context.measurement.setHighlighted(false);
45
this._angleMeasurementsPlugin = new AngleMeasurementsPlugin(this.viewer, {});
47
this._angleMeasurementsPlugin.on("mouseOver", (e) => {
48
e.measurement.setHighlighted(true);
51
this._angleMeasurementsPlugin.on("mouseLeave", (e) => {
52
if (this._contextMenu.shown && this._contextMenu.context.measurement.id === e.measurement.id) {
55
e.measurement.setHighlighted(false);
58
this._angleMeasurementsPlugin.on("contextMenu", (e) => {
59
this._contextMenu.context = {
60
angleMeasurementsPlugin: this._angleMeasurementsPlugin,
61
measurement: e.measurement
63
this._contextMenu.show(e.event.clientX, e.event.clientY);
64
e.event.preventDefault();
67
this._angleMeasurementsMouseControl = new AngleMeasurementsMouseControl(this._angleMeasurementsPlugin, {
71
this._angleMeasurementsMouseControl.snapping = true;
73
this.on("enabled", (enabled) => {
75
buttonElement.classList.add("disabled");
77
buttonElement.classList.remove("disabled");
81
this.on("active", (active) => {
83
buttonElement.classList.add("active");
84
this._angleMeasurementsMouseControl.activate();
86
buttonElement.classList.remove("active");
87
this._angleMeasurementsMouseControl.deactivate();
91
buttonElement.addEventListener("click", (event) => {
92
if (this.getEnabled()) {
93
const active = this.getActive();
94
this.setActive(!active);
96
event.preventDefault();
99
this.bimViewer.on("reset", () => {
100
this.setActive(false);
105
getNumMeasurements() {
106
return Object.keys(this._angleMeasurementsPlugin.measurements).length;
109
setSnappingEnabled(snappingEnabled) {
110
return this._angleMeasurementsMouseControl.snapping = snappingEnabled;
113
getSnappingEnabled() {
114
return this._angleMeasurementsMouseControl.snapping;
118
this._angleMeasurementsPlugin.clear();
122
this._angleMeasurementsPlugin.destroy();
123
this._angleMeasurementsMouseControl.destroy();
124
this._contextMenu.destroy();