BIMviewer
327 строк · 14.4 Кб
1import {ContextMenu, math} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";2
3/**
4* @private
5*/
6class ObjectContextMenu extends ContextMenu {7
8constructor(bimViewer, cfg = {}) {9super(cfg);10this._bimViewer = bimViewer;11this._buildMenu(cfg);12}13
14_buildMenu(cfg) {15
16const showObjectItems = [];17const focusObjectItems = [];18const measurementItems = [];19
20const enableMeasurements = (!!cfg.enableMeasurements);21
22if (this._bimViewer._enablePropertiesInspector) {23showObjectItems.push(...[{24getTitle: (context) => {25return context.viewer.localeService.translate("objectContextMenu.inspectProperties") || "Inspect Properties";26},27doAction: (context) => {28const objectId = context.entity.id;29context.bimViewer.showObjectProperties(objectId);30}31}]);32}33
34showObjectItems.push(...[35{36getTitle: (context) => {37return context.viewer.localeService.translate("objectContextMenu.showInTree") || "Show in Explorer";38},39doAction: (context) => {40const objectId = context.entity.id;41context.showObjectInExplorers(objectId);42}43}44]);45
46focusObjectItems.push(...[47{48getTitle: (context) => {49return context.viewer.localeService.translate("objectContextMenu.viewFit") || "View Fit";50},51doAction: (context) => {52const viewer = context.viewer;53const scene = viewer.scene;54const entity = context.entity;55viewer.cameraFlight.flyTo({56aabb: entity.aabb,57duration: 0.558}, () => {59setTimeout(function () {60scene.setObjectsHighlighted(scene.highlightedObjectIds, false);61}, 500);62});63viewer.cameraControl.pivotPos = math.getAABB3Center(entity.aabb);64}65},66{67getTitle: (context) => {68return context.viewer.localeService.translate("canvasContextMenu.viewFitSelection") || "View Fit Selected";69},70getEnabled: (context) => {71return (context.viewer.scene.numSelectedObjects > 0);72},73doAction: (context) => {74const viewer = context.viewer;75const scene = viewer.scene;76const sceneAABB = scene.getAABB(scene.selectedObjectIds);77viewer.cameraFlight.flyTo({78aabb: sceneAABB,79duration: 0.580});81viewer.cameraControl.pivotPos = math.getAABB3Center(sceneAABB);82}83},84{85getTitle: (context) => {86return context.viewer.localeService.translate("objectContextMenu.viewFitAll") || "View Fit All";87},88doAction: (context) => {89const viewer = context.viewer;90const scene = viewer.scene;91const sceneAABB = scene.getAABB(scene.visibleObjectIds);92viewer.cameraFlight.flyTo({93aabb: sceneAABB,94duration: 0.595});96viewer.cameraControl.pivotPos = math.getAABB3Center(sceneAABB);97}98}99]);100
101if (enableMeasurements) {102measurementItems.push(...[{103getTitle: (context) => {104return context.viewer.localeService.translate("canvasContextMenu.measurements") || "Measurements";105},106doAction: function (context) {107// Does nothing108},109items: [ // Sub-menu110[{111getTitle: (context) => {112return context.viewer.localeService.translate("canvasContextMenu.clearMeasurements") || "Clear";113}, getEnabled: (context) => {114return (context.bimViewer.getNumMeasurements() > 0);115}, doAction: (context) => {116context.bimViewer.clearMeasurements();117}118}, {119getTitle: (context) => {120return context.bimViewer.getMeasurementsAxisVisible() ? context.viewer.localeService.translate("canvasContextMenu.hideMeasurementAxisWires") || "Hide Axis Wires" : context.viewer.localeService.translate("canvasContextMenu.showMeasurementAxisWires") || "Show Axis Wires"121}, getEnabled: (context) => {122return (context.bimViewer.getNumMeasurements() > 0);123}, doAction: (context) => {124context.bimViewer.setMeasurementsAxisVisible(!context.bimViewer.getMeasurementsAxisVisible());125}126}, {127getTitle: (context) => {128return context.bimViewer.getMeasurementsSnappingEnabled() ? context.viewer.localeService.translate("canvasContextMenu.disableMeasurementSnapping") || "Disable Snapping" : context.viewer.localeService.translate("canvasContextMenu.enableMeasurementSnapping") || "Enable Snapping"129}, getEnabled: (context) => {130return (context.bimViewer.getNumMeasurements() > 0);131}, doAction: (context) => {132context.bimViewer.setMeasurementsSnappingEnabled(!context.bimViewer.getMeasurementsSnappingEnabled());133}134}]]135}]);136}137
138this.items = [139showObjectItems,140focusObjectItems,141[142{143getTitle: (context) => {144return context.viewer.localeService.translate("objectContextMenu.hide") || "Hide";145},146getEnabled: (context) => {147return context.entity.visible;148},149doAction: (context) => {150context.entity.visible = false;151}152},153{154getTitle: (context) => {155return context.viewer.localeService.translate("objectContextMenu.hideOthers") || "Hide Others";156},157doAction: (context) => {158const viewer = context.viewer;159const scene = viewer.scene;160const entity = context.entity;161const metaObject = viewer.metaScene.metaObjects[entity.id];162if (!metaObject) {163return;164}165scene.setObjectsVisible(scene.visibleObjectIds, false);166metaObject.withMetaObjectsInSubtree((metaObject) => {167const entity = scene.objects[metaObject.id];168if (entity) {169entity.visible = true;170}171});172}173},174{175getTitle: (context) => {176return context.viewer.localeService.translate("objectContextMenu.hideAll") || "Hide All";177},178getEnabled: (context) => {179return (context.viewer.scene.numVisibleObjects > 0);180},181doAction: (context) => {182context.viewer.scene.setObjectsVisible(context.viewer.scene.visibleObjectIds, false);183}184},185{186getTitle: (context) => {187return context.viewer.localeService.translate("objectContextMenu.showAll") || "Show All";188},189getEnabled: (context) => {190const scene = context.viewer.scene;191return ((scene.numVisibleObjects < scene.numObjects) || (context.viewer.scene.numXRayedObjects > 0));192},193doAction: (context) => {194const scene = context.viewer.scene;195scene.setObjectsVisible(scene.objectIds, true);196scene.setObjectsPickable(scene.xrayedObjectIds, true);197scene.setObjectsXRayed(scene.xrayedObjectIds, false);198}199}200],201[202{203getTitle: (context) => {204return context.viewer.localeService.translate("objectContextMenu.xray") || "X-Ray";205},206getEnabled: (context) => {207return (!context.entity.xrayed);208},209doAction: (context) => {210const entity = context.entity;211entity.xrayed = true;212entity.pickable = context.bimViewer.getConfig("xrayPickable");213}214},215{216getTitle: (context) => {217return context.viewer.localeService.translate("objectContextMenu.xrayOthers") || "X-Ray Others";218},219doAction: (context) => {220const viewer = context.viewer;221const scene = viewer.scene;222const entity = context.entity;223const metaObject = viewer.metaScene.metaObjects[entity.id];224if (!metaObject) {225return;226}227scene.setObjectsVisible(scene.objectIds, true);228scene.setObjectsXRayed(scene.objectIds, true);229if (!context.bimViewer.getConfig("xrayPickable")) {230scene.setObjectsPickable(scene.objectIds, false);231}232metaObject.withMetaObjectsInSubtree((metaObject) => {233const entity = scene.objects[metaObject.id];234if (entity) {235entity.xrayed = false;236entity.pickable = true;237}238});239}240},241{242getTitle: (context) => {243return context.viewer.localeService.translate("objectContextMenu.xrayAll") || "X-Ray All";244},245getEnabled: (context) => {246const scene = context.viewer.scene;247return (scene.numXRayedObjects < scene.numObjects);248},249doAction: (context) => {250const scene = context.viewer.scene;251scene.setObjectsVisible(scene.objectIds, true);252if (!context.bimViewer.getConfig("xrayPickable")) {253scene.setObjectsPickable(scene.objectIds, false);254}255scene.setObjectsXRayed(scene.objectIds, true);256}257},258{259getTitle: (context) => {260return context.viewer.localeService.translate("objectContextMenu.xrayNone") || "X-Ray None";261},262getEnabled: (context) => {263return (context.viewer.scene.numXRayedObjects > 0);264},265doAction: (context) => {266const scene = context.viewer.scene;267const xrayedObjectIds = scene.xrayedObjectIds;268scene.setObjectsPickable(xrayedObjectIds, true);269scene.setObjectsXRayed(xrayedObjectIds, false);270}271}272],273[274{275getTitle: (context) => {276return context.viewer.localeService.translate("objectContextMenu.select") || "Select";277},278getEnabled: (context) => {279return (!context.entity.selected);280},281doAction: (context) => {282context.entity.selected = true;283
284}285},286{287getTitle: (context) => {288return context.viewer.localeService.translate("objectContextMenu.undoSelect") || "Undo Select";289},290getEnabled: (context) => {291return context.entity.selected;292},293doAction: (context) => {294context.entity.selected = false;295}296},297{298getTitle: (context) => {299return context.viewer.localeService.translate("objectContextMenu.selectNone") || "Select None";300},301getEnabled: (context) => {302return (context.viewer.scene.numSelectedObjects > 0);303},304doAction: (context) => {305context.viewer.scene.setObjectsSelected(context.viewer.scene.selectedObjectIds, false);306}307}308],309[310{311getTitle: (context) => {312return context.viewer.localeService.translate("objectContextMenu.clearSlices") || "Clear Slices";313},314getEnabled: (context) => {315return (context.bimViewer.getNumSections() > 0);316},317doAction: (context) => {318context.bimViewer.clearSections();319}320}321],322measurementItems
323];324}325}
326
327export {ObjectContextMenu};