src/contextMenus/SectionToolContextMenu.js
import {ContextMenu, math, utils} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
const tempAABB = math.AABB3();
const tempVec3 = math.vec3();
/**
* @private
*/
class SectionToolContextMenu extends ContextMenu {
constructor(cfg = {}) {
if (!cfg.sectionPlanesPlugin) {
throw "Missing config: sectionPlanesPlugin";
}
super(utils.apply({}, cfg));
this._sectionPlanesPlugin = cfg.sectionPlanesPlugin;
this._viewer = this._sectionPlanesPlugin.viewer;
this._onSceneSectionPlaneCreated = this._viewer.scene.on("sectionPlaneCreated", () => {
this._buildMenu();
});
this._onSceneSectionPlaneDestroyed = this._viewer.scene.on("sectionPlaneDestroyed", () => {
this._buildMenu();
});
this._buildMenu();
}
_buildMenu() {
const sectionPlanesPlugin = this._sectionPlanesPlugin;
const sectionPlanes = Object.values(sectionPlanesPlugin.sectionPlanes);
const sectionPlanesMenuItems = [];
for (let i = 0, len = sectionPlanes.length; i < len; i++) {
const sectionPlane = sectionPlanes[i];
sectionPlanesMenuItems.push({
getTitle: (context) => {
return `${context.viewer.localeService.translate("sectionToolContextMenu.slice") || "Slice"} #` + (i + 1);
},
doHoverEnter(context) {
sectionPlanesPlugin.hideControl();
sectionPlanesPlugin.showControl(sectionPlane.id);
},
doHoverLeave(context) {
sectionPlanesPlugin.hideControl();
},
items: [ // Submenu
[ // Group
{
getTitle: (context) => {
return sectionPlane.active
? context.viewer.localeService.translate("sectionToolContextMenu.deactivate") || "Disable"
: context.viewer.localeService.translate("sectionToolContextMenu.activate") || "Enable";
},
doAction: (context) => {
sectionPlane.active = !sectionPlane.active;
}
},
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.edit") || "Edit";
},
getEnabled() {
return sectionPlane.active;
},
doAction: (context) => {
sectionPlanesPlugin.hideControl();
sectionPlanesPlugin.showControl(sectionPlane.id);
const sectionPlanePos = sectionPlane.pos;
tempAABB.set(this._viewer.scene.aabb);
math.getAABB3Center(tempAABB, tempVec3);
tempAABB[0] += sectionPlanePos[0] - tempVec3[0];
tempAABB[1] += sectionPlanePos[1] - tempVec3[1];
tempAABB[2] += sectionPlanePos[2] - tempVec3[2];
tempAABB[3] += sectionPlanePos[0] - tempVec3[0];
tempAABB[4] += sectionPlanePos[1] - tempVec3[1];
tempAABB[5] += sectionPlanePos[2] - tempVec3[2];
this._viewer.cameraFlight.flyTo({
aabb: tempAABB,
fitFOV: 65
});
}
},
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.flip") || "Flip";
},
getEnabled() {
return sectionPlane.active;
},
doAction: (context) => {
sectionPlane.flipDir();
}
},
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.delete") || "Delete";
},
doAction: (context) => {
sectionPlane.destroy();
}
}
]
]
});
}
this.items = [
[
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.clearSlices") || "Clear Slices";
},
getEnabled: (context) => {
return (context.bimViewer.getNumSections() > 0);
},
doAction: (context) => {
context.bimViewer.clearSections();
}
},
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.flipSlices") || "Flip Slices";
},
getEnabled: (context) => {
return (context.bimViewer.getNumSections() > 0);
},
doAction: (context) => {
context.bimViewer.flipSections();
}
}
],
[
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.disableAllSlices") || "Disable all Slices";
},
getEnabled: (context) => {
return (context.bimViewer.getNumSections() > 0);
},
doAction: (context) => {
context.bimViewer.disableSections();
}
},
{
getTitle: (context) => {
return context.viewer.localeService.translate("sectionToolContextMenu.enableAllSlices") || "Enable all Slices";
},
getEnabled: (context) => {
return (context.bimViewer.getNumSections() > 0);
},
doAction: (context) => {
context.bimViewer.enableSections();
}
}
],
sectionPlanesMenuItems
];
}
destroy() {
super.destroy();
const scene = this._viewer.scene;
scene.off(this._onSceneSectionPlaneCreated);
scene.off(this._onSceneSectionPlaneDestroyed);
}
}
export {SectionToolContextMenu};