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