1
import {Controller} from "../Controller.js";
2
import {ContextMenu, DistanceMeasurementsMouseControl, DistanceMeasurementsPlugin} from "@xeokit/xeokit-sdk";
5
export class MeasureDistanceTool 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.axisVisible ? "Hide Measurement Axis" : "Show Measurement Axis";
24
doAction: function (context) {
25
context.measurement.axisVisible = !context.measurement.axisVisible;
29
getTitle: (context) => {
30
return context.measurement.labelsVisible ? "Hide Measurement Labels" : "Show Measurement Labels";
32
doAction: function (context) {
33
context.measurement.labelsVisible = !context.measurement.labelsVisible;
38
title: "Delete Measurement",
39
doAction: function (context) {
40
context.measurement.destroy();
47
this._contextMenu.on("hidden", () => {
48
if (this._contextMenu.context.measurement) {
49
this._contextMenu.context.measurement.setHighlighted(false);
53
this._distanceMeasurementsPlugin = new DistanceMeasurementsPlugin(this.viewer, {
54
defaultAxisVisible: false,
55
defaultLabelsOnWires : false
58
this._distanceMeasurementsPlugin.on("mouseOver", (e) => {
59
e.measurement.setHighlighted(true);
62
this._distanceMeasurementsPlugin.on("mouseLeave", (e) => {
63
if (this._contextMenu.shown && this._contextMenu.context.measurement.id === e.measurement.id) {
66
e.measurement.setHighlighted(false);
69
this._distanceMeasurementsPlugin.on("contextMenu", (e) => {
70
this._contextMenu.context = {
71
distanceMeasurementsPlugin: this._distanceMeasurementsPlugin,
72
measurement: e.measurement
74
this._contextMenu.show(e.event.clientX, e.event.clientY);
75
e.event.preventDefault();
78
this._distanceMeasurementsMouseControl = new DistanceMeasurementsMouseControl(this._distanceMeasurementsPlugin, {
82
this._distanceMeasurementsMouseControl.snapping = true;
84
this.on("enabled", (enabled) => {
86
buttonElement.classList.add("disabled");
88
buttonElement.classList.remove("disabled");
92
this.on("active", (active) => {
94
buttonElement.classList.add("active");
95
this._distanceMeasurementsMouseControl.activate();
97
buttonElement.classList.remove("active");
98
this._distanceMeasurementsMouseControl.deactivate();
102
buttonElement.addEventListener("click", (event) => {
103
if (this.getEnabled()) {
104
const active = this.getActive();
105
this.setActive(!active);
107
event.preventDefault();
110
this.bimViewer.on("reset", () => {
111
this.setActive(false);
116
getNumMeasurements() {
117
return Object.keys(this._distanceMeasurementsPlugin.measurements).length;
120
setMeasurementsAxisVisible(axisVisible) {
121
this._distanceMeasurementsPlugin.setAxisVisible(axisVisible);
124
getMeasurementsAxisVisible() {
125
return this._distanceMeasurementsPlugin.getAxisVisible();
128
setSnappingEnabled(snappingEnabled) {
129
return this._distanceMeasurementsMouseControl.snapping = snappingEnabled;
132
getSnappingEnabled() {
133
return this._distanceMeasurementsMouseControl.snapping;
137
this._distanceMeasurementsPlugin.clear();
141
this._distanceMeasurementsPlugin.destroy();
142
this._distanceMeasurementsMouseControl.destroy();
143
this._contextMenu.destroy();