@roomle/web-sdk 2.108.0 → 2.109.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/definitions/web-sdk/packages/typings/planner.d.ts +1 -0
- package/lib/main-BWNZ7qEz.js.map +1 -1
- package/lib/main-Dv1fpIpy.mjs.map +1 -1
- package/lib/{planner-ol3gjqFY.js → planner-CTkUBoTH.js} +2 -2
- package/lib/{planner-ol3gjqFY.js.map → planner-CTkUBoTH.js.map} +1 -1
- package/lib/{planner-RcUe_egC.mjs → planner-iORwmIyR.mjs} +3 -2
- package/lib/{planner-RcUe_egC.mjs.map → planner-iORwmIyR.mjs.map} +1 -1
- package/lib/planner.js +1 -1
- package/lib/planner.nomodule.js +1 -1
- package/lib/roomle-sdk.js +1 -1
- package/lib/roomle-sdk.nomodule.js +1 -1
- package/lib/static/roomle-core-hsc/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleServiceCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleToolsCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/embind/plannerCoreInterface.d.ts +1 -0
- package/lib/static/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/plannerCoreInterface.d.ts +1 -0
- package/lib/static/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +1 -0
- package/lib/static/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleServiceCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner-RcUe_egC.mjs","sources":["../../packages/common-core/public/textures/paper_background.png?no-inline?url","../../packages/planner-core/src/webgl/lightsetting/planner-light-setting.ts","../../packages/planner-core/src/utils/planner-selection-handler.ts","../../packages/planner-core/src/webgl/planner-scene-event-handler.ts","../../packages/planner-core/src/utils/planner-scene-utils.ts","../../../../node_modules/three/examples/jsm/objects/Sky.js","../../packages/planner-core/src/utils/map-to-ui-plan-objects.ts","../../packages/planner-core/src/webgl/paper-background.ts","../../packages/common-core/src/cameracontrol/planner-camera-behaviour.ts","../../packages/common-core/src/cameracontrol/planner-2d-camera-behaviour.ts","../../packages/common-core/src/cameracontrol/planner-3d-camera-behaviour.ts","../../packages/common-core/src/cameracontrol/planner-fp-camera-behaviour.ts","../../packages/planner-core/src/webgl/planner-element-highlighter.ts","../../packages/planner-core/src/utils/dimensions-helper.ts","../../packages/common-core/src/utils/clipboard-manager.ts","../../packages/planner-core/src/webgl/planner-scene-manager.ts","../../packages/planner-core/src/roomle-planner.ts","../../packages/planner-core/src/input/planner-input-manager.ts","../../packages/planner-core/src/utils/injectables.ts","../../packages/homag-intelligence/src/hi-tag-catalog-callbacks.ts","../../../../node_modules/comlink/dist/esm/comlink.mjs","../../packages/planner-core/src/planner.ts"],"sourcesContent":["export default \"__VITE_ASSET__mifIsO0e__\"","//import { viewSpacePositionFromUV } from '../../../../common-core/src/utils/threejs-utils';\nimport LightSetting from '../../../../common-core/src/lightsetting/light-setting';\nimport { LAYER } from '../../../../common-core/src/webgl/layer';\nimport { getGUI } from '../../../../common-core/src/utils/threejs-utils';\nimport type { Box3, ColorRepresentation, HemisphereLight, Scene } from 'three';\nimport {\n AmbientLight,\n Color,\n DirectionalLight,\n Sphere,\n Vector2,\n Vector3,\n} from 'three';\n\nexport default class PlannerLightSetting extends LightSetting {\n private _hemiLight: HemisphereLight;\n private _ambientLight: AmbientLight;\n private _mainDirLight: DirectionalLight;\n\n private _center: Vector3 = new Vector3(0, 0, 0);\n\n private _params = {\n ambientLight: {\n color: '#ffffff',\n },\n hemiLight: {\n color: '#ffffff',\n },\n mainDirLight: {\n direction: {\n x: 2,\n y: 1,\n z: 2,\n },\n color: '#ffffff',\n },\n };\n\n constructor(scene: Scene, oldLightSetting?: LightSetting) {\n super(scene, oldLightSetting);\n\n this._ambientLight = new AmbientLight(\n new Color(this._params.ambientLight.color as ColorRepresentation),\n 0.4\n );\n this._ambientLight.layers.set(LAYER.LIGHTING);\n\n // this._hemiLight = new HemisphereLight(new Color(0xffffff), new Color(0x555555), 0.3);\n // this._hemiLight.layers.set(LAYER.LIGHTING);\n // this._hemiLight.visible = false;\n\n this._mainDirLight = new DirectionalLight(\n new Color(this._params.mainDirLight.color as ColorRepresentation),\n 0.5\n );\n this._mainDirLight.castShadow = true;\n this._mainDirLight.shadow.camera.near = 0.5;\n this._mainDirLight.shadow.camera.far = 100;\n this._mainDirLight.shadow.mapSize = new Vector2(1024, 1024);\n this._mainDirLight.visible = true;\n\n this.addToScene();\n }\n\n public updateSunPosition(_inclination: number, _azimuth: number) {\n //const distance = 20;\n //const viewSpacePosition = viewSpacePositionFromUV(\n // distance,\n // _azimuth,\n // _inclination\n //);\n //const position = new Vector3(\n // viewSpacePosition.x,\n // -viewSpacePosition.z,\n // viewSpacePosition.y\n //);\n // this._areaLight.position.copy(position);\n // this._areaLight.lookAt(new Vector3(0, 0, 0));\n }\n\n public addToScene(): void {\n this._scene.add(this._mainDirLight);\n this._scene.add(this._ambientLight);\n // this._scene.add(this._hemiLight);\n this._scene.add(this._mainDirLight.target);\n }\n\n public removeFromScene(): void {\n this._scene.remove(this._mainDirLight);\n this._scene.remove(this._ambientLight);\n this._scene.remove(this._mainDirLight.target);\n }\n\n public reload(): void {\n this.removeFromScene();\n this.addToScene();\n }\n\n public needsBounds(): boolean {\n return true;\n }\n\n public updateBounds(bounds: Box3) {\n this._center.copy(bounds.getCenter(new Vector3()));\n\n const boundingSphere = new Sphere();\n bounds.getBoundingSphere(boundingSphere);\n\n const maxSize = boundingSphere.radius;\n\n const lightDirection = new Vector3(\n this._params.mainDirLight.direction.x,\n this._params.mainDirLight.direction.y,\n this._params.mainDirLight.direction.z\n );\n lightDirection.normalize();\n lightDirection.multiplyScalar(maxSize);\n\n this._mainDirLight.position.copy(this._center);\n this._mainDirLight.position.add(lightDirection);\n this._mainDirLight.target.position.copy(this._center);\n this._mainDirLight.target.updateMatrixWorld(true);\n\n this._mainDirLight.shadow.camera.top = maxSize;\n this._mainDirLight.shadow.camera.bottom = -maxSize;\n this._mainDirLight.shadow.camera.left = -maxSize;\n this._mainDirLight.shadow.camera.right = maxSize;\n this._mainDirLight.shadow.camera.near = 0.01;\n this._mainDirLight.shadow.camera.far = 2 * maxSize;\n this._mainDirLight.shadow.camera.updateProjectionMatrix();\n }\n\n public showGUI(): void {\n let gui = getGUI();\n if (!gui) {\n return;\n }\n if (this._ambientLight) {\n let ambiLight = gui.addFolder('Ambient Light');\n ambiLight.add<any>(this._ambientLight, 'visible');\n ambiLight\n .add<any>(this._ambientLight, 'intensity')\n .min(0)\n .max(5)\n .step(0.1);\n ambiLight\n .addColor(this._params.ambientLight, 'color')\n .onChange(\n (color: ColorRepresentation) =>\n (this._ambientLight.color = new Color(color))\n );\n }\n if (this._hemiLight) {\n let hemiLight = gui.addFolder('Hemi Light');\n hemiLight.add<any>(this._hemiLight, 'visible');\n hemiLight.add<any>(this._hemiLight, 'intensity').min(0).max(5).step(0.1);\n hemiLight\n .addColor(this._params.hemiLight, 'color')\n .onChange(\n (color: ColorRepresentation) =>\n (this._hemiLight.color = new Color(color))\n );\n }\n if (this._mainDirLight) {\n let mainDirectionalLight = gui.addFolder('Main Directional Light');\n mainDirectionalLight.add<any>(this._mainDirLight, 'visible');\n mainDirectionalLight\n .add<any>(this._mainDirLight, 'intensity')\n .min(0)\n .max(10)\n .step(0.1);\n mainDirectionalLight.add<any>(this._mainDirLight, 'castShadow');\n mainDirectionalLight\n .addColor(this._params.mainDirLight, 'color')\n .onChange(\n (color: ColorRepresentation) =>\n (this._mainDirLight.color = new Color(color))\n );\n mainDirectionalLight\n .add<any>(this._mainDirLight.position, 'x')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => this._mainDirLight.lookAt(this._center));\n mainDirectionalLight\n .add<any>(this._mainDirLight.position, 'y')\n .min(-10)\n .max(50)\n .step(0.1)\n .onChange(() => this._mainDirLight.lookAt(this._center));\n mainDirectionalLight\n .add<any>(this._mainDirLight.position, 'z')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => this._mainDirLight.lookAt(this._center));\n }\n }\n}\n","import EventDispatcher from '../../../configurator-core/src/utils/event-dispatcher';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport type { CancelSelectionReasons } from '../../../typings/planner';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport FloorPlanElementViewModel from '../view-model/floor-plan-element-view-model';\nimport { SELECTION_MODE } from '../../../configurator-core/src/utils/selection-handler';\n\nexport const enum SELECTION_EVENT {\n SELECT_PLAN_ELEMENT,\n DESELECT_PLAN_ELEMENT,\n SELECT_PLAN_ELEMENT_MULTI,\n SELECTION_MODE_CHANGED,\n}\n\nexport const isWallOrFloor = (planElementViewModel: PlanElementViewModel) => {\n return (\n planElementViewModel instanceof WallPlanElementViewModel ||\n planElementViewModel instanceof FloorPlanElementViewModel\n );\n};\n\nexport class PlannerSelectionHandlerEvent {\n public planElementViewModel: PlanElementViewModel;\n public planElementViewModels: PlanElementViewModel[];\n public selectionMode: SELECTION_MODE;\n public reason: CancelSelectionReasons;\n\n constructor(data: {\n planElementViewModel?: PlanElementViewModel;\n planElementViewModels?: PlanElementViewModel[];\n selectionMode?: SELECTION_MODE;\n reason?: CancelSelectionReasons;\n }) {\n const {\n planElementViewModel,\n planElementViewModels,\n selectionMode,\n reason,\n } = data;\n this.planElementViewModel = planElementViewModel;\n this.planElementViewModels = planElementViewModels;\n this.selectionMode = selectionMode;\n this.reason = reason;\n }\n}\n\nexport default class PlannerSelectionHandler extends EventDispatcher<PlannerSelectionHandlerEvent> {\n private _selectionMode: SELECTION_MODE = SELECTION_MODE.STANDARD;\n protected _selectedPlanElementViewModels: Map<number, PlanElementViewModel> =\n new Map();\n\n public check(planElementViewModel: PlanElementViewModel) {\n if (this._selectionMode === SELECTION_MODE.STANDARD) {\n this._checkStandard(planElementViewModel);\n }\n if (this._selectionMode === SELECTION_MODE.MULTISELECT) {\n this._checkMulti(planElementViewModel);\n }\n }\n\n public removeSelection() {\n this._selectedPlanElementViewModels.clear();\n }\n\n public cancelSelection(reason: CancelSelectionReasons) {\n if (this._selectedPlanElementViewModels.size === 0) {\n return;\n }\n this._selectedPlanElementViewModels.forEach((planElementViewModel, id) => {\n this._selectedPlanElementViewModels.delete(id);\n planElementViewModel.deselect();\n this.dispatchEvent(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({ planElementViewModel, reason })\n );\n });\n }\n\n private _checkStandard(planElementViewModel: PlanElementViewModel) {\n const planElementId = planElementViewModel.getId();\n let selected = this._selectedPlanElementViewModels.has(planElementId);\n if (selected) {\n const selectedPlanViewModel =\n this._selectedPlanElementViewModels.get(planElementId);\n if (selectedPlanViewModel) {\n return;\n }\n }\n\n if (this._selectedPlanElementViewModels.size > 0) {\n this._selectedPlanElementViewModels.forEach((value, id) => {\n this._selectedPlanElementViewModels.delete(id);\n value.deselect();\n this.dispatchEvent(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({\n planElementViewModel: value,\n reason: 'select_other',\n })\n );\n });\n }\n this._selectedPlanElementViewModels.set(\n planElementViewModel.getId(),\n planElementViewModel\n );\n planElementViewModel.select();\n this.dispatchEvent(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({ planElementViewModel })\n );\n }\n\n private _checkMulti(planElementViewModel: PlanElementViewModel) {\n if (isWallOrFloor(planElementViewModel)) {\n return;\n }\n\n let selected = this._selectedPlanElementViewModels.has(\n planElementViewModel.getId()\n );\n\n if (selected) {\n return;\n } else {\n this._selectedPlanElementViewModels.set(\n planElementViewModel.getId(),\n planElementViewModel\n );\n\n planElementViewModel.select();\n\n this.dispatchEvent(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT_MULTI,\n new PlannerSelectionHandlerEvent({\n planElementViewModels: this.getSelectedPlanElementViewModels(),\n })\n );\n\n this.dispatchEvent(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({ planElementViewModel })\n );\n }\n }\n\n private _deselectWallAndFloorElements() {\n this._selectedPlanElementViewModels.forEach((planElementViewModel, id) => {\n if (isWallOrFloor(planElementViewModel)) {\n this._selectedPlanElementViewModels.delete(id);\n planElementViewModel.deselect();\n this.dispatchEvent(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({\n planElementViewModel,\n reason: 'selection_mode_changed',\n })\n );\n }\n });\n }\n\n public setSelectionMode(mode: SELECTION_MODE) {\n if (this._selectionMode === mode) {\n return;\n }\n if (mode === SELECTION_MODE.MULTISELECT) {\n this._deselectWallAndFloorElements();\n }\n this._selectionMode = mode;\n this.dispatchEvent(\n SELECTION_EVENT.SELECTION_MODE_CHANGED,\n new PlannerSelectionHandlerEvent({\n selectionMode: mode,\n })\n );\n }\n\n public getSelectionMode(): SELECTION_MODE {\n return this._selectionMode;\n }\n\n public hasSelection(): boolean {\n return this._selectedPlanElementViewModels.size > 0;\n }\n\n public hasMultiSelection(): boolean {\n return this._selectedPlanElementViewModels.size > 1;\n }\n\n public getSelectedPlanElementViewModels(): PlanElementViewModel[] {\n return [...this._selectedPlanElementViewModels].map(\n ([_id, planElementViewModel]) => planElementViewModel\n );\n }\n\n public getSelectedIds(): number[] {\n let result: number[] = [];\n this._selectedPlanElementViewModels.forEach((component) =>\n result.push(component.getId())\n );\n return result;\n }\n\n public isSelected(id: number) {\n return !!this._selectedPlanElementViewModels.get(id);\n }\n}\n","import type InputManager from '../../../common-core/src/input/input-manager';\nimport type { InputEvent } from '../../../common-core/src/input/input-manager';\nimport {\n INPUT_DELAY_TYPE,\n INPUT_EVENT,\n INPUT_EVENT_TYPE,\n} from '../../../common-core/src/input/input-manager';\nimport type PlanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport inject from '../../../common-core/src/di/inject';\nimport type PlannerSelectionHandler from '../utils/planner-selection-handler';\nimport {\n isWallOrFloor,\n SELECTION_EVENT,\n} from '../utils/planner-selection-handler';\nimport { SELECTION_MODE } from '../../../configurator-core/src/utils/selection-handler';\nimport {\n CURSOR_STYLE,\n deepMerge,\n setCursor,\n wait,\n} from '../../../common-core/src/utils/common-utils';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport type PlannerKernelAccess from '../services/planner-kernel-access';\nimport {\n convertToKernel,\n convertToTHREE,\n} from '../../../common-core/src/utils/kernel-utils';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport type {\n KernelObjectPtrList,\n KernelVector3,\n} from '../../../typings/kernel';\nimport SceneEventHandler from '../../../common-core/src/webgl/scene-event-handler';\nimport {\n INTERSECTION_MODE,\n OBJECT_EVENT,\n RAYCAST_EVENT,\n RAYCAST_PRIORITY,\n} from '../../../configurator-core/src/utils/raycast-helper';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport {\n CORE_CHILD_ENTITY_MODE,\n type CancelSelectionReasons,\n type KernelObject,\n type PlanInteractionHandler,\n type PlanMeasure,\n} from '../../../typings/planner';\nimport { DrawingType } from '../../../typings/planner-kernel-container';\nimport { isSafari } from '../../../common-core/src/utils/browser-helper';\nimport NodePlanElementViewModel from '../view-model/node-plan-element-view-model';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\nimport StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport type ContinuousDrawingHelper from './continuous-drawing-helper';\nimport type { Camera, Object3D, Scene } from 'three';\nimport {\n Box3,\n Group,\n Layers,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Vector3,\n} from 'three';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport type {\n RoomleEventedMesh,\n RoomleEventedObject3D,\n} from '../../../common-core/src/utils/threejs-utils';\nimport type { Position2 } from '../../../common-core/src/common-interfaces';\nimport FloorPlanElementViewModel from '../view-model/floor-plan-element-view-model';\nimport type { MeasurementLineDraggablePoints } from '../view-model/measurement-line-plan-element-view-model';\nimport MeasurementLinePlanElementViewModel, {\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME,\n} from '../view-model/measurement-line-plan-element-view-model';\nimport type { Values } from '../../../typings/helper';\nimport type InitData from './../../../common-core/src/utils/init-data';\nimport { DRAW_PREVIEW_MODES } from '../../../common-core/src/utils/shims';\nimport ConstructionPlanObjectViewModel from '../view-model/construction-plan-object-view-model';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport { isLockedElement } from './planner-scene-manager';\nimport { CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\n\nexport const enum PLANNER_SCENE_EVENT {\n SELECT_PLAN_ELEMENT,\n DESELECT_PLAN_ELEMENT,\n STATE_CHANGED,\n HOVER_ON,\n HOVER_OFF,\n DRAW,\n DRAWING_START,\n DRAWING_END,\n BEFORE_DRAG_START,\n DRAG_START,\n DRAG_MOVE,\n DRAG_END,\n DRAG_CANCEL,\n INTERACTION,\n CLICK_OUTSIDE,\n SELECTION_MODE_CHANGED,\n ADD_MEASUREMENT_LINE_START,\n ADD_MEASUREMENT_LINE_END,\n DRAG_MEASUREMENT_LINE,\n ACTIVATE_PLAN_ELEMENT,\n}\n\nexport const enum PLANNER_SCENE_EVENT_STATE {\n IDLE,\n DRAG,\n ROTATE,\n DRAW,\n MEASURE,\n}\n\nexport class SceneEventInfo {\n public planElementViewModel: PlanElementViewModel;\n public resetCamera: boolean;\n public state: PLANNER_SCENE_EVENT_STATE;\n public oldState: PLANNER_SCENE_EVENT_STATE;\n public reason: CancelSelectionReasons;\n\n constructor(data: {\n planElementViewModel?: PlanElementViewModel;\n resetCamera?: boolean;\n state?: PLANNER_SCENE_EVENT_STATE;\n oldState?: PLANNER_SCENE_EVENT_STATE;\n reason?: CancelSelectionReasons;\n }) {\n const { planElementViewModel, resetCamera, state, oldState, reason } = data;\n this.planElementViewModel = planElementViewModel;\n this.resetCamera = resetCamera === undefined ? true : resetCamera;\n this.state = state === undefined ? PLANNER_SCENE_EVENT_STATE.IDLE : state;\n this.oldState =\n oldState === undefined ? PLANNER_SCENE_EVENT_STATE.IDLE : oldState;\n this.reason = reason;\n }\n}\n\nexport interface PlanObjectEventInfo {\n planElementName: string;\n hasListener: boolean;\n priority: number;\n ignoreElementHit: boolean;\n roomleId: number;\n snapToWall: boolean; // true if it should be possible to snap the object on to a wall (when enabled)\n}\n\nexport default class PlannerSceneEventHandler extends SceneEventHandler<SceneEventInfo> {\n @inject\n private _plannerSelectionHandler: PlannerSelectionHandler;\n\n @inject\n private _plannerKernelAccess: PlannerKernelAccess;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n @inject\n protected _initData: InitData;\n\n private _planViewModel: PlanViewModel;\n\n private _draggedObject: PlanElementViewModel;\n private _lastDragPosition: Vector3;\n private _hoveredObject: PlanElementViewModel;\n\n private _position: Vector3;\n private _isDrawingEnabled: boolean = false;\n private _isCurrentlyDrawing: boolean = false;\n private _isMeasurementLineDrawActive: boolean = false;\n private _state: PLANNER_SCENE_EVENT_STATE = PLANNER_SCENE_EVENT_STATE.IDLE;\n private _drawingGroup: Group;\n\n private _continuousDrawingHelper: ContinuousDrawingHelper;\n private _kernelZoomFactor: number;\n private _currentPlanMeasure: PlanMeasure;\n\n constructor(\n creator: string,\n scene: Scene,\n camera: Camera,\n inputManager: InputManager\n ) {\n super(creator, scene, camera, inputManager);\n this._inputManager.addEventListener(\n INPUT_EVENT.UP,\n () => (this._position = null),\n this\n );\n this._raycastHelper.setMode(INTERSECTION_MODE.PLANNER);\n this._raycastHelper.addEventListener(\n RAYCAST_EVENT.CLICK_OUTSIDE,\n () => {\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.resetState();\n return;\n }\n this._plannerSelectionHandler.cancelSelection('click_outside');\n },\n this\n );\n\n // don't we wait for SELECTION_EVENT.SELECT_PLAN_ELEMENT here?\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT,\n ({ planElementViewModel }) => {\n this.dispatchEvent(\n this.isDragIn()\n ? PLANNER_SCENE_EVENT.ACTIVATE_PLAN_ELEMENT\n : PLANNER_SCENE_EVENT.SELECT_PLAN_ELEMENT,\n new SceneEventInfo({ planElementViewModel })\n );\n },\n this\n );\n\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT_MULTI,\n ({ planElementViewModels }) => {\n this._roomlePlannerUiCallback.onMultiSelectionChange(\n planElementViewModels\n );\n },\n this\n );\n\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.SELECTION_MODE_CHANGED,\n ({ selectionMode }) => {\n if (\n selectionMode === SELECTION_MODE.MULTISELECT &&\n this._hoveredObject\n ) {\n this._hoverOnMultiSelect(this._hoveredObject);\n }\n this._roomlePlannerUiCallback.onSelectionModeChange(selectionMode);\n this._checkRaycasterSnapping();\n },\n this\n );\n\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n ({ planElementViewModel, reason }) => {\n // We skipped setting the state to idle for the drag event because the plan object gets selected automatically after dragging and\n // if there is an old object already selected, we deselect it to select the new dragged object and all this should happen\n // while the drag event is in progress. we set the state to idle inside the _dragEnd\n if (this._state !== PLANNER_SCENE_EVENT_STATE.DRAG) {\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n }\n\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DESELECT_PLAN_ELEMENT,\n new SceneEventInfo({ planElementViewModel, reason })\n );\n },\n this\n );\n\n this._inputManager.addEventListener(\n INPUT_EVENT.MOVE,\n (event: InputEvent) => this._move(event),\n this\n );\n }\n\n public disable() {\n const layers = new Layers();\n layers.disableAll();\n this._raycastHelper.setLayers(layers);\n this._raycastHelper.disableEvents();\n }\n\n get planInteractionHandler(): PlanInteractionHandler {\n return this._plannerKernelAccess?.planInteractionHandler;\n }\n\n get hoveredObjectId() {\n if (this._hoveredObject?.getPlanElement()) {\n return this._hoveredObject.getId();\n }\n return null;\n }\n\n get isCurrentlyDrawing() {\n return this._isCurrentlyDrawing;\n }\n\n public enable() {\n const layers = new Layers();\n layers.disableAll();\n layers.enable(LAYER.OBJECT);\n layers.enable(LAYER.GIZMO);\n layers.enable(LAYER.UI);\n layers.enable(LAYER.CONSTRUCTION);\n layers.enable(LAYER.BACKGROUND);\n this._raycastHelper.setLayers(layers);\n this._raycastHelper.enableEvents();\n }\n\n public enableConstructionEvents(enable: boolean) {\n if (enable) {\n this._raycastHelper.getLayers().enable(LAYER.CONSTRUCTION);\n } else {\n this._raycastHelper.getLayers().disable(LAYER.CONSTRUCTION);\n }\n }\n\n public enableObjectEvents(enable: boolean) {\n if (enable) {\n this._raycastHelper.getLayers().enable(LAYER.UI);\n } else {\n this._raycastHelper.getLayers().disable(LAYER.UI);\n }\n }\n\n public getSelectionMode(): SELECTION_MODE {\n return this._plannerSelectionHandler.getSelectionMode();\n }\n\n public addConstructionPlanObjectHandlers(\n planObjectViewModel: PlanObjectViewModel,\n object?: RoomleEventedObject3D\n ) {\n if (!object) {\n object = planObjectViewModel.getBoundingBox();\n }\n const planObjectEventInfo = {\n planElementName: planObjectViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.CONSTRUCTION,\n roomleId: planObjectViewModel.getId(),\n snapToWall: true,\n } as PlanObjectEventInfo;\n this._addPlanObjectHandlers(\n planObjectViewModel,\n object,\n planObjectEventInfo\n );\n }\n\n public addPlanObjectHandlers(\n planObjectViewModel: PlanObjectViewModel,\n object?: RoomleEventedObject3D\n ) {\n if (!object) {\n object = planObjectViewModel.getBoundingBox();\n }\n const planObjectEventInfo = {\n planElementName: planObjectViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: planObjectViewModel.getId(),\n } as PlanObjectEventInfo;\n this._addPlanObjectHandlers(\n planObjectViewModel,\n object,\n planObjectEventInfo\n );\n }\n\n public addWallHandlers(planElementViewModel: PlanElementViewModel) {\n this._addPlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n ignoreElementHit: true, // enables long press on mobile\n priority: RAYCAST_PRIORITY.WALL,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n public addWallAtticHandlers(planElementViewModel: PlanElementViewModel) {\n this._addPlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.WALL,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n public addMeasurementLineHandlers(\n planElementViewModel: MeasurementLinePlanElementViewModel\n ) {\n const componentEventInfo = {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo;\n\n this._addMeasurementLinePlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getPoint1DraggableBoundingBox(),\n componentEventInfo,\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT1\n );\n\n this._addMeasurementLinePlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getPoint2DraggableBoundingBox(),\n componentEventInfo,\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT2\n );\n\n this._addMeasurementLinePlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n componentEventInfo,\n null\n );\n }\n\n public addFloorHandlers(planElementViewModel: PlanElementViewModel) {\n this._addFloorElementHandlers(\n planElementViewModel,\n planElementViewModel.getObject(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.FLOOR,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n public addNodeHandlers(planElementViewModel: PlanElementViewModel) {\n this._addPlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n ignoreElementHit: true, // enables long press on mobile\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n private _addPlanObjectHandlers(\n planObjectViewModel: PlanObjectViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n if (!object.userData.hasListener) {\n object.userData = deepMerge(object.userData, componentEventInfo);\n object.addEventListener(OBJECT_EVENT.CLICK, () =>\n this._clickElement(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DRAG_START, () =>\n this._dragStart(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DRAG, (event) =>\n this._drag(planObjectViewModel, event.attachment.position)\n );\n object.addEventListener(OBJECT_EVENT.DRAG_END, (event) =>\n this._dragEnd(planObjectViewModel, event.attachment.position)\n );\n object.addEventListener(OBJECT_EVENT.HOVER_ON, () =>\n this._hoverOn(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.HOVER_OFF, () =>\n this._hoverOff(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.ROTATE, (event) =>\n this._rotate(planObjectViewModel, event.attachment.rotation)\n );\n }\n }\n\n private _addFloorElementHandlers(\n planElementViewModel: PlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n this._addElementHandlers(planElementViewModel, object, componentEventInfo);\n }\n\n private _addElementHandlers(\n planElementViewModel: PlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n if (!object.userData.hasListener) {\n object.userData = deepMerge(object.userData, componentEventInfo);\n object.addEventListener(OBJECT_EVENT.CLICK, () =>\n this._clickElement(planElementViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DOUBLE_CLICK, (event) => {\n this._doubleClickElement(\n planElementViewModel,\n (event as any).attachment.type,\n (event as any).attachment.intersection?.point\n );\n });\n object.addEventListener(OBJECT_EVENT.HOVER_ON, () =>\n this._hoverOn(planElementViewModel)\n );\n object.addEventListener(OBJECT_EVENT.HOVER_OFF, () =>\n this._hoverOff(planElementViewModel)\n );\n }\n }\n\n private _addPlanElementHandlers(\n planElementViewModel: PlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n if (!object.userData.hasListener) {\n this._addElementHandlers(\n planElementViewModel,\n object,\n componentEventInfo\n );\n object.addEventListener(OBJECT_EVENT.DRAG_START, () =>\n this._dragStart(planElementViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DRAG, (event) =>\n this._drag(planElementViewModel, event.attachment.position)\n );\n object.addEventListener(OBJECT_EVENT.DRAG_END, (event) =>\n this._dragEnd(planElementViewModel, event.attachment.position)\n );\n }\n }\n\n private _addMeasurementLinePlanElementHandlers(\n planElementViewModel: MeasurementLinePlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo,\n point: MeasurementLineDraggablePoints\n ) {\n if (object.userData.hasListener) {\n return;\n }\n\n object.userData = deepMerge(object.userData, componentEventInfo);\n\n const updateCurrentPoint = () => {\n planElementViewModel.currentPoint = point;\n };\n\n object.addEventListener(OBJECT_EVENT.CLICK, () => {\n this._clickElement(planElementViewModel);\n updateCurrentPoint();\n });\n\n object.addEventListener(OBJECT_EVENT.DRAG_START, () => {\n updateCurrentPoint();\n planElementViewModel.selectPointOnDragStart(planElementViewModel);\n this._dragStart(planElementViewModel);\n });\n\n object.addEventListener(OBJECT_EVENT.DRAG, (event) => {\n updateCurrentPoint();\n planElementViewModel.hideDraggablePointsOnDragStart(\n planElementViewModel,\n point\n );\n this._drag(planElementViewModel, event.attachment.position);\n });\n\n object.addEventListener(OBJECT_EVENT.DRAG_END, (event) => {\n planElementViewModel.showDraggablePointsOnDragEnd(\n planElementViewModel,\n point\n );\n this._dragEnd(planElementViewModel, event.attachment.position);\n planElementViewModel.showDraggableNodes();\n updateCurrentPoint();\n });\n\n object.addEventListener(OBJECT_EVENT.HOVER_ON, () => {\n updateCurrentPoint();\n planElementViewModel.showDraggablePointsOnHoverOn(planElementViewModel);\n this._hoverOn(planElementViewModel);\n });\n\n object.addEventListener(OBJECT_EVENT.HOVER_OFF, () => {\n updateCurrentPoint();\n planElementViewModel.showDraggablePointsOnHoverOff(planElementViewModel);\n this._hoverOff(planElementViewModel);\n });\n }\n\n private _createFloorMeshWithHandler() {\n const geo = new PlaneGeometry(1000, 1000, 8, 8);\n const mat = new MeshBasicMaterial();\n mat.visible = false;\n const plane: RoomleEventedMesh = new Mesh(geo, mat);\n plane.name = '2D raycaster floor mesh';\n plane.rotation.set(-Math.PI / 2, 0, 0);\n plane.layers.enable(LAYER.BACKGROUND);\n plane.userData.ignoreElementHit = true;\n\n const componentEventInfo = {\n planElementName: '2D raycaster floor mesh',\n hasListener: true,\n priority: RAYCAST_PRIORITY.RAYCASTER_FLOOR,\n roomleId: undefined,\n } as PlanObjectEventInfo;\n plane.userData = deepMerge(plane.userData, componentEventInfo);\n plane.addEventListener(OBJECT_EVENT.DOUBLE_CLICK, (event) => {\n this._doubleClickOnPlane(\n convertToKernel(event.attachment.intersection.point),\n event.attachment.type\n );\n });\n plane.addEventListener(OBJECT_EVENT.CLICK, (event) => {\n const clickPoint = convertToKernel(event.attachment.intersection.point);\n if (!this._isCurrentlyDrawing) {\n this._plannerSelectionHandler.cancelSelection('click_outside');\n } else {\n this._clickOnPlane(clickPoint);\n }\n });\n\n return plane;\n }\n\n private _clickOnPlane(point?: KernelVector3) {\n this._createNode(null, point);\n }\n\n private _doubleClickOnPlane(\n point: KernelVector3,\n inputType: INPUT_EVENT_TYPE = INPUT_EVENT_TYPE.UNKNOWN\n ) {\n if (this._isMeasurementLineDrawActive) {\n return;\n }\n if (!this._closeToPoint(point)) {\n this._toggleDrawing(null, point, inputType);\n } else {\n this.stopDrawing();\n }\n }\n\n private _closeToPoint(point: KernelVector3) {\n let closeToPoint = false;\n for (const nodePlanViewModel of this._planViewModel.getNodePlanObjectViewModels()) {\n if (this._close(nodePlanViewModel.getPlanElement().getCenter(), point)) {\n closeToPoint = true;\n }\n }\n return closeToPoint;\n }\n\n private _close(point1: KernelVector3, point2: KernelVector3) {\n const maxDistance = 500;\n return (\n Math.abs(point1.x - point2.x) < maxDistance &&\n Math.abs(point1.y - point2.y) < maxDistance &&\n Math.abs(point1.z - point2.z) < maxDistance\n );\n }\n\n private _clickElement(planElementViewModel: PlanElementViewModel) {\n if (isLockedElement(planElementViewModel, this._initData)) {\n this._plannerSelectionHandler.cancelSelection('click_outside');\n\n return;\n }\n if (this._isCurrentlyDrawing) {\n return;\n }\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.handleDraggablePointsSelection(planElementViewModel);\n }\n if (this._debug) {\n console.log('select', planElementViewModel.getId());\n }\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.resetState();\n return;\n }\n this._plannerSelectionHandler.check(planElementViewModel);\n this._roomlePlannerUiCallback.onClickElement(planElementViewModel);\n this._setCursor();\n }\n\n private _doubleClickElement(\n planElementViewModel: PlanElementViewModel,\n inputType: INPUT_EVENT_TYPE = INPUT_EVENT_TYPE.UNKNOWN,\n intersectionPoint: Vector3\n ) {\n if (\n !this._isDrawingEnabled ||\n (!(planElementViewModel instanceof NodePlanElementViewModel) &&\n !(planElementViewModel instanceof WallPlanElementViewModel))\n ) {\n return;\n }\n if (this._debug) {\n console.log('double click', planElementViewModel.getId());\n }\n\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n this._plannerSelectionHandler.cancelSelection('double_click_wall');\n }\n\n let kernelPosition;\n if (planElementViewModel instanceof NodePlanElementViewModel) {\n kernelPosition = planElementViewModel.getPlanElement().getCenter();\n } else if (intersectionPoint) {\n kernelPosition = convertToKernel(\n new Vector3(intersectionPoint.x, 0, intersectionPoint.z)\n );\n }\n\n if (this._isCurrentlyDrawing) {\n this.endWallDrawing(null, kernelPosition);\n } else {\n this._startWallDrawing(null, kernelPosition, inputType);\n }\n }\n\n private _hoverOn(planElementViewModel: PlanElementViewModel) {\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.showDraggablePointsOnHoverOn(planElementViewModel);\n }\n if (this._isCurrentlyDrawing) {\n return;\n }\n if (\n this._plannerSelectionHandler.getSelectionMode() ===\n SELECTION_MODE.MULTISELECT\n ) {\n this._hoverOnMultiSelect(planElementViewModel);\n } else {\n this._hoverOnStandard(planElementViewModel);\n }\n }\n\n private _hoverOnMultiSelect(planElementViewModel: PlanElementViewModel) {\n if (\n isWallOrFloor(this._hoveredObject) ||\n isWallOrFloor(planElementViewModel)\n ) {\n this._hoveredObject = null;\n setCursor(CURSOR_STYLE.DEFAULT);\n } else {\n this._hoverOnStandard(planElementViewModel);\n }\n }\n\n private _hoverOnStandard(planElementViewModel: PlanElementViewModel) {\n planElementViewModel.hoverOn();\n this._hoveredObject = planElementViewModel;\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.HOVER_ON,\n new SceneEventInfo({ planElementViewModel })\n );\n this._interaction();\n this._setCursor();\n }\n\n private _hoverOff(planElementViewModel: PlanElementViewModel) {\n planElementViewModel.hoverOff();\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.showDraggablePointsOnHoverOff(planElementViewModel);\n }\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.HOVER_OFF,\n new SceneEventInfo({ planElementViewModel })\n );\n this._interaction();\n this._hoveredObject = null;\n this._setCursor();\n }\n\n private _isHoveredObjectNonDraggable() {\n return this._hoveredObject instanceof FloorPlanElementViewModel;\n }\n\n private _setCursor() {\n if (this._state === PLANNER_SCENE_EVENT_STATE.MEASURE) {\n setCursor(CURSOR_STYLE.NODE_HOVER);\n } else if (\n this._state === PLANNER_SCENE_EVENT_STATE.ROTATE &&\n this.hasSelection()\n ) {\n setCursor(CURSOR_STYLE.ROTATE);\n } else if (this._state === PLANNER_SCENE_EVENT_STATE.DRAG) {\n setCursor(CURSOR_STYLE.DRAGGING);\n } else if (\n !this._isHoveredObjectNonDraggable &&\n this._plannerSelectionHandler.isSelected(this.hoveredObjectId)\n ) {\n setCursor(CURSOR_STYLE.MOVE);\n } else if (this._hoveredObject) {\n if (isLockedElement(this._hoveredObject, this._initData)) {\n setCursor(CURSOR_STYLE.DEFAULT);\n } else {\n setCursor(CURSOR_STYLE.HOVER);\n }\n } else if (this._state === PLANNER_SCENE_EVENT_STATE.DRAW) {\n if (isSafari) {\n setCursor(CURSOR_STYLE.DRAW_FALLBACK);\n } else {\n setCursor(CURSOR_STYLE.DRAW);\n }\n } else {\n setCursor(CURSOR_STYLE.DEFAULT);\n }\n }\n\n public setCamera(camera: Camera) {\n this._raycastHelper.setCamera(camera);\n }\n\n public setObject(object: Object3D) {\n this._raycastHelper.setObject(object);\n }\n\n public getSelectedIds(): number[] {\n return this._plannerSelectionHandler.getSelectedIds();\n }\n\n public setSelectionMode(selectionMode: SELECTION_MODE) {\n this._plannerSelectionHandler.setSelectionMode(selectionMode);\n if (selectionMode === SELECTION_MODE.MULTISELECT) {\n this._roomlePlannerUiCallback.onMultiSelectionChange(\n this._plannerSelectionHandler.getSelectedPlanElementViewModels()\n );\n }\n }\n\n public setPlanViewModel(planViewModel: PlanViewModel) {\n this._planViewModel = planViewModel;\n }\n\n public cancelSelection(reason: CancelSelectionReasons) {\n if (this.isDragIn() && reason === 'dock_component') {\n // we do not want to cancel the selection if we drag and build up a new item\n return;\n }\n this._plannerSelectionHandler.cancelSelection(reason);\n }\n\n public removeSelection() {\n this._plannerSelectionHandler.removeSelection();\n }\n\n private _dragStart(planElementViewModel: PlanElementViewModel) {\n if (this._isMeasurementLineDrawActive) {\n return;\n }\n if (\n ((!this._plannerSelectionHandler.isSelected(\n planElementViewModel.getId()\n ) &&\n !this._dragIn) ||\n this._state !== PLANNER_SCENE_EVENT_STATE.IDLE) &&\n !this._isDrawingEnabled\n ) {\n return;\n }\n this.dispatchEvent(PLANNER_SCENE_EVENT.BEFORE_DRAG_START);\n wait(INPUT_DELAY_TYPE.DRAG).then(() => {\n if (this._inputManager.isMouseUp()) {\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n setCursor(CURSOR_STYLE.HOVER);\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAG_CANCEL);\n return;\n }\n\n this._draggedObject = planElementViewModel;\n this.setState(PLANNER_SCENE_EVENT_STATE.DRAG);\n this._roomlePlannerUiCallback.onDragElementStart(\n planElementViewModel.getId()\n );\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DRAG_START,\n new SceneEventInfo({ planElementViewModel })\n );\n });\n }\n\n private _drag(planElementViewModel: PlanElementViewModel, position: Vector3) {\n if (\n !this._draggedObject ||\n this._state !== PLANNER_SCENE_EVENT_STATE.DRAG\n ) {\n return;\n }\n\n const planInteractionHandler = this.planInteractionHandler;\n if (!this._lastDragPosition) {\n this._lastDragPosition = position;\n }\n let distance = position.clone().sub(this._lastDragPosition);\n\n if (this._plannerSelectionHandler.getSelectedIds().length > 1) {\n const planObjectPtrList: KernelObjectPtrList =\n new this._plannerKernelAccess.kernelContainer.PlanObjectPtrList();\n this._plannerSelectionHandler\n .getSelectedIds()\n .forEach((id) =>\n planObjectPtrList.push_back(\n this._planViewModel.getPlanObjectForId(id).getPlanElement()\n )\n );\n const vector3 = convertToKernel(distance);\n // Fix z position so multiple selected items don't climb walls on move.\n if (this._plannerSelectionHandler.hasMultiSelection()) {\n vector3.z = 0;\n }\n planInteractionHandler.moveObjectsBy(planObjectPtrList, vector3);\n\n this._lastDragPosition.copy(position);\n } else if (\n planElementViewModel instanceof MeasurementLinePlanElementViewModel\n ) {\n this._dragMeasurementLine(planElementViewModel, position);\n } else {\n const isWallOrNode =\n planElementViewModel instanceof NodePlanElementViewModel ||\n planElementViewModel instanceof WallPlanElementViewModel;\n const planElement = planElementViewModel.getPlanElement(); \n const is2d = this._planViewModel.cameraType === CAMERA_TYPE.CAMERA_2D;\n if ((is2d && !this._dragIn) || isWallOrNode) {\n const currentPosition = convertToTHREE(\n planElement.getCenter()\n );\n const vector3 = convertToKernel(\n position.clone().sub(currentPosition)\n );\n vector3.z = 0;\n planInteractionHandler.moveElementBy(\n planElement,\n vector3\n );\n } else {\n planInteractionHandler.moveElementTo(\n planElement,\n convertToKernel(position)\n );\n }\n }\n\n this._lastDragPosition.copy(position);\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DRAG_MOVE,\n new SceneEventInfo({ planElementViewModel })\n );\n }\n\n private _dragEnd(\n planElementViewModel: PlanElementViewModel,\n _position: Position2\n ) {\n if (!this._draggedObject) {\n return;\n }\n this._draggedObject = null;\n this._lastDragPosition = null;\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DRAG_END,\n new SceneEventInfo({ planElementViewModel })\n );\n if (this._dragIn) {\n this.setDragIn(false);\n }\n this._roomlePlannerUiCallback.onDragElementEnd();\n this._setCursor();\n }\n\n private _rotate(\n planElementViewModel: PlanElementViewModel,\n rotation: number\n ) {\n if (\n this._plannerSelectionHandler.isSelected(planElementViewModel.getId())\n ) {\n const planInteractionHandler = this.planInteractionHandler;\n const planObject = (\n planElementViewModel as PlanObjectViewModel\n ).getPlanObject();\n planInteractionHandler.setObjectRotation(\n planElementViewModel.getPlanElement(),\n planObject.rotation - rotation\n );\n }\n }\n\n public setState(state: PLANNER_SCENE_EVENT_STATE) {\n const oldState = this._state;\n this._state = state;\n this._setCursor();\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.STATE_CHANGED,\n new SceneEventInfo({ state: this._state, oldState })\n );\n this._position = null;\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.planInteractionHandler?.deactivateAllSnappingActivity();\n } else if (oldState === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.planInteractionHandler?.reactivateAllSnappingActivity();\n }\n }\n\n public resetState() {\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n }\n\n private _move(event: InputEvent) {\n if (\n this._state === PLANNER_SCENE_EVENT_STATE.DRAW ||\n this._state === PLANNER_SCENE_EVENT_STATE.MEASURE\n ) {\n return;\n }\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n if (this.hasSelection()) {\n this._setCursor();\n let delta = Math.PI / 180;\n const { x, y } = event.positionRelative;\n if (this._position) {\n // rotate 1.4 * 180 degree to the left and right to enable a full rotation if 30% of screen are hidden be menus\n delta =\n event.positionRelative.x * 1.4 * Math.PI -\n this._position.x * 1.4 * Math.PI;\n } else {\n this._position = new Vector3(\n event.positionRelative.x,\n event.positionRelative.y,\n 0\n );\n }\n const list =\n new this._plannerKernelAccess.kernelContainer.PlanObjectPtrList();\n const bounds = new Box3();\n this.getSelectedIds().forEach((id) => {\n const planObjectViewModel =\n this._planViewModel?.getPlanObjectForId(id);\n if (planObjectViewModel && planObjectViewModel.getObject()) {\n list.push_back(planObjectViewModel.getPlanElement());\n bounds.expandByObject(planObjectViewModel.getContainer());\n }\n });\n const center = bounds.getCenter(new Vector3());\n const planInteractionHandler = this.planInteractionHandler;\n planInteractionHandler.rotateObjectsBy(\n list,\n delta,\n convertToKernel(center)\n );\n this._position.copy(new Vector3(x, y, 0));\n }\n }\n }\n\n public hasSelection() {\n return this._plannerSelectionHandler.getSelectedIds().length > 0;\n }\n\n public async selectPlanElement(planElement: PlanElementViewModel) {\n if (\n planElement instanceof ConfiguratorPlanObjectViewModel ||\n planElement instanceof StaticPlanObjectViewModel\n ) {\n await planElement.isInitDone();\n }\n this._plannerSelectionHandler.check(planElement);\n }\n\n protected _interaction(_forceRender?: boolean) {\n this.dispatchEvent(PLANNER_SCENE_EVENT.INTERACTION, new SceneEventInfo({}));\n }\n\n public addComponentDragInHandler(planViewModel: PlanElementViewModel) {\n if (!this._dragIn) {\n return;\n }\n const boundingBox = planViewModel.getBoundingBox();\n\n const snapToWall =\n planViewModel instanceof ConstructionPlanObjectViewModel ||\n planViewModel instanceof ConfigurableConstructionPlanObjectViewModel;\n this._addPlanElementHandlers(planViewModel, boundingBox, {\n planElementName: planViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: planViewModel.getId(),\n snapToWall,\n } as PlanObjectEventInfo);\n this._raycastHelper.enableDragIn(boundingBox);\n this._dragStart(planViewModel);\n }\n\n public enableSnapping() {\n this.planInteractionHandler.enableSnap = true;\n this._checkRaycasterSnapping();\n }\n\n public disableSnapping() {\n this.planInteractionHandler.enableSnap = false;\n this._checkRaycasterSnapping();\n }\n\n public enableAdvancedDocking() {\n this.planInteractionHandler.dockWhenSnap = true;\n }\n\n public disableAdvancedDocking() {\n this.planInteractionHandler.dockWhenSnap = false;\n }\n\n public showsChildrenOfPlanObject(object: KernelObject): boolean {\n return (\n this.planInteractionHandler.getShowChildrenOfPlanObject(object).value !==\n CORE_CHILD_ENTITY_MODE.OFF\n );\n }\n\n public enableShowChildrenOfPlanObject(object: KernelObject) {\n this.planInteractionHandler.setShowChildrenOfPlanObject(\n object,\n {\n value: CORE_CHILD_ENTITY_MODE.GROUND_COMPONENTS,\n },\n false\n );\n }\n\n public disableShowChildrenOfPlanObject(object: KernelObject) {\n this.planInteractionHandler.setShowChildrenOfPlanObject(\n object,\n {\n value: CORE_CHILD_ENTITY_MODE.OFF,\n },\n false\n );\n }\n\n private _checkRaycasterSnapping() {\n const snappingEnabled = this.planInteractionHandler.enableSnap;\n const isMultiselect =\n this.getSelectionMode() === SELECTION_MODE.MULTISELECT;\n\n if (snappingEnabled && !isMultiselect) {\n this._raycastHelper.enableOnWallSnapping();\n } else {\n this._raycastHelper.disableOnWallSnapping();\n }\n }\n\n public enableWallDrawing(): Group {\n this._isDrawingEnabled = true;\n this._drawingGroup = new Group();\n this._drawingGroup.name = 'Drawing';\n this._drawingGroup.add(this._createFloorMeshWithHandler());\n this._inputManager.addEventListener(\n INPUT_EVENT.MOVE,\n this._drawWallOnMouseMove,\n this\n );\n this._inputManager.addEventListener(\n INPUT_EVENT.TOUCH_END,\n this.endWallDrawing,\n this\n );\n\n return this._drawingGroup;\n }\n\n public cancelWallDrawing(): Group {\n this._isDrawingEnabled = false;\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.IDLE);\n this._inputManager.removeEventListener(\n INPUT_EVENT.MOVE,\n this._drawWallOnMouseMove\n );\n this._inputManager.removeEventListener(\n INPUT_EVENT.TOUCH_END,\n this.endWallDrawing\n );\n\n this._raycastHelper.clear();\n\n return this._drawingGroup;\n }\n\n public stopDrawing(cancelDrawing: boolean = true) {\n this.planInteractionHandler.endInteraction();\n if (cancelDrawing) {\n this.planInteractionHandler.cancelDrawing();\n }\n this._raycastHelper.getLayers().enable(LAYER.CONSTRUCTION);\n this._isCurrentlyDrawing = false;\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.IDLE);\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAWING_END);\n this._continuousDrawingHelper?.endDrawing();\n this._roomlePlannerUiCallback.onDrawingStateChanged(false);\n }\n\n public startDrawing() {\n if (this._isCurrentlyDrawing) {\n return;\n }\n this._isCurrentlyDrawing = true;\n this._raycastHelper.getLayers().disable(LAYER.CONSTRUCTION);\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAWING_START);\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.DRAW);\n this._continuousDrawingHelper?.update();\n this._roomlePlannerUiCallback.onDrawingStateChanged(true);\n }\n\n private _toggleDrawing(\n event: InputEvent,\n point?: KernelVector3,\n inputType?: INPUT_EVENT_TYPE\n ) {\n if (this._isCurrentlyDrawing) {\n this.endWallDrawing(event, point);\n } else {\n this._startWallDrawing(event, point, inputType);\n }\n }\n\n public endWallDrawing(event: InputEvent | null, point?: KernelVector3) {\n if (this._isCurrentlyDrawing) {\n if (\n this.planInteractionHandler\n .getContinuousDrawingManager()\n .shouldShowCircle() &&\n this.planInteractionHandler\n .getContinuousDrawingManager()\n .shouldShowCircle()\n ) {\n this.planInteractionHandler.cancelDrawing();\n } else {\n const { x, y } = point\n ? point\n : this._getIntersectionPointWithScene(event);\n this.planInteractionHandler.endDrawing({ x, y, z: 0 });\n }\n this.stopDrawing(false);\n }\n }\n\n private async _startWallDrawing(\n event: InputEvent | null,\n point?: KernelVector3,\n inputType?: INPUT_EVENT_TYPE\n ) {\n if (\n (event && event.type === INPUT_EVENT_TYPE.TOUCH) ||\n inputType === INPUT_EVENT_TYPE.TOUCH\n ) {\n await this._initMobileDrawing();\n this._continuousDrawingHelper.update();\n }\n this.planInteractionHandler.startInteraction();\n\n const { x, y } = point ? point : this._getIntersectionPointWithScene(event);\n const vectorDrawPreviewMode =\n this._initData?.featureFlags?.drawPreviewMode ===\n DRAW_PREVIEW_MODES.VECTOR;\n this.planInteractionHandler.beginDrawing(\n { x, y, z: 0 },\n vectorDrawPreviewMode\n );\n this.startDrawing();\n }\n\n private async _initMobileDrawing() {\n this.planInteractionHandler.setDrawingType(DrawingType.CONTINOUS);\n this.planInteractionHandler.setSnapFeedbackWhileDrawing(true);\n\n if (!this._continuousDrawingHelper) {\n const { default: ContinuousDrawingHelperClass } = await import(\n './continuous-drawing-helper'\n );\n this._continuousDrawingHelper = new ContinuousDrawingHelperClass();\n this._continuousDrawingHelper.init(\n this._drawingGroup,\n this.planInteractionHandler.getContinuousDrawingManager(),\n this._kernelZoomFactor\n );\n }\n }\n\n private _drawWallOnMouseMove(event: InputEvent) {\n if (!this._isCurrentlyDrawing || this._isMeasurementLineDrawActive) {\n return;\n }\n const { x, y } = this._getIntersectionPointWithScene(event);\n\n this.planInteractionHandler.currentDrawingPosition({ x, y, z: 0 });\n\n this._continuousDrawingHelper?.update();\n\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAW);\n }\n\n private _createNode(event: InputEvent, point?: KernelVector3) {\n if (!this._isCurrentlyDrawing) {\n return;\n }\n\n const { x, y } = point ? point : this._getIntersectionPointWithScene(event);\n this.planInteractionHandler.forceNode({ x, y, z: 0 });\n this._raycastHelper.clear();\n }\n\n private _getIntersectionPointWithScene(event: InputEvent): KernelVector3 {\n return this._raycastHelper.intersectMouseOnScene(event);\n }\n\n private _setStateAndCursor(state: PLANNER_SCENE_EVENT_STATE) {\n this.setState(state);\n this._setCursor();\n }\n\n public setKernelZoomFactor(kernelZoomFactor: number) {\n this._kernelZoomFactor = kernelZoomFactor;\n this._continuousDrawingHelper?.setKernelZoomFactor(kernelZoomFactor);\n }\n\n public enableMeasurementLineDrawing(): void {\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.MEASURE);\n this._isMeasurementLineDrawActive = true;\n this._enableDrawingListeners();\n }\n\n public disableMeasurementLineDrawing(): void {\n this._disableDrawingListeners();\n this.dispatchEvent(PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_END);\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n this._isMeasurementLineDrawActive = false;\n this._currentPlanMeasure = null;\n }\n\n private _handleMeasurementLineDrawingEvent(\n eventNumber: Values<keyof INPUT_EVENT>\n ) {\n if (eventNumber === INPUT_EVENT.MOVE) {\n return this._drawMeasurementLineOnMouseMove;\n } else if (\n eventNumber === INPUT_EVENT.CLICK ||\n eventNumber === INPUT_EVENT.LONG_TOUCH ||\n eventNumber === INPUT_EVENT.TOUCH_END\n ) {\n return this._createPlanMeasure;\n }\n return null;\n }\n\n private _enableDrawingListeners() {\n const events = [\n INPUT_EVENT.CLICK,\n INPUT_EVENT.MOVE,\n INPUT_EVENT.LONG_TOUCH,\n INPUT_EVENT.TOUCH_END,\n ];\n events.forEach((eventType) => {\n this._inputManager.addEventListener(\n eventType,\n this._handleMeasurementLineDrawingEvent(eventType),\n this\n );\n });\n }\n\n private _disableDrawingListeners() {\n const events = [\n INPUT_EVENT.CLICK,\n INPUT_EVENT.MOVE,\n INPUT_EVENT.LONG_TOUCH,\n INPUT_EVENT.TOUCH_END,\n ];\n events.forEach((eventType) => {\n this._inputManager.removeEventListener(\n eventType,\n this._handleMeasurementLineDrawingEvent(eventType)\n );\n });\n }\n\n private _drawMeasurementLineOnMouseMove(event: InputEvent) {\n if (!this._currentPlanMeasure) {\n return;\n }\n if (this._state !== PLANNER_SCENE_EVENT_STATE.MEASURE) {\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.MEASURE);\n }\n const { x, y } = this._getIntersectionPointWithScene(event);\n this.planInteractionHandler.setMeasurePoint2(\n this._currentPlanMeasure,\n {\n x,\n y,\n z: 0,\n },\n true,\n true\n );\n }\n\n private _updateMeasurementLineViewModels(\n action: 'hide_dragged_node' | 'showDraggableNodes'\n ) {\n if (action === 'hide_dragged_node') {\n this._planViewModel\n .getMeasurementLineObjectViewModels()\n .forEach((viewModel) => {\n if (this._currentPlanMeasure.getId() === viewModel.getId()) {\n viewModel.hidePoint2DraggableNode();\n }\n });\n } else if (action === 'showDraggableNodes') {\n this._planViewModel\n .getMeasurementLineObjectViewModels()\n .forEach((viewModel) => {\n if (this._currentPlanMeasure.getId() === viewModel.getId()) {\n viewModel.showDraggableNodes();\n viewModel.showDraggablePointsOnDragEnd(viewModel, 'point2');\n }\n });\n }\n }\n\n private _createPlanMeasure(event: InputEvent) {\n const { x, y } = this._getIntersectionPointWithScene(event);\n const position = { x, y, z: 0 };\n\n if (!this._currentPlanMeasure) {\n this.dispatchEvent(PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_START);\n this._currentPlanMeasure = this.planInteractionHandler.addMeasure(\n position,\n position\n );\n this._updateMeasurementLineViewModels('hide_dragged_node');\n return;\n }\n\n this.planInteractionHandler.setMeasurePoint2(\n this._currentPlanMeasure,\n position,\n true,\n true\n );\n\n this._updateMeasurementLineViewModels('showDraggableNodes');\n this.disableMeasurementLineDrawing();\n }\n\n private _dragMeasurementLine(\n planElementViewModel: MeasurementLinePlanElementViewModel,\n newPosition: Vector3\n ) {\n const planMeasure = planElementViewModel.getPlanElement() as PlanMeasure;\n\n if (!planElementViewModel.currentPoint) {\n if (!this._lastDragPosition) {\n this._lastDragPosition = newPosition.clone();\n return;\n }\n\n const distance = newPosition.clone().sub(this._lastDragPosition);\n const currentCenter = convertToTHREE(planMeasure.getCenter());\n const newCenter = currentCenter.add(distance);\n\n this.planInteractionHandler.moveElementTo(\n planMeasure,\n convertToKernel(newCenter)\n );\n\n this._lastDragPosition.copy(newPosition);\n planElementViewModel.update();\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAG_MEASUREMENT_LINE);\n return;\n }\n\n if (\n planElementViewModel.currentPoint ===\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT1\n ) {\n this.planInteractionHandler.setMeasurePoint1(\n planMeasure,\n convertToKernel(newPosition),\n true,\n true\n );\n }\n\n if (\n planElementViewModel.currentPoint ===\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT2\n ) {\n this.planInteractionHandler.setMeasurePoint2(\n planMeasure,\n convertToKernel(newPosition),\n true,\n true\n );\n }\n }\n\n public setMeasurementLineLength(\n measurementLine: MeasurementLinePlanElementViewModel,\n targetLengthMM: number,\n direction: string\n ) {\n if (!measurementLine) {\n console.error('Measurement line not found');\n return;\n }\n\n const targetLengthUnits = targetLengthMM / 1000;\n\n const isLeftDirection = direction.toLowerCase() === 'left';\n const basePoint = isLeftDirection\n ? measurementLine.getPoint2Draggable().position.clone()\n : measurementLine.getPoint1Draggable().position.clone();\n const directionVector = new Vector3()\n .subVectors(\n measurementLine.getPoint2Draggable().position,\n measurementLine.getPoint1Draggable().position\n )\n .normalize();\n const scaledDirectionVector =\n directionVector.multiplyScalar(targetLengthUnits);\n\n const newPoint = isLeftDirection\n ? basePoint.sub(scaledDirectionVector)\n : basePoint.add(scaledDirectionVector);\n\n if (isLeftDirection) {\n this.planInteractionHandler.setMeasurePoint1(\n measurementLine.getPlanElement() as PlanMeasure,\n convertToKernel(newPoint),\n false,\n false\n );\n } else {\n this.planInteractionHandler.setMeasurePoint2(\n measurementLine.getPlanElement() as PlanMeasure,\n convertToKernel(newPoint),\n false,\n false\n );\n }\n }\n}\n","import {\n getScreenXY,\n threeVectorToTransferableXY,\n} from '../../../common-core/src/utils/threejs-utils';\nimport type PplanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport type { PlanObjectPosition } from '../../../typings/planner';\nimport type { Camera } from 'three';\nimport { Box3, Vector3 } from 'three';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport FloorPlanElementViewModel from '../view-model/floor-plan-element-view-model';\nimport MeasurementLinePlanElementViewModel from '../view-model/measurement-line-plan-element-view-model';\nimport WallAtticPlanElementViewModel from '../view-model/wall-attic-plan-element-view-model';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\n\nexport const createTransferableObjectPosition = (\n planViewModel: PplanObjectViewModel | PlanElementViewModel,\n camera: Camera,\n clientWidth: number,\n clientHeight: number\n): PlanObjectPosition => {\n const bounds = new Box3().setFromObject(planViewModel.getContainer());\n const center = bounds.getCenter(new Vector3());\n return {\n runtimeIds: [planViewModel.getId()],\n position2d: threeVectorToTransferableXY(\n getScreenXY(center, camera, clientWidth, clientHeight)\n ),\n };\n};\n\nexport type CallbackObjectType =\n | 'static'\n | 'configuration'\n | 'wall'\n | 'measure'\n | 'attic'\n | 'door'\n | 'floor'\n | 'window'\n | 'unknown'\n | 'external-configuration';\n\nexport const getCallbackObjectType = (\n planElementViewModel: PlanElementViewModel\n): CallbackObjectType => {\n if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n const objectType = planElementViewModel\n .getPlanObject()\n .getObjectType() as CallbackObjectType;\n if (objectType !== 'door' && objectType !== 'window') {\n return 'static';\n } else {\n return objectType;\n }\n }\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n return 'configuration';\n }\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n return 'wall';\n }\n if (planElementViewModel instanceof FloorPlanElementViewModel) {\n return 'floor';\n }\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n return 'measure';\n }\n if (planElementViewModel instanceof WallAtticPlanElementViewModel) {\n return 'attic';\n }\n return 'unknown';\n};\n\nexport const addDemoLights = (\n planObjectViewModel: StaticPlanObjectViewModel,\n planViewModel: PlanViewModel,\n active: boolean\n) => {\n const rapiItem = planObjectViewModel.getRapiItem?.();\n if (\n rapiItem &&\n (rapiItem.detailType === 'lamp_ceiling' ||\n rapiItem.detailType === 'lamp_standing')\n ) {\n if (rapiItem?.id === 'brands_15:flos_aim') {\n const targetPos = {\n x: -0.45,\n y: -0.37,\n z: 0.35,\n };\n const lightPos = {\n x: 0.38,\n y: 0.31,\n z: -0.17,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n { targetPos, lightPos, active }\n );\n } else if (rapiItem?.id === 'brands_26:diesel_with_foscarini_fork') {\n const targetPos = {\n x: 0,\n y: -0.56,\n z: -0.49,\n };\n const lightPos = {\n x: 0.01,\n y: 1.62,\n z: 0,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n targetPos,\n lightPos,\n color: 0xffdfbb,\n decay: 0,\n active,\n }\n );\n }\n }\n\n if (rapiItem?.id === 'brands_26:diesel_with_foscarini_duii') {\n const targetPos = {\n x: -1.4,\n y: -0.74,\n z: -0.07,\n };\n const lightPos = {\n x: 0.07,\n y: 0.59,\n z: 0,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n targetPos,\n lightPos,\n color: 0xffffff,\n decay: 2,\n active,\n }\n );\n }\n\n if (rapiItem?.id === 'ba6d0d48:lights-kitchen') {\n const dimensions = {\n width: 2.45,\n height: 0.03,\n };\n const lightPos = {\n x: 0,\n y: 1.571,\n z: -1.05,\n };\n planViewModel.handleRectLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n dimensions,\n lightPos,\n color: 0xffffff,\n active,\n }\n );\n\n // Second one\n const dimensions2 = {\n width: 0.03,\n height: 2.17,\n };\n\n const lightPos2 = {\n x: 1.195,\n y: 1.033,\n z: 0,\n };\n\n planViewModel.handleRectLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n dimensions: dimensions2,\n lightPos: lightPos2,\n color: 0xffffff,\n active,\n }\n );\n }\n\n if (\n // @ts-ignore -- it works\n planObjectViewModel.getRapiItem?.()?.id ===\n 'roomle_white_furniture:Lighting_Pendant_lamp_02'\n ) {\n const targetPos = {\n x: 0,\n y: -99,\n z: 0,\n };\n const lightPos = {\n x: 0,\n y: 0.15,\n z: 0,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n targetPos,\n lightPos,\n color: 0xfaefcf,\n decay: 1,\n intensity: 1,\n active,\n }\n );\n }\n};\n","import {\n\tBackSide,\n\tBoxGeometry,\n\tMesh,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector3\n} from 'three';\n\n/**\n * Based on \"A Practical Analytic Model for Daylight\"\n * aka The Preetham Model, the de facto standard analytic skydome model\n * https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight\n *\n * First implemented by Simon Wallner\n * http://simonwallner.at/project/atmospheric-scattering/\n *\n * Improved by Martin Upitis\n * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n *\n * Three.js integration by zz85 http://twitter.com/blurspline\n*/\n\nclass Sky extends Mesh {\n\n\tconstructor() {\n\n\t\tconst shader = Sky.SkyShader;\n\n\t\tconst material = new ShaderMaterial( {\n\t\t\tname: shader.name,\n\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\tsuper( new BoxGeometry( 1, 1, 1 ), material );\n\n\t\tthis.isSky = true;\n\n\t}\n\n}\n\nSky.SkyShader = {\n\n\tname: 'SkyShader',\n\n\tuniforms: {\n\t\t'turbidity': { value: 2 },\n\t\t'rayleigh': { value: 1 },\n\t\t'mieCoefficient': { value: 0.005 },\n\t\t'mieDirectionalG': { value: 0.8 },\n\t\t'sunPosition': { value: new Vector3() },\n\t\t'up': { value: new Vector3( 0, 1, 0 ) }\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tuniform vec3 sunPosition;\n\t\tuniform float rayleigh;\n\t\tuniform float turbidity;\n\t\tuniform float mieCoefficient;\n\t\tuniform vec3 up;\n\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float e = 2.71828182845904523536028747135266249775724709369995957;\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\t// wavelength of used primaries, according to preetham\n\t\tconst vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n\t\t// this pre-calculation replaces older TotalRayleigh(vec3 lambda) function:\n\t\t// (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n\t\tconst vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n\t\t// mie stuff\n\t\t// K coefficient for the primaries\n\t\tconst float v = 4.0;\n\t\tconst vec3 K = vec3( 0.686, 0.678, 0.666 );\n\t\t// MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n\t\tconst vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n\t\t// earth shadow hack\n\t\t// cutoffAngle = pi / 1.95;\n\t\tconst float cutoffAngle = 1.6110731556870734;\n\t\tconst float steepness = 1.5;\n\t\tconst float EE = 1000.0;\n\n\t\tfloat sunIntensity( float zenithAngleCos ) {\n\t\t\tzenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n\t\t\treturn EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n\t\t}\n\n\t\tvec3 totalMie( float T ) {\n\t\t\tfloat c = ( 0.2 * T ) * 10E-18;\n\t\t\treturn 0.434 * c * MieConst;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n\t\t\tvSunDirection = normalize( sunPosition );\n\n\t\t\tvSunE = sunIntensity( dot( vSunDirection, up ) );\n\n\t\t\tvSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n\t\t\tfloat rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n\t\t\t// extinction (absorption + out scattering)\n\t\t\t// rayleigh coefficients\n\t\t\tvBetaR = totalRayleigh * rayleighCoefficient;\n\n\t\t\t// mie coefficients\n\t\t\tvBetaM = totalMie( turbidity ) * mieCoefficient;\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tuniform float mieDirectionalG;\n\t\tuniform vec3 up;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\tconst float n = 1.0003; // refractive index of air\n\t\tconst float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)\n\n\t\t// optical length at zenith for molecules\n\t\tconst float rayleighZenithLength = 8.4E3;\n\t\tconst float mieZenithLength = 1.25E3;\n\t\t// 66 arc seconds -> degrees, and the cosine of that\n\t\tconst float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n\t\t// 3.0 / ( 16.0 * pi )\n\t\tconst float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n\t\t// 1.0 / ( 4.0 * pi )\n\t\tconst float ONE_OVER_FOURPI = 0.07957747154594767;\n\n\t\tfloat rayleighPhase( float cosTheta ) {\n\t\t\treturn THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n\t\t}\n\n\t\tfloat hgPhase( float cosTheta, float g ) {\n\t\t\tfloat g2 = pow( g, 2.0 );\n\t\t\tfloat inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n\t\t\treturn ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec3 direction = normalize( vWorldPosition - cameraPosition );\n\n\t\t\t// optical length\n\t\t\t// cutoff angle at 90 to avoid singularity in next formula.\n\t\t\tfloat zenithAngle = acos( max( 0.0, dot( up, direction ) ) );\n\t\t\tfloat inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n\t\t\tfloat sR = rayleighZenithLength * inverse;\n\t\t\tfloat sM = mieZenithLength * inverse;\n\n\t\t\t// combined extinction factor\n\t\t\tvec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n\t\t\t// in scattering\n\t\t\tfloat cosTheta = dot( direction, vSunDirection );\n\n\t\t\tfloat rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n\t\t\tvec3 betaRTheta = vBetaR * rPhase;\n\n\t\t\tfloat mPhase = hgPhase( cosTheta, mieDirectionalG );\n\t\t\tvec3 betaMTheta = vBetaM * mPhase;\n\n\t\t\tvec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n\t\t\tLin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n\t\t\t// nightsky\n\t\t\tfloat theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]\n\t\t\tfloat phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]\n\t\t\tvec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n\t\t\tvec3 L0 = vec3( 0.1 ) * Fex;\n\n\t\t\t// composition + solar disc\n\t\t\tfloat sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n\t\t\tL0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n\t\t\tvec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n\t\t\tvec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n\t\t\tgl_FragColor = vec4( retColor, 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\nexport { Sky };\n","import { convertCObject } from '../../../common-core/src/utils/kernel-utils';\nimport { CONFIGURATION_TYPE, type UiPlanObject } from '../../../typings/kernel';\nimport type { RapiComponent, RapiId } from '../../../typings/rapi-types';\nimport type PlannerKernelAccess from '../services/planner-kernel-access';\nimport type RapiAccess from '../../../common-core/src/rapi-access';\nimport type { ExtObjId } from '../../../typings/external-objects';\nimport { createExtObjId } from '../../../common-core/src/utils/external-objects';\n\nconst getIds = async (\n planObjects: any,\n plannerKernelAccess: PlannerKernelAccess,\n): Promise<{\n objects: UiPlanObject[];\n itemIds: string[];\n configurationIds: string[];\n externalConfigurationData: Array<[ExtObjId, Record<string, any>]>;\n}> => {\n const objects: UiPlanObject[] = [];\n const itemIds: RapiId[] = [];\n const configurationIds: RapiId[] = [];\n const externalConfigurationData: Array<[ExtObjId, Record<string, any>]> = [];\n await Promise.all(\n planObjects.map(async (planObject: any) => {\n if (\n planObject.configurationRuntimeId &&\n plannerKernelAccess.kernelInstance?.isExternalPlanObject(\n planObject.configurationRuntimeId,\n )\n ) {\n externalConfigurationData.push([\n createExtObjId(planObject.configurationHash as string),\n planObject,\n ]);\n objects.push(convertCObject(planObject) as UiPlanObject);\n } else if (\n planObject.configurationType?.value !== CONFIGURATION_TYPE.EXTERNAL\n ) {\n const obj = convertCObject(planObject) as UiPlanObject;\n if (obj.configurationHash) {\n configurationIds.push(obj.configurationHash);\n } else if (obj.catalogItemId) {\n itemIds.push(obj.catalogItemId);\n }\n if (obj.parts) {\n const hash = obj.configurationHash || obj.catalogItemId;\n obj.parts = await plannerKernelAccess.addUiDataAndPriceToPartList(\n obj.parts,\n hash,\n );\n }\n if (obj.configuration) {\n const configurationData =\n await plannerKernelAccess.getConfigurationData(obj.runtimeId);\n obj.configuration = configurationData.configuration;\n }\n obj.data = null;\n objects.push(obj);\n }\n }),\n );\n return {\n objects,\n itemIds,\n configurationIds,\n externalConfigurationData,\n };\n};\n\nconst fetchData = async (\n itemIds: RapiId[] = [],\n configurationIds: RapiId[] = [],\n externalObjectsDataIn: Array<[ExtObjId, Record<string, any>]> = [],\n rapiAccess: RapiAccess,\n) => {\n const externalObjectsData: Record<string, any> = {} as { [key: string]: any };\n const externalObjectIds = externalObjectsDataIn.map(([id, data]) => {\n externalObjectsData[id as ExtObjId] = data;\n return id;\n });\n const [responseItems, responseConfigurations, responseExternalObjects] =\n await Promise.allSettled([\n rapiAccess.getItems(itemIds),\n rapiAccess.getConfigurations(configurationIds),\n rapiAccess.getExternalObjects(externalObjectIds),\n ]);\n const rootComponentIds: RapiId[] = [];\n const data: Map<RapiId, any> = new Map();\n if (responseItems.status === 'fulfilled') {\n for (const item of responseItems.value) {\n data.set(item.id, item);\n }\n }\n if (responseExternalObjects.status === 'fulfilled') {\n if (responseExternalObjects.value?.length > 0) {\n for (const { data: externalObject } of responseExternalObjects.value) {\n data.set(externalObject.id, externalObject);\n }\n }\n }\n if (responseConfigurations.status === 'fulfilled') {\n for (const configuration of responseConfigurations.value) {\n data.set(configuration.id, configuration);\n rootComponentIds.push(configuration.rootComponentId);\n }\n } else {\n console.warn(\n 'Could not fetch configuration for data property. This happens when a configuration has not been saved yet',\n );\n }\n return { data, rootComponentIds };\n};\n\nexport const mapToUiPlanObjects = async (\n planObjects: any,\n plannerKernelAccess: PlannerKernelAccess,\n rapiAccess: RapiAccess,\n): Promise<UiPlanObject[]> => {\n const { objects, itemIds, configurationIds, externalConfigurationData } =\n await getIds(planObjects, plannerKernelAccess);\n\n const { data, rootComponentIds } = await fetchData(\n itemIds,\n configurationIds,\n externalConfigurationData,\n rapiAccess,\n );\n\n const rootComponents = await rapiAccess.getComponents(rootComponentIds);\n const rootComponentsMap: Map<RapiId, RapiComponent> = new Map();\n for (const rootComponent of rootComponents) {\n rootComponentsMap.set(rootComponent.id, rootComponent);\n }\n for (const obj of objects) {\n const id = obj.catalogItemId || obj.configurationHash;\n const entryData =\n data.get(obj.catalogItemId) || data.get(obj.configurationHash) || null;\n if (\n entryData &&\n !entryData.label &&\n rootComponentsMap.has(entryData.rootComponentId)\n ) {\n const component = rootComponentsMap.get(entryData.rootComponentId);\n entryData.label = component.label;\n }\n if (entryData && !entryData.label) {\n entryData.label = id;\n }\n obj.data = entryData;\n }\n\n return objects;\n};\n","import {\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n RepeatWrapping,\n TextureLoader,\n} from 'three';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport { PAPER_BACKGROUND_FILE_NAME } from '../../../common-core/src/static-files/environment-maps';\n\nexport default class PaperBackground extends Mesh {\n constructor() {\n const geo = new PlaneGeometry(1000, 1000, 8, 8);\n geo.rotateX(-Math.PI / 2);\n\n const material = new MeshBasicMaterial();\n const textureLoader = new TextureLoader();\n\n textureLoader.load(PAPER_BACKGROUND_FILE_NAME, (texture) => {\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n const repeatEveryM = 5;\n texture.repeat.set(1000 / repeatEveryM, 1000 / repeatEveryM);\n material.map = texture;\n material.alphaTest = 0.3;\n material.transparent = true;\n });\n\n super(geo, material);\n\n this.name = '2d paper background';\n this.position.set(0, -0.1, 0);\n this.layers.set(LAYER.BACKGROUND);\n this.userData.ignoreElementHit = true;\n }\n}\n","import { type Box3 } from 'three';\nimport CameraBehaviour from './camera-behaviour';\nimport type CameraControl from './camera-control';\nimport type { CameraParameter } from './camera-control';\n\nexport default abstract class PlannerCameraBehaviour extends CameraBehaviour {\n public get cameraControl(): CameraControl {\n return this._cameraControl;\n }\n\n public abstract resetCameraOnPlanCompletelyLoaded(bounds: Box3): void;\n\n public abstract externalApiResetCameraPosition(bounds: Box3): void;\n\n public abstract updateCameraOnDrawWalls(bounds: Box3): void;\n\n public abstract updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n bounds: Box3\n ): void;\n\n public abstract updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n bounds: Box3\n ): void;\n\n public abstract updateCameraOnPlanElementDraggedOutsidePlanBounds(\n bounds: Box3\n ): void;\n\n public abstract updateCameraOnPlanElementRemoved(bounds: Box3): void;\n\n public abstract updateCameraOnBackToPlanner(\n bounds: Box3,\n startCameraParams: CameraParameter,\n endCameraParams: CameraParameter\n ): void;\n\n public abstract resetCameraOnEnableWallDrawing(bounds: Box3): void;\n}\n","import type CameraControl2D from './camera-control-2d';\nimport PlannerCameraBehaviour from './planner-camera-behaviour';\nimport { type Box3 } from 'three';\nimport { getDrawingMinBounds } from '../utils/threejs-utils';\nimport type { CameraParameter } from './camera-control';\n\nexport default class Planner2dCameraBehaviour extends PlannerCameraBehaviour {\n public get cameraControl(): CameraControl2D {\n return this._cameraControl as CameraControl2D;\n }\n\n public resetCameraOnPlanCompletelyLoaded(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(\n getDrawingMinBounds(\n bounds,\n this.cameraControl.domHelper.element.clientWidth,\n this.cameraControl.domHelper.element.clientHeight,\n 1.1\n ),\n true\n );\n }\n\n public externalApiResetCameraPosition(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(\n getDrawingMinBounds(\n bounds,\n this.cameraControl.domHelper.element.clientWidth,\n this.cameraControl.domHelper.element.clientHeight,\n 1.1\n ),\n true\n );\n }\n\n public resetCameraOnSwitchTo2d(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(\n getDrawingMinBounds(\n bounds,\n this.cameraControl.domHelper.element.clientWidth,\n this.cameraControl.domHelper.element.clientHeight,\n 1.1\n ),\n true\n );\n }\n\n public updateCameraOnDrawWalls(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n bounds: Box3\n ): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n _bounds: Box3\n ): void {\n // Camera doesn't need to be updated\n }\n\n public updateCameraOnPlanElementDraggedOutsidePlanBounds(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public updateCameraOnPlanElementRemoved(_bounds: Box3): void {\n // Camera doesn't need to be updated\n }\n\n public updateCameraOnBackToPlanner(\n bounds: Box3,\n _startCameraParams: CameraParameter,\n _endCameraParams: CameraParameter\n ): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public resetCameraOnEnableWallDrawing(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n}\n","import type CameraControl3D from './camera-control-3d';\nimport PlannerCameraBehaviour from './planner-camera-behaviour';\nimport { type Box3 } from 'three';\nimport type { CameraParameter } from './camera-control';\n\nexport default class Planner3dCameraBehaviour extends PlannerCameraBehaviour {\n public get cameraControl(): CameraControl3D {\n return this._cameraControl as CameraControl3D;\n }\n\n public resetCameraOnPlanCompletelyLoaded(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, true);\n }\n\n public externalApiResetCameraPosition(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, true);\n }\n\n public resetCameraOnSwitchTo3d(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, false);\n }\n\n public disablePanningOnShiftRelease() {\n this.cameraControl.disablePanning();\n }\n\n public enablePanningOnShiftClick() {\n this.cameraControl.enablePanning();\n }\n\n public updateCameraOnDrawWalls(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, true);\n }\n\n public updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n bounds: Box3,\n ): void {\n this.cameraControl.zoomToFitBounds(bounds, false);\n }\n\n public updateCameraOnPlanElementDraggedOutsidePlanBounds(bounds: Box3): void {\n this.cameraControl.adjustToBoundsWithoutChangingDistance(bounds);\n }\n\n public updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n bounds: Box3,\n ): void {\n this.cameraControl.adjustToBoundsWithoutChangingDistance(bounds);\n }\n\n public updateCameraOnPlanElementRemoved(bounds: Box3): void {\n this.cameraControl.adjustToBoundsWithoutChangingDistance(bounds);\n }\n\n public async updateCameraOnBackToPlanner(\n bounds: Box3,\n startCameraParams: CameraParameter,\n endCameraParams: CameraParameter,\n ) {\n if (!endCameraParams) {\n return;\n }\n this.cameraControl.setObjectRotation(0);\n const cameraTargetIsZero = Math.abs(0 - endCameraParams.targetX) <= 0.01 &&\n Math.abs(0 - endCameraParams.targetY) <= 0.01 &&\n Math.abs(0 - endCameraParams.targetZ) <= 0.01;\n if (cameraTargetIsZero) {\n await this.cameraControl.updateAndReset(bounds, true);\n } else {\n await this._cameraControl.setToState(startCameraParams, endCameraParams);\n }\n }\n\n public resetCameraOnEnableWallDrawing(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, true);\n }\n\n public async externalApiMoveCamera(\n cameraParameter: CameraParameter,\n ): Promise<void> {\n await this.cameraControl.moveCamera(cameraParameter);\n this._onCameraChanged();\n }\n}\n","import type CameraControlFirstPerson from '../../../planner-core/src/camera-control/camera-control-first-person';\nimport PlannerCameraBehaviour from './planner-camera-behaviour';\nimport { type Box3 } from 'three';\nimport type { CameraParameter } from './camera-control';\n\nexport default class PlannerFpCameraBehaviour extends PlannerCameraBehaviour {\n public get cameraControl(): CameraControlFirstPerson {\n return this._cameraControl as CameraControlFirstPerson;\n }\n\n public resetCameraOnPlanCompletelyLoaded(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public externalApiResetCameraPosition(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnDrawWalls(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n _bounds: Box3\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n _bounds: Box3\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementDraggedOutsidePlanBounds(\n _bounds: Box3\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementRemoved(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnBackToPlanner(\n _bounds: Box3,\n _startCameraParams: CameraParameter,\n _endCameraParams: CameraParameter\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public resetCameraOnEnableWallDrawing(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public resetCameraOnSwitchToFirstPerson(): void {\n this.cameraControl.updateCamera();\n }\n}\n","import type { Object3D } from 'three';\nimport type PlannerSceneEventHandler from './planner-scene-event-handler';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport type { RoomleWebGLRenderer } from '../../../common-core/src/webgl/roomle-webgl-renderer';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport ConstructionPlanObjectViewModel from '../view-model/construction-plan-object-view-model';\nimport type { KernelWall } from '../../../typings/planner';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\n\nexport default class PlanElementHighlighter {\n private _sceneEventHandler: PlannerSceneEventHandler;\n private _roomleRenderer: RoomleWebGLRenderer;\n private _planViewModel: PlanViewModel;\n\n constructor(\n sceneEventHandler: PlannerSceneEventHandler,\n roomleRenderer: RoomleWebGLRenderer,\n planViewModel: PlanViewModel\n ) {\n this._sceneEventHandler = sceneEventHandler;\n this._roomleRenderer = roomleRenderer;\n this._planViewModel = planViewModel;\n }\n\n private _processViewModel(\n viewModel: PlanElementViewModel,\n selectedMeshes: Set<Object3D>\n ) {\n const isWallHasAttachedAttic =\n viewModel instanceof WallPlanElementViewModel &&\n (viewModel.getKernelObject() as KernelWall).getAttachedAttics?.().size() >\n 0;\n if (isWallHasAttachedAttic) {\n viewModel.getBoundingBox().children.forEach((child) => {\n if (!(child as any).isChildPlanObject) {\n selectedMeshes.add(child);\n }\n });\n } else {\n if (\n (viewModel instanceof ConstructionPlanObjectViewModel ||\n viewModel instanceof ConfigurableConstructionPlanObjectViewModel) &&\n viewModel.getTopViewContainer()\n ) {\n selectedMeshes.add(viewModel.getTopViewContainer());\n }\n if (viewModel.getObject()?.children) {\n viewModel.getObject().children.forEach((child) => {\n if (!(child as any).isChildPlanObject) {\n selectedMeshes.add(child);\n }\n });\n }\n }\n }\n\n private _processSelectedPlanElementIds(selectedMeshes: Set<Object3D>) {\n const selectedIds = this._sceneEventHandler?.getSelectedIds() || [];\n\n selectedIds.forEach((id) => {\n const viewModel = this._planViewModel.getPlanObjectForId(id);\n if (viewModel) {\n this._processViewModel(viewModel, selectedMeshes);\n }\n });\n }\n\n private _highlightPlanElementsBase(\n runtimeIds?: number[],\n planElementViewModel?: PlanElementViewModel\n ) {\n let selectedMeshes = new Set<Object3D>();\n\n if (planElementViewModel) {\n this._processViewModel(planElementViewModel, selectedMeshes);\n }\n\n runtimeIds?.forEach((id) => {\n const viewModel = this._planViewModel.getPlanObjectForId(id);\n if (viewModel) {\n this._processViewModel(viewModel, selectedMeshes);\n }\n });\n\n this._processSelectedPlanElementIds(selectedMeshes);\n\n this._roomleRenderer?.highlightObjects(Array.from(selectedMeshes));\n }\n\n public highlightPlanElements(runtimeIds?: number[]) {\n this._highlightPlanElementsBase(runtimeIds);\n }\n\n public highlightPlanElement(planElementViewModel?: PlanElementViewModel) {\n this._highlightPlanElementsBase(undefined, planElementViewModel);\n }\n\n public clearHighlighting() {\n this._highlightPlanElementsBase();\n }\n}\n","import type { Group, Vector3 } from 'three';\nimport { Mesh, MeshBasicMaterial, SphereGeometry, type Camera } from 'three';\nimport type {\n WallDimension,\n WallDimensionTransferable,\n} from '../view-model/wall-plan-element-view-model';\nimport { wallDimensionToTransferable } from '../view-model/wall-plan-element-view-model';\nimport { getScreenXY } from '../../../common-core/src/utils/threejs-utils';\nimport CameraControl2D from '../../../common-core/src/cameracontrol/camera-control-2d';\nimport type UnitFormatter from '../../../configurator-core/src/services/unit-formatter';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport type PlannerSceneEventHandler from '../webgl/planner-scene-event-handler';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport type { WallPlanObject } from '../../../typings/planner';\nimport type CameraBehaviour from '../../../common-core/src/cameracontrol/camera-behaviour';\nimport type { AtticDimension } from './measurements';\nimport type DomHelper from '../../../common-core/src/utils/dom-helper';\n\nexport function sendWallDimensions(\n domHelper: DomHelper,\n cameraBehaviour: CameraBehaviour,\n roomlePlannerUiCallback: RoomlePlannerUiCallback,\n plannerSceneEventHandler: PlannerSceneEventHandler,\n viewModel: PlanViewModel,\n unitFormatter: UnitFormatter,\n debugSpheres: {\n wallPoints: Group;\n constructionElementsPoints: Group;\n floorPoints: Group;\n },\n isFixedWalls = true,\n isDebug = false\n): void {\n if (!(cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n if (cameraBehaviour.cameraControl.isLocked() && isFixedWalls) {\n return;\n }\n\n const wallDimensions: WallDimensionTransferable[] = [];\n const { x: clientWidth, y: clientHeight } = domHelper.getClientDimensions();\n const wallViewModels = viewModel.getWallPlanObjectViewModels();\n const zoomFactor = cameraBehaviour.cameraControl.getKernelZoomFactor();\n const camera = cameraBehaviour.cameraControl.getCamera();\n\n for (const planViewModel of wallViewModels) {\n const wallDimension = planViewModel.getWallDimension(\n zoomFactor,\n clientWidth,\n clientHeight\n );\n wallDimension.isCurrentlyDrawn =\n plannerSceneEventHandler.isCurrentlyDrawing &&\n (planViewModel.getPlanElement() as WallPlanObject).getTo().extRef\n .jsObject === viewModel.latestNodePlanObjectViewModel;\n\n const { isVectorWall } = planViewModel.getKernelObject();\n if (wallDimension.length <= 0 && !isVectorWall) {\n continue;\n }\n\n convertWallTo2D(wallDimension, camera, clientWidth, clientHeight);\n\n if (wallDimension.attic) {\n convertAtticTo2D(wallDimension.attic, camera, clientWidth, clientHeight);\n }\n\n wallDimension.lengthFormatted = unitFormatter.formatMMValueToUnitString(\n wallDimension.length\n );\n\n if (isDebug) {\n debugWallDimensions(wallDimension, debugSpheres);\n }\n\n wallDimensions.push(wallDimensionToTransferable(wallDimension));\n }\n\n roomlePlannerUiCallback.onUpdateWallDimensions(wallDimensions);\n}\n\nfunction convertWallTo2D(\n wallDimension: WallDimension,\n camera: Camera,\n clientWidth: number,\n clientHeight: number\n) {\n wallDimension.fromPosition2d = getScreenXY(\n wallDimension.fromPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.toPosition2d = getScreenXY(\n wallDimension.toPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.textPosition2d = getScreenXY(\n wallDimension.textPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.fromWithoutPadding = getScreenXY(\n wallDimension.fromWithoutPadding,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.toWithoutPadding = getScreenXY(\n wallDimension.toWithoutPadding,\n camera,\n clientWidth,\n clientHeight\n );\n}\n\nfunction convertAtticTo2D(\n attic: AtticDimension<Vector3, Vector3>,\n camera: Camera,\n clientWidth: number,\n clientHeight: number\n) {\n attic.textPosition2d = attic.fromPosition3d\n ? getScreenXY(attic.textPosition3d, camera, clientWidth, clientHeight)\n : undefined;\n\n attic.fromPosition2d = attic.fromPosition3d\n ? getScreenXY(attic.fromPosition3d, camera, clientWidth, clientHeight)\n : undefined;\n\n attic.toPosition2d = attic.toPosition3d\n ? getScreenXY(attic.toPosition3d, camera, clientWidth, clientHeight)\n : undefined;\n\n attic.atticCenterPosition2d = attic.atticCenterPosition3d\n ? getScreenXY(\n attic.atticCenterPosition3d,\n camera,\n clientWidth,\n clientHeight\n )\n : undefined;\n\n attic.wallCenterPosition2d = getScreenXY(\n attic.wallCenterPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n\n attic.labelCPosition2d = getScreenXY(\n attic.labelCPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n attic.labelHeightPosition2d = getScreenXY(\n attic.labelHeightPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n\n attic.shiftedWallCenter2d = getScreenXY(\n attic.shiftedWallCenter3d,\n camera,\n clientWidth,\n clientHeight\n );\n\n attic.heightAt2mPosition2d = getScreenXY(\n attic.heightAt2mPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n attic.attic2mCornerFrom2d = getScreenXY(\n attic.attic2mCornerFrom3d,\n camera,\n clientWidth,\n clientHeight\n );\n attic.attic2mCornerto2d = getScreenXY(\n attic.attic2mCornerto3d,\n camera,\n clientWidth,\n clientHeight\n );\n}\n\nfunction debugWallDimensions(\n wallDimension: WallDimension,\n debugSpheres: {\n wallPoints: Group;\n constructionElementsPoints: Group;\n floorPoints: Group;\n }\n) {\n console.log('Wall dimension', wallDimension);\n\n const geometry = new SphereGeometry(0.1, 32, 16);\n const material = new MeshBasicMaterial({ color: 0xff0000 });\n\n const fromSphere = new Mesh(geometry, material);\n fromSphere.position.copy(wallDimension.fromPosition3d);\n\n const toSphere = new Mesh(geometry, material);\n toSphere.position.copy(wallDimension.toPosition3d);\n\n const centerSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0x00ff00 })\n );\n centerSphere.position.copy(wallDimension.textPosition3d);\n\n debugSpheres.wallPoints.add(fromSphere);\n debugSpheres.wallPoints.add(toSphere);\n debugSpheres.wallPoints.add(centerSphere);\n\n if (wallDimension.attic) {\n const atticFromSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0x0000ff })\n );\n if (wallDimension.attic.fromPosition3d) {\n atticFromSphere.position.copy(wallDimension.attic.fromPosition3d);\n }\n\n const atticToSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0xff00ff })\n );\n if (wallDimension.attic.toPosition3d) {\n atticToSphere.position.copy(wallDimension.attic.toPosition3d);\n }\n\n const atticCenterSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0xffff00 })\n );\n if (wallDimension.attic.atticCenterPosition3d) {\n atticCenterSphere.position.copy(\n wallDimension.attic.atticCenterPosition3d\n );\n }\n\n debugSpheres.wallPoints.add(atticFromSphere);\n debugSpheres.wallPoints.add(atticToSphere);\n debugSpheres.wallPoints.add(atticCenterSphere);\n }\n}\n","/**\n * Manages clipboard operations (copy and paste) with a fallback to localStorage\n * if the native Clipboard API is not fully supported.\n *\n * Note: The localStorage fallback only works for copy/paste operations within\n * the same browser tab and origin. It does not interact with the system clipboard.\n */\nexport default class ClipboardManager {\n private static LOCAL_STORAGE_KEY = 'clipboardManagerFallback';\n\n /**\n * Checks if the modern Clipboard API (writeText) is likely supported.\n * @returns true if navigator.clipboard.writeText is available, false otherwise.\n */\n private static hasNativeClipboardWriteSupport(): boolean {\n return !!(\n navigator.clipboard && typeof navigator.clipboard.writeText === 'function'\n );\n }\n\n /**\n * Checks if the modern Clipboard API (readText) is likely supported.\n * @returns true if navigator.clipboard.readText is available, false otherwise.\n */\n private static async hasNativeClipboardReadSupport(): Promise<boolean> {\n const hasClipboardReadSupport = !!(\n navigator.clipboard && typeof navigator.clipboard.readText === 'function'\n );\n if (hasClipboardReadSupport) {\n const permission = await navigator.permissions.query({\n name: 'clipboard-read' as any, //neded for linter\n });\n return permission.state !== 'denied';\n }\n return false;\n }\n\n /**\n * Copies the given text. It first tries the native Clipboard API.\n * If that's not available, it falls back to localStorage.\n *\n * @param text The string to copy.\n * @returns A Promise that resolves when the text has been successfully copied\n */\n public static async copy(text: string): Promise<void> {\n if (this.hasNativeClipboardWriteSupport()) {\n try {\n await navigator.clipboard.writeText(text);\n } catch (err) {\n console.warn(\n 'Native clipboard writeText failed, attempting localStorage fallback.',\n err\n );\n }\n }\n\n // Also copy to localStorage in case read permisions are denied\n try {\n localStorage.setItem(this.LOCAL_STORAGE_KEY, text);\n } catch (e) {\n console.error('Failed to copy text using localStorage:', e);\n }\n }\n\n /**\n * Pastes text. It first tries the native Clipboard API.\n * If that's not available or fails, it falls back to reading from localStorage.\n *\n * @returns A Promise that resolves with the text content (from system clipboard or localStorage).\n * Resolves with an empty string if localStorage fallback is used and no item is found.\n * Rejects if both operations fail.\n * @throws Will throw an error if both native clipboard and localStorage paste operations fail.\n *\n * Note: Reading from the system clipboard often requires user permission and the document to be focused.\n */\n public static async paste(): Promise<string> {\n if (await this.hasNativeClipboardReadSupport()) {\n try {\n return await navigator.clipboard.readText();\n } catch (err) {\n console.warn(\n 'Native clipboard readText failed, attempting localStorage fallback.',\n err\n );\n // Common errors for native paste include:\n // - NotAllowedError: User denied clipboard read permission.\n // - DOMException: Document is not focused.\n // - SecurityError: Operation is insecure (e.g. not HTTPS).\n // Fall through to localStorage if native fails\n }\n }\n\n // Fallback to localStorage\n try {\n const text = localStorage.getItem(this.LOCAL_STORAGE_KEY);\n if (text === null) {\n return ''; // Return empty string if nothing in localStorage\n }\n return text;\n } catch (e) {\n console.error(\n 'Failed to paste text using native clipboard and localStorage fallback:',\n e\n );\n throw new Error(\n 'Failed to paste text. Both clipboard and localStorage methods failed.'\n );\n }\n }\n}\n","import inject from '../../../common-core/src/di/inject';\nimport type {\n Base64Image,\n CanvasOffset,\n} from '../../../common-core/src/common-interfaces';\nimport type { PlannerKernelCallbackI } from '../services/planner-kernel-access';\nimport type RapiAccess from '../../../common-core/src/rapi-access';\nimport type { default as PlannerMeshGenerator } from './planner-mesh-generator';\nimport Benchmark from '../../../common-core/src/utils/benchmark';\nimport {\n createEmptySceneFromCurrent,\n dispose,\n fadeIn,\n getDrawingMinBounds,\n getScreenXY,\n hideWallsBasedOnCamera,\n isBox3InFrustum,\n kernelBoxToThreeBox,\n setWallTransparency,\n threeVectorToTransferableXY,\n viewSpacePositionFromUV,\n} from '../../../common-core/src/utils/threejs-utils';\nimport PlannerLightSetting from './lightsetting/planner-light-setting';\nimport type {\n CancelSelectionReasons,\n KernelFloor,\n KernelFloorMaterial,\n KernelWall,\n Plan,\n PlanElement,\n PlanObject,\n PlanObjectPosition,\n} from '../../../typings/planner';\nimport CameraControl3D from '../../../common-core/src/cameracontrol/camera-control-3d';\nimport CameraControl2D from '../../../common-core/src/cameracontrol/camera-control-2d';\nimport type { KernelPlanObjectComponent } from '../../../typings/kernel';\nimport {\n CONFIGURATION_TYPE,\n type KernelEnum,\n type KernelObjectPtrList,\n type KernelPlanObject,\n type KernelVector3,\n type RuntimeId,\n type UiPlanObject,\n} from '../../../typings/kernel';\nimport PlannerSceneEventHandler, {\n PLANNER_SCENE_EVENT,\n PLANNER_SCENE_EVENT_STATE,\n type SceneEventInfo,\n} from './planner-scene-event-handler';\nimport type {\n BatchPaintMaterial,\n InsertItemIdInfo,\n InsertItemResult,\n RoomlePlannerCallback,\n SceneEvents,\n} from '../roomle-planner';\nimport type PlanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport type {\n ObjectToWallDimensionTransferable,\n ObjectWallDimension,\n} from '../../../common-core/src/view-model/plan-object-view-model';\nimport { objectToWallDimensionToTransferable } from '../../../common-core/src/view-model/plan-object-view-model';\nimport type { InputEvent } from '../../../common-core/src/input/input-manager';\nimport type InputManager from '../../../common-core/src/input/input-manager';\nimport { INPUT_EVENT } from '../../../common-core/src/input/input-manager';\nimport type PlannerInputManager from '../input/planner-input-manager';\nimport CameraControlFirstPerson from '../camera-control/camera-control-first-person';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport type { SelectionPayload } from '../roomle-planner-ui-callback';\nimport { PLAN_ELEMENT_CHANGE_TYPES } from '../roomle-planner-ui-callback';\nimport type { RapiConfiguration, RapiItem } from '../../../typings/rapi-types';\nimport StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\nimport { SELECTION_MODE } from '../../../configurator-core/src/utils/selection-handler';\nimport type LocalStorageHelper from '../../../common-core/src/utils/local-storage-helper';\nimport { CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport AsyncGuard from '../../../common-core/src/async-guard';\nimport BackgroundEnvironment from '../../../common-core/src/environment/background-environment';\nimport type { CameraParameter } from '../../../common-core/src/cameracontrol/camera-control';\nimport { CAMERA_EVENT } from '../../../common-core/src/cameracontrol/camera-control';\nimport {\n convertToKernel,\n convertToTHREE,\n} from '../../../common-core/src/utils/kernel-utils';\nimport {\n getHostname,\n isIdItemId,\n} from '../../../common-core/src/utils/rapi-utils';\nimport {\n applyMaterialToKernelMaterial,\n copy,\n ctrlOrCmd,\n getColor,\n getIdQueryParam,\n hashCode,\n isCtrlOrCmd,\n} from '../../../common-core/src/utils/common-utils';\nimport PlanViewModel, {\n GROUP_CEILING_LIGHTS,\n} from '../view-model/plan-view-model';\nimport ConfiguratorSceneManager from '../../../configurator-core/src/webgl/configurator-scene-manager';\nimport { BASE_CONTEXT } from '../../../common-core/src/main';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport NodePlanElementViewModel from '../view-model/node-plan-element-view-model';\nimport {\n addDemoLights,\n type CallbackObjectType,\n} from '../utils/planner-scene-utils';\nimport {\n createTransferableObjectPosition,\n getCallbackObjectType,\n} from '../utils/planner-scene-utils';\nimport type { Enumify } from '../../../common-core/src/types';\nimport {\n Group,\n type Camera,\n type Material,\n type Object3D,\n type OrthographicCamera,\n type PerspectiveCamera,\n} from 'three';\nimport {\n Box3,\n MathUtils,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n SphereGeometry,\n Vector2,\n Vector3,\n} from 'three';\nimport { Sky } from 'three/examples/jsm/objects/Sky.js';\nimport { RenderMode } from '../../../common-core/src/webgl/roomle-webgl-renderer';\nimport { mapToUiPlanObjects } from '../utils/map-to-ui-plan-objects';\nimport type { FloorAreaDataTransferable } from '../view-model/floor-plan-element-view-model';\nimport FloorPlanElementViewModel, {\n toFloorAreaDataTransferable,\n} from '../view-model/floor-plan-element-view-model';\nimport type {\n CameraTarget,\n PrepareImageOptions,\n} from '../../../common-core/src/webgl/image-renderer';\nimport ImageRenderer from '../../../common-core/src/webgl/image-renderer';\nimport MaterialCreator from '../../../common-core/src/utils/material-creator';\nimport PaperBackground from './paper-background';\nimport type {\n OrthographicOffsetCamera,\n PerspectiveOffsetCamera,\n} from '../../../common-core/src/webgl/roomle-component-factory';\nimport Planner2dCameraBehaviour from '../../../common-core/src/cameracontrol/planner-2d-camera-behaviour';\nimport Planner3dCameraBehaviour from '../../../common-core/src/cameracontrol/planner-3d-camera-behaviour';\nimport PlannerFpCameraBehaviour from '../../../common-core/src/cameracontrol/planner-fp-camera-behaviour';\nimport type { MeasurementLineDimensionTransferable } from '../view-model/measurement-line-plan-element-view-model';\nimport MeasurementLinePlanElementViewModel, {\n toMeasurementLineDimensionToTransferable,\n} from '../view-model/measurement-line-plan-element-view-model';\nimport GlbViewerCameraBehaviour from '../../../common-core/src/cameracontrol/glb-viewer-camera-behaviour';\nimport ConfiguratorCameraBehaviour from '../../../common-core/src/cameracontrol/configurator-camera-behaviour';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport ConstructionPlanObjectViewModel from '../view-model/construction-plan-object-view-model';\nimport {\n type ConstructionMeasurement,\n type ConstructionMeasurementsTransferable,\n convertToStandardArray,\n toConstructionMeasurementTransferable,\n} from '../utils/measurements';\nimport PlannerCameraBehaviour from '../../../common-core/src/cameracontrol/planner-camera-behaviour';\nimport {\n WALL_SIDES,\n type EMSConstant,\n} from '../../../typings/planner-kernel-container';\nimport PlanElementHighlighter from './planner-element-highlighter';\nimport { sendWallDimensions } from '../utils/dimensions-helper';\nimport type InitData from '../../../common-core/src/utils/init-data';\nimport {\n DEFAULT_ENV_MAP_ROTATION,\n DEFAULT_ENV_MAP_INTENSITY,\n} from '../../../common-core/src/utils/init-data';\nimport {\n INTERIOR_LIGHTS_ENV_MAP_ROTATION,\n INTERIOR_LIGHTS_ENV_MAP_INTENSITY,\n} from '../../../common-core/src/webgl/scene-manager';\nimport ClipboardManager from '../../../common-core/src/utils/clipboard-manager';\nimport type { RoomleLightSource } from '../../../common-core/src/light/light-source';\n\nexport function isLockedElement(\n planElementViewModel: PlanElementViewModel,\n initData: InitData,\n): boolean {\n const planElementType = getCallbackObjectType(planElementViewModel);\n const lockPlanEnabled = initData?.lockPlan;\n\n const isConstructionProduct =\n planElementViewModel &&\n 'getPlanElement' in planElementViewModel &&\n planElementViewModel.getPlanElement() &&\n 'getAttachedWall' in planElementViewModel.getPlanElement();\n\n const isWallOrFloorOrConstructionElement =\n planElementType === 'wall' ||\n planElementType === 'floor' ||\n isConstructionProduct;\n\n return !!(lockPlanEnabled && isWallOrFloorOrConstructionElement);\n}\n\nconst PLAN_STORE = 'rml_plans';\n\nconst SET_WALL_MATERIAL_TYPE = {\n INTERIOR: 'interior',\n EXTERIOR: 'exterior',\n} as const;\n\ninterface PrepareImageOptionsPlanner extends PrepareImageOptions {\n object?: Object3D;\n externalObjectsOnly?: boolean;\n}\n\nconst getPressedKeysCount = (event: KeyboardEvent) =>\n ['altKey', 'ctrlKey', 'shiftKey', 'metaKey'].reduce((acc, key) => {\n if ((event as any)[key]) {\n acc++;\n }\n return acc;\n }, 0);\n\nexport default class PlannerSceneManager\n extends ConfiguratorSceneManager\n implements PlannerKernelCallbackI\n{\n @inject\n private _rapiAccess: RapiAccess;\n\n @inject\n private _plannerMeshGenerator: PlannerMeshGenerator;\n\n @inject\n private _plannerInputManager: PlannerInputManager;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n @inject\n private _localStorageHelper: LocalStorageHelper;\n\n private _plannerSceneEventHandler: PlannerSceneEventHandler;\n\n private _roomlePlannerCallback: RoomlePlannerCallback;\n\n private _itemsLoadingStatePromises: Array<Promise<void>> = [];\n\n private _sky: any;\n private _drawingEnabled: boolean;\n private _configureInRoom: boolean;\n\n private _planId: string;\n private _preloadScene: Object3D;\n\n private _staticItemGuard: AsyncGuard<void> = new AsyncGuard();\n private _completelyLoaded: boolean = false;\n private _configurableItemGuard: AsyncGuard<void> = new AsyncGuard();\n private _planCompletelyLoadedGuard: AsyncGuard<void> = new AsyncGuard();\n private _dragStartBounds: Box3;\n public currentSelection: SelectionPayload | null = null;\n private _paperBackground: PaperBackground | null = null;\n private _cameraState: CameraParameter | null = null;\n private _planElementHighlighter: PlanElementHighlighter;\n\n // debug variables\n private _debugSpheres: {\n wallPoints: Group;\n constructionElementsPoints: Group;\n floorPoints: Group;\n } = {\n wallPoints: new Group(),\n constructionElementsPoints: new Group(),\n floorPoints: new Group(),\n };\n\n constructor(\n creator: string,\n offset: CanvasOffset,\n plannerCallback: RoomlePlannerCallback,\n mode: Enumify<typeof CAMERA_TYPE>,\n ) {\n super(creator, offset, mode);\n this._stopRendering = true;\n this._configureInRoom = !!this._initData.configureInRoom;\n this._configuratorContext.baseContext = BASE_CONTEXT.PLANNER;\n this._roomlePlannerCallback = plannerCallback;\n this._plannerMeshGenerator.maxAnisotropy =\n this._renderer.capabilities.getMaxAnisotropy();\n this._plannerMeshGenerator.maxTextures =\n this._renderer.capabilities.maxTextures;\n this._plannerSceneEventHandler = new PlannerSceneEventHandler(\n creator,\n this._scene,\n this.cameraBehaviour.cameraControl.getCamera(),\n this._getInputManager(),\n );\n\n this._roomleRenderer?.switchToPlanner(RenderMode.Mode3D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._imageRenderer.switchToPlannerSettings();\n this._planElementHighlighter = new PlanElementHighlighter(\n this._plannerSceneEventHandler,\n this._roomleRenderer!,\n this._getViewModel(),\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.STATE_CHANGED,\n ({ state, oldState }) => {\n if (\n oldState === PLANNER_SCENE_EVENT_STATE.ROTATE &&\n state !== oldState\n ) {\n this._roomlePlannerUiCallback.onRotationCancel();\n }\n if (\n state === PLANNER_SCENE_EVENT_STATE.ROTATE ||\n state === PLANNER_SCENE_EVENT_STATE.DRAG ||\n state === PLANNER_SCENE_EVENT_STATE.MEASURE ||\n state === PLANNER_SCENE_EVENT_STATE.DRAW\n ) {\n this.cameraBehaviour.cameraControl.lock();\n this._onCameraMove();\n } else {\n this.cameraBehaviour.cameraControl.unlock();\n this._onCameraIdle();\n }\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.INTERACTION,\n () => this._renderWithoutShadowsAndAO(),\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.ACTIVATE_PLAN_ELEMENT,\n (sceneEventInfo) => this._activateElement(sceneEventInfo),\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.SELECT_PLAN_ELEMENT,\n (sceneEventInfo) => {\n this._activateElement(sceneEventInfo);\n const planElementViewModel = sceneEventInfo.planElementViewModel;\n this._sendElementMeasurements();\n\n if (\n planElementViewModel instanceof StaticPlanObjectViewModel &&\n this._initData.debug\n ) {\n console.log(planElementViewModel.getGLBUrl());\n }\n if (!isLockedElement(planElementViewModel, this._initData)) {\n this._planElementHighlighter.highlightPlanElement(\n planElementViewModel,\n );\n }\n\n this._onSelectionChange(planElementViewModel);\n this._renderWithoutShadowsAndAO();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DESELECT_PLAN_ELEMENT,\n ({ planElementViewModel, reason }) => {\n this._planElementHighlighter.clearHighlighting();\n this._onSelectionCancel(planElementViewModel, reason);\n this._roomlePlannerUiCallback.onSelectionCancel(reason);\n this._renderWithoutShadowsAndAO();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.BEFORE_DRAG_START,\n () => {\n this.cameraBehaviour.cameraControl.lock();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_START,\n ({ planElementViewModel }) => {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.startInteraction();\n this._sendElementMeasurements();\n\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n this._sendWallDimensions();\n }\n this._requestRender();\n this._dragStartBounds = this.getBounds();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_MOVE,\n ({ planElementViewModel }) => {\n this.cameraBehaviour.cameraControl.checkNearFarDistance(\n planElementViewModel.getPosition(),\n );\n this._requestRender();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_END,\n async ({ planElementViewModel }) => {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.endInteraction();\n this.cameraBehaviour.cameraControl.unlock();\n const position = this._getDragPosition(\n planElementViewModel.getPosition(),\n );\n if (position) {\n planInteractionHandler.moveElementTo(\n planElementViewModel.getPlanElement(),\n convertToKernel(position),\n );\n }\n this.updateEnvironment(this.getBounds(), true);\n this._renderEverything();\n const planObject = this.getPlanObject(planElementViewModel.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.MOVED,\n planObjects.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n\n const isConstructionOrMeasurementPlanElement =\n planElementViewModel instanceof WallPlanElementViewModel ||\n planElementViewModel instanceof MeasurementLinePlanElementViewModel ||\n planElementViewModel instanceof NodePlanElementViewModel;\n if (\n !this._cameraBehaviourState.isWithinPlanBounds(\n planElementViewModel.getPosition(),\n this.getBounds(),\n ) &&\n !isConstructionOrMeasurementPlanElement\n ) {\n this.plannerCameraBehaviour.updateCameraOnPlanElementDraggedOutsidePlanBounds(\n this.getBounds(),\n );\n }\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_CANCEL,\n () => {\n this.cameraBehaviour.cameraControl.unlock();\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_START,\n () => {\n this.cameraBehaviour.cameraControl.lock();\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_MEASUREMENT_LINE,\n () => {\n this._roomlePlannerUiCallback.onUpdateMeasurementLineDimensions([]);\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_END,\n () => {\n this.cameraBehaviour.cameraControl.unlock();\n this._roomlePlannerUiCallback.onMeasurementLineStateChange(false);\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAWING_START,\n () => {\n this._setKernelZoomFactor();\n this._renderWithoutShadowsAndAO();\n this._roomleRenderer?.setGroundShadow(false);\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAW,\n () => this._renderWithoutShadowsAndAO(),\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAWING_END,\n () => {\n this._renderWithoutShadowsAndAO();\n this._roomleRenderer?.setGroundShadow(true);\n },\n this,\n );\n\n this._getKernelAccess().addPlannerListener(this);\n\n this._plannerMeshGenerator.setMaterialLoadedListener(() => {\n // disabled because it has not been implemented for BufferGeometry yet\n // this._getViewModel().tryToMergeComponents();\n this._configurableItemGuard.resolve();\n this._requestRender();\n });\n\n window.onbeforeunload = this.clearScene.bind(this);\n\n this._getInputManager().addEventListener(\n INPUT_EVENT.ZOOM_IN,\n this._renderListener,\n this,\n );\n this._getInputManager().addEventListener(\n INPUT_EVENT.ZOOM_OUT,\n this._renderListener,\n this,\n );\n // https://github.com/roomle-dev/web-sdk/pull/1264#discussion_r2086492744\n this._getInputManager().addEventListener(\n INPUT_EVENT.DOWN,\n this._onMouseDown,\n this,\n );\n\n this.disableConfiguratorEvents();\n if (mode !== CAMERA_TYPE.CAMERA_FP) {\n this.enablePlannerEvents();\n }\n // relevant for mode=2d\n // move to next frame otherwise we stop rendering before setting the color and thus have a black background\n setTimeout(() => this._updatePaperBackground(), 0);\n if (this._initData.debug) {\n this._debugSpheres.wallPoints.name = 'Walls debug points';\n this._debugSpheres.constructionElementsPoints.name =\n 'Construction elements debug points';\n this._debugSpheres.floorPoints.name = 'Floor debug points';\n this._scene.add(this._debugSpheres.wallPoints);\n this._scene.add(this._debugSpheres.constructionElementsPoints);\n this._scene.add(this._debugSpheres.floorPoints);\n }\n }\n\n get configuratorContext() {\n return this._configuratorContext;\n }\n\n public get hasSingleRoom(): boolean {\n const floorPlanObjects =\n this._getViewModel().getFloorPlanObjectViewModels();\n\n const uniqueFloors = new Set(floorPlanObjects.map((obj) => obj.getId()));\n\n return uniqueFloors.size === 1;\n }\n\n public get scenePlanElementLightSources() {\n const elementLights: Array<Map<number, RoomleLightSource>> = [];\n this._scene.traverse((element) => {\n if (\n 'getAllLightSources' in element &&\n typeof element.getAllLightSources === 'function'\n ) {\n const lights: Map<number, RoomleLightSource> =\n element.getAllLightSources();\n if (lights.size > 0) {\n elementLights.push(lights);\n }\n }\n });\n return elementLights;\n }\n\n public setAllLightsOnOff(state: boolean) {\n for (const lightsMaps of this.scenePlanElementLightSources) {\n for (const light of Array.from(lightsMaps.values())) {\n light.setLightOnOff(state);\n }\n }\n this._renderEverything();\n }\n\n public setLightsOnOffByIds(ids: number[], state: boolean) {\n // Nested for loop is because it's possible that a single configuration can have many light sources.\n for (const lightsMaps of this.scenePlanElementLightSources) {\n for (const light of Array.from(lightsMaps.values())) {\n if (ids.includes(light.lightSourceId)) {\n light.setLightOnOff(state);\n }\n }\n }\n this._renderEverything();\n }\n\n private _activateElement(\n { planElementViewModel }: SceneEventInfo,\n notifyUiSelectionCallback = (): void => void 0,\n ) {\n const planElement = this._plannerSceneEventHandler.isDragIn()\n ? planElementViewModel\n : null;\n this._sendElementMeasurements(planElement);\n\n if (\n planElementViewModel instanceof StaticPlanObjectViewModel &&\n this._initData.debug\n ) {\n console.log(planElementViewModel.getGLBUrl());\n }\n\n if (!isLockedElement(planElementViewModel, this._initData)) {\n this._planElementHighlighter.highlightPlanElement(planElementViewModel);\n }\n notifyUiSelectionCallback();\n this._renderWithoutShadowsAndAO();\n }\n\n planCleared(): void {\n // unused\n }\n\n planHistoryStateChanged(): void {\n this._sendRoomMeasurements();\n\n if (this._completelyLoaded) {\n // Save plan to IDB\n const { configuratorId } = this._globalInitData;\n const planInteractionHandler =\n this._plannerKernelAccess?.planInteractionHandler;\n const planXml = planInteractionHandler.getPlan()?.getPlanXML(false, 2);\n const key = this._idbManager.getKey(\n getHostname(),\n configuratorId,\n this._initData.id,\n );\n this._idbManager.setValue(key, planXml, this._idbManager.configStore);\n }\n }\n\n protected _getViewModel(): PlanViewModel {\n if (!this._viewModel) {\n this._viewModel = new PlanViewModel(this._creator_);\n this._viewModel.setRequestRenderCallback(() => this._renderEverything());\n this._viewModel.setRequestRenderSceneUpdateCallback(() =>\n this._roomleRenderer?.clearCache(),\n );\n this._viewModel.setInvalidateRenderCallback(() =>\n this._roomleRenderer?.forceShadowUpdates(true),\n );\n }\n\n return this._viewModel as PlanViewModel;\n }\n\n private _getDragPosition(elementPosition: Vector3) {\n // only check position if an element gets dragged in\n if (!this._plannerSceneEventHandler.isDragIn()) {\n return null;\n }\n const bounds = this._dragStartBounds\n ? this._dragStartBounds\n : this.getBounds();\n const center = bounds.getCenter(new Vector3());\n const distance = elementPosition.distanceTo(center);\n const size = bounds.getSize(new Vector3());\n const boundsSize = Math.max(size.x, size.z);\n // add distance of 3 meters to max bounds distance\n const maxAllowedDistance = boundsSize + 3;\n if (distance > maxAllowedDistance) {\n const direction = new Vector3()\n .subVectors(elementPosition, center)\n .normalize();\n // set new element position to max allowed distance from center and original position\n return center.clone().add(direction.multiplyScalar(maxAllowedDistance));\n }\n return null;\n }\n\n private _hideAllMeasurementsNodeOnElementChange(\n planElementViewModel: PlanElementViewModel,\n ) {\n const measurementLineViewModels =\n this._getViewModel().getMeasurementLineObjectViewModels();\n measurementLineViewModels.forEach((measurementModel) =>\n measurementModel.hideDraggableNodes(),\n );\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.showDraggableNodes();\n }\n }\n\n private _onSelectionChange(planElementViewModel: PlanElementViewModel) {\n this._hideAllMeasurementsNodeOnElementChange(planElementViewModel);\n const payload: SelectionPayload = {};\n if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n payload.item = planElementViewModel.getRapiItem();\n payload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n this._configuratorUiCallbacks.onUpdateParameters([]);\n }\n if (\n planElementViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel\n ) {\n payload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n }\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planElementId = planElementViewModel.getId();\n const rootPlanElementId = this.getRootPlanObjectId(planElementId);\n const rootPlanElementViewModel =\n this._getViewModel().getPlanObjectForId(rootPlanElementId);\n payload.configurationRuntimeId = (\n rootPlanElementViewModel as ConfiguratorPlanObjectViewModel\n ).getConfigurationRuntimeId();\n }\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n const zoomFactor =\n this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n const { clientWidth, clientHeight } = this._domHelper.element;\n payload.wall = planElementViewModel.getWallDimension(\n zoomFactor,\n clientWidth,\n clientHeight,\n );\n }\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n payload.measurementLine =\n planElementViewModel.getMeasurementLineDimension();\n }\n if (planElementViewModel instanceof FloorPlanElementViewModel) {\n payload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n }\n\n let objectType: CallbackObjectType =\n getCallbackObjectType(planElementViewModel);\n\n const fetchPayloadData = async (): Promise<SelectionPayload> => {\n const promisePayload: SelectionPayload = {};\n if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n promisePayload.item = planElementViewModel.getRapiItem();\n promisePayload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n }\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n await planElementViewModel.isInitDone();\n const configurationRuntimeId =\n planElementViewModel.getConfigurationRuntimeId();\n this._getKernelAccess().updatePlanObjectDependencies(\n configurationRuntimeId,\n );\n const catalogItemId = planElementViewModel\n .getPlanObject()\n .getCatalogItemId();\n let idToUse = catalogItemId;\n if (!idToUse) {\n const configurationHash =\n this._getKernelAccess().kernelInstance.getHashOfConfiguration(\n configurationRuntimeId,\n );\n idToUse = configurationHash;\n }\n const isExternalConfiguration =\n this._getKernelAccess().kernelInstance.isExternalPlanObject(\n configurationRuntimeId,\n );\n if (isExternalConfiguration) {\n const rootPlanElementId = this.getRootPlanObjectId(\n planElementViewModel.getId(),\n );\n const rootPlanElementViewModel =\n this._getViewModel().getPlanObjectForId(\n rootPlanElementId,\n ) as ConfiguratorPlanObjectViewModel;\n this._planObjectSelectionChanged(\n rootPlanElementViewModel.getConfigurationRuntimeId(),\n planElementViewModel.getRootComponentRuntimeId(),\n );\n }\n this._configuratorContext.planObjectId = configurationRuntimeId;\n this._configuratorContext.planElementId = planElementViewModel.getId();\n this._configuratorContext.rootComponentId =\n planElementViewModel.getRootComponentRuntimeId();\n let rootComponentId;\n if (!isExternalConfiguration) {\n if (catalogItemId && isIdItemId(catalogItemId)) {\n const item = await this._rapiAccess.getItem(catalogItemId);\n promisePayload.item = item;\n rootComponentId = item.rootComponentId\n ? item.rootComponentId\n : null;\n } else {\n try {\n const configuration =\n await this._rapiAccess.getConfiguration(idToUse);\n promisePayload.configuration = configuration;\n rootComponentId = configuration.rootComponentId\n ? configuration.rootComponentId\n : null;\n } catch (_e) {\n console.warn(\n 'Could not get RAPI configuration for kernel hash ' +\n idToUse +\n ', saving configuration...',\n );\n const configurationData =\n (await this._getKernelAccess().getConfigurationData(\n configurationRuntimeId,\n )) as RapiConfiguration;\n const rapiConfiguration =\n await this._rapiAccess.saveConfiguration(configurationData);\n promisePayload.configuration = rapiConfiguration;\n rootComponentId = rapiConfiguration.rootComponentId\n ? rapiConfiguration.rootComponentId\n : null;\n }\n }\n }\n if (rootComponentId) {\n const component =\n await this._rapiAccess.getComponent(rootComponentId);\n promisePayload.component = component;\n }\n promisePayload.configurationRuntimeId = configurationRuntimeId;\n objectType = 'configuration';\n }\n promisePayload.planElementId = planElementViewModel.getId();\n return copy(promisePayload);\n };\n\n // no await on purpose because we want to return\n // the promise and not the actual value\n const payloadPromise = fetchPayloadData();\n this.currentSelection = copy(payload);\n\n this._sendElementMeasurements();\n this._sendPlanObjectPositions();\n\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const configurationRuntimeId =\n planElementViewModel.getConfigurationRuntimeId();\n if (configurationRuntimeId && configurationRuntimeId !== -1) {\n const isExternalConfiguration =\n this._getKernelAccess().kernelInstance.isExternalPlanObject(\n configurationRuntimeId,\n );\n if (isExternalConfiguration) {\n objectType = 'external-configuration';\n payload.externalConfigurationType = 'tc-config';\n }\n }\n }\n\n this._roomlePlannerUiCallback.onSelectionChange(\n copy(this._plannerSceneEventHandler.getSelectionMode()),\n copy<CallbackObjectType>(objectType),\n copy(payload),\n payloadPromise,\n planElementViewModel,\n );\n if (\n planElementViewModel instanceof WallPlanElementViewModel ||\n planElementViewModel instanceof NodePlanElementViewModel\n ) {\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.show());\n this._updateNodeSize();\n }\n this._renderWithoutShadowsAndAO();\n }\n\n private _onSelectionCancel(\n _planElementViewModel: PlanElementViewModel,\n reason: CancelSelectionReasons,\n ) {\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.hide());\n this._renderWithoutShadowsAndAO();\n this.resetConfiguratorContext(reason);\n this.cancelComponentSelection(false, reason);\n this._handleMeasurementLineDraggablePoints(_planElementViewModel);\n this.currentSelection = null;\n }\n\n private _handleMeasurementLineDraggablePoints(\n planElementViewModel: PlanElementViewModel,\n ) {\n this._getViewModel()\n .getMeasurementLineObjectViewModels()\n .forEach((measurementLineViewModel) => {\n measurementLineViewModel.hideDraggableNodes();\n measurementLineViewModel.deselectAllDraggablePoints();\n });\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.deselectAllDraggablePoints();\n planElementViewModel.currentPoint = null;\n }\n }\n\n public resetConfiguratorContext(reason: CancelSelectionReasons) {\n try {\n if (this._configuratorContext.planObjectId) {\n const planObject = this.getPlanObject(\n this._configuratorContext.planElementId,\n );\n if (\n planObject.configurationType?.value === CONFIGURATION_TYPE.EXTERNAL\n ) {\n this.notifyPlannerOnComponentSelectionCancel(true, reason);\n }\n }\n } catch (e) {\n console.error(e);\n }\n this._configuratorContext.planObjectId = 0;\n this._configuratorContext.planElementId = 0;\n this._configuratorContext.rootComponentId = 0;\n this._configuratorContext.dockingRootComponentId = 0;\n }\n\n protected _setupScene(offset?: CanvasOffset, transparent?: boolean) {\n super._setupScene(offset, transparent, true);\n\n if (this._initData.legacyLight) {\n this._lightSetting = new PlannerLightSetting(\n this._scene,\n this._lightSetting,\n );\n }\n if (!this._initData.moc) {\n this._addSky();\n }\n if (!transparent) {\n this._setEnvironment(\n new BackgroundEnvironment(\n this._scene,\n this._environment,\n getColor(this._initData.colors.DEFAULT_BACKGROUND),\n ),\n );\n }\n }\n\n protected onBeforeRender(): void {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n const anyVisibilityChanged = hideWallsBasedOnCamera(\n this.cameraBehaviour.cameraControl.getCamera(),\n this._getViewModel().getWallPlanObjectViewModels(),\n );\n if (anyVisibilityChanged) {\n this._roomleRenderer?.forceShadowUpdates(true); // this._roomleRenderer could be null e.g.: if e2e=true\n }\n }\n }\n\n protected _getInputManager(): InputManager {\n return this._plannerInputManager;\n }\n\n protected createCameraControl(\n mode: Enumify<typeof CAMERA_TYPE>,\n _offset: CanvasOffset,\n ) {\n this.setMode(mode);\n }\n\n public startViewing() {\n this._configuratorContext.baseContext = BASE_CONTEXT.GLB_VIEWER;\n\n const ids = this._plannerSceneEventHandler.getSelectedIds();\n if (ids.length === 1) {\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(\n ids[0],\n );\n\n this._setCameraPosition();\n const currentCameraParameters =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n\n this._changeCameraBehaviour(\n new GlbViewerCameraBehaviour(\n this._getCameraControl3D(currentCameraParameters),\n this._cameraBehaviourState,\n ),\n );\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.setObjectRotation(\n planObjectViewModel.getPlanElement().rotation,\n );\n }\n if (!this._configureInRoom) {\n this._getViewModel().hideAllExcept(planObjectViewModel.getId());\n }\n\n (this.cameraBehaviour as GlbViewerCameraBehaviour)\n .updateCameraOnItemLoaded(this.getBounds())\n .then(() => {\n // update environment because we did hide other objects\n this.updateEnvironment(this.getBounds(), true);\n });\n }\n\n this.disablePlannerEvents();\n this.updateScene();\n }\n\n public startConfiguring() {\n this._configuratorContext.baseContext = BASE_CONTEXT.CONFIGURATOR;\n\n let { planElementId } = this._configuratorContext;\n planElementId = this.getRootPlanObjectId(planElementId);\n\n if (this._configuratorContext.planElementId !== planElementId) {\n this.selectPlanObject(planElementId);\n }\n this._selectExternalObjectModule();\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(\n planElementId,\n ) as ConfiguratorPlanObjectViewModel;\n\n this._setCameraPosition();\n const currentCameraParameters =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n\n this._changeCameraBehaviour(\n new ConfiguratorCameraBehaviour(\n this._getCameraControl3D(currentCameraParameters),\n this._cameraBehaviourState,\n ),\n );\n\n let objectRotation = 0;\n let lookAtSide = 0;\n if (planObjectViewModel) {\n this.setRootComponentId(planObjectViewModel.getRootComponentRuntimeId());\n const preferredRotation = planObjectViewModel\n .getPlanElement()\n .getRotationToPreferredFront();\n objectRotation = preferredRotation.rotationRoundTo90deg;\n lookAtSide =\n preferredRotation.lookAtSide.value === WALL_SIDES.LEFT ? -1 : 1;\n this._componentRaycastHelper?.setObject(planObjectViewModel.getObject());\n }\n const planObjectId = planObjectViewModel?.getConfigurationRuntimeId();\n if (this._configuratorContext.planObjectId !== planObjectId) {\n this._configuratorContext.planObjectId = planObjectId;\n }\n\n // unselect all plan elements, otherwise meshes are still highlighted in configurator\n this._plannerSceneEventHandler.removeSelection();\n this._planElementHighlighter.clearHighlighting();\n\n if (!this._configureInRoom) {\n this._getViewModel().hideAllExcept(planElementId);\n }\n\n // Turn off lights, return lighting and env maps to normal conditions for configure.\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(false);\n }\n\n this.configuratorCameraBehaviour\n .resetCameraOnStartConfiguring(\n this.getBounds(),\n currentCameraParameters,\n objectRotation,\n lookAtSide,\n )\n .then(() => {\n // update environment because we did hide other objects\n this.updateEnvironment(this.getBounds(), true);\n });\n\n this.setEventHandlerObject(planObjectViewModel.getContainer());\n\n this.disablePlannerEvents();\n this.enableConfiguratorEvents();\n this._roomleRenderer?.switchToConfigurator(); // this._roomleRenderer could be null e.g.: if e2e=true\n this._imageRenderer.switchToConfiguratorSettings();\n this.updateScene();\n this._getKernelAccess().updatePlanObjectDependencies(planObjectId);\n this._getKernelAccess().requestPartListAndUpdatePricesOfParts();\n this._getKernelAccess().planObjectUpdated(planObjectId, false);\n\n const planInteractionHandler =\n this._plannerKernelAccess?.planInteractionHandler;\n planInteractionHandler?.startInteraction();\n }\n\n private _setCameraPosition() {\n this._cameraState =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n }\n\n private _resetCameraPosition(cameraParameters: CameraParameter) {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n if (!this._cameraState) {\n return;\n }\n this.plannerCameraBehaviour.updateCameraOnBackToPlanner(\n this.getBounds(),\n cameraParameters,\n this._cameraState,\n );\n }\n }\n\n public async selectPlanObject(runtimeId: number) {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n if (selectedIds.includes(runtimeId)) {\n return;\n }\n runtimeId = this.getRootPlanObjectId(runtimeId);\n\n const planObjectViewModel =\n this._getViewModel().getPlanObjectForId(runtimeId);\n await this._plannerSceneEventHandler.selectPlanElement(planObjectViewModel);\n }\n\n public backToPlanner() {\n if (this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER) {\n return;\n }\n if (this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n const planInteractionHandler =\n this._plannerKernelAccess?.planInteractionHandler;\n planInteractionHandler?.endInteraction();\n const isExtObj = this._getKernelAccess().kernelInstance.getPlanObject(\n this.currentSelection?.configurationRuntimeId ?? 0,\n )?.externalObject;\n if (isExtObj) {\n this.notifyPlannerOnComponentSelectionCancel(\n true,\n 'isolation_mode_cancelled',\n );\n }\n }\n this._configuratorContext.baseContext = BASE_CONTEXT.PLANNER;\n\n const currentCameraParams =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n\n const cameraType = this._getViewModel().cameraType;\n this._changeCameraBehaviour(\n cameraType === CAMERA_TYPE.CAMERA_3D ||\n cameraType === CAMERA_TYPE.CAMERA_FP\n ? new Planner3dCameraBehaviour(\n this._getCameraControl3D(currentCameraParams),\n this._cameraBehaviourState,\n )\n : new Planner2dCameraBehaviour(\n this._getCameraControl2D(),\n this._cameraBehaviourState,\n ),\n );\n\n // Turn on lights, return lighting and env maps to lighting conditions when done configuring.\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(true);\n }\n\n this._resetCameraPosition(currentCameraParams);\n this._getViewModel().showAll();\n\n this.setEventHandlerObject(this._scene);\n\n this.enablePlannerEvents();\n\n const is3D =\n this.cameraBehaviour.cameraControl instanceof CameraControl3D ||\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson;\n this._getViewModel().setCameraType(\n is3D ? CAMERA_TYPE.CAMERA_3D : CAMERA_TYPE.CAMERA_2D,\n );\n this.disableConfiguratorEvents();\n this._roomleRenderer?.switchToPlanner(\n // this._roomleRenderer could be null e.g.: if e2e=true\n this.cameraBehaviour.cameraControl instanceof CameraControl3D\n ? RenderMode.Mode3D\n : RenderMode.Mode2D,\n );\n this._imageRenderer.switchToPlannerSettings();\n this.updateScene();\n }\n\n private _getYRotationOfObject(object: Object3D): number {\n let objectDirection = object.getWorldDirection(new Vector3()).clone();\n objectDirection.y = 0;\n if (objectDirection.lengthSq() < 0.01) {\n objectDirection = new Vector3(0, 1, 0);\n objectDirection.applyQuaternion(object.quaternion);\n objectDirection.y = 0;\n }\n objectDirection.normalize();\n let angle = Math.asin(objectDirection.x);\n if (objectDirection.z < 0) {\n angle = Math.PI - angle;\n }\n // clamp to a value between 0 and 2 PI\n if (angle < 0) {\n angle += Math.PI * 2;\n }\n return angle;\n }\n\n public loadStaticPlanObjects() {\n const kernelPlanObjects: Map<string, StaticPlanObjectViewModel[]> =\n new Map();\n this._getViewModel()\n .getStaticPlanObjectViewModels()\n .forEach((planObjectViewModel) => {\n const planObject = planObjectViewModel.getPlanObject();\n if (kernelPlanObjects.has(planObject.getCatalogItemId())) {\n const objects = kernelPlanObjects.get(planObject.getCatalogItemId());\n objects.push(planObjectViewModel);\n } else {\n kernelPlanObjects.set(planObject.getCatalogItemId(), [\n planObjectViewModel,\n ]);\n }\n });\n\n this._rapiAccess\n .getItems(Array.from(kernelPlanObjects.keys()))\n .then((rapiItems: RapiItem[]) => {\n const promises: Array<Promise<void>> = [];\n rapiItems.forEach((rapiItem: RapiItem) => {\n this._getKernelAccess().catalogItemLoaded(rapiItem);\n kernelPlanObjects.get(rapiItem.id).forEach((planObjectViewModel) => {\n promises.push(\n new Promise<void>((resolve, reject) => {\n planObjectViewModel.setRapiItem(rapiItem).then(() => {\n this._requestRender();\n resolve();\n }, reject);\n }),\n );\n });\n });\n Promise.all(promises).then(() => this._staticItemsLoaded());\n });\n }\n\n public requestCatalogItem(catalogItemId: string): void {\n this._rapiAccess.getItem(catalogItemId).then((rapiItem: RapiItem) => {\n this._getKernelAccess().catalogItemLoaded(rapiItem);\n });\n }\n\n private _staticItemsLoaded() {\n this._requestRender();\n this._staticItemGuard.resolve();\n this._roomlePlannerUiCallback.onItemsLoaded();\n }\n\n public preload(id: string) {\n this._planId = id;\n const planGLTF = this._localStorageHelper.getItem(this._planId, PLAN_STORE);\n if (planGLTF) {\n this._loadGLTF(planGLTF).then((glb) => {\n this._preloadScene = glb;\n if (this._preloadScene) {\n this._scene.add(this._preloadScene);\n }\n this._requestRender();\n });\n }\n }\n\n public planXMLLoaded(plan: Plan): void {\n this.endPlanConstruction(plan);\n this.loadStaticPlanObjects();\n }\n\n private _activateCeilingLight() {\n this._getViewModel().handleInitialLights(\n this._renderer.capabilities.maxTextures,\n this._roomleRenderer.sceneRenderer.getQualityLevel(),\n );\n this._getViewModel().handleCeilingLights();\n }\n\n public planCompletelyLoaded(_plan: Plan): void {\n this._stopRendering = false;\n this._renderEverything();\n // move call to the next run loop otherwise elements will still be added to the scene\n setTimeout(() => this._planCompletelyLoadedGuard.resolve(), 0);\n\n // Handle ceiling lights and env map for lighting mode when plan loads.\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(true);\n this._activateCeilingLight();\n }\n\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.hide());\n this._getViewModel()\n .getMeasurementLineObjectViewModels()\n .forEach((measurementLineViewModel) =>\n measurementLineViewModel.hideDraggableNodes(),\n );\n }\n\n public handlerSwitchedPlans(fromPlan: Plan, toPlan: Plan): void {\n this._completelyLoaded = false;\n this._roomlePlannerUiCallback.onHandlerSwitchedPlans();\n this._getViewModel().setReference(toPlan);\n this._getKernelAccess().coupleReferences(this._getViewModel(), toPlan);\n this._getViewModel().setPlannerSceneEventHandler(\n this._plannerSceneEventHandler,\n );\n this._getViewModel().setGeometriesMergedListener(() => {\n this._renderEverything();\n });\n this._plannerSceneEventHandler.setPlanViewModel(this._getViewModel());\n if (fromPlan) {\n this.clearScene();\n }\n if (!this._initData.moc) {\n this._addSky();\n const planeGeometry = new PlaneGeometry(1000, 1000);\n planeGeometry.rotateX(-Math.PI / 2);\n const planeMaterial = MaterialCreator.createMeshStandardMaterial({\n color: '#f0f0f0',\n roughness: 1,\n metalness: 0,\n depthWrite: false,\n });\n // planeMaterial.opacity = 0.2;\n const plane = new Mesh(planeGeometry, planeMaterial);\n plane.name = 'Ground';\n plane.position.y = -0.01;\n plane.userData.isFloor = true;\n this._scene.add(plane);\n }\n this._setCeiling();\n\n this._staticItemGuard.reset();\n this._configurableItemGuard.reset();\n this._planCompletelyLoadedGuard.reset();\n\n const configurableItemPromise =\n this._plannerMeshGenerator.materialQueue.length > 0\n ? this._configurableItemGuard.wait()\n : Promise.resolve();\n Promise.all([\n this._staticItemGuard.wait(),\n configurableItemPromise,\n this._planCompletelyLoadedGuard.wait(),\n ]).then(this._itemsLoaded.bind(this));\n }\n\n private async _itemsLoaded() {\n const plan = this._getViewModel().getCorePlan();\n\n if (this._roomleRenderer) {\n const box = kernelBoxToThreeBox(plan.getBounds());\n this._roomleRenderer.updateBounds(box);\n this._imageRenderer.updateBounds(box);\n }\n\n await Promise.allSettled(this._itemsLoadingStatePromises);\n\n this._roomlePlannerUiCallback.onCompletelyLoaded();\n\n this.updateEnvironment(this.getBounds(), true);\n this._renderEverything();\n\n if (this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER) {\n this.plannerCameraBehaviour.resetCameraOnPlanCompletelyLoaded(\n this.getBounds(),\n );\n }\n this._completelyLoaded = true;\n\n Benchmark.end('loadingTime');\n\n this._readyForRender();\n }\n\n public beginPlanConstruction(_plan: Plan): void {\n // Keep tslint quite\n }\n\n public addPlanMesh(\n _plan: Plan,\n _material: any,\n _vertices: Float32Array,\n _indices: Int32Array,\n _uvCoords: Float32Array,\n _normals: Float32Array,\n _type: KernelEnum,\n ): void {\n // Keep tslint quite\n }\n\n public endPlanConstruction(_plan: Plan): void {\n this._renderLoopFunction = () => {\n this._scene.add(this._getViewModel().getConstructionGroup());\n this._scene.add(this._getViewModel().getCeilingGroup());\n this._scene.add(this._getViewModel().getFloorGroup());\n this._scene.add(this._getViewModel().getMeasurementLineGroup());\n this._scene.add(this._getViewModel().getWallAtticsGroup());\n\n if (this._isInteriorLightActive) {\n this._createCeilingLightGroup();\n }\n\n if (this._lightSetting?.needsBounds()) {\n this._lightSetting.updateBounds(this._getViewModel().getBoundingBox());\n }\n this._scene.remove(this._preloadScene);\n };\n }\n\n public async addPlanObjectToScene(\n planViewModel: PlanObjectViewModel,\n ): Promise<void> {\n if (!planViewModel) {\n return Promise.resolve();\n }\n\n let resolveItemLoadedPromise: () => void;\n let rejectItemLoadedPromise: () => void;\n try {\n const promise = new Promise<void>(\n (resolve, reject) => (\n (resolveItemLoadedPromise = resolve),\n (rejectItemLoadedPromise = reject)\n ),\n );\n this._itemsLoadingStatePromises.push(promise);\n const object3D = planViewModel.getContainer();\n fadeIn(object3D);\n this._scene.add(object3D);\n if (this._plannerSceneEventHandler.isDragIn()) {\n this._plannerSceneEventHandler.addComponentDragInHandler(planViewModel);\n this._requestRender();\n }\n this._roomlePlannerUiCallback.onPlanChanged();\n await planViewModel.isInitDone();\n this.updateEnvironment(this.getBounds());\n this._renderEverything();\n const planObject = this.getPlanObject(planViewModel.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.ADDED,\n planObjects.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n\n const isItemOrConfiguration =\n planViewModel instanceof ConfiguratorPlanObjectViewModel ||\n planViewModel instanceof StaticPlanObjectViewModel;\n\n if (this._initData.featureFlags.interiorLights) {\n addDemoLights(\n planViewModel as StaticPlanObjectViewModel,\n this._getViewModel(),\n this._isInteriorLightActive,\n );\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(true);\n }\n }\n\n if (\n isItemOrConfiguration &&\n !this._plannerSceneEventHandler.isDragIn() &&\n this.cameraBehaviour instanceof PlannerCameraBehaviour\n ) {\n {\n const isItemInFrustum = isBox3InFrustum(\n this.cameraBehaviour.cameraControl.getCamera(),\n planViewModel.getBounds(),\n );\n if (!isItemInFrustum) {\n this.plannerCameraBehaviour.updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n this.getBounds(),\n );\n } else {\n this.plannerCameraBehaviour.updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n this.getBounds(),\n );\n }\n }\n }\n } catch (e: any) {\n console.error(e);\n rejectItemLoadedPromise();\n }\n resolveItemLoadedPromise();\n }\n\n removePlanObjectFromScene(planViewModel: PlanElementViewModel): void {\n if (\n planViewModel instanceof WallPlanElementViewModel ||\n planViewModel instanceof NodePlanElementViewModel\n ) {\n this._sendWallDimensions();\n }\n if (planViewModel instanceof MeasurementLinePlanElementViewModel) {\n this._sendMeasurementLineDimension();\n }\n this._scene.remove(planViewModel.getContainer());\n planViewModel.clear();\n this.updateEnvironment(this.getBounds(), true);\n const isConstructionOrMeasurementPlanElement =\n planViewModel instanceof WallPlanElementViewModel ||\n planViewModel instanceof MeasurementLinePlanElementViewModel ||\n planViewModel instanceof NodePlanElementViewModel;\n if (\n !isConstructionOrMeasurementPlanElement &&\n this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER\n ) {\n this.plannerCameraBehaviour.updateCameraOnPlanElementRemoved(\n this.getBounds(),\n );\n }\n this._renderEverything();\n }\n\n public planElementChanged(\n plan: Plan,\n planElementViewModel: PlanElementViewModel,\n ): void {\n if (this._drawingEnabled) {\n this._sendWallDimensions(false); // show the measurements while wall drawing\n }\n\n const planElement = this._plannerSceneEventHandler.isDragIn()\n ? planElementViewModel\n : null;\n this._sendElementMeasurements(planElement);\n this._sendRoomAreaData();\n\n this.updateEnvironment(this.getBounds(), true);\n this._renderEverything();\n this._onPlanChanged();\n if (!this._plannerSceneEventHandler.isDragIn()) {\n const planObject = this.getPlanObject(planElementViewModel.getId());\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.MOVED,\n { ...planObject, ...{ data: null } },\n );\n }\n // Recalculate ceiling light power when the walls move around.\n if (\n planElementViewModel instanceof WallPlanElementViewModel &&\n plan.extRef &&\n plan.extRef.jsObject &&\n this._isInteriorLightActive\n ) {\n const planViewModel = plan.extRef.jsObject as PlanViewModel;\n planViewModel.handleCeilingLights();\n }\n }\n\n public exportGLB(_exportObjects?: Object3D[], _id?: string) {\n // three-refactor - GLTFExporter\n //this._scriptLoader\n // .fetch(GLTF_EXPORTER_FILE_NAME, { id: 'gltf-exporter' })\n // .then(() => {\n // let exporter = new (THREE as any).GLTFExporter();\n //\n // if (!exportObjects) {\n // exportObjects = [];\n // this._scene.children.forEach((child: any) => {\n // if (this._isPartOfScene(child)) {\n // exportObjects.push(child);\n // }\n // });\n // }\n //\n // // Parse the input and generate the glTF output\n // exporter.parse(\n // exportObjects,\n // (gltf: any) => {\n // let key = id ? id : 'test';\n // this._localStorageHelper.addItem(\n // key,\n // JSON.stringify(gltf),\n // PLAN_STORE\n // );\n // // download(gltf);\n //\n // // const blob = new Blob([gltf], {type: 'model/gltf-binary'});\n // // a.href = URL.createObjectURL(blob);\n // // a.download = 'scene.glb';\n // },\n // { binary: false, embedImages: true, forceIndices: true }\n // );\n // });\n }\n\n public importGLB(url: string) {\n this._loadGLB(url).then((object) => this._scene.add(object));\n }\n\n public clearScene() {\n this._plannerMeshGenerator.clear();\n this._getViewModel().sceneCleared();\n super.clearScene();\n }\n\n //https://threejs.org/examples/webgl_shaders_sky.html\n private _addSky() {\n const skyParams = {\n distance: 400000,\n turbidity: 10,\n rayleigh: 2,\n mieCoefficient: 0.005,\n mieDirectionalG: 0.8,\n inclination: 0.6, // elevation / inclination\n azimuth: 0, // Facing front\n };\n\n if (!this._sky) {\n //SKY\n this._sky = new Sky();\n this._sky.name = 'Sky';\n this._sky.scale.setScalar(450000);\n this._sky.frustumCulled = false;\n this._scene.add(this._sky);\n\n this._sky.material.uniforms.turbidity.value = skyParams.turbidity;\n this._sky.material.uniforms.rayleigh.value = skyParams.rayleigh;\n this._sky.material.uniforms.mieCoefficient.value =\n skyParams.mieCoefficient;\n this._sky.material.uniforms.mieDirectionalG.value =\n skyParams.mieDirectionalG;\n const sunPosition = viewSpacePositionFromUV(\n skyParams.distance,\n skyParams.azimuth,\n skyParams.inclination,\n );\n this._sky.material.uniforms.sunPosition.value.copy(sunPosition);\n\n // Add Sun Helper\n // three-refactor\n const sunSphere = new Mesh(\n new SphereGeometry(20000, 16, 8),\n new MeshBasicMaterial({ color: 0xffffff }),\n );\n sunSphere.name = 'Sunsphere';\n sunSphere.position.y = -700000;\n sunSphere.visible = false;\n //this._scene.add(sunSphere);\n sunSphere.position.set(sunPosition.x, -sunPosition.z, sunPosition.y);\n //sunSphere.visible = true;\n }\n\n if (this._lightSetting instanceof PlannerLightSetting) {\n this._lightSetting.updateSunPosition(\n skyParams.inclination,\n skyParams.azimuth,\n );\n }\n }\n\n public toggleConfigureInRoom() {\n this._configureInRoom = !this._configureInRoom;\n if (!this._roomleRenderer.isConfiguring) {\n return;\n }\n if (this._configureInRoom) {\n this._getViewModel().showAll();\n } else {\n this._hideAllExceptSelectedElement();\n }\n this._renderEverything();\n this.updateScene();\n }\n\n public switchTo2D() {\n if (this.cameraBehaviour?.cameraControl instanceof CameraControl2D) {\n return;\n }\n if (\n this.cameraBehaviour?.cameraControl instanceof CameraControlFirstPerson\n ) {\n this._getCameraControlFirstPerson().cleanUp();\n }\n\n this._roomleRenderer?.setCameraType(CAMERA_TYPE.CAMERA_2D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._plannerSceneEventHandler?.enable();\n\n for (const wallPlanObject of this._getViewModel().getWallPlanObjectViewModels()) {\n wallPlanObject.show();\n }\n\n this._getViewModel()\n .setCameraType(CAMERA_TYPE.CAMERA_2D)\n .then(() => this._planElementHighlighter.highlightPlanElement());\n\n this._roomleRenderer?.switchToPlanner(RenderMode.Mode2D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._renderEverything();\n\n this._changeCameraBehaviour(\n new Planner2dCameraBehaviour(\n this._getCameraControl2D(),\n this._cameraBehaviourState,\n ),\n );\n\n this._onCameraMove();\n (\n this.plannerCameraBehaviour as Planner2dCameraBehaviour\n ).resetCameraOnSwitchTo2d(this.getBounds());\n this._addCameraControlListener();\n this._setCeiling();\n\n this._roomlePlannerUiCallback.onCameraChanged(CAMERA_TYPE.CAMERA_2D);\n\n // set initial zoom factor, otherwise kernel won't send callbacks\n this._setKernelZoomFactor();\n\n this._onCameraMove();\n this._sendRoomMeasurements();\n }\n\n public switchTo3D() {\n if (this.cameraBehaviour?.cameraControl instanceof CameraControl3D) {\n return;\n }\n\n this._roomleRenderer?.setCameraType(CAMERA_TYPE.CAMERA_3D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._plannerSceneEventHandler?.enable();\n\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_3D);\n\n this._roomleRenderer?.switchToPlanner(RenderMode.Mode3D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._renderEverything();\n\n this._changeCameraBehaviour(\n new Planner3dCameraBehaviour(\n this._getCameraControl3D(),\n this._cameraBehaviourState,\n ),\n );\n\n this._onCameraMove();\n (\n this.plannerCameraBehaviour as Planner3dCameraBehaviour\n ).resetCameraOnSwitchTo3d(this.getBounds());\n this._addCameraControlListener();\n this._setCeiling();\n this._roomlePlannerUiCallback.onCameraChanged(CAMERA_TYPE.CAMERA_3D);\n }\n\n public switchToFirstPerson() {\n if (\n this.cameraBehaviour?.cameraControl instanceof CameraControlFirstPerson\n ) {\n return;\n }\n\n this._roomleRenderer?.setCameraType(CAMERA_TYPE.CAMERA_FP); // this._roomleRenderer could be null e.g.: if e2e=true\n this._plannerSceneEventHandler?.disable();\n\n this._plannerMeshGenerator.wallMeshes.forEach((mesh) =>\n setWallTransparency(mesh.material as Material, false, false),\n );\n\n this._getViewModel()\n .getWallPlanObjectViewModels()\n .forEach((wall) => {\n wall.show();\n });\n\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_FP);\n\n this._renderEverything();\n\n this._changeCameraBehaviour(\n new PlannerFpCameraBehaviour(\n this._getCameraControlFirstPerson(),\n this._cameraBehaviourState,\n ),\n );\n\n this._addCameraControlListener();\n this._setCeiling();\n\n this._roomlePlannerUiCallback.onCameraChanged(CAMERA_TYPE.CAMERA_FP);\n\n (\n this.plannerCameraBehaviour as PlannerFpCameraBehaviour\n ).resetCameraOnSwitchToFirstPerson();\n }\n\n protected onCameraChanged() {\n // do not call super\n }\n\n protected _setCameraControlListeners() {\n super._setCameraControlListeners();\n if (!(this.cameraBehaviour instanceof PlannerCameraBehaviour)) {\n return;\n }\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.IDLE,\n () => {\n this._onCameraIdle();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_MOVE,\n () => {\n this._onCameraMove();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.MOVING,\n () => {\n this._onCameraMove();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_IN,\n () => {\n this._onCameraMove();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_OUT,\n () => {\n this._onCameraMove();\n },\n this,\n );\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_CHANGE,\n () => {\n this._onCameraZoomChange();\n },\n this,\n );\n }\n\n private _onCameraZoomChange() {\n this._setKernelZoomFactor();\n }\n\n private _setKernelZoomFactor() {\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n if (zoomFactor && isFinite(zoomFactor) && zoomFactor >= 0) {\n this._getKernelAccess().planInteractionHandler?.setZoomFactor(zoomFactor);\n }\n this._plannerSceneEventHandler?.setKernelZoomFactor(zoomFactor);\n }\n\n private _setCeiling() {\n if (!this._getViewModel()) {\n return;\n }\n if (\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson\n ) {\n this._getViewModel().getCeilingGroup().visible = true;\n } else {\n this._getViewModel().getCeilingGroup().visible = false;\n }\n }\n\n public cameraBehaviourChanged() {\n super.cameraBehaviourChanged();\n this._plannerSceneEventHandler?.setCamera(\n this.cameraBehaviour.cameraControl.getCamera(),\n );\n this._updatePaperBackground();\n }\n\n private _updatePaperBackground() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n if (!this._paperBackground) {\n this._paperBackground = new PaperBackground();\n }\n this._scene?.add(this._paperBackground);\n this._requestRender();\n } else {\n if (this._paperBackground) {\n this._scene?.remove(this._paperBackground);\n }\n }\n }\n\n public sceneChanged() {\n // if this is called from constructor we do not need to setScene because this happens on instantiation\n // therefore _plannerSceneEventHandler is still undefined\n if (this._plannerSceneEventHandler) {\n // sceneChanges after everything is setup, tell all the others\n this._plannerSceneEventHandler.setObject(this._scene);\n }\n }\n\n protected _onKeyDown(event: KeyboardEvent) {\n super._onKeyDown(event);\n if (this._initData.debug) {\n this._checkNumKey(event);\n }\n\n // Copy (Ctrl+C or Cmd+C) and Paste (Ctrl+V or Cmd+V) events\n this._checkCopyPaste(event);\n\n // Undo (Ctrl+z or Cmd+z) and Paste (Ctrl+shift+z or Cmd+shift+z) events\n this._checkUndoRedo(event);\n\n //CMD or CTRL\n if (ctrlOrCmd(event)) {\n const numPressedKeys = getPressedKeysCount(event);\n const correctKeyPressed =\n (event.metaKey && event.key === 'Meta') ||\n (event.ctrlKey && event.key === 'Control');\n const selectionMode =\n numPressedKeys > 1\n ? SELECTION_MODE.STANDARD\n : correctKeyPressed\n ? SELECTION_MODE.MULTISELECT\n : SELECTION_MODE.STANDARD;\n this._plannerSceneEventHandler.setSelectionMode(selectionMode);\n }\n\n // Shift\n this._checkPanning(event);\n\n //Backspace\n if (\n this._plannerSceneEventHandler &&\n this._plannerSceneEventHandler.hasSelection() &&\n event.key &&\n (event.key === 'Backspace' || event.key === 'Delete')\n ) {\n this.deletePlanElementSelection();\n event.preventDefault();\n }\n }\n\n private async _checkCopyPaste(event: KeyboardEvent) {\n // Copy (Ctrl+C or Cmd+C)\n if (ctrlOrCmd(event) && event.key === 'c') {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n\n const selectedItemsIds: string[] = [];\n selectedIds.forEach((runtimeId) => {\n const item = this._getViewModel().getPlanObjectForId(runtimeId);\n const planElement = item.getPlanElement();\n const id =\n planElement.getCatalogItemId() || planElement.getConfigurationHash();\n selectedItemsIds.push(id);\n });\n ClipboardManager.copy(selectedItemsIds.join());\n }\n\n // Paste (Ctrl+V or Cmd+V)\n if (ctrlOrCmd(event) && event.key === 'v') {\n const clipboard = await ClipboardManager.paste();\n if (clipboard) {\n const selectedItemsIds = clipboard.split(',');\n const validItemIds = selectedItemsIds\n .map((id) => getIdQueryParam(id) || id)\n .filter((id) => id.includes(':'));\n this._insertRapiItems(validItemIds);\n }\n }\n }\n\n private _checkPanning(event: KeyboardEvent | MouseEvent) {\n if (\n event.shiftKey === true ||\n ((event as KeyboardEvent).key &&\n (event as KeyboardEvent).key.includes('Shift'))\n ) {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.enablePanning();\n event.preventDefault();\n }\n }\n }\n\n private _onMouseDown(inputEvent: InputEvent) {\n if ('event' in inputEvent) {\n this._checkPanning(inputEvent.event as KeyboardEvent);\n }\n }\n\n private _checkNumKey(event: KeyboardEvent) {\n //1\n if (event.key && event.key === '1') {\n this.switchTo2D();\n event.preventDefault();\n }\n\n //2\n if (event.key && event.key === '2') {\n this.switchTo3D();\n event.preventDefault();\n }\n\n //3\n if (event.key && event.key === '3') {\n this.switchToFirstPerson();\n event.preventDefault();\n }\n }\n\n protected _onKeyUp(event: KeyboardEvent, cleanup: boolean = false) {\n super._onKeyUp(event, cleanup);\n //CMD or CTRL\n if (ctrlOrCmd(event, true)) {\n const numPressedKeys = getPressedKeysCount(event);\n let selectionMode = SELECTION_MODE.STANDARD;\n const isMultiSelectKey = isCtrlOrCmd(event);\n if (!isMultiSelectKey && numPressedKeys === 1) {\n selectionMode = SELECTION_MODE.MULTISELECT;\n }\n this._plannerSceneEventHandler.setSelectionMode(selectionMode);\n event.preventDefault();\n }\n\n // Shift\n if (event.key && event.key.includes('Shift')) {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.disablePanning();\n event.preventDefault();\n }\n }\n // Escape\n if (event.key && (event.key === 'Escape' || event.key === 'Esc')) {\n if (this._drawingEnabled) {\n this.escapeDrawing(true);\n this._roomlePlannerUiCallback.onDrawCancel();\n }\n this.cancelDragIn();\n }\n }\n\n public async undo(): Promise<void> {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.cancelDrawing();\n planInteractionHandler.undo();\n this.cancelPlanElementSelection('undo');\n return Promise.resolve();\n }\n\n public async redo(): Promise<void> {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.redo();\n this.cancelPlanElementSelection('redo');\n return Promise.resolve();\n }\n\n public setMode(mode: Enumify<typeof CAMERA_TYPE>) {\n switch (mode) {\n case CAMERA_TYPE.CAMERA_2D:\n this.switchTo2D();\n break;\n case CAMERA_TYPE.CAMERA_3D:\n this.switchTo3D();\n break;\n case CAMERA_TYPE.CAMERA_FP:\n this.switchToFirstPerson();\n break;\n }\n }\n\n private _clearHighlighting() {\n this._planElementHighlighter.clearHighlighting();\n this._renderWithoutShadowsAndAO();\n }\n\n public highlightPlanElementsById(runtimeIds: number[] | null) {\n if (runtimeIds === null) {\n this._clearHighlighting();\n return;\n }\n\n this._planElementHighlighter.highlightPlanElements(runtimeIds);\n }\n\n public highlightPlanElementById(runtimeId: number | null) {\n if (runtimeId === null) {\n this._clearHighlighting();\n return;\n }\n runtimeId = this.getRootPlanObjectId(runtimeId);\n const planObjectViewModel =\n this._getViewModel().getPlanObjectForId(runtimeId);\n this._planElementHighlighter.highlightPlanElement(planObjectViewModel);\n }\n\n public destroy() {\n super.destroy();\n this._plannerMeshGenerator.removeMaterialLoadedListener();\n this._getViewModel().removeGeometriesMergedListener();\n }\n\n public planObjectConfigurationLoaded(\n plan: Plan,\n element: PlanElement,\n success: boolean,\n ): void {\n if (!success) {\n console.error(\n 'Plan object configuration loading failed',\n (element as PlanObject).getCatalogItemId() ||\n (element as PlanObject).getConfigurationHash(),\n );\n }\n if (plan && plan.extRef && element && element.extRef) {\n const planObjectViewModel = element.extRef\n .jsObject as PlanObjectViewModel;\n const runtimeId = planObjectViewModel\n .getPlanObject()\n .getConfigurationRuntimeId();\n if (runtimeId > 0) {\n this._getViewModel().constructComponents(runtimeId);\n }\n }\n }\n\n public async planObjectConfigurationChanged(\n _plan: Plan,\n element: PlanElementViewModel,\n ) {\n const planObject = this.getPlanObject(element.getId());\n let planObjects: UiPlanObject[];\n\n if (\n planObject &&\n !(element instanceof ConfiguratorPlanObjectViewModel) &&\n !(element instanceof ConfigurableConstructionPlanObjectViewModel)\n ) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.CHANGED,\n planObjects?.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n }\n\n public addMesh(\n _planElement: PlanElement,\n _material: any,\n _vertices: Float32Array,\n _indices: Int32Array,\n _uvCoords: Float32Array,\n _normals: Float32Array,\n ): void {\n // unused\n }\n\n public updateCameraOnDrawWalls() {\n this.plannerCameraBehaviour.updateCameraOnDrawWalls(this.getBounds());\n }\n\n public getBounds(): Box3 {\n if (!this._getViewModel()) {\n return null;\n }\n return this._getViewModel().getBoundingBox();\n }\n\n public getGeometryBounds(): Box3 {\n if (this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n return super.getGeometryBounds();\n }\n return this.getBounds();\n }\n\n public getPlanObject(id: number): KernelPlanObject {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n const planModelViewHelper = this._plannerKernelAccess.planModelViewHelper;\n const plan = planInteractionHandler.getPlan();\n return planModelViewHelper.getPlanObject(plan, id);\n }\n\n /**\n * This is needed to get the root plan object id in case a plan element is selected\n * which has been docked using `advanced docking`\n * @param id\n */\n public getRootPlanObjectId(id: number): number {\n if (!this._plannerKernelAccess?.kernelContainer) {\n return id;\n }\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n const planModelViewHelper = this._plannerKernelAccess.planModelViewHelper;\n const plan = planInteractionHandler.getPlan();\n return planModelViewHelper.getRootPlanObjectId(plan, id);\n }\n\n public cancelPlanElementSelection(reason: CancelSelectionReasons) {\n this._plannerSceneEventHandler.cancelSelection(reason);\n this._planElementHighlighter.clearHighlighting();\n this._requestRender();\n }\n\n public async deletePlanElements(runtimeIds: RuntimeId[]) {\n this.cancelPlanElementSelection('delete_object');\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.startInteraction();\n await this.deletePlanElementByIds(runtimeIds);\n planInteractionHandler.endInteraction();\n }\n\n public async deletePlanElementSelection() {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n await this.deletePlanElements(selectedIds);\n }\n\n public async deletePlanElementByIds(runtimeIds: number[]) {\n for (const id of runtimeIds) {\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(id);\n if (planObjectViewModel && planObjectViewModel.getObject()) {\n const planObject = this.getPlanObject(planObjectViewModel.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.REMOVED,\n planObjects.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n this._getKernelAccess().planInteractionHandler.removeElement(\n planObjectViewModel.getKernelObject(),\n );\n }\n }\n }\n\n public rotatePlanElements(ids: RuntimeId[], rotateBy: number) {\n const list =\n new (this._getKernelAccess().kernelContainer.PlanObjectPtrList)();\n const bounds = new Box3();\n let kernelCenter: KernelVector3 = { x: 0, y: 0, z: 0 };\n ids.forEach((id) => {\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(id);\n if (planObjectViewModel && planObjectViewModel.getObject()) {\n kernelCenter = planObjectViewModel.getPlanElement().getCenter();\n list.push_back(planObjectViewModel.getPlanElement());\n bounds.expandByObject(planObjectViewModel.getContainer());\n }\n });\n if (list.size() > 1) {\n const center = bounds.getCenter(new Vector3());\n kernelCenter = convertToKernel(center);\n }\n this._getKernelAccess().planInteractionHandler.rotateObjectsBy(\n list,\n rotateBy,\n kernelCenter,\n );\n }\n\n public rotatePlanElementSelection(rotateBy: number) {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n this.rotatePlanElements(selectedIds, rotateBy);\n }\n\n public planBoundsChanged(): void {\n this.updateEnvironment(this.getBounds());\n this._requestRender();\n }\n\n public planElementRemoved(element: PlanElement): void {\n if (this._configuratorContext.planElementId === element.getId()) {\n this._roomlePlannerUiCallback.onSelectionCancel('delete_object');\n this._configuratorContext.planElementId = 0;\n }\n this._onPlanChanged();\n this._renderEverything();\n\n if (this.scenePlanElementLightSources.length === 0) {\n this.toggleInteriorLightsSceneSettings(false);\n }\n }\n\n private _onPlanChanged() {\n this._roomlePlannerUiCallback.onPlanChanged();\n }\n\n public prepareTopImage(\n options: PrepareImageOptions = {},\n isolationMode?: boolean,\n ): Promise<Base64Image> {\n if (\n this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR &&\n isolationMode\n ) {\n return super.preparePerspectiveImage(options);\n }\n return new Promise<Base64Image>((resolve) => {\n this._getViewModel()\n .materialQueue.finished(true)\n .then(async () => {\n const cameraTarget = options.runtimeIds\n ? ImageRenderer.getCameraTargetForBBox(\n this._getViewModel().getBoundingBoxFromRuntimeIds(\n options.runtimeIds,\n ),\n 0.1,\n )\n : this._calculateBoundingBoxOfAllMeshes(0.1);\n this._lightSetting?.removeFromScene();\n\n const invisibleWalls = [];\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n await this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_2D);\n this._getViewModel().setNodeVisibility(false);\n\n for (const wallPlanObject of this._getViewModel().getWallPlanObjectViewModels()) {\n if (!wallPlanObject.isVisible()) {\n invisibleWalls.push(wallPlanObject);\n }\n wallPlanObject.show();\n }\n }\n\n if (options.runtimeIds) {\n this._getViewModel().hideAllExceptRuntimeIds(options.runtimeIds);\n }\n\n const image = await this._imageRenderer.prepareTopImage(\n this._scene,\n null,\n cameraTarget,\n options,\n );\n\n if (options.runtimeIds) {\n this._getViewModel().showAll();\n }\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n await this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_3D);\n }\n\n if (invisibleWalls.length) {\n for (const wallPlanObject of invisibleWalls) {\n wallPlanObject.hide();\n }\n }\n\n this._lightSetting?.addToScene();\n this._roomleRenderer?.clearCache();\n this._requestRender();\n resolve(image);\n });\n });\n }\n\n public preparePerspectiveImageOf(\n runtimeId: RuntimeId,\n options: PrepareImageOptions = {},\n ): Promise<Base64Image> {\n const object = this._getViewModel().getPlanObjectForId(runtimeId);\n if (!object) {\n const error = 'Object with runtimeId ' + runtimeId + ' not found';\n console.warn(error);\n throw new Error(error);\n }\n return this._preparePerspectiveImage({\n ...options,\n object: object.getObject().clone(),\n });\n }\n\n protected async _waitForAssets(): Promise<void> {\n await super._waitForAssets();\n await this._getViewModel().materialQueue.finished(true);\n }\n\n private _preparePerspectiveImage(\n options: PrepareImageOptionsPlanner = {},\n isolationMode?: boolean,\n ): Promise<Base64Image> {\n if (\n this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR &&\n isolationMode\n ) {\n return super.preparePerspectiveImage(options);\n }\n\n const restorePlannerEditModeState =\n this._handlePlannerIsolationModeState(isolationMode);\n\n return new Promise<Base64Image>((resolve, reject) => {\n this._getViewModel()\n .materialQueue.finished(true)\n .then(async () => {\n let camera: PerspectiveOffsetCamera | OrthographicOffsetCamera;\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n camera = this.cameraBehaviour.cameraControl.getCamera().clone();\n } else {\n camera = this.getPerspectiveOffsetCamera().clone();\n this._getViewModel().getCeilingGroup().visible = false;\n camera.layers.enableAll();\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_3D);\n }\n\n camera.resetOffset();\n const cameraTarget = !options.object\n ? options.runtimeIds\n ? ImageRenderer.getCameraTargetForBBox(\n this._getViewModel().getBoundingBoxFromRuntimeIds(\n options.runtimeIds,\n ),\n )\n : this._calculateBoundingBoxOfAllMeshes()\n : ImageRenderer.getCameraTargetForBBox(\n new Box3().setFromObject(options.object),\n );\n this._lightSetting?.removeFromScene();\n const scene = !options.object\n ? this._scene\n : createEmptySceneFromCurrent(this._scene);\n if (options.object) {\n scene.add(options.object);\n }\n\n if (options.runtimeIds) {\n this._getViewModel().hideAllExceptRuntimeIds(options.runtimeIds);\n }\n\n const image = await this._imageRenderer.preparePerspectiveImage(\n scene,\n null,\n camera as PerspectiveCamera,\n cameraTarget,\n options,\n undefined,\n (placedCamera) => {\n hideWallsBasedOnCamera(\n placedCamera,\n this._getViewModel().getWallPlanObjectViewModels(),\n );\n },\n );\n\n dispose(camera);\n\n if (options.runtimeIds) {\n this._getViewModel().showAll();\n }\n\n if (options.object) {\n dispose(scene);\n }\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_2D);\n this._getViewModel()\n .getWallPlanObjectViewModels()\n .forEach((node) => node.show());\n } else {\n hideWallsBasedOnCamera(\n this.cameraBehaviour.cameraControl.getCamera(),\n this._getViewModel().getWallPlanObjectViewModels(),\n );\n }\n\n this._lightSetting?.addToScene();\n this._roomleRenderer?.clearCache();\n this._requestRender();\n this._setCeiling();\n\n restorePlannerEditModeState();\n\n resolve(image);\n }, reject);\n });\n }\n\n private _handlePlannerIsolationModeState(\n isolationMode?: boolean,\n ): () => void {\n if (!isolationMode) {\n const previousContext = this._configuratorContext.baseContext;\n\n this._getViewModel().showAll();\n this._configuratorContext.baseContext = BASE_CONTEXT.PLANNER;\n\n return () => {\n this._configuratorContext.baseContext = previousContext;\n if (previousContext === BASE_CONTEXT.CONFIGURATOR) {\n // Because there might be a case that we already inside the focuse mode in edit mode\n if (!this._configureInRoom) {\n this._hideAllExceptSelectedElement();\n }\n }\n };\n }\n\n return () => null;\n }\n\n private _hideAllExceptSelectedElement(): void {\n const { planElementId } = this._configuratorContext;\n const selectedElement = this.getRootPlanObjectId(planElementId);\n this._getViewModel().hideAllExcept(selectedElement);\n }\n\n public preparePerspectiveImage(\n options: PrepareImageOptions = {},\n isolationMode?: boolean,\n ): Promise<Base64Image> {\n return this._preparePerspectiveImage(options, isolationMode);\n }\n\n protected _calculateBoundingBoxOfAllMeshes(\n spacing: number = 0,\n ): CameraTarget {\n const bounds = this.getBounds();\n return ImageRenderer.getCameraTargetForBBox(bounds, spacing);\n }\n\n public enableRotation() {\n this._plannerSceneEventHandler.setState(PLANNER_SCENE_EVENT_STATE.ROTATE);\n }\n\n public disableRotation() {\n this._plannerSceneEventHandler.resetState();\n }\n\n public enableSnapping() {\n this._plannerSceneEventHandler.enableSnapping();\n }\n\n public disableSnapping() {\n this._plannerSceneEventHandler.disableSnapping();\n }\n\n public enableAdvancedDocking() {\n this._plannerSceneEventHandler.enableAdvancedDocking();\n }\n\n public disableAdvancedDocking() {\n this._plannerSceneEventHandler.disableAdvancedDocking();\n }\n\n public showsChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ): boolean {\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planObject = planElementViewModel.getKernelObject();\n return this._plannerSceneEventHandler.showsChildrenOfPlanObject(\n planObject,\n );\n }\n return false;\n }\n\n public enableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planObject = planElementViewModel.getKernelObject();\n this._plannerSceneEventHandler.enableShowChildrenOfPlanObject(planObject);\n }\n }\n\n public disableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planObject = planElementViewModel.getKernelObject();\n this._plannerSceneEventHandler.disableShowChildrenOfPlanObject(\n planObject,\n );\n }\n }\n\n public dragIn(dragEvent: DragEvent) {\n if (this._plannerSceneEventHandler.getSelectedIds().length > 0) {\n this._plannerSceneEventHandler.cancelSelection('dragIn');\n }\n this._plannerSceneEventHandler.setDragIn(true, dragEvent);\n }\n\n public getPlannerSceneEventHandler() {\n return this._plannerSceneEventHandler;\n }\n\n public disablePlannerEvents() {\n this._plannerSceneEventHandler.disable();\n }\n\n public enablePlannerEvents() {\n this._plannerSceneEventHandler.enable();\n }\n\n protected _onCameraIdle() {\n if (super._onCameraIdle()) {\n this._sendRoomMeasurements();\n this._sendPlanObjectPositions();\n this._roomlePlannerUiCallback.onCameraIdle();\n this._sendElementMeasurements();\n this._hideAllNodeIfThereAreNoSelections();\n this._sendWallDimensions();\n }\n return true;\n }\n\n private _hideAllNodeIfThereAreNoSelections() {\n if (\n !this.currentSelection &&\n !this.getPlannerSceneEventHandler().isCurrentlyDrawing\n ) {\n this._getViewModel()\n .getMeasurementLineObjectViewModels()\n .forEach((measurementLineViewModel) =>\n measurementLineViewModel.hideDraggableNodes(),\n );\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.hide());\n }\n }\n\n protected _onCameraMove() {\n if (super._onCameraMove()) {\n this._roomlePlannerUiCallback.disableWallDimensions();\n this._roomlePlannerUiCallback.cameraStartsMoving();\n }\n this._updateNodeSize();\n this._renderEverything();\n return true;\n }\n\n private _showWallNodes() {\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.show());\n }\n\n private _updateNodeSize() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n const zoom =\n 1 /\n (this.cameraBehaviour.cameraControl.getCamera() as OrthographicCamera)\n .zoom;\n this._getViewModel().setNodeZoom(zoom);\n }\n }\n\n private _sendPlanObjectPositions(): void {\n if (this.cameraBehaviour.cameraControl.isLocked()) {\n return;\n }\n\n const { clientWidth, clientHeight } = this._domHelper.element;\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n\n if (selectedIds.length > 1) {\n this._sendMultiSelectionPosition(\n selectedIds,\n camera,\n clientWidth,\n clientHeight,\n );\n } else {\n this._sendSelectedPlanObjectPositions(camera, clientWidth, clientHeight);\n }\n }\n\n private _sendMultiSelectionPosition(\n selectedIds: RuntimeId[],\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ): void {\n const combinedBounds = new Box3();\n\n for (const id of selectedIds) {\n const planElement = this._getViewModel().getPlanObjectForId(id);\n if (planElement) {\n combinedBounds.expandByObject(planElement.getContainer());\n }\n }\n\n const center = combinedBounds.getCenter(new Vector3());\n const position2d = threeVectorToTransferableXY(\n getScreenXY(center, camera, clientWidth, clientHeight),\n );\n\n this._roomlePlannerUiCallback.onUpdatePlanObjectPositions([\n { runtimeIds: selectedIds, position2d },\n ]);\n }\n\n private _sendSelectedPlanObjectPositions(\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ): void {\n const viewModel = this._getViewModel();\n const planObjectPositions: PlanObjectPosition[] = [];\n\n const allPlanObjects: PlanElementViewModel[] = [\n ...viewModel.getStaticPlanObjectViewModels(),\n ...viewModel.getConfigurablePlanObjectViewModels(),\n ...viewModel.getConfigurableConstructionPlanObjectViewModels(),\n ...viewModel.getConstructionPlanObjectViewModels(),\n ...viewModel.getWallPlanObjectViewModels(),\n ...viewModel.getFloorPlanObjectViewModels(),\n ...viewModel.getNodePlanObjectViewModels(),\n ];\n\n for (const planElement of allPlanObjects) {\n planObjectPositions.push(\n createTransferableObjectPosition(\n planElement,\n camera,\n clientWidth,\n clientHeight,\n ),\n );\n }\n\n this._roomlePlannerUiCallback.onUpdatePlanObjectPositions(\n planObjectPositions,\n );\n }\n\n private _sendRoomAreaData(): void {\n const floorPlanObjectViewModels =\n this._getViewModel().getFloorPlanObjectViewModels();\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const floorsData: FloorAreaDataTransferable[] = [];\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n\n if (\n this._initData.debug &&\n this._debugSpheres.floorPoints.children.length\n ) {\n this._debugSpheres.floorPoints.clear();\n }\n\n for (const floor of floorPlanObjectViewModels) {\n const floorData = floor.getFloorData(zoomFactor);\n\n if (!floorData || !floorData.textPosition3d) {\n return;\n }\n\n floorData.roomLabel = (\n floor.getKernelObject() as KernelFloor\n ).getLabelObject();\n floorData.formattedArea =\n this._unitFormatter.formatSquareMMValueToUnitString(floorData.area);\n\n floorData.textPosition2d = getScreenXY(\n floorData.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n\n floorsData.push(toFloorAreaDataTransferable(floorData));\n\n if (this._initData.debug) {\n const geometry = new SphereGeometry(0.1, 32, 16);\n const material = new MeshBasicMaterial({ color: 0x0000ff });\n const textSphere = new Mesh(geometry, material);\n textSphere.position.copy(floorData.textPosition3d);\n this._debugSpheres.floorPoints.add(textSphere);\n }\n }\n\n if (floorsData.length > 0) {\n this._roomlePlannerUiCallback.onFloorPlanAreasUpdated(floorsData);\n }\n }\n\n private _updateMeasurementPositions(\n measurements: ConstructionMeasurement,\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ) {\n if (measurements.fromPosition3d) {\n measurements.fromPosition2d = getScreenXY(\n measurements.fromPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n }\n if (measurements.toPosition3d) {\n measurements.toPosition2d = getScreenXY(\n measurements.toPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n }\n if (measurements.textPosition3d) {\n measurements.textPosition2d = getScreenXY(\n measurements.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n }\n return measurements;\n }\n\n private _sendElementMeasurements(\n planElementViewModel?: PlanElementViewModel,\n ) {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n this._sendConstructionElementDimensions(planElementViewModel);\n this._sendObjectMeasurements(planElementViewModel);\n this._sendMeasurementLineDimension();\n }\n\n private _sendRoomMeasurements() {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n this._sendWallDimensions();\n this._sendRoomAreaData();\n }\n\n private _sendMeasurementLineDimension() {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const measurementLineDimensions: MeasurementLineDimensionTransferable[] =\n [];\n\n const measurementLineViewModels =\n this._getViewModel().getMeasurementLineObjectViewModels();\n for (const measurementLineViewModel of measurementLineViewModels) {\n const measurementLineDimension =\n measurementLineViewModel.getMeasurementLineDimension();\n\n measurementLineDimension.fromPosition2d = getScreenXY(\n measurementLineDimension.fromPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n measurementLineDimension.toPosition2d = getScreenXY(\n measurementLineDimension.toPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n\n measurementLineDimension.textPosition2d = getScreenXY(\n measurementLineDimension.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n measurementLineDimension.lengthFormatted =\n this._unitFormatter.formatMMValueToUnitString(\n measurementLineDimension.length,\n );\n\n measurementLineDimensions.push(\n toMeasurementLineDimensionToTransferable(measurementLineDimension),\n );\n }\n\n this._roomlePlannerUiCallback.onUpdateMeasurementLineDimensions(\n measurementLineDimensions,\n );\n }\n\n private _sendObjectMeasurements(planElementViewModel?: PlanElementViewModel) {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n\n if (!this.currentSelection && !planElementViewModel) {\n return;\n }\n\n const ids = this._plannerSceneEventHandler.getSelectedIds();\n if (ids.length === 0 && !planElementViewModel) {\n // We did not show object to wall Measurements for multi-select case\n return;\n }\n\n const planObjectViewModel =\n planElementViewModel || this._getViewModel().getPlanObjectForId(ids[0]);\n if (\n !planObjectViewModel ||\n planObjectViewModel instanceof ConstructionPlanObjectViewModel ||\n planObjectViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel ||\n (!(planObjectViewModel instanceof StaticPlanObjectViewModel) &&\n !(planObjectViewModel instanceof ConfiguratorPlanObjectViewModel))\n ) {\n return;\n }\n\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n\n const objectDimensions = planObjectViewModel.getObjectMeasurements(\n zoomFactor,\n clientWidth,\n clientHeight,\n );\n const transferableRectMeasurements = this.transformMeasurements(\n objectDimensions.rectMeasurements,\n camera,\n clientWidth,\n clientHeight,\n );\n const transferableObjectMeasurements = this.transformMeasurements(\n objectDimensions.objectMeasurements,\n camera,\n clientWidth,\n clientHeight,\n );\n const transferableObjectToWallsMeasurements = this.transformMeasurements(\n objectDimensions.objectToWallsMeasurements,\n camera,\n clientWidth,\n clientHeight,\n );\n\n this._roomlePlannerUiCallback.onUpdateObjectMeasurements({\n rectMeasurements: transferableRectMeasurements,\n objectMeasurements: transferableObjectMeasurements,\n objectToWallsMeasurements: transferableObjectToWallsMeasurements,\n });\n }\n\n private transformMeasurements(\n dimensions: ObjectWallDimension[],\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ): ObjectToWallDimensionTransferable[] {\n return dimensions.map((dimension) => {\n const fromPosition2d = getScreenXY(\n dimension.fromPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n const toPosition2d = getScreenXY(\n dimension.toPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n const textPosition2d = getScreenXY(\n dimension.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n\n return objectToWallDimensionToTransferable({\n ...dimension,\n fromPosition2d,\n toPosition2d,\n textPosition2d,\n });\n });\n }\n\n private _sendConstructionElementDimensions(\n planElementViewModel?: PlanElementViewModel,\n ) {\n if (!this.currentSelection && !planElementViewModel) {\n return;\n }\n\n const planObjectViewModel =\n planElementViewModel ||\n this._getViewModel().getPlanObjectForId(\n this.currentSelection.staticItemRuntimeId ||\n this.currentSelection.configurationRuntimeId,\n );\n if (\n !planObjectViewModel ||\n !(\n planObjectViewModel instanceof ConstructionPlanObjectViewModel ||\n planObjectViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel\n )\n ) {\n return;\n }\n if (\n this._initData.debug &&\n this._debugSpheres.constructionElementsPoints.children.length > 0\n ) {\n this._debugSpheres.constructionElementsPoints.clear();\n }\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n const constructionMeasurements = (\n planObjectViewModel as\n | ConstructionPlanObjectViewModel\n | ConfigurableConstructionPlanObjectViewModel\n ).getConstructionElementMeasurements(zoomFactor, clientWidth, clientHeight);\n\n if (!constructionMeasurements) {\n return;\n }\n\n if (this._initData.debug) {\n const redMaterial = new MeshBasicMaterial({ color: 0xff0000 });\n const greenMaterial = new MeshBasicMaterial({ color: 0x00ff00 });\n const blueMaterial = new MeshBasicMaterial({ color: 0x0000ff });\n const sphereGeometry = new SphereGeometry(0.1, 32, 16);\n\n const leftFromSphere = new Mesh(sphereGeometry, redMaterial);\n leftFromSphere.position.copy(\n constructionMeasurements.leftMeasurement.fromPosition3d,\n );\n leftFromSphere.position.y = 5;\n const leftToSphere = new Mesh(sphereGeometry, redMaterial);\n leftToSphere.position.copy(\n constructionMeasurements.leftMeasurement.toPosition3d,\n );\n leftToSphere.position.y = 5;\n\n const rightFromSphere = new Mesh(sphereGeometry, greenMaterial);\n rightFromSphere.position.copy(\n constructionMeasurements.rightMeasurement.fromPosition3d,\n );\n rightFromSphere.position.y = 5;\n const rightToSphere = new Mesh(sphereGeometry, greenMaterial);\n rightToSphere.position.copy(\n constructionMeasurements.rightMeasurement.toPosition3d,\n );\n rightToSphere.position.y = 5;\n const rangeFromSphere = new Mesh(sphereGeometry, blueMaterial);\n rangeFromSphere.position.copy(\n constructionMeasurements.elementRange.fromPosition3d,\n );\n rangeFromSphere.position.y = 5;\n const rangeToSphere = new Mesh(sphereGeometry, blueMaterial);\n rangeToSphere.position.copy(\n constructionMeasurements.elementRange.toPosition3d,\n );\n rangeToSphere.position.y = 5;\n\n this._debugSpheres.constructionElementsPoints.add(leftFromSphere);\n this._debugSpheres.constructionElementsPoints.add(leftToSphere);\n this._debugSpheres.constructionElementsPoints.add(rightFromSphere);\n this._debugSpheres.constructionElementsPoints.add(rightToSphere);\n this._debugSpheres.constructionElementsPoints.add(rangeFromSphere);\n this._debugSpheres.constructionElementsPoints.add(rangeToSphere);\n }\n constructionMeasurements.leftMeasurement = this._updateMeasurementPositions(\n constructionMeasurements.leftMeasurement,\n camera,\n clientWidth,\n clientHeight,\n );\n constructionMeasurements.rightMeasurement =\n this._updateMeasurementPositions(\n constructionMeasurements.rightMeasurement,\n camera,\n clientWidth,\n clientHeight,\n );\n constructionMeasurements.elementRange = this._updateMeasurementPositions(\n constructionMeasurements.elementRange,\n camera,\n clientWidth,\n clientHeight,\n );\n const transferableMeasurements: ConstructionMeasurementsTransferable = {\n leftMeasurement: {\n ...toConstructionMeasurementTransferable(\n constructionMeasurements.leftMeasurement,\n ),\n },\n rightMeasurement: {\n ...toConstructionMeasurementTransferable(\n constructionMeasurements.rightMeasurement,\n ),\n },\n elementRange: {\n ...toConstructionMeasurementTransferable(\n constructionMeasurements.elementRange,\n ),\n },\n };\n this._roomlePlannerUiCallback.onUpdateConstructionElementsMeasurements(\n transferableMeasurements,\n );\n }\n\n private _sendWallDimensions(isFixedWalls = true) {\n if (\n this._initData.debug &&\n this._debugSpheres.wallPoints.children.length > 0\n ) {\n this._debugSpheres.wallPoints.clear();\n }\n\n sendWallDimensions(\n this._domHelper,\n this.cameraBehaviour,\n this._roomlePlannerUiCallback,\n this._plannerSceneEventHandler,\n this._getViewModel(),\n this._unitFormatter,\n this._debugSpheres,\n isFixedWalls,\n this._initData.debug,\n );\n }\n\n enableWallDrawing() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n const bounds = getDrawingMinBounds(\n this.getBounds(),\n this._domHelper.element.clientWidth,\n this._domHelper.element.clientHeight,\n );\n this.plannerCameraBehaviour.resetCameraOnEnableWallDrawing(bounds);\n }\n\n if (this._drawingEnabled) {\n // return if drawing is enabled so that eventListeners are not added multiple times\n return;\n }\n this._drawingEnabled = true;\n this._scene.add(this._plannerSceneEventHandler.enableWallDrawing());\n }\n\n disableWallDrawing() {\n this._drawingEnabled = false;\n this.cameraBehaviour.cameraControl.unlock();\n this._scene.remove(this._plannerSceneEventHandler.cancelWallDrawing());\n }\n\n public escapeDrawing(cancelDrawing: boolean) {\n this._plannerSceneEventHandler.stopDrawing(cancelDrawing);\n }\n\n public cancelDragIn() {\n if (this._plannerSceneEventHandler.isDragIn()) {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n this._plannerSceneEventHandler.cancelSelection('delete_object');\n this._plannerSceneEventHandler.setDragIn(false);\n this._getInputManager().forceMouseUp();\n this.deletePlanElements(selectedIds);\n }\n }\n\n public setSceneEvents(sceneEvents: SceneEvents) {\n if (\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson\n ) {\n return;\n }\n if (sceneEvents.construction !== undefined) {\n this._plannerSceneEventHandler?.enableConstructionEvents(\n sceneEvents.construction,\n );\n }\n if (sceneEvents.objects !== undefined) {\n this._plannerSceneEventHandler?.enableObjectEvents(sceneEvents.objects);\n }\n }\n\n /**\n * called by kernel\n */\n public startedDrawing(): void {\n this._plannerSceneEventHandler.startDrawing();\n this._showWallNodes();\n }\n\n /**\n * called by kernel\n */\n public stoppedDrawing(): void {\n this._plannerSceneEventHandler.stopDrawing();\n }\n\n public disableEvents() {\n super.disableEvents();\n this.disablePlannerEvents();\n }\n\n public enableEvents() {\n super.enableEvents();\n if (\n this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER &&\n !(this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson)\n ) {\n this.enablePlannerEvents();\n }\n }\n\n public resetCameraPositionToStart() {\n this.plannerCameraBehaviour.externalApiResetCameraPosition(\n this.getBounds(),\n );\n }\n\n async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n if (\n this.plannerCameraBehaviour instanceof Planner3dCameraBehaviour ||\n this.plannerCameraBehaviour instanceof ConfiguratorCameraBehaviour\n ) {\n return this.plannerCameraBehaviour.externalApiMoveCamera(cameraParameter);\n }\n return Promise.resolve();\n }\n\n protected _setInteriorOrExteriorWallMaterial(\n type: Enumify<typeof SET_WALL_MATERIAL_TYPE>,\n material: BatchPaintMaterial,\n ) {\n const viewModel = this._getViewModel();\n const wallPlanObjectViewModels = viewModel.getWallPlanObjectViewModels();\n\n if (!wallPlanObjectViewModels.length) {\n return;\n }\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n\n const setLeftMaterial = (wall: KernelWall) => {\n planInteractionHandler.setWallLeftMaterial(\n wall,\n applyMaterialToKernelMaterial(wall.leftMaterial, material),\n );\n };\n const setRightMaterial = (wall: KernelWall) => {\n planInteractionHandler.setWallRightMaterial(\n wall,\n applyMaterialToKernelMaterial(wall.rightMaterial, material),\n );\n };\n\n const kernelWalls = wallPlanObjectViewModels.map((wall) =>\n wall.getKernelObject(),\n );\n\n // TODO: Find a way to deal with standalone walls\n // const kernelStandAloneWallEnum =\n // this._plannerKernelAccess.kernelContainer.WallType.StandAloneWall;\n const kernelInnerWallEnum =\n this._plannerKernelAccess.kernelContainer.WallType.InnerWall;\n const kernelOuterWallLeftEnum =\n this._plannerKernelAccess.kernelContainer.WallType.OuterWallLeft;\n const kernelOuterWallRightEnum =\n this._plannerKernelAccess.kernelContainer.WallType.OuterWallRight;\n\n for (const wall of kernelWalls) {\n if (\n wall.wallType === kernelInnerWallEnum &&\n type === SET_WALL_MATERIAL_TYPE.INTERIOR\n ) {\n setLeftMaterial(wall);\n setRightMaterial(wall);\n }\n\n if (wall.wallType === kernelOuterWallLeftEnum) {\n if (type === SET_WALL_MATERIAL_TYPE.INTERIOR) {\n setRightMaterial(wall);\n } else {\n setLeftMaterial(wall);\n }\n }\n\n if (wall.wallType === kernelOuterWallRightEnum) {\n if (type === SET_WALL_MATERIAL_TYPE.EXTERIOR) {\n setRightMaterial(wall);\n } else {\n setLeftMaterial(wall);\n }\n }\n\n // TODO: Find a way to deal with standalone walls\n // if (wall.wallType === kernelStandAloneWallEnum) {\n // setLeftMaterial(wall);\n // setRightMaterial(wall);\n // }\n }\n }\n\n public changeInteriorWallsMaterial(material: BatchPaintMaterial) {\n this._setInteriorOrExteriorWallMaterial(\n SET_WALL_MATERIAL_TYPE.INTERIOR,\n material,\n );\n }\n\n public changeExteriorWallsMaterial(material: BatchPaintMaterial) {\n this._setInteriorOrExteriorWallMaterial(\n SET_WALL_MATERIAL_TYPE.EXTERIOR,\n material,\n );\n }\n\n public changeFloorsMaterial(material: BatchPaintMaterial) {\n const viewModel = this._getViewModel();\n const floorPlanObjectViewModels = viewModel.getFloorPlanObjectViewModels();\n\n if (!floorPlanObjectViewModels.length) {\n return;\n }\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n\n const kernelFloors = floorPlanObjectViewModels.map(\n (floor: FloorPlanElementViewModel) =>\n floor.getKernelObject() as KernelFloor,\n );\n\n planInteractionHandler.startInteraction();\n for (const floor of kernelFloors) {\n planInteractionHandler.setFloorMaterial(\n floor as KernelFloor,\n applyMaterialToKernelMaterial(\n floor.material,\n material,\n ) as KernelFloorMaterial,\n );\n }\n planInteractionHandler.endInteraction();\n }\n\n public getWallAngleDegrees(wall: WallPlanElementViewModel): number {\n if (!(wall instanceof WallPlanElementViewModel)) {\n return 0;\n }\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const cameraPosition = new Vector2(camera.position.x, camera.position.z);\n const wallPosition = new Vector2(\n wall.getPosition().x,\n wall.getPosition().z,\n );\n const cameraToWall = wallPosition.clone().sub(cameraPosition).normalize();\n const wallKernelObject = wall.getKernelObject();\n const wallForward = new Vector2(\n Math.sin(wallKernelObject.getAngle()),\n Math.cos(wallKernelObject.getAngle()),\n );\n const angleRadians = cameraToWall.angle() - wallForward.angle();\n return MathUtils.radToDeg(angleRadians);\n }\n\n public moveElementPosition(\n selectedElement: PlanElementViewModel,\n position: KernelVector3,\n ) {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.setObjectFixedZ(\n selectedElement.getPlanElement(),\n true,\n );\n const elementCenter = selectedElement.getPlanElement().getCenter();\n const distance = convertToTHREE(position).sub(\n convertToTHREE(elementCenter),\n );\n planInteractionHandler.moveElementBy(\n selectedElement.getPlanElement(),\n convertToKernel(distance),\n );\n planInteractionHandler.setObjectFixedZ(\n selectedElement.getPlanElement(),\n false,\n );\n this._sendPlanObjectPositions();\n }\n\n public moveElementsPosition(\n selectedElements: PlanElementViewModel[],\n position: KernelVector3,\n ) {\n const planObjectPtrList: KernelObjectPtrList =\n new this._plannerKernelAccess.kernelContainer.PlanObjectPtrList();\n const distance = convertToTHREE(position).sub(\n selectedElements[selectedElements.length - 1].getPosition(),\n );\n selectedElements.forEach((planElementViewModel) =>\n planObjectPtrList.push_back(planElementViewModel.getPlanElement()),\n );\n const vector3 = convertToKernel(distance);\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.moveObjectsBy(planObjectPtrList, vector3);\n\n this._sendPlanObjectPositions();\n }\n\n protected get plannerCameraBehaviour() {\n return this.cameraBehaviour as\n | Planner2dCameraBehaviour\n | Planner3dCameraBehaviour\n | PlannerFpCameraBehaviour;\n }\n\n public enableMeasurementLineDrawing() {\n this._roomlePlannerUiCallback.onMeasurementLineStateChange(true);\n this._plannerSceneEventHandler.enableMeasurementLineDrawing();\n }\n\n public disableMeasurementLineDrawing() {\n this._plannerSceneEventHandler.disableMeasurementLineDrawing();\n }\n\n public setCompletelyLoaded(completelyLoaded: boolean) {\n this._completelyLoaded = completelyLoaded;\n }\n\n protected enablePanning() {\n if (this.plannerCameraBehaviour instanceof Planner3dCameraBehaviour) {\n this.plannerCameraBehaviour.enablePanningOnShiftClick();\n }\n }\n\n protected disablePanning() {\n if (this.plannerCameraBehaviour instanceof Planner3dCameraBehaviour) {\n this.plannerCameraBehaviour.disablePanningOnShiftRelease();\n }\n }\n\n public setObjectToWallMeasurementLength(\n planElementId: number,\n measurementId: number,\n length: number,\n ) {\n const planObject = this._getViewModel().getPlanObjectForId(planElementId);\n\n const kernelPlanElement = planObject.getPlanElement();\n\n const wallDistances = convertToStandardArray(\n kernelPlanElement.getWallDistances(),\n );\n const wallDistance = wallDistances.find(\n (w) => hashCode(w.angle + '_' + w.length) === measurementId,\n );\n\n if (!wallDistance) {\n return;\n }\n\n const startPoint = convertToTHREE(wallDistance.startPoint);\n const endPoint = convertToTHREE(wallDistance.endPoint);\n\n const direction = startPoint.clone().sub(endPoint).normalize();\n\n const newLength = (length - wallDistance.length) / 1000;\n\n const position = planObject\n .getPosition()\n .clone()\n .add(direction.multiplyScalar(newLength));\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n\n planInteractionHandler.moveElementToIn2d(\n kernelPlanElement,\n convertToKernel(position),\n );\n\n this._sendObjectMeasurements();\n }\n\n public setWallMeasurementLength(\n measurementId: number,\n length: number,\n wallDirection: EMSConstant,\n ) {\n const isCurrentlyDrawing =\n this.getPlannerSceneEventHandler().isCurrentlyDrawing;\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n let wallPlanObject = this._getViewModel().getPlanObjectForId(measurementId);\n const isVectorPreviewModeEnabled =\n planInteractionHandler.isVectorPreviewModeEnabled();\n if (isCurrentlyDrawing && !isVectorPreviewModeEnabled) {\n const nodePlanObject = this._getViewModel().latestNodePlanObjectViewModel;\n const kernelPosition = convertToKernel(nodePlanObject.getPosition());\n planInteractionHandler.endDrawing(kernelPosition);\n this.escapeDrawing(false);\n wallPlanObject = this._getViewModel().latestWallPlanObjectViewModel;\n }\n\n if (wallPlanObject) {\n const wallKernelObject = wallPlanObject.getKernelObject();\n\n planInteractionHandler.startInteraction();\n planInteractionHandler.setLengthOfWall(\n wallKernelObject as KernelWall,\n length,\n (wallKernelObject as any).getPreferredSide(),\n wallDirection,\n true,\n );\n planInteractionHandler.endInteraction();\n }\n if (isCurrentlyDrawing && !isVectorPreviewModeEnabled) {\n planInteractionHandler.startInteraction();\n const nodePlanObject = this._getViewModel().latestNodePlanObjectViewModel;\n const kernelPosition = convertToKernel(nodePlanObject.getPosition());\n planInteractionHandler.beginDrawing(kernelPosition, false);\n this._plannerSceneEventHandler.startDrawing();\n }\n }\n\n public setMeasurementLineLength(\n measurementId: number,\n length: number,\n wallDirection: string,\n ) {\n const planObject = this._getViewModel().getPlanObjectForId(measurementId);\n this._plannerSceneEventHandler.setMeasurementLineLength(\n planObject as MeasurementLinePlanElementViewModel,\n length,\n wallDirection,\n );\n }\n\n protected setEventHandlerObject(object: Object3D) {\n super.setEventHandlerObject(object);\n this._plannerSceneEventHandler.setObject(object);\n }\n\n // info when scene is ready to render, used for testing\n protected _readyForRender() {\n console.log('ready_for_render');\n this._roomlePlannerUiCallback.onReadyForRender();\n this._globalCallback.onReadyForRender();\n }\n\n protected notifyPlannerOnComponentSelectionCancel(\n isExtObj: boolean,\n reason: CancelSelectionReasons,\n ): void {\n if (isExtObj) {\n if (this.configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n if (reason === 'click_outside') {\n const selectedPlanObjectComponent = this.getObjectComponent(\n this.configuratorContext.rootComponentId ??\n this.configuratorContext.planObjectId,\n );\n this._roomlePlannerUiCallback.onExternalObjectModuleSelected(\n selectedPlanObjectComponent.externalObjectGroupId,\n null,\n null,\n );\n }\n } else {\n this._roomlePlannerUiCallback.onExternalObjectSelectionCancel(reason);\n }\n } else {\n this._roomlePlannerUiCallback.onComponentSelectionCancel();\n }\n }\n\n private _planObjectSelectionChanged(\n configurationRuntimeId: number,\n elementRuntimeId: number,\n ) {\n const planObjectComponent = this.getObjectComponent(\n elementRuntimeId ?? configurationRuntimeId,\n );\n if (\n planObjectComponent?.configurationType?.value !==\n CONFIGURATION_TYPE.EXTERNAL\n ) {\n return;\n }\n const selectedPlanObjectComponent = this.getObjectComponent(\n this.configuratorContext.selectedRuntimeComponentId ??\n this.configuratorContext.planObjectId,\n );\n if (\n selectedPlanObjectComponent.externalRootModuleId ===\n planObjectComponent.externalRootModuleId &&\n selectedPlanObjectComponent.externalSubModuleId ===\n planObjectComponent.externalSubModuleId\n ) {\n return;\n }\n this._getKernelAccess().planObjectSelectionChanged(\n configurationRuntimeId,\n elementRuntimeId,\n );\n }\n\n public highlightExternalObject(\n planObjectComponent: KernelPlanObjectComponent,\n ) {\n this.highlightPlanElementById(planObjectComponent.runtimeId);\n this._renderWithoutShadowsAndAO();\n }\n\n private _selectExternalObjectModule() {\n if (\n this._getKernelAccess()?.kernelContainer &&\n !this._configuratorContext.selectedRuntimeComponentId\n ) {\n const planObject = this.getPlanObject(\n this._configuratorContext.planElementId,\n );\n if (planObject.configurationType?.value === CONFIGURATION_TYPE.EXTERNAL) {\n this.selectComponent(this._configuratorContext.rootComponentId);\n }\n }\n }\n\n public getObjectComponent(id: number): KernelPlanObjectComponent {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n const plan = planInteractionHandler.getPlan();\n const planModelViewHelper = this._getKernelAccess().planModelViewHelper;\n return planModelViewHelper.getObjectComponent(plan, id);\n }\n\n public getCameraParameters3d(): NonNullable<CameraParameter> {\n if (this._getViewModel().cameraType === CAMERA_TYPE.CAMERA_3D) {\n return this.cameraBehaviour3d.cameraControl.getCurrentCameraParameters();\n }\n return null;\n }\n\n private _createCeilingLightGroup() {\n const existingCeilingLightGroup = this._scene.children.find(\n (child) => child.name === GROUP_CEILING_LIGHTS,\n );\n if (!existingCeilingLightGroup) {\n this._scene.add(this._getViewModel().getCeilingLightsGroup());\n }\n }\n\n public toggleInteriorLightsSceneSettings(on: boolean) {\n if (this._initData.featureFlags.interiorLights) {\n this._isInteriorLightActive = on;\n this._scene.userData.environmentDefinition.rotation = on\n ? INTERIOR_LIGHTS_ENV_MAP_ROTATION\n : DEFAULT_ENV_MAP_ROTATION;\n this._scene.userData.environmentDefinition.intensity = on\n ? INTERIOR_LIGHTS_ENV_MAP_INTENSITY\n : DEFAULT_ENV_MAP_INTENSITY;\n if (this._isInteriorLightActive) {\n this._createCeilingLightGroup();\n this._activateCeilingLight();\n }\n this._getViewModel().toggleCeilingLights(on);\n this._requestRender();\n }\n }\n\n private async _insertRapiItems(ids: string[]): Promise<InsertItemResult[]> {\n const idInfos: InsertItemIdInfo[] = ids.map((id, index) => ({\n id,\n index,\n }));\n\n const rapiIds: InsertItemIdInfo[] = [];\n for (const { index, id } of idInfos) {\n rapiIds.push({ index, id });\n }\n\n return await this.insertRapiObjects(rapiIds);\n }\n\n public async insertRapiObjects(\n rapiIds: InsertItemIdInfo[],\n ): Promise<InsertItemResult[]> {\n const mapFun = ({ id }: InsertItemIdInfo) => {\n const item = isIdItemId(id)\n ? this._rapiAccess.getItem(id)\n : this._rapiAccess.getConfiguration(id);\n return item as Promise<RapiItem | RapiConfiguration>;\n };\n const itemsPromise = rapiIds.map(mapFun);\n const itemList = await Promise.all(itemsPromise);\n const rapiRuntimeIds =\n await this._plannerKernelAccess.insertItems(itemList);\n return rapiRuntimeIds.map((runtimeId, index) => {\n return { runtimeId, originalIndex: rapiIds[index].index };\n });\n }\n}\n","import type DomHelper from '../../common-core/src/utils/dom-helper';\nimport inject from '../../common-core/src/di/inject';\nimport PlannerSceneManager from './webgl/planner-scene-manager';\nimport type PlannerKernelAccess from './services/planner-kernel-access';\nimport Benchmark from '../../common-core/src/utils/benchmark';\nimport type RapiAccess from '../../common-core/src/rapi-access';\nimport {\n isPlanSnapshotId,\n USER_ACTION_MODULE,\n} from '../../common-core/src/rapi-access';\nimport type SinglePromiseFactory from '../../common-core/src/utils/single-promise-factory';\nimport { PROMISE_CATEGORY } from '../../common-core/src/utils/single-promise-factory';\nimport type RoomlePlannerUiCallback from './roomle-planner-ui-callback';\nimport { PLAN_ELEMENT_CHANGE_TYPES } from './roomle-planner-ui-callback';\nimport type { GlbViewer } from '../../glb-viewer-core/src/glb-viewer';\nimport {\n BASE_CONTEXT,\n type ExternalEmbeddable,\n type GlobalAPI,\n type KernelUtilityForUi,\n type RubensAPI,\n} from '../../common-core/src/main';\nimport type Main from '../../common-core/src/main';\nimport type { Configurator } from '../../configurator-core/src/configurator';\nimport type {\n GlobalInitDataDefinition,\n InitDataDefinition,\n} from '../../common-core/src/utils/shims';\nimport type {\n ConfigurationString,\n RapiConfiguration,\n RapiId,\n RapiItem,\n RapiPlan,\n RapiPlanSnapshotGetData,\n RapiPlanSnapshotGetDataWith3dUrls,\n RapiPlanSnapshotPostData,\n} from '../../typings/rapi-types';\nimport type LifeCycleManager from '../../common-core/src/life-cycle-manager';\nimport type { Context } from '../../common-core/src/di/context';\nimport {\n CORE_CHILD_ENTITY_MODE,\n type CancelSelectionReasons,\n type KernelObject,\n type KernelWall,\n type Plan,\n type PlanInteractionHandler,\n type PlanModelViewHelper,\n type PlanOverview,\n type KernelObjectConfiguration,\n} from '../../typings/planner';\nimport type { KernelAccessCallbackI } from '../../common-core/src/kernel-access-callback';\nimport type KernelAccessCallback from '../../common-core/src/kernel-access-callback';\nimport type DataSyncer from '../../common-core/src/services/data-syncer';\nimport type InitData from '../../common-core/src/utils/init-data';\nimport type GlobalInitData from '../../common-core/src/utils/global-init-data';\nimport type {\n CanvasOffset,\n Position3,\n} from '../../common-core/src/common-interfaces';\nimport { isIdItemId } from '../../common-core/src/utils/rapi-utils';\nimport {\n convertCObject,\n convertToKernel,\n} from '../../common-core/src/utils/kernel-utils';\nimport type { PrepareImageOptions } from '../../common-core/src/webgl/image-renderer';\nimport DynamicLightSettingLoader from '../../common-core/src/lightsetting/dynamic-light-setting-loader';\nimport { CONFIGURATION_TYPE } from '../../typings/kernel';\nimport type {\n KernelParameter,\n KernelPartList,\n KernelPartListPrice,\n KernelPlanObjectComponent,\n KernelVector3,\n RuntimeId,\n UiPlanObject,\n} from '../../typings/kernel';\nimport type UnitFormatter from '../../configurator-core/src/services/unit-formatter';\nimport RoomleConfigurator from '../../configurator-core/src/roomle-configurator';\nimport type {\n EMSConstant,\n PlannerKernelContainer,\n} from '../../typings/planner-kernel-container';\nimport type { Scene } from 'three';\nimport { Vector3 } from 'three';\nimport { mapToUiPlanObjects } from './utils/map-to-ui-plan-objects';\nimport type { CameraParameter } from '../../common-core/src/cameracontrol/camera-control';\nimport type PlanElementViewModel from '../../common-core/src/view-model/plan-element-view-model';\nimport type WallPlanElementViewModel from './view-model/wall-plan-element-view-model';\nimport { SELECTION_MODE } from '../../configurator-core/src/utils/selection-handler';\nimport type ConfiguratorContext from '../../common-core/src/webgl/configurator-context';\nimport type { KernelAttic, PlanObject, WallSide } from '../../typings/planner';\nimport type IdbManager from '../../common-core/src/services/idb-manager';\nimport type PlanViewModel from './view-model/plan-view-model';\nimport type ConfiguratorPlanObjectViewModel from '../../common-core/src/view-model/configurator-plan-object-view-model';\nimport type {\n ExternalObjectAPI,\n ExternalObjectApiConfiguration,\n ExternalRoomInformation,\n} from './external-object-api';\nimport type { GlobalCallback } from '../../common-core/src/services/global-callback';\nimport type {\n ExternalGroupData,\n ExternalObject,\n ExtObjId,\n} from '../../typings/external-objects';\nimport { isExternalObject, isExtObjId } from '../../common-core/src/roomle-sdk';\nimport type { PluginName } from '../../configurator-core/src/utils/plugin-types';\nimport { toDegrees, toRadiant } from '../../common-core/src/utils/math-helper';\nimport type { Nullable } from '../../typings/helper';\nimport { type MaybePromise } from '../../common-core/src/utils/common-utils';\nimport type { HomagIntelligence } from '../../homag-intelligence/src/homag-intelligence';\nimport type { RoomleLightSource } from '../../common-core/src/light/light-source';\n\nexport type ID_TYPE = 'rml_id' | 'tc_id' | 'rml_serialized' | 'tc_serialized';\nexport const EXT_OBJ_EXCEPTION =\n 'Could not retrieve configuration for external object! Did you implement onGetConfigurationForExternalObject?';\n\nexport interface RoomlePlannerCallback {\n switchToConfigurator: () => Promise<Configurator>;\n\n switchToViewer: () => Promise<GlbViewer>;\n\n cancelSelection: (reason: CancelSelectionReasons) => void;\n\n deleteSelection: () => void;\n\n rotateSelection: (rotateBy: number) => void;\n}\n\nexport interface WallDefinition {\n from: Position3;\n to: Position3;\n props?: { thickness?: number; height?: number };\n}\n\nexport interface InteractionOptions {\n keepInteractionOpen?: boolean;\n}\n\nconst OFFSET = { left: 0, top: 1, right: 1, bottom: 0 };\n\nconst enum MODE {\n CONFIGURATOR,\n PLANNER,\n GLB,\n}\n\nexport interface SceneEvents {\n /**\n * walls and wall nodes\n */\n construction?: boolean;\n /**\n * static and configurable items\n */\n objects?: boolean;\n}\n\nexport interface BatchPaintMaterial {\n id?: RapiId;\n materialId?: RapiId;\n color?: string;\n rgbValue?: number;\n catalogItemId?: RapiId;\n}\n\nexport interface InsertItemIdInfo {\n id: RapiId | ExtObjId;\n index: number;\n}\n\nexport interface InsertItemResult {\n runtimeId: RuntimeId;\n originalIndex: number;\n}\n\nexport default class RoomlePlanner<\n P extends readonly PluginName[] = readonly [],\n >\n implements\n KernelAccessCallbackI,\n RoomlePlannerCallback,\n GlobalAPI,\n Context,\n KernelUtilityForUi,\n ExternalEmbeddable<RoomlePlannerUiCallback>,\n RubensAPI,\n ExternalObjectAPI\n{\n public _creator_: string;\n\n private _activePlugins: P;\n\n private _homagIntelligence: HomagIntelligence | null = null;\n\n @inject\n private _configuratorContext: ConfiguratorContext;\n\n @inject\n private _domHelper: DomHelper;\n\n @inject\n private _kernelAccessCallback: KernelAccessCallback;\n\n @inject\n private _plannerKernelAccess: PlannerKernelAccess;\n\n @inject\n private _rapiAccess: RapiAccess;\n\n @inject\n private _singlePromiseFactory: SinglePromiseFactory;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n @inject\n private _lifeCycleManager: LifeCycleManager;\n\n @inject\n private _dataSyncer: DataSyncer;\n\n @inject\n protected _initData: InitData;\n\n @inject\n protected _idbManager: IdbManager;\n\n @inject\n private _globalInitData: GlobalInitData;\n\n @inject\n private _globalCallback: GlobalCallback;\n\n @inject\n private _unitFormatter: UnitFormatter;\n\n private _planInteractionHandler: PlanInteractionHandler;\n private _sceneManager: PlannerSceneManager;\n private _plan: Plan;\n private _preloadPlanId: string;\n private _kernelReadyCallback: () => void;\n private _hscInstance: Configurator = null;\n private _glbInstance: GlbViewer = null;\n private _configurator: RoomleConfigurator<P> = null;\n private _currentMode: MODE = MODE.PLANNER;\n\n constructor(creator: string, activePlugins?: P) {\n this._creator_ = creator;\n this._activePlugins = (activePlugins || []) as P;\n this._kernelAccessCallback.addListener(this);\n }\n\n public setEnvironmentMap(params: {\n url?: string;\n intensity?: number;\n rotation?: number;\n maxLightSources?: number;\n }): void {\n const { url, intensity, rotation, maxLightSources } = params;\n this._sceneManager.setEnvironmentMap(\n url,\n intensity,\n rotation,\n maxLightSources,\n );\n }\n\n public deleteSelection() {\n this._sceneManager.deletePlanElementSelection();\n }\n\n /**\n * rotates the selected item(s)\n * @param rotateBy angle in rad\n */\n public rotateSelection(rotateBy: number) {\n this._sceneManager.rotatePlanElementSelection(rotateBy);\n }\n\n public cancelSelection(reason: CancelSelectionReasons = 'unknown') {\n this._sceneManager.cancelPlanElementSelection(reason);\n }\n\n public init(\n element: HTMLElement,\n preloadPlanId?: string,\n options?: InitDataDefinition & GlobalInitDataDefinition,\n ): Promise<void> {\n Benchmark.start('loadingTime');\n this._domHelper.setDomElement(element);\n\n if (this._sceneManager) {\n this._lifeCycleManager.resume();\n return Promise.resolve();\n }\n this._preloadPlanId = preloadPlanId;\n this.setOverrides(options);\n return new Promise<void>(this._initPromiseCallback.bind(this));\n }\n\n /**\n * creates and loads a plan from a given object\n * @param id\n * @param position\n * @param rotation\n *\n * return the object runtime id\n */\n public async createPlanFromObject(\n id: RapiId,\n position?: Position3,\n rotation?: number,\n ): Promise<number> {\n if (!this._planInteractionHandler) {\n throw new Error('no plan interaction handler');\n }\n if (position) {\n position = convertToKernel(\n new Vector3(position.x, position.y, position.z),\n );\n }\n const rapiItem = await (isIdItemId(id)\n ? this._rapiAccess.getItem(id)\n : this._rapiAccess.getConfiguration(id));\n\n this._plan = this._plannerKernelAccess.createPlanFromObject(\n rapiItem,\n position,\n rotation,\n );\n\n this._sceneManager.planXMLLoaded(this._plan);\n\n this._sceneManager.updateScene();\n this.resetCameraPosition();\n\n const planObjects = convertCObject(this._plan.getPlanObjects());\n if (planObjects?.length) {\n return planObjects[0].getId();\n }\n return -1;\n }\n\n public loadPlanXml(\n xml: string,\n options?: InitDataDefinition & GlobalInitDataDefinition,\n ): Promise<void> {\n this._sceneManager.setCompletelyLoaded(false);\n this.setOverrides(options);\n return new Promise<void>((resolve) => {\n this._plan = this._planInteractionHandler.loadPlanXML(xml);\n this._sceneManager.planXMLLoaded(this._plan);\n this._roomlePlannerUiCallback.onTotalFloorAreaChanged(\n this._planInteractionHandler.getPlan().getTotalFloorArea(),\n );\n this._currentMode = MODE.PLANNER;\n if (this._initData.moc) {\n if (options.id) {\n this._rapiAccess.trackView(\n options.id,\n USER_ACTION_MODULE.ROOM_DESIGNER,\n );\n } else {\n this._rapiAccess.trackView(\n 'planXML',\n USER_ACTION_MODULE.ROOM_DESIGNER,\n );\n }\n }\n resolve();\n });\n }\n\n public loadPlan(\n id: string,\n options?: InitDataDefinition & GlobalInitDataDefinition,\n ): Promise<RapiPlan | RapiPlanSnapshotGetData> {\n this.setOverrides(options);\n return new Promise<RapiPlan | RapiPlanSnapshotGetData>(\n (resolve, reject) => {\n const isPlanSnapshot = isPlanSnapshotId(id);\n const planPromise = isPlanSnapshot\n ? this._rapiAccess.getPlanSnapshot(id)\n : this._rapiAccess.getPlan(id);\n planPromise.then((plan: RapiPlan | RapiPlanSnapshotGetData) => {\n this._sceneManager.backToPlanner();\n this._sceneManager.setCompletelyLoaded(false);\n const planObjects = isPlanSnapshot ? plan.plan : plan.planObjects;\n this._plan = this._planInteractionHandler.loadPlanXML(planObjects);\n this._sceneManager.planXMLLoaded(this._plan);\n this._roomlePlannerUiCallback.onTotalFloorAreaChanged(\n this._planInteractionHandler.getPlan().getTotalFloorArea(),\n );\n this._configuratorContext.lastLoadedPlanId = id;\n this._currentMode = MODE.PLANNER;\n if (this._initData.moc) {\n this._rapiAccess.trackView(id, USER_ACTION_MODULE.ROOM_DESIGNER);\n }\n resolve(plan);\n }, reject);\n },\n );\n }\n\n /**\n * Set general configuration parameter\n * @param initData\n */\n public setOverrides(\n initData: InitDataDefinition & GlobalInitDataDefinition,\n ): void {\n if (!initData) {\n return;\n }\n\n this._initData.setOverrides(initData);\n this._globalInitData.setOverrides(initData);\n }\n\n public toggleConfigureInRoom() {\n this._sceneManager.toggleConfigureInRoom();\n }\n\n public switch2D() {\n this._sceneManager.switchTo2D();\n }\n\n public switch3D() {\n this._sceneManager.switchTo3D();\n }\n\n public switchToFirstPerson() {\n this._sceneManager.switchToFirstPerson();\n }\n\n public resetCameraPosition(): void {\n this._sceneManager.resetCameraPositionToStart();\n }\n\n public exportGLB() {\n this._sceneManager.exportGLB();\n }\n\n public importGLB(url: string) {\n this._sceneManager.importGLB(url);\n }\n\n private _initPromiseCallback(resolve: () => void, _reject: () => void) {\n this._kernelReadyCallback = resolve;\n const { dls, ls, mode, stats } = this._initData;\n if (!this._sceneManager) {\n this._sceneManager = new PlannerSceneManager(\n this._creator_,\n OFFSET,\n this,\n mode,\n );\n }\n if (this._preloadPlanId) {\n this._sceneManager.preload(this._preloadPlanId);\n }\n const dynamicLightSettingSource =\n DynamicLightSettingLoader.createDynamicLightSettingSource(dls, ls);\n\n if (stats) {\n this.showStats();\n }\n\n this._sceneManager.enableHD(dynamicLightSettingSource);\n if (this._planInteractionHandler) {\n this._kernelReadyCallback();\n }\n }\n\n public isReady(): void {\n this._planInteractionHandler =\n this._plannerKernelAccess.planInteractionHandler;\n if (this._kernelReadyCallback) {\n this._kernelReadyCallback();\n }\n }\n\n public showBenchmarks() {\n Benchmark.showBenchmarks();\n }\n\n public getConfiguratorApi(): RoomleConfigurator<P> {\n if (!this._configurator) {\n this._configurator = new RoomleConfigurator(\n this._creator_,\n this._activePlugins,\n );\n this._configurator.setOverrides(this._initData);\n this._configurator.initSceneManager(this._sceneManager);\n }\n return this._configurator;\n }\n\n public startViewing() {\n this._sceneManager.startViewing();\n this._roomlePlannerUiCallback.onContextChanged(BASE_CONTEXT.GLB_VIEWER);\n }\n\n public startConfiguring() {\n const currentSelection = this._sceneManager.currentSelection;\n const id = currentSelection.item?.id || currentSelection.configuration?.id;\n this._sceneManager.startConfiguring();\n if (id) {\n this._configurator.notifyUiAboutNewLabel(id);\n }\n this._roomlePlannerUiCallback.onContextChanged(BASE_CONTEXT.CONFIGURATOR);\n }\n\n /**\n * select an object in the scene based on its runtime id\n * @param runtimeId\n */\n public async selectPlanObjectById(runtimeId: RuntimeId): Promise<void> {\n return this._sceneManager.selectPlanObject(runtimeId);\n }\n\n /**\n * Highlights one or more objects in the scene based on their runtime IDs.\n * If `runtimeIds` is `null`, all highlighted objects will be unhighlighted.\n *\n * @param runtimeIds A single runtime ID, an array of runtime IDs, or null.\n */\n public highlightPlanElements(runtimeIds: number | number[] | null): void {\n if (runtimeIds === null) {\n this._sceneManager.highlightPlanElementsById(null);\n } else if (Array.isArray(runtimeIds)) {\n this._sceneManager.highlightPlanElementsById(runtimeIds);\n } else {\n this._sceneManager.highlightPlanElementById(runtimeIds);\n }\n }\n\n public backToPlanner() {\n this._sceneManager.backToPlanner();\n this._roomlePlannerUiCallback.onContextChanged(BASE_CONTEXT.PLANNER);\n }\n\n public showGUI() {\n this._sceneManager.showGUI();\n }\n\n public async switchToConfigurator(): Promise<Configurator> {\n const configurator = await this._singlePromiseFactory.create<Configurator>(\n PROMISE_CATEGORY.START_HSC,\n 'startHSC',\n (resolve) => {\n if (this._hscInstance) {\n return resolve(this._hscInstance);\n }\n\n import('../../configurator-core/src/configurator').then(\n ({ Configurator: ConfiguratorClass }) => {\n const hsc = new ConfiguratorClass(this._creator_);\n hsc.boot({\n kernelInstance:\n this._planInteractionHandler.getConfiguratorKernel(),\n kernelContainer: this._plannerKernelAccess.kernelContainer,\n });\n hsc.getApi().setOverrides(this._initData);\n hsc.getApi().initSceneManager(this._sceneManager);\n hsc\n .getApi()\n .init(this._domHelper.element)\n .then(() => {\n this._hscInstance = hsc;\n resolve(this._hscInstance);\n });\n },\n );\n },\n );\n this._currentMode = MODE.CONFIGURATOR;\n this.cancelSelection('isolation_mode_started');\n return configurator;\n }\n\n public async switchToViewer(): Promise<GlbViewer> {\n const viewer = await this._singlePromiseFactory.create<GlbViewer>(\n PROMISE_CATEGORY.START_GLB,\n 'startGLB',\n (resolve) => {\n if (this._glbInstance) {\n return resolve(this._glbInstance);\n }\n import('../../glb-viewer-core/src/glb-viewer').then(\n (GLBViewerModule) => {\n const glb = new GLBViewerModule.GlbViewer(this._creator_);\n glb.boot();\n glb.getApi().setOverrides(this._initData);\n glb\n .getApi()\n .init(this._domHelper.element)\n .then(() => {\n this._glbInstance = glb;\n resolve(this._glbInstance);\n });\n },\n );\n },\n );\n this._currentMode = MODE.GLB;\n this.cancelSelection('isolation_mode_started');\n return viewer;\n }\n\n public switchToPlanner(id?: string) {\n if (id) {\n this.loadPlan(id);\n }\n this._currentMode = MODE.PLANNER;\n }\n\n public updateSize() {\n this._sceneManager.updateCamera();\n }\n\n /**\n * Return the main class which has access to lifecycle events and RapiAccess.\n * Hidden because it's only useful for embedding API.\n * Has to be overridden by main class.\n * @hidden\n */\n public getMain(): Main {\n return undefined;\n }\n\n public update() {\n this.updateSize();\n if (this._glbInstance) {\n this._glbInstance.getApi().updateSize();\n }\n if (this._hscInstance) {\n this._hscInstance.getApi().updateSize();\n }\n }\n\n get callbacks(): RoomlePlannerUiCallback {\n return this._roomlePlannerUiCallback;\n }\n\n set callbacks(callback: RoomlePlannerUiCallback) {\n this._roomlePlannerUiCallback = callback;\n }\n\n /**\n * Check if the 3D scene contains only one room\n * @returns {boolean} True if there is only one room, false otherwise\n */\n get hasSingleRoom(): boolean {\n return this._sceneManager.hasSingleRoom;\n }\n\n public showStats() {\n this._sceneManager.showStats();\n }\n\n public onCloseHSC() {\n if (this._hscInstance) {\n this._hscInstance.getApi().pauseKernelCallbacks();\n }\n }\n\n public back() {\n if (this._currentMode === MODE.GLB && this._glbInstance) {\n const roomleGLBViewer = this._glbInstance.getApi();\n roomleGLBViewer.clearScene();\n }\n if (this._currentMode === MODE.CONFIGURATOR && this._hscInstance) {\n const roomleConfigurator = this._hscInstance.getApi();\n roomleConfigurator.cancelSelection({\n reason: 'isolation_mode_cancelled',\n });\n roomleConfigurator.cancelDockings();\n roomleConfigurator.hideDimensions();\n roomleConfigurator.disableMultiselect();\n this._sceneManager.updateScene();\n }\n this._currentMode = MODE.PLANNER;\n }\n\n public backTo(_cssClass: string) {\n console.error('backTo in planner Needs to be implemented later');\n }\n\n public getConfigurator(): Configurator {\n return this._hscInstance;\n }\n\n public getCurrentSkin() {\n return this._rapiAccess.getCurrentSkin();\n }\n\n /**\n * Returns the runtime component id of the plan object with the given id\n * @param planObjectId id of the plan object you want to get the runtime component id of the root component from\n * @returns number the number of the runtime id of the root component\n */\n public getRuntimeComponentIdOfRootComponent(planObjectId: number): number {\n // Maybe we refactor this to a own class in future\n // abstract class then must have a getConfiguratorKernelMethod and getRuntimeComponentIdOfRootComponent\n // further more we need to think how to deal with planObjectId vs no planObjectId (see roomle-configurator vs roomle-planner)\n if (!planObjectId) {\n console.warn('Can not retrieve runtime id without planObjectId');\n return 0; // Kernel returns 0 if something is invalid, to be same as kernel also return 0 here\n }\n if (!this._plannerKernelAccess.planInteractionHandler) {\n console.warn(\n 'Can not retrieve runtime id without planInteractionHandler',\n );\n return 0; // Kernel returns 0 if something is invalid, to be same as kernel also return 0 here\n }\n return this._plannerKernelAccess.planInteractionHandler\n .getConfiguratorKernel()\n .getRootPlanComponentIdFromObjectId(planObjectId);\n }\n\n /**\n * This method is used for lifecycle tests only\n * @hidden\n */\n public resumeTest(element: HTMLElement) {\n this._domHelper.setDomElement(element);\n this._lifeCycleManager.resume();\n }\n\n /**\n * This method is used for lifecycle tests only\n * @hidden\n */\n public pauseTest() {\n this._lifeCycleManager.pause();\n }\n\n public syncCatalog(catalogId: string): Promise<void> {\n return this._dataSyncer.syncCatalog(catalogId);\n }\n\n public loadError(error?: any): void {\n console.log(error);\n }\n\n public getPlanInteractionHandler(): Promise<PlanInteractionHandler> {\n return Promise.resolve(this._planInteractionHandler);\n }\n\n public getPlanModelViewHelper(): Promise<PlanModelViewHelper> {\n return Promise.resolve(this._plannerKernelAccess.planModelViewHelper);\n }\n\n /**\n * Inserts the object into the scene (at a given position and rotation)\n * @param id\n * @param position x (left/right),y (up, down) and z(front, back) in meters\n * @param rotation in radians\n */\n public async insertObject(\n id: RapiId | ExtObjId,\n position?: Position3,\n rotation?: number,\n ): Promise<RuntimeId> {\n if (!this._planInteractionHandler) {\n throw new Error('no plan interaction handler');\n }\n if (position) {\n position = convertToKernel(\n new Vector3(position.x, position.y, position.z),\n );\n }\n if (isExtObjId(id)) {\n return this._insertExternalObject(id, {\n findFreeSpaceInPlan: !position,\n position,\n rotation,\n });\n }\n const rapiItem = await (isIdItemId(id)\n ? this._rapiAccess.getItem(id)\n : this._rapiAccess.getConfiguration(id));\n const object = await this._plannerKernelAccess.addPlanObjectFromItem(\n rapiItem,\n position,\n rotation,\n );\n this._sceneManager.updateScene();\n return object;\n }\n\n public async insertItemList(\n ids: Array<RapiId | ExtObjId>,\n ): Promise<RuntimeId[]> {\n if (ids.length === 0) {\n return [];\n }\n\n const idInfos: InsertItemIdInfo[] = ids.map((id, index) => {\n return {\n id,\n index,\n };\n });\n\n const insertExternalObject = async (\n id: ExtObjId,\n originalIndex: number,\n ): Promise<InsertItemResult> => {\n return { runtimeId: await this._insertExternalObject(id), originalIndex };\n };\n\n const externalObjectsPromise: Array<Promise<InsertItemResult>> = [];\n const rapiIds: InsertItemIdInfo[] = [];\n for (const { index, id } of idInfos) {\n if (isExtObjId(id)) {\n externalObjectsPromise.push(insertExternalObject(id, index));\n } else {\n rapiIds.push({ index, id });\n }\n }\n const rapiObjectsPromise = this._sceneManager.insertRapiObjects(rapiIds);\n const [externalObjects, rapiObjects] = await Promise.all([\n Promise.all(externalObjectsPromise),\n rapiObjectsPromise,\n ]);\n const results: InsertItemResult[] = [...externalObjects, ...rapiObjects];\n results.sort((a, b) => a.originalIndex - b.originalIndex);\n return results.map((result) => result.runtimeId);\n }\n\n /**\n * Inserts all of the items in the array into current plan\n * @param itemList Array of items received from the Roomle API\n */\n public async insertItems(\n itemList: Array<RapiItem | RapiConfiguration | ExtObjId | ExternalObject>,\n ): Promise<RuntimeId[]> {\n if (itemList.length === 0) {\n return [];\n }\n const ids = itemList.map((item) =>\n typeof item === 'string' ? item : item.id,\n );\n return this.insertItemList(ids);\n }\n\n /**\n * Duplicates all planObjects in the array and inserts them into the current plan\n * @param itemList Array of PlanObjects\n */\n public duplicateItems(itemList: PlanObject[]): PlanObject[] {\n return this._plannerKernelAccess.duplicateItems(itemList);\n }\n\n public getScene(): Scene {\n return this._sceneManager.getScene();\n }\n\n public updateScene(): void {\n this._sceneManager?.updateScene();\n }\n\n public getCameraOffset(): CanvasOffset {\n return this._sceneManager.getCameraOffset();\n }\n\n public setCameraOffset(offset: CanvasOffset): void {\n this._sceneManager.setCameraOffset(offset);\n }\n\n /**\n * returns all objects found in the current plan\n * this includes info about size, rotation, id and parts\n */\n public async getObjects(): Promise<UiPlanObject[]> {\n const planOverview = (await this.getPlanModelViewHelper()).getPlanOverview(\n this._plan,\n );\n const planObjects = convertCObject(planOverview.objects);\n return mapToUiPlanObjects(\n planObjects,\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n\n /**\n * get all info available for the current plan, including objects, rooms and walls\n */\n public async getPlanOverview(): Promise<PlanOverview> {\n const planOverview = (await this.getPlanModelViewHelper()).getPlanOverview(\n this._plan,\n );\n return convertCObject(planOverview);\n }\n\n /**\n * Generates a top image (birds eye view) and returns it as base64\n * @param options\n */\n public prepareTopImage(options: PrepareImageOptions = {}) {\n return this._sceneManager.prepareTopImage(options);\n }\n\n /**\n * Generates a perspective image (slightly from the side) and returns it as base64\n * @param options\n @param isolationMode - defaults to false. Determines whether to generate a perspective image for the current configuration.\n */\n public preparePerspectiveImage(\n options: PrepareImageOptions = {},\n isolationMode = false,\n ) {\n return this._sceneManager.preparePerspectiveImage(options, isolationMode);\n }\n\n /**\n * Enables rotation of selected elements\n */\n public enableRotation() {\n this._sceneManager.enableRotation();\n }\n\n /**\n * Disable rotation of selected elements\n */\n public disableRotation() {\n this._sceneManager.disableRotation();\n }\n\n /**\n * Enable the selection of multiple elements.\n * Common parameters shared between those elements can then be changed at once\n */\n\n public enableMultiselect() {\n this._sceneManager\n .getPlannerSceneEventHandler()\n .setSelectionMode(SELECTION_MODE.MULTISELECT);\n this._configuratorContext.selectionMode = SELECTION_MODE.MULTISELECT;\n }\n\n /**\n * Disable the selection of multiple elements.\n */\n public disableMultiselect() {\n this._sceneManager\n .getPlannerSceneEventHandler()\n .setSelectionMode(SELECTION_MODE.STANDARD);\n // since we set it in enableMultiselect we need to reset it here\n // there is also an ongoing discussion why we set configuratorContext\n // here in the planner for more details see:\n // https://roomle.slack.com/archives/GQD67DDC5/p1700748062512249\n this._configuratorContext.selectionMode = SELECTION_MODE.STANDARD;\n }\n\n private async _insertExternalObject(\n idOrConfig: ExtObjId | ExternalGroupData | ExternalObject,\n options: {\n findFreeSpaceInPlan?: boolean;\n dragIn?: boolean;\n position?: Position3;\n rotation?: number;\n } = {}\n ): Promise<number> {\n let config = idOrConfig;\n\n if (isExtObjId(idOrConfig)) {\n config = await this.newPosDataFromId(idOrConfig);\n if (!config) {\n throw new Error(EXT_OBJ_EXCEPTION);\n }\n }\n if (isExternalObject(idOrConfig) && idOrConfig.externalMeta?.refresh) {\n config =\n await this._roomlePlannerUiCallback.onGetConfigurationForExternalObject(\n idOrConfig.id,\n );\n if (!config) {\n throw new Error(EXT_OBJ_EXCEPTION);\n }\n }\n const findFreeSpaceInPlan = options.findFreeSpaceInPlan ?? true;\n const dragIn = options.dragIn ?? false;\n await this._loadExternalObjectGroup(\n config,\n findFreeSpaceInPlan,\n dragIn,\n false,\n [],\n options.position,\n options.rotation\n );\n return -1;\n }\n\n public async dragInObject(\n idOrSerializedConfigString: string,\n dragEvent: DragEvent,\n type: ID_TYPE = 'rml_id',\n ): Promise<RuntimeId> {\n if (type === 'rml_serialized') {\n throw new Error(\n 'dragInObject is not supported for tc_id or rml_serialized',\n );\n }\n this._sceneManager.dragIn(dragEvent);\n if (type === 'rml_id') {\n const object = isIdItemId(idOrSerializedConfigString)\n ? await this._rapiAccess.getItem(idOrSerializedConfigString)\n : await this._rapiAccess.getConfiguration(idOrSerializedConfigString);\n const objects = await this.insertItems([object]);\n await this._sceneManager.selectPlanObject(objects[0]);\n if (objects.length !== 1) {\n throw new Error('More than one object added, abort');\n }\n return objects[0];\n } else if (type === 'tc_id' || type === 'tc_serialized') {\n return this._insertExternalObject(idOrSerializedConfigString, {\n dragIn: true,\n });\n } else {\n throw new Error('dragInObject is not supported for ' + type);\n }\n }\n\n /**\n * Will remove an element that was dragged into the scene while still dragging it.\n * This is mainly used in the context of pressing ESC while dragging or dragging the element away from the scene again.\n */\n public cancelDragIn() {\n this._sceneManager.cancelDragIn();\n }\n\n /**\n * enable snapping of object to object and object to wall\n */\n public enableSnapping() {\n this._sceneManager.enableSnapping();\n }\n\n /**\n * disable all types of snapping\n */\n public disableSnapping() {\n this._sceneManager.disableSnapping();\n }\n\n /**\n * enable docking of objects that fit together when objects are snapped in the plan\n */\n public enableAdvancedDocking() {\n this._sceneManager.enableAdvancedDocking();\n }\n\n /**\n * disable docking of objects that fit together when objects are snapped in the plan\n */\n public disableAdvancedDocking() {\n this._sceneManager.disableAdvancedDocking();\n }\n\n /**\n * returns true if interaction with the child components of a configuration object is enabled, and flashes otherwise\n */\n public showsChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ): boolean {\n return this._sceneManager.showsChildrenOfPlanObject(planElementViewModel);\n }\n\n /**\n * enable interaction with child components of configurable objects in the plan\n */\n public enableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n this._sceneManager.enableShowChildrenOfPlanObject(planElementViewModel);\n }\n\n /**\n * disable interaction with child components of configurable objects in the plan\n */\n public disableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n this._sceneManager.disableShowChildrenOfPlanObject(planElementViewModel);\n }\n\n /**\n * get the Partlist of certain runtimeID\n * can be used if partlist of a selected Item is needed\n * @param id runtimeID of a configurable item\n * @returns kernelPartlist with processed price, currency and RAL colors\n */\n public async getPartlistOf(id: number): Promise<KernelPartList | null> {\n const configurationHash =\n this._plannerKernelAccess.kernelInstance.getHashOfConfiguration(id);\n if (!configurationHash) {\n const warning =\n 'Object has no partlist because it is not a configuration: ' +\n configurationHash;\n console.warn(warning);\n return Promise.reject(warning);\n }\n const element = this._plannerKernelAccess.kernelInstance.getPartList(id);\n const enhancedPartList =\n await this._plannerKernelAccess.addUiDataAndPriceToPartList(\n element,\n configurationHash,\n );\n return enhancedPartList;\n }\n\n /**\n * Returns the formatted value based on the parameter.unitType\n *\n * @param value\n * @param parameter\n */\n public formatValueToUnitString(value: number, parameter: KernelParameter) {\n return this._unitFormatter.formatValueToUnitString(value, parameter);\n }\n\n /**\n * Draws walls according to the wall definitions\n * this can be used to create a room on the fly\n */\n public drawWalls(\n wallDefinitions: WallDefinition[],\n interactionOptions: InteractionOptions = {},\n ): KernelWall[] {\n const planInteractionHandler = this._planInteractionHandler;\n planInteractionHandler.startInteraction();\n const createdWalls = [];\n for (const wallDefinition of wallDefinitions) {\n const nodeFrom = planInteractionHandler.addNode(wallDefinition.from);\n const nodeTo = planInteractionHandler.addNode(wallDefinition.to);\n const wall = planInteractionHandler.addWall(nodeFrom, nodeTo);\n if (wallDefinition.props?.height !== undefined) {\n planInteractionHandler.setWallHeight(wall, wallDefinition.props.height);\n }\n if (wallDefinition.props?.thickness !== undefined) {\n planInteractionHandler.setWallThickness(\n wall,\n wallDefinition.props.thickness,\n );\n }\n createdWalls.push(wall);\n }\n if (!interactionOptions.keepInteractionOpen) {\n planInteractionHandler.endInteraction();\n }\n this._sceneManager.updateCameraOnDrawWalls();\n this._sceneManager.updateScene();\n return createdWalls;\n }\n\n public async removeElements(\n kernelPlanElements: KernelObject[],\n interactionOptions: InteractionOptions = {},\n ) {\n this._sceneManager.lockCamera();\n const planInteractionHandler = this._planInteractionHandler;\n for (const element of kernelPlanElements) {\n const planObject = this._sceneManager.getPlanObject(element.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.REMOVED,\n planObjects?.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n this._planInteractionHandler.removeElement(element);\n }\n if (!interactionOptions.keepInteractionOpen) {\n planInteractionHandler.endInteraction();\n }\n this._sceneManager.unlockCamera();\n }\n\n public hasWalls(): boolean {\n const planInteractionHandler = this._planInteractionHandler;\n const plan = planInteractionHandler?.getPlan();\n if (!plan) {\n return false;\n }\n if (plan.getWallCount() < 1) {\n return false;\n }\n return true;\n }\n\n public enableWallDrawing() {\n this._sceneManager.enableWallDrawing();\n }\n\n public disableWallDrawing() {\n this._sceneManager.disableWallDrawing();\n }\n\n /**\n * returns unit formatter for formatting input und output values in scene\n */\n public getUnitFormatter(): UnitFormatter {\n return this._unitFormatter;\n }\n\n /**\n * returns manager class to interface with indexedDB storage\n */\n public getStorage(): IdbManager {\n return this._idbManager;\n }\n\n /**\n * returns class containing configurator specific data properties\n */\n public getConfiguratorContext(): ConfiguratorContext {\n return this._configuratorContext;\n }\n\n /**\n * @returns an object which has all type constants from Roomle Core (C/C++)\n */\n public get PlannerCoreTypes(): PlannerKernelContainer {\n return this._plannerKernelAccess.kernelContainer;\n }\n\n /**\n * set which events are enabled in the scene, for example disable selection of walls and wall nodes\n * @param sceneEvents\n */\n public setSceneEvents(sceneEvents: SceneEvents) {\n this._sceneManager.setSceneEvents(sceneEvents);\n }\n\n /**\n * Saves a snapshot of the external objects in the plan without walls and other objects\n * Also contains the urls to the glb and usdz files\n * @param parentPlanId id of the current plan, optional\n * @returns the snapshot of the external objects if there are no external objects it returns null\n */\n public async saveExternalObjectSnapshot(\n parentPlanId?: RapiId,\n ): Promise<Nullable<RapiPlanSnapshotGetDataWith3dUrls>> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const externalObjects = convertCObject(\n planModelViewHelper.getExternalObjectGroups(plan),\n ) as KernelObjectConfiguration[];\n if (externalObjects.length === 0) {\n return null;\n }\n const planSnapshot = await this._savePlanSnapshotExternalObjects(\n parentPlanId,\n externalObjects,\n );\n\n return {\n ...planSnapshot,\n glb: `https://api.roomle.com/v2/planSnapshots/${planSnapshot.id}/3dAssets/glTF/plan.glb`,\n usdz: `https://api.roomle.com/v2/planSnapshots/${planSnapshot.id}/3dAssets/usdz/plan.usdz`,\n };\n }\n\n private async _savePlanSnapshotExternalObjects(\n parentPlanId: RapiId,\n externalObjects: KernelObjectConfiguration[],\n ) {\n const externalObjectUniqueIds = externalObjects.map(\n (externalObject) => externalObject.uniqueId,\n );\n const externalObjectRuntimeIds = externalObjects.map(\n (externalObject) => externalObject.runtimeId,\n );\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planOverview = planModelViewHelper.getPlanOverview(plan);\n const planXML = plan.createPlanXmlWithObjects(\n externalObjectUniqueIds,\n false /** includeRuntimeId */,\n 2 /** XML version */,\n );\n const snapshot: RapiPlanSnapshotPostData = {\n parentId: parentPlanId || null,\n planObjects: [],\n combinedIds: [],\n plan: planXML,\n };\n const objects = planOverview.objects;\n const objectsSize = objects.size();\n for (let i = 0; i < objectsSize; i++) {\n const object = objects.get(i);\n const id = object.configurationHash || object.catalogItemId;\n if (externalObjectRuntimeIds.includes(object.runtimeId)) {\n const { center, dimensions, rotation, rootComponentCenter } = object;\n const locationString = JSON.stringify({\n center,\n dimensions,\n rotation,\n // for static items rootComponentCenter is equal to center\n rootComponentCenter,\n });\n snapshot.planObjects.push({\n combinedId: id,\n position: locationString,\n });\n }\n }\n const planSnapshot = await this._rapiAccess.savePlanSnapshot(snapshot);\n this._plannerKernelAccess.planSnapshotCreated(planSnapshot);\n const result = new Promise<RapiPlanSnapshotGetData>((resolve, reject) => {\n Promise.allSettled([\n this.preparePerspectiveImage({ runtimeIds: externalObjectRuntimeIds }),\n this.prepareTopImage({ runtimeIds: externalObjectRuntimeIds }),\n ]).then(async ([perspectiveImage, topImage]) => {\n if (\n perspectiveImage.status === 'rejected' ||\n topImage.status === 'rejected'\n ) {\n reject('Could not generate images of plan snapshot');\n return;\n }\n try {\n const responsePlanSnapshotResult =\n await this._rapiAccess.savePlanSnapshotImage(\n planSnapshot,\n perspectiveImage.value,\n 'perspectiveImage',\n topImage.value,\n 'topImage',\n );\n resolve({ ...responsePlanSnapshotResult });\n } catch (e) {\n reject(e);\n }\n });\n });\n try {\n return await result;\n } catch (e) {\n console.error(e);\n return planSnapshot;\n }\n }\n\n public async saveCurrentPlanSnapshot(\n parentPlanId?: RapiId,\n configurationHashOrGroupId?: string | string[],\n ): Promise<RapiPlanSnapshotGetData> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planOverview = planModelViewHelper.getPlanOverview(plan);\n const planXML = configurationHashOrGroupId\n ? plan.createPlanXmlWithObjects(\n configurationHashOrGroupId,\n false /** includeRuntimeId */,\n 2 /** XML version */,\n )\n : plan.getPlanXML(false, 2);\n const snapshot: RapiPlanSnapshotPostData = {\n parentId: parentPlanId || null,\n planObjects: [],\n combinedIds: [],\n plan: planXML,\n };\n const objects = planOverview.objects;\n const objectsSize = objects.size();\n for (let i = 0; i < objectsSize; i++) {\n const object = objects.get(i);\n const id = object.configurationHash || object.catalogItemId;\n if (!configurationHashOrGroupId || id === configurationHashOrGroupId) {\n const { center, dimensions, rotation, rootComponentCenter } = object;\n const locationString = JSON.stringify({\n center,\n dimensions,\n rotation,\n // for static items rootComponentCenter is equal to center\n rootComponentCenter,\n });\n snapshot.planObjects.push({\n combinedId: id,\n position: locationString,\n });\n }\n }\n const planSnapshot = await this._rapiAccess.savePlanSnapshot(snapshot);\n this._plannerKernelAccess.planSnapshotCreated(planSnapshot);\n const result = new Promise<RapiPlanSnapshotGetData>((resolve, reject) => {\n Promise.allSettled([\n this.preparePerspectiveImage(),\n this.prepareTopImage(),\n ]).then(async ([perspectiveImage, topImage]) => {\n if (\n perspectiveImage.status === 'rejected' ||\n topImage.status === 'rejected'\n ) {\n reject('Could not generate images of plan snapshot');\n return;\n }\n try {\n const responsePlanSnapshotResult =\n await this._rapiAccess.savePlanSnapshotImage(\n planSnapshot,\n perspectiveImage.value,\n 'perspectiveImage',\n topImage.value,\n 'topImage',\n );\n resolve({ ...responsePlanSnapshotResult });\n } catch (e) {\n reject(e);\n }\n });\n });\n try {\n return await result;\n } catch (e) {\n console.error(e);\n return planSnapshot;\n }\n }\n\n public getPlanXmlFrom(plan: RapiPlan | RapiPlanSnapshotGetData) {\n if (!plan) {\n return null;\n }\n return isPlanSnapshotId(plan.id as string) ? plan.plan : plan.planObjects;\n }\n\n public async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n return this._sceneManager.moveCamera(cameraParameter);\n }\n\n public async createNewSerializedConfiguration(\n configurationRuntimeId: number,\n ): Promise<ConfigurationString> {\n return Promise.resolve(\n this._plannerKernelAccess.createNewSerializedConfiguration(\n configurationRuntimeId,\n ),\n );\n }\n\n public changeInteriorWallsMaterial(material: BatchPaintMaterial) {\n this._sceneManager.changeInteriorWallsMaterial(material);\n }\n\n public changeExteriorWallsMaterial(material: BatchPaintMaterial) {\n this._sceneManager.changeExteriorWallsMaterial(material);\n }\n\n public changeFloorsMaterial(material: BatchPaintMaterial) {\n this._sceneManager.changeFloorsMaterial(material);\n }\n\n /**\n * Returns the wall angle in degrees relative to the camera\n * @param wall a WallPlanElementViewModel instance\n */\n public getWallAngleDegrees(wall: WallPlanElementViewModel): number {\n return this._sceneManager.getWallAngleDegrees(wall);\n }\n\n public calcPartsPriceSum(\n partList: KernelPartList,\n ): Promise<KernelPartListPrice> {\n return this._plannerKernelAccess.calcPartsPriceSum(partList);\n }\n\n /**\n * Swap two plan objects in the scene in the same position for example swap two object variants\n * @param old this is the current selected plan object (runtime ID number or PlanElementViewModel)\n * @param idOfNew the RAPI id of the new plan object\n * @returns runtime ID of the new object\n */\n public async swapObject(\n old: number | PlanElementViewModel,\n idOfNew: RapiId,\n ): Promise<number> {\n let planElementViewModel: PlanElementViewModel;\n\n if (typeof old === 'number') {\n planElementViewModel = await this.getPlanObjectForRuntimeId(old);\n } else {\n planElementViewModel = old;\n }\n\n const pos = planElementViewModel.getPosition();\n const rot = planElementViewModel.getRotation();\n\n await this._sceneManager.deletePlanElementByIds([\n planElementViewModel.getPlanElement().getId(),\n ]);\n\n this.cancelSelection('swap_object');\n\n return await this.insertObject(idOfNew, pos, rot);\n }\n\n public exportImageFromCamera(\n filename: string = 'image',\n shouldWaitForAssets: boolean = false,\n ) {\n this._sceneManager.clearHighlighting();\n\n return this._sceneManager.exportImageFromCamera(\n filename,\n shouldWaitForAssets,\n );\n }\n\n public exportCanvasScreenshot(quality?: number): Promise<string> {\n return this._sceneManager.exportCanvasScreenshot(quality);\n }\n\n /**\n * Move the current selected element in the 3D space\n * @param selectedElement this is the current selected plan object\n * @param position new KernelVector3 position of the current selected element\n * returns runtime ID of the new object\n */\n public moveElementPosition(\n selectedElement: PlanElementViewModel,\n position: KernelVector3,\n ) {\n this._sceneManager.moveElementPosition(selectedElement, position);\n }\n\n /**\n * Moves the current multi-selected elements in the 3D space\n * @param selectedElements this is the current selected plan object\n * @param position new KernelVector3 position of the current selected element\n * returns runtime ID of the new object\n */\n public moveElementsPosition(\n selectedElements: PlanElementViewModel[],\n position: KernelVector3,\n ) {\n this._sceneManager.moveElementsPosition(selectedElements, position);\n }\n\n /**\n * Generates a perspective image (slightly from the side) of a plan element by a\n * given runtime-id and returns it as base64\n * @param runtimeId runtime-id of the plan element, e.g.: a selected element\n * @param options PrepareImageOptions\n */\n public preparePerspectiveImageOf(\n runtimeId: RuntimeId,\n options: PrepareImageOptions = {},\n ) {\n return this._sceneManager.preparePerspectiveImageOf(runtimeId, options);\n }\n\n public async generateTCExport(planObjectIds: string[] = []): Promise<any> {\n try {\n const stringArray =\n new this._plannerKernelAccess.kernelContainer.StringArray();\n for (const id of planObjectIds) {\n stringArray.push(id);\n }\n return Promise.resolve(\n JSON.parse(\n (this._planInteractionHandler as any).generateTCExport(stringArray),\n ),\n );\n } catch (e) {\n console.error(e);\n return Promise.reject('Could not create Blue Ocean MVP JSON');\n }\n }\n\n public enableMeasurementLineDrawing() {\n this._sceneManager.enableMeasurementLineDrawing();\n }\n\n public disableMeasurementLineDrawing() {\n this._sceneManager.disableMeasurementLineDrawing();\n }\n\n public setObjectToWallMeasurementLength(\n planElementId: number,\n measurementId: number,\n length: number,\n ) {\n this._sceneManager.setObjectToWallMeasurementLength(\n planElementId,\n measurementId,\n length,\n );\n }\n\n public setWallMeasurementLength(\n measurementId: number,\n length: number,\n wallDirection: EMSConstant,\n ) {\n this._sceneManager.setWallMeasurementLength(\n measurementId,\n length,\n wallDirection,\n );\n }\n\n public setMeasurementLineLength(\n measurementId: number,\n length: number,\n wallDirection: string,\n ) {\n this._sceneManager.setMeasurementLineLength(\n measurementId,\n length,\n wallDirection,\n );\n }\n\n public escapeDrawing(cancelDrawing: boolean) {\n this._sceneManager.escapeDrawing(cancelDrawing);\n this._roomlePlannerUiCallback.onDrawCancel();\n }\n\n public isCurrentlyDrawing(): boolean {\n return this._sceneManager.getPlannerSceneEventHandler().isCurrentlyDrawing;\n }\n\n /**\n * Resolves a shortened URL.\n *\n * @param {string} shortUrl - The shortened URL to resolve.\n * @returns {Promise<string>} - A promise that resolves to the URL.\n */\n public async resolveShortUrl(shortUrl: string): Promise<string> {\n const [, , , id] = shortUrl.split('/');\n const response = await this._rapiAccess.resolveShortUrl(id);\n if (!response) {\n throw new Error('Failed to resolve short URL');\n }\n const { url } = response;\n return url;\n }\n\n public enableEvents() {\n this._sceneManager.enableEvents();\n }\n\n public disableEvents() {\n this._sceneManager.disableEvents();\n }\n\n public async downloadHomagIxExportPoC(): Promise<any> {\n const { downloadHomagIxExportPoC } = await import(\n '../../configurator-core/src/utils/imos-ix-poc-export-helper'\n );\n const planOverview = (await this.getPlanModelViewHelper()).getPlanOverview(\n this._plan,\n );\n return downloadHomagIxExportPoC(\n planOverview,\n this._plannerKernelAccess.configurationExporter,\n this._plannerKernelAccess.kernelInstance,\n );\n }\n\n public async configureExternalObjectApi(\n configurationJson: string | ExternalObjectApiConfiguration,\n ): Promise<void> {\n const properties =\n typeof configurationJson === 'string'\n ? JSON.parse(configurationJson)\n : configurationJson;\n await this._plannerKernelAccess.configureExternalObjectApi(properties);\n }\n\n public loadExternalObjectLibrary(libraryJson: string | object): void {\n const configuratorKernel =\n this._planInteractionHandler.getConfiguratorKernel();\n const serializedJson =\n typeof libraryJson === 'string'\n ? libraryJson\n : JSON.stringify(libraryJson);\n configuratorKernel.loadExternalAttributeDefinition(serializedJson);\n this.updateScene();\n }\n\n public async loadExternalObjectGroup(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n verifyArrangement: boolean = false,\n mergedGroups: string[] = [],\n ): Promise<void> {\n return this._loadExternalObjectGroup(\n groupData,\n findFreeSpaceInPlan,\n false,\n verifyArrangement,\n mergedGroups,\n );\n }\n\n private async _loadExternalObjectGroup(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[] = [],\n position?: Position3,\n rotation?: number\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n if (configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n await this._loadExternalObjectGroupInConfigurator(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n );\n } else {\n await this._loadExternalObjectGroupInPlanner(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n position,\n rotation\n );\n }\n }\n\n private async _loadExternalObjectGroupInConfigurator(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[] = [],\n ): Promise<void> {\n await this._loadOrUpdateExternalObjectGroup(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n true,\n );\n this.updateScene();\n }\n\n private async _loadExternalObjectGroupInPlanner(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[] = [],\n position?: Position3,\n rotation?: number\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const selectedPlanObject = this._sceneManager.getPlanObject(\n configuratorContext.planElementId,\n );\n await this._loadOrUpdateExternalObjectGroup(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n false,\n position,\n rotation\n );\n if (\n selectedPlanObject.configurationType?.value ===\n CONFIGURATION_TYPE.EXTERNAL\n ) {\n if (mergedGroups.includes(selectedPlanObject.configurationHash)) {\n const serializedGroups =\n this._createSerializedGroupCollection(groupData);\n const firstGroupId = JSON.parse(serializedGroups[0]).id;\n await this._selectExternalObjectGroup(firstGroupId, false);\n } else {\n await this._selectExternalObjectGroup(\n selectedPlanObject.configurationHash,\n false,\n );\n }\n }\n this.updateScene();\n }\n\n private async _loadOrUpdateExternalObjectGroup(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[],\n inConfigurator: boolean,\n position?: Position3,\n rotation?: number\n ): Promise<void> {\n const serializedGroups = this._createSerializedGroupCollection(groupData);\n if (dragIn) {\n this._planInteractionHandler.startInteraction();\n } else {\n this._planInteractionHandler.resumeInteraction();\n }\n const objectPosition = position ?? { x: 0, y: 0, z: 0 };\n const objectRotation =\n rotation ??\n (dragIn && !inConfigurator ? this._getFaceTheCameraAngle(90) : 0);\n const updateConfiguration = {\n findFreeSpaceInPlan,\n applyGlobalChildMode: false,\n isVisible: !dragIn,\n correctArrangement,\n };\n const planObjects =\n this._planInteractionHandler.addOrUpdateExternalPlanObjects(\n serializedGroups,\n objectPosition,\n objectRotation,\n updateConfiguration,\n mergedGroups,\n );\n if (!dragIn) {\n this._planInteractionHandler.endInteraction();\n }\n const planViewModel: PlanViewModel =\n this._planInteractionHandler.getPlan().extRef.jsObject;\n const newObjects: ConfiguratorPlanObjectViewModel[] = [];\n for (const planObject of planObjects) {\n if (planObject.hasConfiguration()) {\n newObjects.push(\n planViewModel.getConfigurablePlanObjectForId(planObject.getId()),\n );\n }\n }\n await Promise.all(\n newObjects.map(async (object): Promise<void> => {\n await object.isInitDone();\n }),\n );\n }\n\n private _createSerializedGroupCollection(\n groupData: ExternalGroupData,\n ): string[] {\n const arrayOfGroups = Array.isArray(groupData) ? groupData : [groupData];\n const posDataCollection: string[] = [];\n for (const groupPosData of arrayOfGroups) {\n const serializedJson =\n typeof groupPosData === 'string'\n ? groupPosData\n : JSON.stringify(groupPosData);\n posDataCollection.push(serializedJson);\n }\n return posDataCollection;\n }\n\n private _getFaceTheCameraAngle(stepInDegrees: number): number {\n const cameraParameters = this._sceneManager.getCameraParameters3d();\n if (!cameraParameters?.yaw) {\n return 0;\n }\n const cameraAngleInDegrees = toDegrees(cameraParameters.yaw);\n const faceToAngleInDegrees =\n Math.round(cameraAngleInDegrees / stepInDegrees) * stepInDegrees;\n return toRadiant(faceToAngleInDegrees);\n }\n\n public async renderImagesOfExternalObjectGroup(groups: object): Promise<{\n [key: string]: string;\n }> {\n const jsonObjects = Array.isArray(groups) ? groups : [groups];\n const generatedImages: {\n [key: string]: string;\n } = {};\n const animateCamera = this._initData.animateCamera;\n this._initData.animateCamera = false;\n for (const objectGroup of jsonObjects) {\n try {\n await this._loadExternalObjectGroup(objectGroup, false, false, false);\n await this._selectExternalObjectModule(\n objectGroup.id,\n null,\n true,\n true,\n false,\n false,\n );\n this.preparePerspectiveImage();\n await this._sceneManager.waitForMaterialQueue();\n this.updateScene();\n const canvasScreenshot = await this.exportCanvasScreenshot();\n generatedImages[objectGroup.id] = canvasScreenshot;\n } catch (e) {\n console.error(e);\n }\n this.backToPlanner();\n }\n for (const objectGroup of jsonObjects) {\n await this.removeExternalObjectGroup(objectGroup.id, false);\n }\n this._initData.animateCamera = animateCamera;\n return generatedImages;\n }\n\n public async removeExternalObjectGroup(\n groupId: string,\n wasMerged: boolean = false,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n groupId,\n '',\n );\n const configuratorContext = this.getConfiguratorContext();\n if (configuratorContext.planElementId === planObjectComponent.runtimeId) {\n this._sceneManager.cancelPlanElementSelection('delete_object');\n }\n if (planObjectComponent.runtimeId !== 0) {\n if (wasMerged) {\n this._planInteractionHandler.resumeInteraction();\n this._planInteractionHandler.removeObjectWithId(groupId);\n this._planInteractionHandler.endInteraction();\n } else {\n this._planInteractionHandler.startInteraction();\n this._sceneManager.deletePlanElementByIds([\n planObjectComponent.runtimeId,\n ]);\n this._planInteractionHandler.endInteraction();\n }\n }\n this.updateScene();\n }\n\n public removeExternalObjectRootModule(rootModuleId: string): void {\n this._planInteractionHandler.startInteraction();\n this._planInteractionHandler.removeObjectWithId(rootModuleId);\n this._planInteractionHandler.endInteraction();\n this.updateScene();\n }\n\n public async selectExternalObjectGroup(groupId: string): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const isConfiguratorContext =\n configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR;\n if (!isConfiguratorContext) {\n this._planInteractionHandler.setShowChildrenOfExternalObject(\n groupId,\n {\n value: CORE_CHILD_ENTITY_MODE.OFF,\n },\n false,\n );\n }\n await this._selectExternalObjectGroup(groupId, true);\n this.updateScene();\n }\n\n public async selectExternalObjectRootModule(\n rootModuleId: string,\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const isConfiguratorContext =\n configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR;\n if (!isConfiguratorContext) {\n this._planInteractionHandler.setShowChildrenOfExternalObject(\n rootModuleId,\n {\n value: CORE_CHILD_ENTITY_MODE.GROUND_COMPONENTS,\n },\n false,\n );\n }\n await this._selectExternalObjectModule(\n rootModuleId,\n null,\n !isConfiguratorContext,\n isConfiguratorContext,\n true,\n true,\n );\n this.updateScene();\n }\n\n public async selectExternalObjectSubModule(\n rootModuleId: string,\n subModuleId: string,\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const selectPlanObject =\n configuratorContext.baseContext !== BASE_CONTEXT.CONFIGURATOR;\n await this._selectExternalObjectModule(\n rootModuleId,\n subModuleId,\n selectPlanObject,\n true,\n true,\n true,\n );\n this.updateScene();\n }\n\n public async openOrCloseGeometryOfExternalObject(\n groupIdOrRootModuleId: string,\n _subModuleId: string | null,\n open: boolean,\n animate: boolean,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n groupIdOrRootModuleId,\n '',\n );\n if (planObjectComponent?.configurationRuntimeId) {\n const value = open ? 'open' : 'close';\n this._sceneManager.animateElement(\n planObjectComponent.configurationRuntimeId,\n 'openClose',\n value,\n true,\n animate,\n );\n this.updateScene();\n }\n }\n\n private async _selectKernelComponent(\n selectedPlanObjectComponent: KernelPlanObjectComponent,\n ) {\n if (\n selectedPlanObjectComponent.configurationHash &&\n selectedPlanObjectComponent.configurationType.value ===\n CONFIGURATION_TYPE.EXTERNAL\n ) {\n await this._selectExternalObjectModule(\n selectedPlanObjectComponent.configurationHash,\n selectedPlanObjectComponent.componentId,\n true,\n true,\n true,\n false,\n );\n }\n this.updateScene();\n }\n\n public async _selectExternalObjectGroup(\n groupId: string,\n switchToPlanner: boolean,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n groupId,\n '',\n );\n if (planObjectComponent.runtimeId === 0) {\n return;\n }\n if (switchToPlanner) {\n await this._roomlePlannerUiCallback.onBackToPlanner();\n }\n await this._sceneManager.selectPlanObject(planObjectComponent.runtimeId);\n }\n\n public async _selectExternalObjectModule(\n rootModuleId: string,\n subModuleId: string | null,\n selectPlanObject: boolean,\n switchToConfigurator: boolean,\n selectComponent: boolean,\n highlightSelection: boolean,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n rootModuleId,\n subModuleId ?? '',\n );\n if (planObjectComponent.runtimeId === 0) {\n return;\n }\n const isConfiguratorContext =\n this.getConfiguratorContext().baseContext === BASE_CONTEXT.CONFIGURATOR;\n const currentlySelectedPlanObjectComponent =\n this._getSelectedPlanObjectComponent();\n let configuratorObjectAlreadySelected = false;\n let invokeSelectPlanObject = selectPlanObject;\n if (isConfiguratorContext) {\n configuratorObjectAlreadySelected =\n currentlySelectedPlanObjectComponent?.configurationRuntimeId ===\n planObjectComponent.configurationRuntimeId;\n invokeSelectPlanObject = !configuratorObjectAlreadySelected;\n if (!configuratorObjectAlreadySelected) {\n this._sceneManager.backToPlanner();\n }\n }\n if (invokeSelectPlanObject) {\n await this._selectPlanObject(planObjectComponent);\n }\n if (switchToConfigurator && !configuratorObjectAlreadySelected) {\n await this._roomlePlannerUiCallback.onStartConfiguring();\n }\n if (planObjectComponent.planComponentRuntimeId !== 0 && selectComponent) {\n this._sceneManager.selectComponent(\n planObjectComponent.planComponentRuntimeId,\n false,\n );\n }\n if (highlightSelection && !isConfiguratorContext) {\n this._sceneManager.highlightExternalObject(planObjectComponent);\n }\n }\n\n private async _selectPlanObject(\n planObjectComponent: KernelPlanObjectComponent,\n ) {\n let runtimeId = planObjectComponent.runtimeId;\n const planObjects = convertCObject(this._plan.getPlanObjects());\n for (const planObject of planObjects) {\n if (\n planObject.getConfigurationRuntimeId() ===\n planObjectComponent.planComponentRuntimeId\n ) {\n runtimeId = planObject.getId();\n break;\n }\n }\n await this._sceneManager.selectPlanObject(runtimeId);\n }\n\n private _getSelectedPlanObjectComponent(): KernelPlanObjectComponent {\n const configuratorContext = this.getConfiguratorContext();\n const runtimeId =\n configuratorContext.selectedRuntimeComponentId ??\n configuratorContext.planObjectId;\n const selectedPlanObjectComponent =\n this._sceneManager.getObjectComponent(runtimeId);\n return selectedPlanObjectComponent;\n }\n\n public async getExternalObjectGroups(): Promise<object[]> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const groupDefinitions: object[] = [];\n const externalObjectGroups = convertCObject(\n planModelViewHelper.getExternalObjectGroups(plan),\n );\n for (const group of externalObjectGroups) {\n groupDefinitions.push(JSON.parse(group.serializedDefinition));\n }\n return groupDefinitions;\n }\n\n public async getExternalRoomInformation(): Promise<ExternalRoomInformation> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const externalRoomInformation = convertCObject(\n planModelViewHelper.getExternalRoomInformation(plan)\n );\n return externalRoomInformation;\n }\n\n /**\n * @internal\n * Use this callbacks to hook in your functionality\n */\n public get globalCallbacks(): GlobalCallback {\n return this._globalCallback;\n }\n\n /**\n * Handles interaction with the planner kernel, ensuring start and end interaction are tracked.\n * @param action A function representing the action to perform.\n * @returns The result of the action, if any.\n */\n private _executeWithInteraction<T>(action: () => T): T {\n const planInteractionHandler =\n this._plannerKernelAccess.planInteractionHandler;\n planInteractionHandler.startInteraction();\n const result = action();\n planInteractionHandler.endInteraction();\n return result;\n }\n\n /**\n * Creates a sloping roof attic on a given wall.\n * @param wall The wall to add an attic to.\n * @param kneeHeight Height of the attic knee wall.\n * @param width Width of the sloping roof.\n * @param preferredSide The side where the attic should be added.\n * @returns The newly created attic.\n */\n public addAtticToWall(\n wall: KernelWall,\n kneeHeight: number,\n width: number,\n preferredSide?: WallSide,\n ): KernelAttic | null {\n return this._executeWithInteraction(\n () =>\n this._plannerKernelAccess.planInteractionHandler.addAttic(\n wall,\n kneeHeight,\n width,\n preferredSide,\n ) || null,\n );\n }\n\n /**\n * Removes an attic from a wall.\n * @param attic The attic to be removed.\n */\n public removeAttic(attic: KernelAttic): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.removeElement(attic),\n );\n }\n\n /**\n * Set the attic direction from a wall.\n * @param attic The attic to be removed.\n */\n public setAtticSide(attic: KernelAttic, side: WallSide): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.setAtticSide(\n attic,\n side,\n ),\n );\n }\n\n /**\n * Gets the attached attic from a wall.\n * @param wall The wall to retrieve the attic from.\n * @returns The first attached attic or null.\n */\n public getAttachedAttic(wall: KernelWall): KernelAttic | null {\n const arrayOfAttachedAttics = wall.getAttachedAttics();\n return arrayOfAttachedAttics.size() > 0\n ? arrayOfAttachedAttics.get(0)\n : null;\n }\n\n /**\n * Updates the knee height of an attic.\n * @param attic The attic to update.\n * @param kneeHeight The new knee height value.\n */\n public updateAtticKneeHeight(attic: KernelAttic, kneeHeight: number): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.setAtticKneeHeight(\n attic,\n kneeHeight,\n ),\n );\n }\n\n /**\n * Updates the width of an attic.\n * @param attic The attic to update.\n * @param width The new width value.\n */\n public updateAtticWidth(attic: KernelAttic, width: number): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.setAtticWidth(\n attic,\n width,\n ),\n );\n }\n\n /**\n * Runs a given function with a call to start and end interaction in the planInteractionHandler,\n * this should be used when you want to add a history step after interacting with the plan.\n * @param callback any function.\n */\n public async executeWithInteraction<T>(\n callback: MaybePromise<T>,\n ): Promise<T> {\n const planInteractionHandler =\n this._plannerKernelAccess.planInteractionHandler;\n\n planInteractionHandler.startInteraction();\n\n try {\n const result = callback();\n if (result instanceof Promise) {\n return await result;\n }\n return result;\n } finally {\n planInteractionHandler.endInteraction();\n }\n }\n\n /**\n * Temporarily stops all input event listeners on the canvas.\n */\n public pauseInputListeners(): void {\n return this._sceneManager.pause();\n }\n\n /**\n * Resumes all input event listeners on the canvas.\n */\n public resumeInputListeners(): void {\n return this._sceneManager.resume();\n }\n\n /**\n * Returns all configurable element's light/lamp sources in the scene.\n */\n public getScenePlanElementLightSources(): Array<\n Map<number, RoomleLightSource>\n > {\n return this._sceneManager.scenePlanElementLightSources;\n }\n\n /**\n * Turns all lights in the scene on or off.\n * @param state whether the lights should be on or off\n */\n public setAllLightsOnOff(state: boolean): void {\n this._sceneManager.setAllLightsOnOff(state);\n }\n\n /**\n * Turns lights by list of light IDs in the scene on or off\n * @param state whether the lights should be on or off\n * @param ids array of light IDs, see type interface RoomleLightSource._lightSourceId\n */\n public setLightsOnOffByIds(ids: number[], state: boolean): void {\n this._sceneManager.setLightsOnOffByIds(ids, state);\n }\n\n public async getPlanObjectForRuntimeId(\n runtimeId: number,\n ): Promise<PlanElementViewModel | null> {\n const planViewModel: PlanViewModel =\n this._planInteractionHandler.getPlan()?.extRef?.jsObject;\n return Promise.resolve(planViewModel.getPlanObjectForId(runtimeId) || null);\n }\n\n public async rotateByRuntimeId(\n runtimeId: number,\n rotateBy: number,\n ): Promise<void> {\n this._sceneManager.rotatePlanElements([runtimeId], rotateBy);\n return Promise.resolve();\n }\n\n public async deleteByRuntimeId(runtimeId: number): Promise<void> {\n this._sceneManager.deletePlanElements([runtimeId]);\n return Promise.resolve();\n }\n\n public async moveByRuntimeId(\n runtimeId: number,\n position: KernelVector3,\n ): Promise<void> {\n const selectedElement = await this.getPlanObjectForRuntimeId(runtimeId);\n this._sceneManager.moveElementPosition(selectedElement, position);\n return Promise.resolve();\n }\n\n /**\n * Undo last action\n */\n public undo(): Promise<void> {\n return this._sceneManager.undo();\n }\n\n /**\n * Redo last action\n * only possible if undo was called before\n */\n public redo(): Promise<void> {\n return this._sceneManager.redo();\n }\n\n public setHomagIntelligence(homagIntelligence: HomagIntelligence): void {\n this._homagIntelligence = homagIntelligence;\n }\n\n public newPosDataFromId(id: string) {\n return this._homagIntelligence.getEmulator().newPosDataFromId(id);\n }\n\n public sendToOM(withPrice: boolean = true) {\n return this._homagIntelligence.sendToOM(withPrice);\n }\n\n public async fetchPrice(planId?: string) {\n return this._homagIntelligence.fetchPrice(planId);\n }\n\n public async getOrderManagerGroupData(planId?: string) {\n return this._homagIntelligence.getEmulator().getGroupDataForOrder(planId);\n }\n\n public getRapiAccess(): RapiAccess {\n return this._rapiAccess;\n }\n}\n","import type { INPUT_EVENT_TYPE } from '../../../common-core/src/input/input-manager';\nimport InputManager from '../../../common-core/src/input/input-manager';\n\nexport default class PlannerInputManager extends InputManager {\n protected _canDrag(_type: INPUT_EVENT_TYPE): boolean {\n return true;\n }\n}\n","import ScriptLoader from '../../../common-core/src/script-loader';\nimport {\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../../common-core/src/di/container';\nimport Logger from '../../../common-core/src/logger';\nimport { default as PlannerMeshGenerator } from '../webgl/planner-mesh-generator';\nimport RapiAccess from '../../../common-core/src/rapi-access';\nimport PlannerInputManager from '../input/planner-input-manager';\nimport PlannerSelectionHandler from './planner-selection-handler';\nimport GlobalInitData from '../../../common-core/src/utils/global-init-data';\nimport ConfiguratorViewModel from '../../../common-core/src/view-model/configurator-view-model';\n\nexport const INJECTABLES: DependencyInjectionAssignment[] = [\n new DependencyInjectionAssignment('script-loader', ScriptLoader),\n new DependencyInjectionAssignment(\n 'planner-input-manager',\n PlannerInputManager,\n DI_TYPE.CONTEXT\n ),\n new DependencyInjectionAssignment('logger', Logger),\n new DependencyInjectionAssignment(\n 'planner-mesh-generator',\n PlannerMeshGenerator\n ),\n new DependencyInjectionAssignment(\n 'configurator-view-model',\n ConfiguratorViewModel,\n DI_TYPE.CONTEXT\n ),\n new DependencyInjectionAssignment('rapi-access', RapiAccess),\n new DependencyInjectionAssignment('global-init-data', GlobalInitData),\n new DependencyInjectionAssignment(\n 'planner-selection-handler',\n PlannerSelectionHandler\n ),\n];\n","import type { Emulator } from './emulator';\nimport inject from '../../common-core/src/di/inject';\nimport type { GlobalCallback } from '../../common-core/src/services/global-callback';\nimport type { Context } from '../../common-core/src/di/context';\nimport {\n createExtObj,\n createExtObjId,\n} from '../../common-core/src/utils/external-objects';\nimport type {\n ExternalConfiguration,\n ExternalItem,\n ExternalObjectOnFetchDataMap,\n} from '../../typings/external-objects';\nimport type { ExternalItems, ExternalObjects } from './homag-intelligence';\nimport type ConfiguratorViewModel from '../../common-core/src/view-model/configurator-view-model';\n\nexport const FAKE_ROOT_TAG = 'external:root-tag';\n\nexport class HiTagCatalogCallbacks implements Context {\n public _creator_: string;\n private _emulator: Emulator;\n private _articlesPromise: Promise<any>;\n private _externalItems: ExternalItems = new Map();\n private _externalConfigurations = new Map();\n private _tagIds: string[] = [];\n\n @inject\n private _globalCallback: GlobalCallback;\n\n @inject\n private _configuratorViewModel: ConfiguratorViewModel;\n\n constructor(creator: string, articles: Promise<any>) {\n this._creator_ = creator;\n this._articlesPromise = articles;\n this._init();\n }\n\n public setEmulator(emulator: Emulator) {\n this._emulator = emulator;\n }\n\n private _init() {\n const onCheckExternalCacheOriginal =\n this._globalCallback.onCheckExternalCache;\n\n this._globalCallback.onCheckExternalCache = async (\n url: string,\n requestData: RequestInit,\n ) => {\n const ogReq = await onCheckExternalCacheOriginal(url, requestData);\n if (ogReq !== null) {\n return ogReq;\n } else {\n return this._onCheckExternalCache(url);\n }\n };\n\n this._globalCallback.onFetchExternalData =\n this._onFetchExternalData.bind(this);\n }\n\n private async _onCheckExternalCache(url: string) {\n if (url === '/tags/' + createExtObjId(FAKE_ROOT_TAG)) {\n const articles = await this._processedArticles();\n this._tagIds = [...articles.keys()].sort((a, b) => {\n return a.localeCompare(b);\n });\n return Promise.resolve({\n tag: { id: createExtObjId(FAKE_ROOT_TAG), tags: this._tagIds, sort: 1 },\n });\n }\n\n for (const tagId of this._tagIds) {\n if (url === '/tags/' + tagId) {\n const articles = await this._processedArticles();\n return Promise.resolve({\n tag: { id: tagId, label: articles.get(tagId)!.label, sort: 1 },\n });\n }\n if (url === '/tags/' + tagId + '/items') {\n const articles = await this._processedArticles();\n const items = articles.get(tagId)!.items;\n items.sort((a: any, b: any) => {\n return a.label.localeCompare(b.label);\n });\n return Promise.resolve({\n items,\n });\n }\n }\n return null;\n }\n\n private _onFetchExternalData<\n T extends keyof ExternalObjectOnFetchDataMap,\n K extends string | string[],\n >(\n _type: T,\n ids: K,\n ): Promise<\n K extends string\n ? ExternalObjectOnFetchDataMap[T]\n : K extends string[]\n ? Array<ExternalObjectOnFetchDataMap[T]>\n : never | undefined\n > {\n const idArray = Array.isArray(ids) ? ids : [ids];\n const externalObjects: Array<ExternalItem | ExternalConfiguration> = [];\n for (const id of idArray) {\n const externalConfiguration =\n this._configuratorViewModel.getExternalConfigurationById(id as string);\n if (externalConfiguration) {\n externalObjects.push(externalConfiguration);\n } else if (this._externalItems.has(id as string)) {\n externalObjects.push(this._externalItems.get(id as string)!);\n } else {\n console.warn('ID', id, 'is unknown');\n }\n }\n\n if (Array.isArray(ids)) {\n // The `as any` cast is used here because TypeScript cannot correctly infer\n // the complex conditional return type of the `onFetchExternalData` callback.\n // The implementation correctly returns an array of objects when `ids` is an array.\n return Promise.resolve(externalObjects) as any;\n }\n\n // The `as any` cast is used here for the same reason as above.\n // The implementation correctly returns a single object or undefined when `ids` is a string.\n return Promise.resolve(externalObjects[0]) as any;\n }\n\n private async _processedArticles() {\n let articles = await this._articlesPromise;\n // NOBILIA DEMO HACKS -- connect.homag.com sends differently shaped data.\n if (articles.articles) {\n articles = articles.articles;\n }\n return articles.reduce((acc: ExternalObjects, article: any) => {\n const category = article.category || 'Uncategorized';\n const id = createExtObjId(category.toLowerCase());\n if (!acc.has(id)) {\n acc.set(id, {\n id,\n label: category,\n items: [],\n });\n }\n const entry = acc.get(id)!;\n const { depth, width, height } = article.roots.reduce(\n (\n dimensions: { depth: number; width: number; height: number },\n { attributes }: any,\n ) => {\n if (attributes) {\n attributes.forEach((attribute: { id: string; value: string }) => {\n if (attribute.id === 'mod_Depth') {\n dimensions.depth += parseInt(attribute.value, 10) / 10;\n }\n if (attribute.id === 'mod_Width') {\n dimensions.width += parseInt(attribute.value, 10) / 10;\n }\n if (attribute.id === 'mod_Height') {\n dimensions.height += parseInt(attribute.value, 10) / 10;\n }\n });\n }\n return dimensions;\n },\n { depth: 0, width: 0, height: 0 },\n );\n const addDimensions = depth > 0 && width > 0 && height > 0;\n const extObj = createExtObj({\n id: article.articleId as string,\n uiLabels: {\n desktop: {\n line1: article.name,\n line2: article.desc,\n line3: addDimensions ? `${height}x${width}x${depth}` : '',\n },\n mobile: {\n line1: article.name,\n line2: addDimensions ? `${height}x${width}x${depth}` : '',\n line3: article.desc,\n },\n },\n label: article.name ?? 'external-objects.no-name',\n // configuration: this._emulator.newPosDataFromId(article.articleId),\n // perspectiveImage: article.imageUrl,\n externalObject: true,\n // We add this configuration object so we can get grid view thumbnail images without requesting newPosDataFromId\n configuration: {\n imageUrl: article.imageUrl,\n },\n });\n this._externalItems.set(\n extObj.id as string,\n extObj as any as ExternalItem,\n );\n entry.items.push(extObj);\n return acc;\n }, new Map() as ExternalObjects);\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst proxyMarker = Symbol(\"Comlink.proxy\");\nconst createEndpoint = Symbol(\"Comlink.endpoint\");\nconst releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst finalizer = Symbol(\"Comlink.finalizer\");\nconst throwMarker = Symbol(\"Comlink.thrown\");\nconst isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n};\n/**\n * Allows customizing the serialization of certain values.\n */\nconst transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\nfunction isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\nfunction expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n}\nfunction isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n}\nfunction closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n}\nfunction wrap(ep, target) {\n const pendingListeners = new Map();\n ep.addEventListener(\"message\", function handleMessage(ev) {\n const { data } = ev;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n try {\n resolver(data);\n }\n finally {\n pendingListeners.delete(data.id);\n }\n });\n return createProxy(ep, pendingListeners, [], target);\n}\nfunction throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\nfunction releaseEndpoint(ep) {\n return requestResponseMessage(ep, new Map(), {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n}\nconst proxyCounter = new WeakMap();\nconst proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\nfunction registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n}\nfunction unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\nfunction createProxy(ep, pendingListeners, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n}\nfunction myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n}\nfunction processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\nconst transferCache = new WeakMap();\nfunction transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n}\nfunction proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n}\nfunction windowEndpoint(w, context = globalThis, targetOrigin = \"*\") {\n return {\n postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\nfunction toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\nfunction fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n}\nfunction requestResponseMessage(ep, pendingListeners, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n}\nfunction generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n\nexport { createEndpoint, expose, finalizer, proxy, proxyMarker, releaseProxy, transfer, transferHandlers, windowEndpoint, wrap };\n//# sourceMappingURL=comlink.mjs.map\n","import './utils/global-definitions';\nimport Main, { BASE_CONTEXT } from '../../common-core/src/main';\nimport RoomlePlanner from './roomle-planner';\nimport RoomleDependencyInjection from '../../common-core/src/di/roomle-dependency-injection';\nimport { INJECTABLES } from './utils/injectables';\nimport type PlannerKernelAccess from './services/planner-kernel-access';\nimport type Logger from '../../common-core/src/logger';\nimport { KERNEL_TYPE } from '../../common-core/src/services/common-kernel-access';\nimport type { PluginName } from '../../configurator-core/src/utils/plugin-types';\nimport type InitData from '../../common-core/src/utils/init-data';\nimport { HiTagCatalogCallbacks } from '../../homag-intelligence/src/hi-tag-catalog-callbacks';\nimport { wrap } from 'comlink';\nimport type { Remote } from 'comlink';\nimport type { HiCallbacks } from '../../../../embedding-lib/src/embedding-lib';\nimport { isInIframe } from '../../common-core/src/utils/rapi-utils';\n\nexport class Planner<\n P extends readonly PluginName[] = readonly [],\n> extends Main {\n private _planner: RoomlePlanner<P>;\n private _activePlugins: P;\n\n constructor(creator?: string, activePlugins?: P) {\n super(creator);\n this._activePlugins = (activePlugins || []) as P;\n }\n protected setupGlobals(): void {\n //globals are initialized in bootFinished()\n }\n\n protected setupDependencies(): void {\n RoomleDependencyInjection.setup(INJECTABLES);\n this.lookup<Logger>('logger', this._context);\n // instantiate kernel acccess\n // instantiate pka\n // set pka on kernel access\n const plannerKernelAccess = this.lookup<PlannerKernelAccess>(\n 'planner-kernel-access',\n this._context,\n );\n plannerKernelAccess.init(KERNEL_TYPE.PLANNER);\n }\n\n protected cleanUpGlobals(): void {\n throw new Error('Method not implemented.');\n }\n\n protected cleanUpDependencies(): void {\n throw new Error('Method not implemented.');\n }\n\n protected async bootFinished(): Promise<void> {\n this._planner = new RoomlePlanner<P>(this._context, this._activePlugins);\n\n this._planner.getMain = () => {\n return this;\n };\n\n if (!window.RoomlePlanner) {\n if (this._activePlugins.length === 0) {\n // cast to unknown because we know that the planner is a RoomlePlanner\n window.RoomlePlanner = this._planner as unknown as RoomlePlanner;\n } else {\n window.RoomlePlanner = this._planner as RoomlePlanner<\n readonly PluginName[]\n >;\n }\n }\n\n const initData = this.lookup<InitData>('init-data', this._context);\n\n if (initData?.hi && isInIframe()) {\n const channel = new MessageChannel();\n window.parent.postMessage({ type: \"connect_hi\", port: channel.port2 }, \"*\", [channel.port2]);\n const hiCallbacks: Remote<HiCallbacks> = wrap(channel.port1);\n\n const articleJson = hiCallbacks.onLoadArticleCatalog(initData.hi.libraryId);\n\n const catalogsCallbacks = new HiTagCatalogCallbacks(\n this._context,\n articleJson,\n );\n\n const hiModule = await import(\n '../../homag-intelligence/src/homag-intelligence'\n );\n const homagIntelligence = new hiModule.HomagIntelligence();\n await homagIntelligence.init(\n articleJson,\n catalogsCallbacks,\n // cast to unknown because we know that the planner is a RoomlePlanner\n this._planner as unknown as RoomlePlanner,\n initData.hi.libraryId,\n initData.hi.serverOptions,\n hiCallbacks,\n );\n }\n }\n\n public getApi(): RoomlePlanner<P> {\n return this._planner;\n }\n\n protected getContextName(): string {\n return BASE_CONTEXT.PLANNER;\n }\n}\n"],"names":["PAPER_BACKGROUND_FILE_NAME","PlannerLightSetting","LightSetting","scene","oldLightSetting","Vector3","AmbientLight","Color","LAYER","DirectionalLight","Vector2","_inclination","_azimuth","bounds","boundingSphere","Sphere","maxSize","lightDirection","gui","getGUI","ambiLight","color","hemiLight","mainDirectionalLight","SELECTION_EVENT","isWallOrFloor","planElementViewModel","WallPlanElementViewModel","FloorPlanElementViewModel","PlannerSelectionHandlerEvent","data","planElementViewModels","selectionMode","reason","PlannerSelectionHandler","EventDispatcher","SELECTION_MODE","id","planElementId","value","mode","_id","result","component","PLANNER_SCENE_EVENT","PLANNER_SCENE_EVENT_STATE","SceneEventInfo","resetCamera","state","oldState","PlannerSceneEventHandler","SceneEventHandler","creator","camera","inputManager","INPUT_EVENT","INTERSECTION_MODE","RAYCAST_EVENT","event","layers","Layers","enable","planObjectViewModel","object","planObjectEventInfo","RAYCAST_PRIORITY","componentEventInfo","MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME","deepMerge","OBJECT_EVENT","point","updateCurrentPoint","geo","PlaneGeometry","mat","MeshBasicMaterial","plane","Mesh","convertToKernel","clickPoint","inputType","INPUT_EVENT_TYPE","closeToPoint","nodePlanViewModel","point1","point2","isLockedElement","MeasurementLinePlanElementViewModel","intersectionPoint","NodePlanElementViewModel","kernelPosition","setCursor","CURSOR_STYLE","isSafari","planViewModel","wait","INPUT_DELAY_TYPE","position","planInteractionHandler","distance","planObjectPtrList","vector3","isWallOrNode","planElement","CAMERA_TYPE","currentPosition","convertToTHREE","_position","rotation","planObject","delta","x","y","list","Box3","center","ConfiguratorPlanObjectViewModel","StaticPlanObjectViewModel","_forceRender","boundingBox","snapToWall","ConstructionPlanObjectViewModel","ConfigurableConstructionPlanObjectViewModel","CORE_CHILD_ENTITY_MODE","snappingEnabled","isMultiselect","Group","cancelDrawing","vectorDrawPreviewMode","DRAW_PREVIEW_MODES","DrawingType","ContinuousDrawingHelperClass","kernelZoomFactor","eventNumber","eventType","action","viewModel","newPosition","planMeasure","newCenter","measurementLine","targetLengthMM","direction","targetLengthUnits","isLeftDirection","basePoint","scaledDirectionVector","newPoint","__decorateClass","inject","createTransferableObjectPosition","clientWidth","clientHeight","threeVectorToTransferableXY","getScreenXY","getCallbackObjectType","objectType","WallAtticPlanElementViewModel","addDemoLights","active","rapiItem","targetPos","lightPos","dimensions","dimensions2","lightPos2","Sky","shader","material","ShaderMaterial","UniformsUtils","BackSide","BoxGeometry","getIds","planObjects","plannerKernelAccess","objects","itemIds","configurationIds","externalConfigurationData","createExtObjId","convertCObject","CONFIGURATION_TYPE","obj","hash","configurationData","fetchData","externalObjectsDataIn","rapiAccess","externalObjectIds","responseItems","responseConfigurations","responseExternalObjects","rootComponentIds","item","externalObject","configuration","mapToUiPlanObjects","rootComponents","rootComponentsMap","rootComponent","entryData","PaperBackground","TextureLoader","texture","RepeatWrapping","repeatEveryM","PlannerCameraBehaviour","CameraBehaviour","Planner2dCameraBehaviour","getDrawingMinBounds","_bounds","_startCameraParams","_endCameraParams","Planner3dCameraBehaviour","startCameraParams","endCameraParams","cameraParameter","PlannerFpCameraBehaviour","PlanElementHighlighter","sceneEventHandler","roomleRenderer","selectedMeshes","child","runtimeIds","sendWallDimensions","domHelper","cameraBehaviour","roomlePlannerUiCallback","plannerSceneEventHandler","unitFormatter","debugSpheres","isFixedWalls","isDebug","CameraControl2D","wallDimensions","wallViewModels","zoomFactor","wallDimension","isVectorWall","convertWallTo2D","convertAtticTo2D","debugWallDimensions","wallDimensionToTransferable","attic","geometry","SphereGeometry","fromSphere","toSphere","centerSphere","atticFromSphere","atticToSphere","atticCenterSphere","_ClipboardManager","text","err","e","ClipboardManager","initData","planElementType","lockPlanEnabled","isConstructionProduct","PLAN_STORE","SET_WALL_MATERIAL_TYPE","getPressedKeysCount","acc","key","PlannerSceneManager","ConfiguratorSceneManager","offset","plannerCallback","AsyncGuard","BASE_CONTEXT","RenderMode","sceneEventInfo","PLAN_ELEMENT_CHANGE_TYPES","isConstructionOrMeasurementPlanElement","floorPlanObjects","elementLights","element","lights","lightsMaps","light","ids","notifyUiSelectionCallback","configuratorId","planXml","getHostname","PlanViewModel","elementPosition","size","maxAllowedDistance","measurementModel","payload","rootPlanElementId","rootPlanElementViewModel","payloadPromise","promisePayload","configurationRuntimeId","catalogItemId","idToUse","isExternalConfiguration","rootComponentId","isIdItemId","rapiConfiguration","copy","node","_planElementViewModel","measurementLineViewModel","transparent","BackgroundEnvironment","getColor","CameraControl3D","hideWallsBasedOnCamera","_offset","currentCameraParameters","GlbViewerCameraBehaviour","ConfiguratorCameraBehaviour","objectRotation","lookAtSide","preferredRotation","WALL_SIDES","planObjectId","cameraParameters","runtimeId","currentCameraParams","cameraType","is3D","CameraControlFirstPerson","objectDirection","angle","kernelPlanObjects","rapiItems","promises","resolve","reject","planGLTF","glb","plan","_plan","fromPlan","toPlan","planeGeometry","planeMaterial","MaterialCreator","configurableItemPromise","box","kernelBoxToThreeBox","_material","_vertices","_indices","_uvCoords","_normals","_type","resolveItemLoadedPromise","rejectItemLoadedPromise","promise","object3D","fadeIn","isItemOrConfiguration","isBox3InFrustum","_exportObjects","url","skyParams","sunPosition","viewSpacePositionFromUV","sunSphere","wallPlanObject","mesh","setWallTransparency","wall","CAMERA_EVENT","ctrlOrCmd","numPressedKeys","correctKeyPressed","selectedIds","selectedItemsIds","clipboard","validItemIds","getIdQueryParam","inputEvent","cleanup","isCtrlOrCmd","success","_planElement","planModelViewHelper","rotateBy","kernelCenter","options","isolationMode","cameraTarget","ImageRenderer","invisibleWalls","image","error","restorePlannerEditModeState","createEmptySceneFromCurrent","placedCamera","dispose","previousContext","selectedElement","spacing","dragEvent","zoom","combinedBounds","position2d","planObjectPositions","allPlanObjects","floorPlanObjectViewModels","floorsData","floor","floorData","toFloorAreaDataTransferable","textSphere","measurements","measurementLineDimensions","measurementLineViewModels","measurementLineDimension","toMeasurementLineDimensionToTransferable","objectDimensions","transferableRectMeasurements","transferableObjectMeasurements","transferableObjectToWallsMeasurements","dimension","fromPosition2d","toPosition2d","textPosition2d","objectToWallDimensionToTransferable","constructionMeasurements","redMaterial","greenMaterial","blueMaterial","sphereGeometry","leftFromSphere","leftToSphere","rightFromSphere","rightToSphere","rangeFromSphere","rangeToSphere","transferableMeasurements","toConstructionMeasurementTransferable","sceneEvents","type","wallPlanObjectViewModels","setLeftMaterial","applyMaterialToKernelMaterial","setRightMaterial","kernelWalls","kernelInnerWallEnum","kernelOuterWallLeftEnum","kernelOuterWallRightEnum","kernelFloors","cameraPosition","cameraToWall","wallKernelObject","wallForward","angleRadians","MathUtils","elementCenter","selectedElements","completelyLoaded","measurementId","length","kernelPlanElement","wallDistance","convertToStandardArray","w","hashCode","startPoint","endPoint","newLength","wallDirection","isCurrentlyDrawing","isVectorPreviewModeEnabled","nodePlanObject","isExtObj","selectedPlanObjectComponent","elementRuntimeId","planObjectComponent","GROUP_CEILING_LIGHTS","on","INTERIOR_LIGHTS_ENV_MAP_ROTATION","DEFAULT_ENV_MAP_ROTATION","INTERIOR_LIGHTS_ENV_MAP_INTENSITY","DEFAULT_ENV_MAP_INTENSITY","idInfos","index","rapiIds","mapFun","itemsPromise","itemList","EXT_OBJ_EXCEPTION","OFFSET","RoomlePlanner","activePlugins","params","intensity","maxLightSources","preloadPlanId","Benchmark","xml","USER_ACTION_MODULE","isPlanSnapshot","isPlanSnapshotId","_reject","dls","ls","stats","dynamicLightSettingSource","DynamicLightSettingLoader","RoomleConfigurator","currentSelection","configurator","PROMISE_CATEGORY","ConfiguratorClass","hsc","viewer","GLBViewerModule","callback","roomleConfigurator","_cssClass","catalogId","isExtObjId","insertExternalObject","originalIndex","externalObjectsPromise","rapiObjectsPromise","externalObjects","rapiObjects","results","a","b","planOverview","idOrConfig","config","isExternalObject","findFreeSpaceInPlan","dragIn","idOrSerializedConfigString","configurationHash","warning","parameter","wallDefinitions","interactionOptions","createdWalls","wallDefinition","nodeFrom","nodeTo","kernelPlanElements","parentPlanId","planSnapshot","externalObjectUniqueIds","externalObjectRuntimeIds","planXML","snapshot","objectsSize","i","rootComponentCenter","locationString","perspectiveImage","topImage","responsePlanSnapshotResult","configurationHashOrGroupId","partList","old","idOfNew","pos","rot","filename","shouldWaitForAssets","quality","planObjectIds","stringArray","shortUrl","response","downloadHomagIxExportPoC","configurationJson","properties","libraryJson","configuratorKernel","serializedJson","groupData","verifyArrangement","mergedGroups","correctArrangement","configuratorContext","selectedPlanObject","serializedGroups","firstGroupId","inConfigurator","objectPosition","updateConfiguration","newObjects","arrayOfGroups","posDataCollection","groupPosData","stepInDegrees","cameraAngleInDegrees","toDegrees","faceToAngleInDegrees","toRadiant","groups","jsonObjects","generatedImages","animateCamera","objectGroup","canvasScreenshot","groupId","wasMerged","rootModuleId","isConfiguratorContext","subModuleId","selectPlanObject","groupIdOrRootModuleId","_subModuleId","open","animate","switchToPlanner","switchToConfigurator","selectComponent","highlightSelection","currentlySelectedPlanObjectComponent","configuratorObjectAlreadySelected","invokeSelectPlanObject","groupDefinitions","externalObjectGroups","group","kneeHeight","width","preferredSide","side","arrayOfAttachedAttics","homagIntelligence","withPrice","planId","PlannerInputManager","InputManager","INJECTABLES","DependencyInjectionAssignment","ScriptLoader","DI_TYPE","Logger","PlannerMeshGenerator","ConfiguratorViewModel","RapiAccess","GlobalInitData","FAKE_ROOT_TAG","HiTagCatalogCallbacks","articles","emulator","onCheckExternalCacheOriginal","requestData","ogReq","tagId","items","idArray","externalConfiguration","article","category","entry","depth","height","attributes","attribute","addDimensions","extObj","createExtObj","proxyMarker","createEndpoint","releaseProxy","finalizer","throwMarker","isObject","val","proxyTransferHandler","port1","port2","expose","port","wrap","throwTransferHandler","serialized","transferHandlers","isAllowedOrigin","allowedOrigins","origin","allowedOrigin","ep","ev","path","argumentList","fromWireValue","returnValue","parent","prop","rawValue","proxy","transfer","wireValue","transferables","toWireValue","closeEndPoint","isMessagePort","endpoint","target","pendingListeners","resolver","createProxy","throwIfProxyReleased","isReleased","releaseEndpoint","requestResponseMessage","proxyCounter","proxyFinalizers","newCount","registerProxy","unregisterProxy","isProxyReleased","_target","r","p","_thisArg","rawArgumentList","last","processArguments","myFlat","arr","processed","v","transferCache","transfers","name","handler","serializedValue","msg","generateUUID","Planner","Main","RoomleDependencyInjection","KERNEL_TYPE","isInIframe","channel","hiCallbacks","articleJson","catalogsCallbacks","hiModule"],"mappings":"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","x_google_ignoreList":[5,20]}
|
|
1
|
+
{"version":3,"file":"planner-iORwmIyR.mjs","sources":["../../packages/common-core/public/textures/paper_background.png?no-inline?url","../../packages/planner-core/src/webgl/lightsetting/planner-light-setting.ts","../../packages/planner-core/src/utils/planner-selection-handler.ts","../../packages/planner-core/src/webgl/planner-scene-event-handler.ts","../../packages/planner-core/src/utils/planner-scene-utils.ts","../../../../node_modules/three/examples/jsm/objects/Sky.js","../../packages/planner-core/src/utils/map-to-ui-plan-objects.ts","../../packages/planner-core/src/webgl/paper-background.ts","../../packages/common-core/src/cameracontrol/planner-camera-behaviour.ts","../../packages/common-core/src/cameracontrol/planner-2d-camera-behaviour.ts","../../packages/common-core/src/cameracontrol/planner-3d-camera-behaviour.ts","../../packages/common-core/src/cameracontrol/planner-fp-camera-behaviour.ts","../../packages/planner-core/src/webgl/planner-element-highlighter.ts","../../packages/planner-core/src/utils/dimensions-helper.ts","../../packages/common-core/src/utils/clipboard-manager.ts","../../packages/planner-core/src/webgl/planner-scene-manager.ts","../../packages/planner-core/src/roomle-planner.ts","../../packages/planner-core/src/input/planner-input-manager.ts","../../packages/planner-core/src/utils/injectables.ts","../../packages/homag-intelligence/src/hi-tag-catalog-callbacks.ts","../../../../node_modules/comlink/dist/esm/comlink.mjs","../../packages/planner-core/src/planner.ts"],"sourcesContent":["export default \"__VITE_ASSET__mifIsO0e__\"","//import { viewSpacePositionFromUV } from '../../../../common-core/src/utils/threejs-utils';\nimport LightSetting from '../../../../common-core/src/lightsetting/light-setting';\nimport { LAYER } from '../../../../common-core/src/webgl/layer';\nimport { getGUI } from '../../../../common-core/src/utils/threejs-utils';\nimport type { Box3, ColorRepresentation, HemisphereLight, Scene } from 'three';\nimport {\n AmbientLight,\n Color,\n DirectionalLight,\n Sphere,\n Vector2,\n Vector3,\n} from 'three';\n\nexport default class PlannerLightSetting extends LightSetting {\n private _hemiLight: HemisphereLight;\n private _ambientLight: AmbientLight;\n private _mainDirLight: DirectionalLight;\n\n private _center: Vector3 = new Vector3(0, 0, 0);\n\n private _params = {\n ambientLight: {\n color: '#ffffff',\n },\n hemiLight: {\n color: '#ffffff',\n },\n mainDirLight: {\n direction: {\n x: 2,\n y: 1,\n z: 2,\n },\n color: '#ffffff',\n },\n };\n\n constructor(scene: Scene, oldLightSetting?: LightSetting) {\n super(scene, oldLightSetting);\n\n this._ambientLight = new AmbientLight(\n new Color(this._params.ambientLight.color as ColorRepresentation),\n 0.4\n );\n this._ambientLight.layers.set(LAYER.LIGHTING);\n\n // this._hemiLight = new HemisphereLight(new Color(0xffffff), new Color(0x555555), 0.3);\n // this._hemiLight.layers.set(LAYER.LIGHTING);\n // this._hemiLight.visible = false;\n\n this._mainDirLight = new DirectionalLight(\n new Color(this._params.mainDirLight.color as ColorRepresentation),\n 0.5\n );\n this._mainDirLight.castShadow = true;\n this._mainDirLight.shadow.camera.near = 0.5;\n this._mainDirLight.shadow.camera.far = 100;\n this._mainDirLight.shadow.mapSize = new Vector2(1024, 1024);\n this._mainDirLight.visible = true;\n\n this.addToScene();\n }\n\n public updateSunPosition(_inclination: number, _azimuth: number) {\n //const distance = 20;\n //const viewSpacePosition = viewSpacePositionFromUV(\n // distance,\n // _azimuth,\n // _inclination\n //);\n //const position = new Vector3(\n // viewSpacePosition.x,\n // -viewSpacePosition.z,\n // viewSpacePosition.y\n //);\n // this._areaLight.position.copy(position);\n // this._areaLight.lookAt(new Vector3(0, 0, 0));\n }\n\n public addToScene(): void {\n this._scene.add(this._mainDirLight);\n this._scene.add(this._ambientLight);\n // this._scene.add(this._hemiLight);\n this._scene.add(this._mainDirLight.target);\n }\n\n public removeFromScene(): void {\n this._scene.remove(this._mainDirLight);\n this._scene.remove(this._ambientLight);\n this._scene.remove(this._mainDirLight.target);\n }\n\n public reload(): void {\n this.removeFromScene();\n this.addToScene();\n }\n\n public needsBounds(): boolean {\n return true;\n }\n\n public updateBounds(bounds: Box3) {\n this._center.copy(bounds.getCenter(new Vector3()));\n\n const boundingSphere = new Sphere();\n bounds.getBoundingSphere(boundingSphere);\n\n const maxSize = boundingSphere.radius;\n\n const lightDirection = new Vector3(\n this._params.mainDirLight.direction.x,\n this._params.mainDirLight.direction.y,\n this._params.mainDirLight.direction.z\n );\n lightDirection.normalize();\n lightDirection.multiplyScalar(maxSize);\n\n this._mainDirLight.position.copy(this._center);\n this._mainDirLight.position.add(lightDirection);\n this._mainDirLight.target.position.copy(this._center);\n this._mainDirLight.target.updateMatrixWorld(true);\n\n this._mainDirLight.shadow.camera.top = maxSize;\n this._mainDirLight.shadow.camera.bottom = -maxSize;\n this._mainDirLight.shadow.camera.left = -maxSize;\n this._mainDirLight.shadow.camera.right = maxSize;\n this._mainDirLight.shadow.camera.near = 0.01;\n this._mainDirLight.shadow.camera.far = 2 * maxSize;\n this._mainDirLight.shadow.camera.updateProjectionMatrix();\n }\n\n public showGUI(): void {\n let gui = getGUI();\n if (!gui) {\n return;\n }\n if (this._ambientLight) {\n let ambiLight = gui.addFolder('Ambient Light');\n ambiLight.add<any>(this._ambientLight, 'visible');\n ambiLight\n .add<any>(this._ambientLight, 'intensity')\n .min(0)\n .max(5)\n .step(0.1);\n ambiLight\n .addColor(this._params.ambientLight, 'color')\n .onChange(\n (color: ColorRepresentation) =>\n (this._ambientLight.color = new Color(color))\n );\n }\n if (this._hemiLight) {\n let hemiLight = gui.addFolder('Hemi Light');\n hemiLight.add<any>(this._hemiLight, 'visible');\n hemiLight.add<any>(this._hemiLight, 'intensity').min(0).max(5).step(0.1);\n hemiLight\n .addColor(this._params.hemiLight, 'color')\n .onChange(\n (color: ColorRepresentation) =>\n (this._hemiLight.color = new Color(color))\n );\n }\n if (this._mainDirLight) {\n let mainDirectionalLight = gui.addFolder('Main Directional Light');\n mainDirectionalLight.add<any>(this._mainDirLight, 'visible');\n mainDirectionalLight\n .add<any>(this._mainDirLight, 'intensity')\n .min(0)\n .max(10)\n .step(0.1);\n mainDirectionalLight.add<any>(this._mainDirLight, 'castShadow');\n mainDirectionalLight\n .addColor(this._params.mainDirLight, 'color')\n .onChange(\n (color: ColorRepresentation) =>\n (this._mainDirLight.color = new Color(color))\n );\n mainDirectionalLight\n .add<any>(this._mainDirLight.position, 'x')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => this._mainDirLight.lookAt(this._center));\n mainDirectionalLight\n .add<any>(this._mainDirLight.position, 'y')\n .min(-10)\n .max(50)\n .step(0.1)\n .onChange(() => this._mainDirLight.lookAt(this._center));\n mainDirectionalLight\n .add<any>(this._mainDirLight.position, 'z')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => this._mainDirLight.lookAt(this._center));\n }\n }\n}\n","import EventDispatcher from '../../../configurator-core/src/utils/event-dispatcher';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport type { CancelSelectionReasons } from '../../../typings/planner';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport FloorPlanElementViewModel from '../view-model/floor-plan-element-view-model';\nimport { SELECTION_MODE } from '../../../configurator-core/src/utils/selection-handler';\n\nexport const enum SELECTION_EVENT {\n SELECT_PLAN_ELEMENT,\n DESELECT_PLAN_ELEMENT,\n SELECT_PLAN_ELEMENT_MULTI,\n SELECTION_MODE_CHANGED,\n}\n\nexport const isWallOrFloor = (planElementViewModel: PlanElementViewModel) => {\n return (\n planElementViewModel instanceof WallPlanElementViewModel ||\n planElementViewModel instanceof FloorPlanElementViewModel\n );\n};\n\nexport class PlannerSelectionHandlerEvent {\n public planElementViewModel: PlanElementViewModel;\n public planElementViewModels: PlanElementViewModel[];\n public selectionMode: SELECTION_MODE;\n public reason: CancelSelectionReasons;\n\n constructor(data: {\n planElementViewModel?: PlanElementViewModel;\n planElementViewModels?: PlanElementViewModel[];\n selectionMode?: SELECTION_MODE;\n reason?: CancelSelectionReasons;\n }) {\n const {\n planElementViewModel,\n planElementViewModels,\n selectionMode,\n reason,\n } = data;\n this.planElementViewModel = planElementViewModel;\n this.planElementViewModels = planElementViewModels;\n this.selectionMode = selectionMode;\n this.reason = reason;\n }\n}\n\nexport default class PlannerSelectionHandler extends EventDispatcher<PlannerSelectionHandlerEvent> {\n private _selectionMode: SELECTION_MODE = SELECTION_MODE.STANDARD;\n protected _selectedPlanElementViewModels: Map<number, PlanElementViewModel> =\n new Map();\n\n public check(planElementViewModel: PlanElementViewModel) {\n if (this._selectionMode === SELECTION_MODE.STANDARD) {\n this._checkStandard(planElementViewModel);\n }\n if (this._selectionMode === SELECTION_MODE.MULTISELECT) {\n this._checkMulti(planElementViewModel);\n }\n }\n\n public removeSelection() {\n this._selectedPlanElementViewModels.clear();\n }\n\n public cancelSelection(reason: CancelSelectionReasons) {\n if (this._selectedPlanElementViewModels.size === 0) {\n return;\n }\n this._selectedPlanElementViewModels.forEach((planElementViewModel, id) => {\n this._selectedPlanElementViewModels.delete(id);\n planElementViewModel.deselect();\n this.dispatchEvent(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({ planElementViewModel, reason })\n );\n });\n }\n\n private _checkStandard(planElementViewModel: PlanElementViewModel) {\n const planElementId = planElementViewModel.getId();\n let selected = this._selectedPlanElementViewModels.has(planElementId);\n if (selected) {\n const selectedPlanViewModel =\n this._selectedPlanElementViewModels.get(planElementId);\n if (selectedPlanViewModel) {\n return;\n }\n }\n\n if (this._selectedPlanElementViewModels.size > 0) {\n this._selectedPlanElementViewModels.forEach((value, id) => {\n this._selectedPlanElementViewModels.delete(id);\n value.deselect();\n this.dispatchEvent(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({\n planElementViewModel: value,\n reason: 'select_other',\n })\n );\n });\n }\n this._selectedPlanElementViewModels.set(\n planElementViewModel.getId(),\n planElementViewModel\n );\n planElementViewModel.select();\n this.dispatchEvent(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({ planElementViewModel })\n );\n }\n\n private _checkMulti(planElementViewModel: PlanElementViewModel) {\n if (isWallOrFloor(planElementViewModel)) {\n return;\n }\n\n let selected = this._selectedPlanElementViewModels.has(\n planElementViewModel.getId()\n );\n\n if (selected) {\n return;\n } else {\n this._selectedPlanElementViewModels.set(\n planElementViewModel.getId(),\n planElementViewModel\n );\n\n planElementViewModel.select();\n\n this.dispatchEvent(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT_MULTI,\n new PlannerSelectionHandlerEvent({\n planElementViewModels: this.getSelectedPlanElementViewModels(),\n })\n );\n\n this.dispatchEvent(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({ planElementViewModel })\n );\n }\n }\n\n private _deselectWallAndFloorElements() {\n this._selectedPlanElementViewModels.forEach((planElementViewModel, id) => {\n if (isWallOrFloor(planElementViewModel)) {\n this._selectedPlanElementViewModels.delete(id);\n planElementViewModel.deselect();\n this.dispatchEvent(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n new PlannerSelectionHandlerEvent({\n planElementViewModel,\n reason: 'selection_mode_changed',\n })\n );\n }\n });\n }\n\n public setSelectionMode(mode: SELECTION_MODE) {\n if (this._selectionMode === mode) {\n return;\n }\n if (mode === SELECTION_MODE.MULTISELECT) {\n this._deselectWallAndFloorElements();\n }\n this._selectionMode = mode;\n this.dispatchEvent(\n SELECTION_EVENT.SELECTION_MODE_CHANGED,\n new PlannerSelectionHandlerEvent({\n selectionMode: mode,\n })\n );\n }\n\n public getSelectionMode(): SELECTION_MODE {\n return this._selectionMode;\n }\n\n public hasSelection(): boolean {\n return this._selectedPlanElementViewModels.size > 0;\n }\n\n public hasMultiSelection(): boolean {\n return this._selectedPlanElementViewModels.size > 1;\n }\n\n public getSelectedPlanElementViewModels(): PlanElementViewModel[] {\n return [...this._selectedPlanElementViewModels].map(\n ([_id, planElementViewModel]) => planElementViewModel\n );\n }\n\n public getSelectedIds(): number[] {\n let result: number[] = [];\n this._selectedPlanElementViewModels.forEach((component) =>\n result.push(component.getId())\n );\n return result;\n }\n\n public isSelected(id: number) {\n return !!this._selectedPlanElementViewModels.get(id);\n }\n}\n","import type InputManager from '../../../common-core/src/input/input-manager';\nimport type { InputEvent } from '../../../common-core/src/input/input-manager';\nimport {\n INPUT_DELAY_TYPE,\n INPUT_EVENT,\n INPUT_EVENT_TYPE,\n} from '../../../common-core/src/input/input-manager';\nimport type PlanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport inject from '../../../common-core/src/di/inject';\nimport type PlannerSelectionHandler from '../utils/planner-selection-handler';\nimport {\n isWallOrFloor,\n SELECTION_EVENT,\n} from '../utils/planner-selection-handler';\nimport { SELECTION_MODE } from '../../../configurator-core/src/utils/selection-handler';\nimport {\n CURSOR_STYLE,\n deepMerge,\n setCursor,\n wait,\n} from '../../../common-core/src/utils/common-utils';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport type PlannerKernelAccess from '../services/planner-kernel-access';\nimport {\n convertToKernel,\n convertToTHREE,\n} from '../../../common-core/src/utils/kernel-utils';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport type {\n KernelObjectPtrList,\n KernelVector3,\n} from '../../../typings/kernel';\nimport SceneEventHandler from '../../../common-core/src/webgl/scene-event-handler';\nimport {\n INTERSECTION_MODE,\n OBJECT_EVENT,\n RAYCAST_EVENT,\n RAYCAST_PRIORITY,\n} from '../../../configurator-core/src/utils/raycast-helper';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport {\n CORE_CHILD_ENTITY_MODE,\n type CancelSelectionReasons,\n type KernelObject,\n type PlanInteractionHandler,\n type PlanMeasure,\n} from '../../../typings/planner';\nimport { DrawingType } from '../../../typings/planner-kernel-container';\nimport { isSafari } from '../../../common-core/src/utils/browser-helper';\nimport NodePlanElementViewModel from '../view-model/node-plan-element-view-model';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\nimport StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport type ContinuousDrawingHelper from './continuous-drawing-helper';\nimport type { Camera, Object3D, Scene } from 'three';\nimport {\n Box3,\n Group,\n Layers,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Vector3,\n} from 'three';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport type {\n RoomleEventedMesh,\n RoomleEventedObject3D,\n} from '../../../common-core/src/utils/threejs-utils';\nimport type { Position2 } from '../../../common-core/src/common-interfaces';\nimport FloorPlanElementViewModel from '../view-model/floor-plan-element-view-model';\nimport type { MeasurementLineDraggablePoints } from '../view-model/measurement-line-plan-element-view-model';\nimport MeasurementLinePlanElementViewModel, {\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME,\n} from '../view-model/measurement-line-plan-element-view-model';\nimport type { Values } from '../../../typings/helper';\nimport type InitData from './../../../common-core/src/utils/init-data';\nimport { DRAW_PREVIEW_MODES } from '../../../common-core/src/utils/shims';\nimport ConstructionPlanObjectViewModel from '../view-model/construction-plan-object-view-model';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport { isLockedElement } from './planner-scene-manager';\nimport { CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\n\nexport const enum PLANNER_SCENE_EVENT {\n SELECT_PLAN_ELEMENT,\n DESELECT_PLAN_ELEMENT,\n STATE_CHANGED,\n HOVER_ON,\n HOVER_OFF,\n DRAW,\n DRAWING_START,\n DRAWING_END,\n BEFORE_DRAG_START,\n DRAG_START,\n DRAG_MOVE,\n DRAG_END,\n DRAG_CANCEL,\n INTERACTION,\n CLICK_OUTSIDE,\n SELECTION_MODE_CHANGED,\n ADD_MEASUREMENT_LINE_START,\n ADD_MEASUREMENT_LINE_END,\n DRAG_MEASUREMENT_LINE,\n ACTIVATE_PLAN_ELEMENT,\n}\n\nexport const enum PLANNER_SCENE_EVENT_STATE {\n IDLE,\n DRAG,\n ROTATE,\n DRAW,\n MEASURE,\n}\n\nexport class SceneEventInfo {\n public planElementViewModel: PlanElementViewModel;\n public resetCamera: boolean;\n public state: PLANNER_SCENE_EVENT_STATE;\n public oldState: PLANNER_SCENE_EVENT_STATE;\n public reason: CancelSelectionReasons;\n\n constructor(data: {\n planElementViewModel?: PlanElementViewModel;\n resetCamera?: boolean;\n state?: PLANNER_SCENE_EVENT_STATE;\n oldState?: PLANNER_SCENE_EVENT_STATE;\n reason?: CancelSelectionReasons;\n }) {\n const { planElementViewModel, resetCamera, state, oldState, reason } = data;\n this.planElementViewModel = planElementViewModel;\n this.resetCamera = resetCamera === undefined ? true : resetCamera;\n this.state = state === undefined ? PLANNER_SCENE_EVENT_STATE.IDLE : state;\n this.oldState =\n oldState === undefined ? PLANNER_SCENE_EVENT_STATE.IDLE : oldState;\n this.reason = reason;\n }\n}\n\nexport interface PlanObjectEventInfo {\n planElementName: string;\n hasListener: boolean;\n priority: number;\n ignoreElementHit: boolean;\n roomleId: number;\n snapToWall: boolean; // true if it should be possible to snap the object on to a wall (when enabled)\n}\n\nexport default class PlannerSceneEventHandler extends SceneEventHandler<SceneEventInfo> {\n @inject\n private _plannerSelectionHandler: PlannerSelectionHandler;\n\n @inject\n private _plannerKernelAccess: PlannerKernelAccess;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n @inject\n protected _initData: InitData;\n\n private _planViewModel: PlanViewModel;\n\n private _draggedObject: PlanElementViewModel;\n private _lastDragPosition: Vector3;\n private _hoveredObject: PlanElementViewModel;\n\n private _position: Vector3;\n private _isDrawingEnabled: boolean = false;\n private _isCurrentlyDrawing: boolean = false;\n private _isMeasurementLineDrawActive: boolean = false;\n private _state: PLANNER_SCENE_EVENT_STATE = PLANNER_SCENE_EVENT_STATE.IDLE;\n private _drawingGroup: Group;\n\n private _continuousDrawingHelper: ContinuousDrawingHelper;\n private _kernelZoomFactor: number;\n private _currentPlanMeasure: PlanMeasure;\n\n constructor(\n creator: string,\n scene: Scene,\n camera: Camera,\n inputManager: InputManager\n ) {\n super(creator, scene, camera, inputManager);\n this._inputManager.addEventListener(\n INPUT_EVENT.UP,\n () => (this._position = null),\n this\n );\n this._raycastHelper.setMode(INTERSECTION_MODE.PLANNER);\n this._raycastHelper.addEventListener(\n RAYCAST_EVENT.CLICK_OUTSIDE,\n () => {\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.resetState();\n return;\n }\n this._plannerSelectionHandler.cancelSelection('click_outside');\n },\n this\n );\n\n // don't we wait for SELECTION_EVENT.SELECT_PLAN_ELEMENT here?\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT,\n ({ planElementViewModel }) => {\n this.dispatchEvent(\n this.isDragIn()\n ? PLANNER_SCENE_EVENT.ACTIVATE_PLAN_ELEMENT\n : PLANNER_SCENE_EVENT.SELECT_PLAN_ELEMENT,\n new SceneEventInfo({ planElementViewModel })\n );\n },\n this\n );\n\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.SELECT_PLAN_ELEMENT_MULTI,\n ({ planElementViewModels }) => {\n this._roomlePlannerUiCallback.onMultiSelectionChange(\n planElementViewModels\n );\n },\n this\n );\n\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.SELECTION_MODE_CHANGED,\n ({ selectionMode }) => {\n if (\n selectionMode === SELECTION_MODE.MULTISELECT &&\n this._hoveredObject\n ) {\n this._hoverOnMultiSelect(this._hoveredObject);\n }\n this._roomlePlannerUiCallback.onSelectionModeChange(selectionMode);\n this._checkRaycasterSnapping();\n },\n this\n );\n\n this._plannerSelectionHandler.addEventListener(\n SELECTION_EVENT.DESELECT_PLAN_ELEMENT,\n ({ planElementViewModel, reason }) => {\n // We skipped setting the state to idle for the drag event because the plan object gets selected automatically after dragging and\n // if there is an old object already selected, we deselect it to select the new dragged object and all this should happen\n // while the drag event is in progress. we set the state to idle inside the _dragEnd\n if (this._state !== PLANNER_SCENE_EVENT_STATE.DRAG) {\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n }\n\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DESELECT_PLAN_ELEMENT,\n new SceneEventInfo({ planElementViewModel, reason })\n );\n },\n this\n );\n\n this._inputManager.addEventListener(\n INPUT_EVENT.MOVE,\n (event: InputEvent) => this._move(event),\n this\n );\n }\n\n public disable() {\n const layers = new Layers();\n layers.disableAll();\n this._raycastHelper.setLayers(layers);\n this._raycastHelper.disableEvents();\n }\n\n get planInteractionHandler(): PlanInteractionHandler {\n return this._plannerKernelAccess?.planInteractionHandler;\n }\n\n get hoveredObjectId() {\n if (this._hoveredObject?.getPlanElement()) {\n return this._hoveredObject.getId();\n }\n return null;\n }\n\n get isCurrentlyDrawing() {\n return this._isCurrentlyDrawing;\n }\n\n public enable() {\n const layers = new Layers();\n layers.disableAll();\n layers.enable(LAYER.OBJECT);\n layers.enable(LAYER.GIZMO);\n layers.enable(LAYER.UI);\n layers.enable(LAYER.CONSTRUCTION);\n layers.enable(LAYER.BACKGROUND);\n this._raycastHelper.setLayers(layers);\n this._raycastHelper.enableEvents();\n }\n\n public enableConstructionEvents(enable: boolean) {\n if (enable) {\n this._raycastHelper.getLayers().enable(LAYER.CONSTRUCTION);\n } else {\n this._raycastHelper.getLayers().disable(LAYER.CONSTRUCTION);\n }\n }\n\n public enableObjectEvents(enable: boolean) {\n if (enable) {\n this._raycastHelper.getLayers().enable(LAYER.UI);\n } else {\n this._raycastHelper.getLayers().disable(LAYER.UI);\n }\n }\n\n public getSelectionMode(): SELECTION_MODE {\n return this._plannerSelectionHandler.getSelectionMode();\n }\n\n public addConstructionPlanObjectHandlers(\n planObjectViewModel: PlanObjectViewModel,\n object?: RoomleEventedObject3D\n ) {\n if (!object) {\n object = planObjectViewModel.getBoundingBox();\n }\n const planObjectEventInfo = {\n planElementName: planObjectViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.CONSTRUCTION,\n roomleId: planObjectViewModel.getId(),\n snapToWall: true,\n } as PlanObjectEventInfo;\n this._addPlanObjectHandlers(\n planObjectViewModel,\n object,\n planObjectEventInfo\n );\n }\n\n public addPlanObjectHandlers(\n planObjectViewModel: PlanObjectViewModel,\n object?: RoomleEventedObject3D\n ) {\n if (!object) {\n object = planObjectViewModel.getBoundingBox();\n }\n const planObjectEventInfo = {\n planElementName: planObjectViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: planObjectViewModel.getId(),\n } as PlanObjectEventInfo;\n this._addPlanObjectHandlers(\n planObjectViewModel,\n object,\n planObjectEventInfo\n );\n }\n\n public addWallHandlers(planElementViewModel: PlanElementViewModel) {\n this._addPlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n ignoreElementHit: true, // enables long press on mobile\n priority: RAYCAST_PRIORITY.WALL,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n public addWallAtticHandlers(planElementViewModel: PlanElementViewModel) {\n this._addPlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.WALL,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n public addMeasurementLineHandlers(\n planElementViewModel: MeasurementLinePlanElementViewModel\n ) {\n const componentEventInfo = {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo;\n\n this._addMeasurementLinePlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getPoint1DraggableBoundingBox(),\n componentEventInfo,\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT1\n );\n\n this._addMeasurementLinePlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getPoint2DraggableBoundingBox(),\n componentEventInfo,\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT2\n );\n\n this._addMeasurementLinePlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n componentEventInfo,\n null\n );\n }\n\n public addFloorHandlers(planElementViewModel: PlanElementViewModel) {\n this._addFloorElementHandlers(\n planElementViewModel,\n planElementViewModel.getObject(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.FLOOR,\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n public addNodeHandlers(planElementViewModel: PlanElementViewModel) {\n this._addPlanElementHandlers(\n planElementViewModel,\n planElementViewModel.getBoundingBox(),\n {\n planElementName: planElementViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n ignoreElementHit: true, // enables long press on mobile\n roomleId: planElementViewModel.getId(),\n } as PlanObjectEventInfo\n );\n }\n\n private _addPlanObjectHandlers(\n planObjectViewModel: PlanObjectViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n if (!object.userData.hasListener) {\n object.userData = deepMerge(object.userData, componentEventInfo);\n object.addEventListener(OBJECT_EVENT.CLICK, () =>\n this._clickElement(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DRAG_START, () =>\n this._dragStart(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DRAG, (event) =>\n this._drag(planObjectViewModel, event.attachment.position)\n );\n object.addEventListener(OBJECT_EVENT.DRAG_END, (event) =>\n this._dragEnd(planObjectViewModel, event.attachment.position)\n );\n object.addEventListener(OBJECT_EVENT.HOVER_ON, () =>\n this._hoverOn(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.HOVER_OFF, () =>\n this._hoverOff(planObjectViewModel)\n );\n object.addEventListener(OBJECT_EVENT.ROTATE, (event) =>\n this._rotate(planObjectViewModel, event.attachment.rotation)\n );\n }\n }\n\n private _addFloorElementHandlers(\n planElementViewModel: PlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n this._addElementHandlers(planElementViewModel, object, componentEventInfo);\n }\n\n private _addElementHandlers(\n planElementViewModel: PlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n if (!object.userData.hasListener) {\n object.userData = deepMerge(object.userData, componentEventInfo);\n object.addEventListener(OBJECT_EVENT.CLICK, () =>\n this._clickElement(planElementViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DOUBLE_CLICK, (event) => {\n this._doubleClickElement(\n planElementViewModel,\n (event as any).attachment.type,\n (event as any).attachment.intersection?.point\n );\n });\n object.addEventListener(OBJECT_EVENT.HOVER_ON, () =>\n this._hoverOn(planElementViewModel)\n );\n object.addEventListener(OBJECT_EVENT.HOVER_OFF, () =>\n this._hoverOff(planElementViewModel)\n );\n }\n }\n\n private _addPlanElementHandlers(\n planElementViewModel: PlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo\n ) {\n if (!object.userData.hasListener) {\n this._addElementHandlers(\n planElementViewModel,\n object,\n componentEventInfo\n );\n object.addEventListener(OBJECT_EVENT.DRAG_START, () =>\n this._dragStart(planElementViewModel)\n );\n object.addEventListener(OBJECT_EVENT.DRAG, (event) =>\n this._drag(planElementViewModel, event.attachment.position)\n );\n object.addEventListener(OBJECT_EVENT.DRAG_END, (event) =>\n this._dragEnd(planElementViewModel, event.attachment.position)\n );\n }\n }\n\n private _addMeasurementLinePlanElementHandlers(\n planElementViewModel: MeasurementLinePlanElementViewModel,\n object: RoomleEventedObject3D,\n componentEventInfo: PlanObjectEventInfo,\n point: MeasurementLineDraggablePoints\n ) {\n if (object.userData.hasListener) {\n return;\n }\n\n object.userData = deepMerge(object.userData, componentEventInfo);\n\n const updateCurrentPoint = () => {\n planElementViewModel.currentPoint = point;\n };\n\n object.addEventListener(OBJECT_EVENT.CLICK, () => {\n this._clickElement(planElementViewModel);\n updateCurrentPoint();\n });\n\n object.addEventListener(OBJECT_EVENT.DRAG_START, () => {\n updateCurrentPoint();\n planElementViewModel.selectPointOnDragStart(planElementViewModel);\n this._dragStart(planElementViewModel);\n });\n\n object.addEventListener(OBJECT_EVENT.DRAG, (event) => {\n updateCurrentPoint();\n planElementViewModel.hideDraggablePointsOnDragStart(\n planElementViewModel,\n point\n );\n this._drag(planElementViewModel, event.attachment.position);\n });\n\n object.addEventListener(OBJECT_EVENT.DRAG_END, (event) => {\n planElementViewModel.showDraggablePointsOnDragEnd(\n planElementViewModel,\n point\n );\n this._dragEnd(planElementViewModel, event.attachment.position);\n planElementViewModel.showDraggableNodes();\n updateCurrentPoint();\n });\n\n object.addEventListener(OBJECT_EVENT.HOVER_ON, () => {\n updateCurrentPoint();\n planElementViewModel.showDraggablePointsOnHoverOn(planElementViewModel);\n this._hoverOn(planElementViewModel);\n });\n\n object.addEventListener(OBJECT_EVENT.HOVER_OFF, () => {\n updateCurrentPoint();\n planElementViewModel.showDraggablePointsOnHoverOff(planElementViewModel);\n this._hoverOff(planElementViewModel);\n });\n }\n\n private _createFloorMeshWithHandler() {\n const geo = new PlaneGeometry(1000, 1000, 8, 8);\n const mat = new MeshBasicMaterial();\n mat.visible = false;\n const plane: RoomleEventedMesh = new Mesh(geo, mat);\n plane.name = '2D raycaster floor mesh';\n plane.rotation.set(-Math.PI / 2, 0, 0);\n plane.layers.enable(LAYER.BACKGROUND);\n plane.userData.ignoreElementHit = true;\n\n const componentEventInfo = {\n planElementName: '2D raycaster floor mesh',\n hasListener: true,\n priority: RAYCAST_PRIORITY.RAYCASTER_FLOOR,\n roomleId: undefined,\n } as PlanObjectEventInfo;\n plane.userData = deepMerge(plane.userData, componentEventInfo);\n plane.addEventListener(OBJECT_EVENT.DOUBLE_CLICK, (event) => {\n this._doubleClickOnPlane(\n convertToKernel(event.attachment.intersection.point),\n event.attachment.type\n );\n });\n plane.addEventListener(OBJECT_EVENT.CLICK, (event) => {\n const clickPoint = convertToKernel(event.attachment.intersection.point);\n if (!this._isCurrentlyDrawing) {\n this._plannerSelectionHandler.cancelSelection('click_outside');\n } else {\n this._clickOnPlane(clickPoint);\n }\n });\n\n return plane;\n }\n\n private _clickOnPlane(point?: KernelVector3) {\n this._createNode(null, point);\n }\n\n private _doubleClickOnPlane(\n point: KernelVector3,\n inputType: INPUT_EVENT_TYPE = INPUT_EVENT_TYPE.UNKNOWN\n ) {\n if (this._isMeasurementLineDrawActive) {\n return;\n }\n if (!this._closeToPoint(point)) {\n this._toggleDrawing(null, point, inputType);\n } else {\n this.stopDrawing();\n }\n }\n\n private _closeToPoint(point: KernelVector3) {\n let closeToPoint = false;\n for (const nodePlanViewModel of this._planViewModel.getNodePlanObjectViewModels()) {\n if (this._close(nodePlanViewModel.getPlanElement().getCenter(), point)) {\n closeToPoint = true;\n }\n }\n return closeToPoint;\n }\n\n private _close(point1: KernelVector3, point2: KernelVector3) {\n const maxDistance = 500;\n return (\n Math.abs(point1.x - point2.x) < maxDistance &&\n Math.abs(point1.y - point2.y) < maxDistance &&\n Math.abs(point1.z - point2.z) < maxDistance\n );\n }\n\n private _clickElement(planElementViewModel: PlanElementViewModel) {\n if (isLockedElement(planElementViewModel, this._initData)) {\n this._plannerSelectionHandler.cancelSelection('click_outside');\n\n return;\n }\n if (this._isCurrentlyDrawing) {\n return;\n }\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.handleDraggablePointsSelection(planElementViewModel);\n }\n if (this._debug) {\n console.log('select', planElementViewModel.getId());\n }\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.resetState();\n return;\n }\n this._plannerSelectionHandler.check(planElementViewModel);\n this._roomlePlannerUiCallback.onClickElement(planElementViewModel);\n this._setCursor();\n }\n\n private _doubleClickElement(\n planElementViewModel: PlanElementViewModel,\n inputType: INPUT_EVENT_TYPE = INPUT_EVENT_TYPE.UNKNOWN,\n intersectionPoint: Vector3\n ) {\n if (\n !this._isDrawingEnabled ||\n (!(planElementViewModel instanceof NodePlanElementViewModel) &&\n !(planElementViewModel instanceof WallPlanElementViewModel))\n ) {\n return;\n }\n if (this._debug) {\n console.log('double click', planElementViewModel.getId());\n }\n\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n this._plannerSelectionHandler.cancelSelection('double_click_wall');\n }\n\n let kernelPosition;\n if (planElementViewModel instanceof NodePlanElementViewModel) {\n kernelPosition = planElementViewModel.getPlanElement().getCenter();\n } else if (intersectionPoint) {\n kernelPosition = convertToKernel(\n new Vector3(intersectionPoint.x, 0, intersectionPoint.z)\n );\n }\n\n if (this._isCurrentlyDrawing) {\n this.endWallDrawing(null, kernelPosition);\n } else {\n this._startWallDrawing(null, kernelPosition, inputType);\n }\n }\n\n private _hoverOn(planElementViewModel: PlanElementViewModel) {\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.showDraggablePointsOnHoverOn(planElementViewModel);\n }\n if (this._isCurrentlyDrawing) {\n return;\n }\n if (\n this._plannerSelectionHandler.getSelectionMode() ===\n SELECTION_MODE.MULTISELECT\n ) {\n this._hoverOnMultiSelect(planElementViewModel);\n } else {\n this._hoverOnStandard(planElementViewModel);\n }\n }\n\n private _hoverOnMultiSelect(planElementViewModel: PlanElementViewModel) {\n if (\n isWallOrFloor(this._hoveredObject) ||\n isWallOrFloor(planElementViewModel)\n ) {\n this._hoveredObject = null;\n setCursor(CURSOR_STYLE.DEFAULT);\n } else {\n this._hoverOnStandard(planElementViewModel);\n }\n }\n\n private _hoverOnStandard(planElementViewModel: PlanElementViewModel) {\n planElementViewModel.hoverOn();\n this._hoveredObject = planElementViewModel;\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.HOVER_ON,\n new SceneEventInfo({ planElementViewModel })\n );\n this._interaction();\n this._setCursor();\n }\n\n private _hoverOff(planElementViewModel: PlanElementViewModel) {\n planElementViewModel.hoverOff();\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.showDraggablePointsOnHoverOff(planElementViewModel);\n }\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.HOVER_OFF,\n new SceneEventInfo({ planElementViewModel })\n );\n this._interaction();\n this._hoveredObject = null;\n this._setCursor();\n }\n\n private _isHoveredObjectNonDraggable() {\n return this._hoveredObject instanceof FloorPlanElementViewModel;\n }\n\n private _setCursor() {\n if (this._state === PLANNER_SCENE_EVENT_STATE.MEASURE) {\n setCursor(CURSOR_STYLE.NODE_HOVER);\n } else if (\n this._state === PLANNER_SCENE_EVENT_STATE.ROTATE &&\n this.hasSelection()\n ) {\n setCursor(CURSOR_STYLE.ROTATE);\n } else if (this._state === PLANNER_SCENE_EVENT_STATE.DRAG) {\n setCursor(CURSOR_STYLE.DRAGGING);\n } else if (\n !this._isHoveredObjectNonDraggable &&\n this._plannerSelectionHandler.isSelected(this.hoveredObjectId)\n ) {\n setCursor(CURSOR_STYLE.MOVE);\n } else if (this._hoveredObject) {\n if (isLockedElement(this._hoveredObject, this._initData)) {\n setCursor(CURSOR_STYLE.DEFAULT);\n } else {\n setCursor(CURSOR_STYLE.HOVER);\n }\n } else if (this._state === PLANNER_SCENE_EVENT_STATE.DRAW) {\n if (isSafari) {\n setCursor(CURSOR_STYLE.DRAW_FALLBACK);\n } else {\n setCursor(CURSOR_STYLE.DRAW);\n }\n } else {\n setCursor(CURSOR_STYLE.DEFAULT);\n }\n }\n\n public setCamera(camera: Camera) {\n this._raycastHelper.setCamera(camera);\n }\n\n public setObject(object: Object3D) {\n this._raycastHelper.setObject(object);\n }\n\n public getSelectedIds(): number[] {\n return this._plannerSelectionHandler.getSelectedIds();\n }\n\n public setSelectionMode(selectionMode: SELECTION_MODE) {\n this._plannerSelectionHandler.setSelectionMode(selectionMode);\n if (selectionMode === SELECTION_MODE.MULTISELECT) {\n this._roomlePlannerUiCallback.onMultiSelectionChange(\n this._plannerSelectionHandler.getSelectedPlanElementViewModels()\n );\n }\n }\n\n public setPlanViewModel(planViewModel: PlanViewModel) {\n this._planViewModel = planViewModel;\n }\n\n public cancelSelection(reason: CancelSelectionReasons) {\n if (this.isDragIn() && reason === 'dock_component') {\n // we do not want to cancel the selection if we drag and build up a new item\n return;\n }\n this._plannerSelectionHandler.cancelSelection(reason);\n }\n\n public removeSelection() {\n this._plannerSelectionHandler.removeSelection();\n }\n\n private _dragStart(planElementViewModel: PlanElementViewModel) {\n if (this._isMeasurementLineDrawActive) {\n return;\n }\n if (\n ((!this._plannerSelectionHandler.isSelected(\n planElementViewModel.getId()\n ) &&\n !this._dragIn) ||\n this._state !== PLANNER_SCENE_EVENT_STATE.IDLE) &&\n !this._isDrawingEnabled\n ) {\n return;\n }\n this.dispatchEvent(PLANNER_SCENE_EVENT.BEFORE_DRAG_START);\n wait(INPUT_DELAY_TYPE.DRAG).then(() => {\n if (this._inputManager.isMouseUp()) {\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n setCursor(CURSOR_STYLE.HOVER);\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAG_CANCEL);\n return;\n }\n\n this._draggedObject = planElementViewModel;\n this.setState(PLANNER_SCENE_EVENT_STATE.DRAG);\n this._roomlePlannerUiCallback.onDragElementStart(\n planElementViewModel.getId()\n );\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DRAG_START,\n new SceneEventInfo({ planElementViewModel })\n );\n });\n }\n\n private _drag(planElementViewModel: PlanElementViewModel, position: Vector3) {\n if (\n !this._draggedObject ||\n this._state !== PLANNER_SCENE_EVENT_STATE.DRAG\n ) {\n return;\n }\n\n const planInteractionHandler = this.planInteractionHandler;\n if (!this._lastDragPosition) {\n this._lastDragPosition = position;\n }\n let distance = position.clone().sub(this._lastDragPosition);\n\n if (this._plannerSelectionHandler.getSelectedIds().length > 1) {\n const planObjectPtrList: KernelObjectPtrList =\n new this._plannerKernelAccess.kernelContainer.PlanObjectPtrList();\n this._plannerSelectionHandler\n .getSelectedIds()\n .forEach((id) =>\n planObjectPtrList.push_back(\n this._planViewModel.getPlanObjectForId(id).getPlanElement()\n )\n );\n const vector3 = convertToKernel(distance);\n // Fix z position so multiple selected items don't climb walls on move.\n if (this._plannerSelectionHandler.hasMultiSelection()) {\n vector3.z = 0;\n }\n planInteractionHandler.moveObjectsBy(planObjectPtrList, vector3);\n\n this._lastDragPosition.copy(position);\n } else if (\n planElementViewModel instanceof MeasurementLinePlanElementViewModel\n ) {\n this._dragMeasurementLine(planElementViewModel, position);\n } else {\n const isWallOrNode =\n planElementViewModel instanceof NodePlanElementViewModel ||\n planElementViewModel instanceof WallPlanElementViewModel;\n const planElement = planElementViewModel.getPlanElement(); \n const is2d = this._planViewModel.cameraType === CAMERA_TYPE.CAMERA_2D;\n if ((is2d && !this._dragIn) || isWallOrNode) {\n const currentPosition = convertToTHREE(\n planElement.getCenter()\n );\n const vector3 = convertToKernel(\n position.clone().sub(currentPosition)\n );\n vector3.z = 0;\n planInteractionHandler.moveElementBy(\n planElement,\n vector3\n );\n } else {\n planInteractionHandler.moveElementTo(\n planElement,\n convertToKernel(position)\n );\n }\n }\n\n this._lastDragPosition.copy(position);\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DRAG_MOVE,\n new SceneEventInfo({ planElementViewModel })\n );\n }\n\n private _dragEnd(\n planElementViewModel: PlanElementViewModel,\n _position: Position2\n ) {\n if (!this._draggedObject) {\n return;\n }\n this._draggedObject = null;\n this._lastDragPosition = null;\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.DRAG_END,\n new SceneEventInfo({ planElementViewModel })\n );\n if (this._dragIn) {\n this.setDragIn(false);\n }\n this._roomlePlannerUiCallback.onDragElementEnd();\n this._setCursor();\n }\n\n private _rotate(\n planElementViewModel: PlanElementViewModel,\n rotation: number\n ) {\n if (\n this._plannerSelectionHandler.isSelected(planElementViewModel.getId())\n ) {\n const planInteractionHandler = this.planInteractionHandler;\n const planObject = (\n planElementViewModel as PlanObjectViewModel\n ).getPlanObject();\n planInteractionHandler.setObjectRotation(\n planElementViewModel.getPlanElement(),\n planObject.rotation - rotation\n );\n }\n }\n\n public setState(state: PLANNER_SCENE_EVENT_STATE) {\n const oldState = this._state;\n this._state = state;\n this._setCursor();\n this.dispatchEvent(\n PLANNER_SCENE_EVENT.STATE_CHANGED,\n new SceneEventInfo({ state: this._state, oldState })\n );\n this._position = null;\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.planInteractionHandler?.deactivateAllSnappingActivity();\n } else if (oldState === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n this.planInteractionHandler?.reactivateAllSnappingActivity();\n }\n }\n\n public resetState() {\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n }\n\n private _move(event: InputEvent) {\n if (\n this._state === PLANNER_SCENE_EVENT_STATE.DRAW ||\n this._state === PLANNER_SCENE_EVENT_STATE.MEASURE\n ) {\n return;\n }\n if (this._state === PLANNER_SCENE_EVENT_STATE.ROTATE) {\n if (this.hasSelection()) {\n this._setCursor();\n let delta = Math.PI / 180;\n const { x, y } = event.positionRelative;\n if (this._position) {\n // rotate 1.4 * 180 degree to the left and right to enable a full rotation if 30% of screen are hidden be menus\n delta =\n event.positionRelative.x * 1.4 * Math.PI -\n this._position.x * 1.4 * Math.PI;\n } else {\n this._position = new Vector3(\n event.positionRelative.x,\n event.positionRelative.y,\n 0\n );\n }\n const list =\n new this._plannerKernelAccess.kernelContainer.PlanObjectPtrList();\n const bounds = new Box3();\n this.getSelectedIds().forEach((id) => {\n const planObjectViewModel =\n this._planViewModel?.getPlanObjectForId(id);\n if (planObjectViewModel && planObjectViewModel.getObject()) {\n list.push_back(planObjectViewModel.getPlanElement());\n bounds.expandByObject(planObjectViewModel.getContainer());\n }\n });\n const center = bounds.getCenter(new Vector3());\n const planInteractionHandler = this.planInteractionHandler;\n planInteractionHandler.rotateObjectsBy(\n list,\n delta,\n convertToKernel(center)\n );\n this._position.copy(new Vector3(x, y, 0));\n }\n }\n }\n\n public hasSelection() {\n return this._plannerSelectionHandler.getSelectedIds().length > 0;\n }\n\n public async selectPlanElement(planElement: PlanElementViewModel) {\n if (\n planElement instanceof ConfiguratorPlanObjectViewModel ||\n planElement instanceof StaticPlanObjectViewModel\n ) {\n await planElement.isInitDone();\n }\n this._plannerSelectionHandler.check(planElement);\n }\n\n protected _interaction(_forceRender?: boolean) {\n this.dispatchEvent(PLANNER_SCENE_EVENT.INTERACTION, new SceneEventInfo({}));\n }\n\n public addComponentDragInHandler(planViewModel: PlanElementViewModel) {\n if (!this._dragIn) {\n return;\n }\n const boundingBox = planViewModel.getBoundingBox();\n\n const snapToWall =\n planViewModel instanceof ConstructionPlanObjectViewModel ||\n planViewModel instanceof ConfigurableConstructionPlanObjectViewModel;\n this._addPlanElementHandlers(planViewModel, boundingBox, {\n planElementName: planViewModel.getName(),\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: planViewModel.getId(),\n snapToWall,\n } as PlanObjectEventInfo);\n this._raycastHelper.enableDragIn(boundingBox);\n this._dragStart(planViewModel);\n }\n\n public enableSnapping() {\n this.planInteractionHandler.enableSnap = true;\n this._checkRaycasterSnapping();\n }\n\n public disableSnapping() {\n this.planInteractionHandler.enableSnap = false;\n this._checkRaycasterSnapping();\n }\n\n public enableAdvancedDocking() {\n this.planInteractionHandler.dockWhenSnap = true;\n }\n\n public disableAdvancedDocking() {\n this.planInteractionHandler.dockWhenSnap = false;\n }\n\n public showsChildrenOfPlanObject(object: KernelObject): boolean {\n return (\n this.planInteractionHandler.getShowChildrenOfPlanObject(object).value !==\n CORE_CHILD_ENTITY_MODE.OFF\n );\n }\n\n public enableShowChildrenOfPlanObject(object: KernelObject) {\n this.planInteractionHandler.setShowChildrenOfPlanObject(\n object,\n {\n value: CORE_CHILD_ENTITY_MODE.GROUND_COMPONENTS,\n },\n false\n );\n }\n\n public disableShowChildrenOfPlanObject(object: KernelObject) {\n this.planInteractionHandler.setShowChildrenOfPlanObject(\n object,\n {\n value: CORE_CHILD_ENTITY_MODE.OFF,\n },\n false\n );\n }\n\n private _checkRaycasterSnapping() {\n const snappingEnabled = this.planInteractionHandler.enableSnap;\n const isMultiselect =\n this.getSelectionMode() === SELECTION_MODE.MULTISELECT;\n\n if (snappingEnabled && !isMultiselect) {\n this._raycastHelper.enableOnWallSnapping();\n } else {\n this._raycastHelper.disableOnWallSnapping();\n }\n }\n\n public enableWallDrawing(): Group {\n this._isDrawingEnabled = true;\n this._drawingGroup = new Group();\n this._drawingGroup.name = 'Drawing';\n this._drawingGroup.add(this._createFloorMeshWithHandler());\n this._inputManager.addEventListener(\n INPUT_EVENT.MOVE,\n this._drawWallOnMouseMove,\n this\n );\n this._inputManager.addEventListener(\n INPUT_EVENT.TOUCH_END,\n this.endWallDrawing,\n this\n );\n\n return this._drawingGroup;\n }\n\n public cancelWallDrawing(): Group {\n this._isDrawingEnabled = false;\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.IDLE);\n this._inputManager.removeEventListener(\n INPUT_EVENT.MOVE,\n this._drawWallOnMouseMove\n );\n this._inputManager.removeEventListener(\n INPUT_EVENT.TOUCH_END,\n this.endWallDrawing\n );\n\n this._raycastHelper.clear();\n\n return this._drawingGroup;\n }\n\n public stopDrawing(cancelDrawing: boolean = true) {\n this.planInteractionHandler.endInteraction();\n if (cancelDrawing) {\n this.planInteractionHandler.cancelDrawing();\n }\n this._raycastHelper.getLayers().enable(LAYER.CONSTRUCTION);\n this._isCurrentlyDrawing = false;\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.IDLE);\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAWING_END);\n this._continuousDrawingHelper?.endDrawing();\n this._roomlePlannerUiCallback.onDrawingStateChanged(false);\n }\n\n public startDrawing() {\n if (this._isCurrentlyDrawing) {\n return;\n }\n this._isCurrentlyDrawing = true;\n this._raycastHelper.getLayers().disable(LAYER.CONSTRUCTION);\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAWING_START);\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.DRAW);\n this._continuousDrawingHelper?.update();\n this._roomlePlannerUiCallback.onDrawingStateChanged(true);\n }\n\n private _toggleDrawing(\n event: InputEvent,\n point?: KernelVector3,\n inputType?: INPUT_EVENT_TYPE\n ) {\n if (this._isCurrentlyDrawing) {\n this.endWallDrawing(event, point);\n } else {\n this._startWallDrawing(event, point, inputType);\n }\n }\n\n public endWallDrawing(event: InputEvent | null, point?: KernelVector3) {\n if (this._isCurrentlyDrawing) {\n if (\n this.planInteractionHandler\n .getContinuousDrawingManager()\n .shouldShowCircle() &&\n this.planInteractionHandler\n .getContinuousDrawingManager()\n .shouldShowCircle()\n ) {\n this.planInteractionHandler.cancelDrawing();\n } else {\n const { x, y } = point\n ? point\n : this._getIntersectionPointWithScene(event);\n this.planInteractionHandler.endDrawing({ x, y, z: 0 });\n }\n this.stopDrawing(false);\n }\n }\n\n private async _startWallDrawing(\n event: InputEvent | null,\n point?: KernelVector3,\n inputType?: INPUT_EVENT_TYPE\n ) {\n if (\n (event && event.type === INPUT_EVENT_TYPE.TOUCH) ||\n inputType === INPUT_EVENT_TYPE.TOUCH\n ) {\n await this._initMobileDrawing();\n this._continuousDrawingHelper.update();\n }\n this.planInteractionHandler.startInteraction();\n\n const { x, y } = point ? point : this._getIntersectionPointWithScene(event);\n const vectorDrawPreviewMode =\n this._initData?.featureFlags?.drawPreviewMode ===\n DRAW_PREVIEW_MODES.VECTOR;\n this.planInteractionHandler.beginDrawing(\n { x, y, z: 0 },\n vectorDrawPreviewMode\n );\n this.startDrawing();\n }\n\n private async _initMobileDrawing() {\n this.planInteractionHandler.setDrawingType(DrawingType.CONTINOUS);\n this.planInteractionHandler.setSnapFeedbackWhileDrawing(true);\n\n if (!this._continuousDrawingHelper) {\n const { default: ContinuousDrawingHelperClass } = await import(\n './continuous-drawing-helper'\n );\n this._continuousDrawingHelper = new ContinuousDrawingHelperClass();\n this._continuousDrawingHelper.init(\n this._drawingGroup,\n this.planInteractionHandler.getContinuousDrawingManager(),\n this._kernelZoomFactor\n );\n }\n }\n\n private _drawWallOnMouseMove(event: InputEvent) {\n if (!this._isCurrentlyDrawing || this._isMeasurementLineDrawActive) {\n return;\n }\n const { x, y } = this._getIntersectionPointWithScene(event);\n\n this.planInteractionHandler.currentDrawingPosition({ x, y, z: 0 });\n\n this._continuousDrawingHelper?.update();\n\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAW);\n }\n\n private _createNode(event: InputEvent, point?: KernelVector3) {\n if (!this._isCurrentlyDrawing) {\n return;\n }\n\n const { x, y } = point ? point : this._getIntersectionPointWithScene(event);\n this.planInteractionHandler.forceNode({ x, y, z: 0 });\n this._raycastHelper.clear();\n }\n\n private _getIntersectionPointWithScene(event: InputEvent): KernelVector3 {\n return this._raycastHelper.intersectMouseOnScene(event);\n }\n\n private _setStateAndCursor(state: PLANNER_SCENE_EVENT_STATE) {\n this.setState(state);\n this._setCursor();\n }\n\n public setKernelZoomFactor(kernelZoomFactor: number) {\n this._kernelZoomFactor = kernelZoomFactor;\n this._continuousDrawingHelper?.setKernelZoomFactor(kernelZoomFactor);\n }\n\n public enableMeasurementLineDrawing(): void {\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.MEASURE);\n this._isMeasurementLineDrawActive = true;\n this._enableDrawingListeners();\n }\n\n public disableMeasurementLineDrawing(): void {\n this._disableDrawingListeners();\n this.dispatchEvent(PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_END);\n this.setState(PLANNER_SCENE_EVENT_STATE.IDLE);\n this._isMeasurementLineDrawActive = false;\n this._currentPlanMeasure = null;\n }\n\n private _handleMeasurementLineDrawingEvent(\n eventNumber: Values<keyof INPUT_EVENT>\n ) {\n if (eventNumber === INPUT_EVENT.MOVE) {\n return this._drawMeasurementLineOnMouseMove;\n } else if (\n eventNumber === INPUT_EVENT.CLICK ||\n eventNumber === INPUT_EVENT.LONG_TOUCH ||\n eventNumber === INPUT_EVENT.TOUCH_END\n ) {\n return this._createPlanMeasure;\n }\n return null;\n }\n\n private _enableDrawingListeners() {\n const events = [\n INPUT_EVENT.CLICK,\n INPUT_EVENT.MOVE,\n INPUT_EVENT.LONG_TOUCH,\n INPUT_EVENT.TOUCH_END,\n ];\n events.forEach((eventType) => {\n this._inputManager.addEventListener(\n eventType,\n this._handleMeasurementLineDrawingEvent(eventType),\n this\n );\n });\n }\n\n private _disableDrawingListeners() {\n const events = [\n INPUT_EVENT.CLICK,\n INPUT_EVENT.MOVE,\n INPUT_EVENT.LONG_TOUCH,\n INPUT_EVENT.TOUCH_END,\n ];\n events.forEach((eventType) => {\n this._inputManager.removeEventListener(\n eventType,\n this._handleMeasurementLineDrawingEvent(eventType)\n );\n });\n }\n\n private _drawMeasurementLineOnMouseMove(event: InputEvent) {\n if (!this._currentPlanMeasure) {\n return;\n }\n if (this._state !== PLANNER_SCENE_EVENT_STATE.MEASURE) {\n this._setStateAndCursor(PLANNER_SCENE_EVENT_STATE.MEASURE);\n }\n const { x, y } = this._getIntersectionPointWithScene(event);\n this.planInteractionHandler.setMeasurePoint2(\n this._currentPlanMeasure,\n {\n x,\n y,\n z: 0,\n },\n true,\n true\n );\n }\n\n private _updateMeasurementLineViewModels(\n action: 'hide_dragged_node' | 'showDraggableNodes'\n ) {\n if (action === 'hide_dragged_node') {\n this._planViewModel\n .getMeasurementLineObjectViewModels()\n .forEach((viewModel) => {\n if (this._currentPlanMeasure.getId() === viewModel.getId()) {\n viewModel.hidePoint2DraggableNode();\n }\n });\n } else if (action === 'showDraggableNodes') {\n this._planViewModel\n .getMeasurementLineObjectViewModels()\n .forEach((viewModel) => {\n if (this._currentPlanMeasure.getId() === viewModel.getId()) {\n viewModel.showDraggableNodes();\n viewModel.showDraggablePointsOnDragEnd(viewModel, 'point2');\n }\n });\n }\n }\n\n private _createPlanMeasure(event: InputEvent) {\n const { x, y } = this._getIntersectionPointWithScene(event);\n const position = { x, y, z: 0 };\n\n if (!this._currentPlanMeasure) {\n this.dispatchEvent(PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_START);\n this._currentPlanMeasure = this.planInteractionHandler.addMeasure(\n position,\n position\n );\n this._updateMeasurementLineViewModels('hide_dragged_node');\n return;\n }\n\n this.planInteractionHandler.setMeasurePoint2(\n this._currentPlanMeasure,\n position,\n true,\n true\n );\n\n this._updateMeasurementLineViewModels('showDraggableNodes');\n this.disableMeasurementLineDrawing();\n }\n\n private _dragMeasurementLine(\n planElementViewModel: MeasurementLinePlanElementViewModel,\n newPosition: Vector3\n ) {\n const planMeasure = planElementViewModel.getPlanElement() as PlanMeasure;\n\n if (!planElementViewModel.currentPoint) {\n if (!this._lastDragPosition) {\n this._lastDragPosition = newPosition.clone();\n return;\n }\n\n const distance = newPosition.clone().sub(this._lastDragPosition);\n const currentCenter = convertToTHREE(planMeasure.getCenter());\n const newCenter = currentCenter.add(distance);\n\n this.planInteractionHandler.moveElementTo(\n planMeasure,\n convertToKernel(newCenter)\n );\n\n this._lastDragPosition.copy(newPosition);\n planElementViewModel.update();\n this.dispatchEvent(PLANNER_SCENE_EVENT.DRAG_MEASUREMENT_LINE);\n return;\n }\n\n if (\n planElementViewModel.currentPoint ===\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT1\n ) {\n this.planInteractionHandler.setMeasurePoint1(\n planMeasure,\n convertToKernel(newPosition),\n true,\n true\n );\n }\n\n if (\n planElementViewModel.currentPoint ===\n MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME.POINT2\n ) {\n this.planInteractionHandler.setMeasurePoint2(\n planMeasure,\n convertToKernel(newPosition),\n true,\n true\n );\n }\n }\n\n public setMeasurementLineLength(\n measurementLine: MeasurementLinePlanElementViewModel,\n targetLengthMM: number,\n direction: string\n ) {\n if (!measurementLine) {\n console.error('Measurement line not found');\n return;\n }\n\n const targetLengthUnits = targetLengthMM / 1000;\n\n const isLeftDirection = direction.toLowerCase() === 'left';\n const basePoint = isLeftDirection\n ? measurementLine.getPoint2Draggable().position.clone()\n : measurementLine.getPoint1Draggable().position.clone();\n const directionVector = new Vector3()\n .subVectors(\n measurementLine.getPoint2Draggable().position,\n measurementLine.getPoint1Draggable().position\n )\n .normalize();\n const scaledDirectionVector =\n directionVector.multiplyScalar(targetLengthUnits);\n\n const newPoint = isLeftDirection\n ? basePoint.sub(scaledDirectionVector)\n : basePoint.add(scaledDirectionVector);\n\n if (isLeftDirection) {\n this.planInteractionHandler.setMeasurePoint1(\n measurementLine.getPlanElement() as PlanMeasure,\n convertToKernel(newPoint),\n false,\n false\n );\n } else {\n this.planInteractionHandler.setMeasurePoint2(\n measurementLine.getPlanElement() as PlanMeasure,\n convertToKernel(newPoint),\n false,\n false\n );\n }\n }\n}\n","import {\n getScreenXY,\n threeVectorToTransferableXY,\n} from '../../../common-core/src/utils/threejs-utils';\nimport type PplanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport type { PlanObjectPosition } from '../../../typings/planner';\nimport type { Camera } from 'three';\nimport { Box3, Vector3 } from 'three';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport FloorPlanElementViewModel from '../view-model/floor-plan-element-view-model';\nimport MeasurementLinePlanElementViewModel from '../view-model/measurement-line-plan-element-view-model';\nimport WallAtticPlanElementViewModel from '../view-model/wall-attic-plan-element-view-model';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\n\nexport const createTransferableObjectPosition = (\n planViewModel: PplanObjectViewModel | PlanElementViewModel,\n camera: Camera,\n clientWidth: number,\n clientHeight: number\n): PlanObjectPosition => {\n const bounds = new Box3().setFromObject(planViewModel.getContainer());\n const center = bounds.getCenter(new Vector3());\n return {\n runtimeIds: [planViewModel.getId()],\n position2d: threeVectorToTransferableXY(\n getScreenXY(center, camera, clientWidth, clientHeight)\n ),\n };\n};\n\nexport type CallbackObjectType =\n | 'static'\n | 'configuration'\n | 'wall'\n | 'measure'\n | 'attic'\n | 'door'\n | 'floor'\n | 'window'\n | 'unknown'\n | 'external-configuration';\n\nexport const getCallbackObjectType = (\n planElementViewModel: PlanElementViewModel\n): CallbackObjectType => {\n if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n const objectType = planElementViewModel\n .getPlanObject()\n .getObjectType() as CallbackObjectType;\n if (objectType !== 'door' && objectType !== 'window') {\n return 'static';\n } else {\n return objectType;\n }\n }\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n return 'configuration';\n }\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n return 'wall';\n }\n if (planElementViewModel instanceof FloorPlanElementViewModel) {\n return 'floor';\n }\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n return 'measure';\n }\n if (planElementViewModel instanceof WallAtticPlanElementViewModel) {\n return 'attic';\n }\n return 'unknown';\n};\n\nexport const addDemoLights = (\n planObjectViewModel: StaticPlanObjectViewModel,\n planViewModel: PlanViewModel,\n active: boolean\n) => {\n const rapiItem = planObjectViewModel.getRapiItem?.();\n if (\n rapiItem &&\n (rapiItem.detailType === 'lamp_ceiling' ||\n rapiItem.detailType === 'lamp_standing')\n ) {\n if (rapiItem?.id === 'brands_15:flos_aim') {\n const targetPos = {\n x: -0.45,\n y: -0.37,\n z: 0.35,\n };\n const lightPos = {\n x: 0.38,\n y: 0.31,\n z: -0.17,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n { targetPos, lightPos, active }\n );\n } else if (rapiItem?.id === 'brands_26:diesel_with_foscarini_fork') {\n const targetPos = {\n x: 0,\n y: -0.56,\n z: -0.49,\n };\n const lightPos = {\n x: 0.01,\n y: 1.62,\n z: 0,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n targetPos,\n lightPos,\n color: 0xffdfbb,\n decay: 0,\n active,\n }\n );\n }\n }\n\n if (rapiItem?.id === 'brands_26:diesel_with_foscarini_duii') {\n const targetPos = {\n x: -1.4,\n y: -0.74,\n z: -0.07,\n };\n const lightPos = {\n x: 0.07,\n y: 0.59,\n z: 0,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n targetPos,\n lightPos,\n color: 0xffffff,\n decay: 2,\n active,\n }\n );\n }\n\n if (rapiItem?.id === 'ba6d0d48:lights-kitchen') {\n const dimensions = {\n width: 2.45,\n height: 0.03,\n };\n const lightPos = {\n x: 0,\n y: 1.571,\n z: -1.05,\n };\n planViewModel.handleRectLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n dimensions,\n lightPos,\n color: 0xffffff,\n active,\n }\n );\n\n // Second one\n const dimensions2 = {\n width: 0.03,\n height: 2.17,\n };\n\n const lightPos2 = {\n x: 1.195,\n y: 1.033,\n z: 0,\n };\n\n planViewModel.handleRectLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n dimensions: dimensions2,\n lightPos: lightPos2,\n color: 0xffffff,\n active,\n }\n );\n }\n\n if (\n // @ts-ignore -- it works\n planObjectViewModel.getRapiItem?.()?.id ===\n 'roomle_white_furniture:Lighting_Pendant_lamp_02'\n ) {\n const targetPos = {\n x: 0,\n y: -99,\n z: 0,\n };\n const lightPos = {\n x: 0,\n y: 0.15,\n z: 0,\n };\n planViewModel.handleLampLight(\n planObjectViewModel as StaticPlanObjectViewModel,\n {\n targetPos,\n lightPos,\n color: 0xfaefcf,\n decay: 1,\n intensity: 1,\n active,\n }\n );\n }\n};\n","import {\n\tBackSide,\n\tBoxGeometry,\n\tMesh,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector3\n} from 'three';\n\n/**\n * Based on \"A Practical Analytic Model for Daylight\"\n * aka The Preetham Model, the de facto standard analytic skydome model\n * https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight\n *\n * First implemented by Simon Wallner\n * http://simonwallner.at/project/atmospheric-scattering/\n *\n * Improved by Martin Upitis\n * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n *\n * Three.js integration by zz85 http://twitter.com/blurspline\n*/\n\nclass Sky extends Mesh {\n\n\tconstructor() {\n\n\t\tconst shader = Sky.SkyShader;\n\n\t\tconst material = new ShaderMaterial( {\n\t\t\tname: shader.name,\n\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\tsuper( new BoxGeometry( 1, 1, 1 ), material );\n\n\t\tthis.isSky = true;\n\n\t}\n\n}\n\nSky.SkyShader = {\n\n\tname: 'SkyShader',\n\n\tuniforms: {\n\t\t'turbidity': { value: 2 },\n\t\t'rayleigh': { value: 1 },\n\t\t'mieCoefficient': { value: 0.005 },\n\t\t'mieDirectionalG': { value: 0.8 },\n\t\t'sunPosition': { value: new Vector3() },\n\t\t'up': { value: new Vector3( 0, 1, 0 ) }\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tuniform vec3 sunPosition;\n\t\tuniform float rayleigh;\n\t\tuniform float turbidity;\n\t\tuniform float mieCoefficient;\n\t\tuniform vec3 up;\n\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float e = 2.71828182845904523536028747135266249775724709369995957;\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\t// wavelength of used primaries, according to preetham\n\t\tconst vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n\t\t// this pre-calculation replaces older TotalRayleigh(vec3 lambda) function:\n\t\t// (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n\t\tconst vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n\t\t// mie stuff\n\t\t// K coefficient for the primaries\n\t\tconst float v = 4.0;\n\t\tconst vec3 K = vec3( 0.686, 0.678, 0.666 );\n\t\t// MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n\t\tconst vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n\t\t// earth shadow hack\n\t\t// cutoffAngle = pi / 1.95;\n\t\tconst float cutoffAngle = 1.6110731556870734;\n\t\tconst float steepness = 1.5;\n\t\tconst float EE = 1000.0;\n\n\t\tfloat sunIntensity( float zenithAngleCos ) {\n\t\t\tzenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n\t\t\treturn EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n\t\t}\n\n\t\tvec3 totalMie( float T ) {\n\t\t\tfloat c = ( 0.2 * T ) * 10E-18;\n\t\t\treturn 0.434 * c * MieConst;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n\t\t\tvSunDirection = normalize( sunPosition );\n\n\t\t\tvSunE = sunIntensity( dot( vSunDirection, up ) );\n\n\t\t\tvSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n\t\t\tfloat rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n\t\t\t// extinction (absorption + out scattering)\n\t\t\t// rayleigh coefficients\n\t\t\tvBetaR = totalRayleigh * rayleighCoefficient;\n\n\t\t\t// mie coefficients\n\t\t\tvBetaM = totalMie( turbidity ) * mieCoefficient;\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tuniform float mieDirectionalG;\n\t\tuniform vec3 up;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\tconst float n = 1.0003; // refractive index of air\n\t\tconst float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)\n\n\t\t// optical length at zenith for molecules\n\t\tconst float rayleighZenithLength = 8.4E3;\n\t\tconst float mieZenithLength = 1.25E3;\n\t\t// 66 arc seconds -> degrees, and the cosine of that\n\t\tconst float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n\t\t// 3.0 / ( 16.0 * pi )\n\t\tconst float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n\t\t// 1.0 / ( 4.0 * pi )\n\t\tconst float ONE_OVER_FOURPI = 0.07957747154594767;\n\n\t\tfloat rayleighPhase( float cosTheta ) {\n\t\t\treturn THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n\t\t}\n\n\t\tfloat hgPhase( float cosTheta, float g ) {\n\t\t\tfloat g2 = pow( g, 2.0 );\n\t\t\tfloat inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n\t\t\treturn ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec3 direction = normalize( vWorldPosition - cameraPosition );\n\n\t\t\t// optical length\n\t\t\t// cutoff angle at 90 to avoid singularity in next formula.\n\t\t\tfloat zenithAngle = acos( max( 0.0, dot( up, direction ) ) );\n\t\t\tfloat inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n\t\t\tfloat sR = rayleighZenithLength * inverse;\n\t\t\tfloat sM = mieZenithLength * inverse;\n\n\t\t\t// combined extinction factor\n\t\t\tvec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n\t\t\t// in scattering\n\t\t\tfloat cosTheta = dot( direction, vSunDirection );\n\n\t\t\tfloat rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n\t\t\tvec3 betaRTheta = vBetaR * rPhase;\n\n\t\t\tfloat mPhase = hgPhase( cosTheta, mieDirectionalG );\n\t\t\tvec3 betaMTheta = vBetaM * mPhase;\n\n\t\t\tvec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n\t\t\tLin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n\t\t\t// nightsky\n\t\t\tfloat theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]\n\t\t\tfloat phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]\n\t\t\tvec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n\t\t\tvec3 L0 = vec3( 0.1 ) * Fex;\n\n\t\t\t// composition + solar disc\n\t\t\tfloat sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n\t\t\tL0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n\t\t\tvec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n\t\t\tvec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n\t\t\tgl_FragColor = vec4( retColor, 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\nexport { Sky };\n","import { convertCObject } from '../../../common-core/src/utils/kernel-utils';\nimport { CONFIGURATION_TYPE, type UiPlanObject } from '../../../typings/kernel';\nimport type { RapiComponent, RapiId } from '../../../typings/rapi-types';\nimport type PlannerKernelAccess from '../services/planner-kernel-access';\nimport type RapiAccess from '../../../common-core/src/rapi-access';\nimport type { ExtObjId } from '../../../typings/external-objects';\nimport { createExtObjId } from '../../../common-core/src/utils/external-objects';\n\nconst getIds = async (\n planObjects: any,\n plannerKernelAccess: PlannerKernelAccess,\n): Promise<{\n objects: UiPlanObject[];\n itemIds: string[];\n configurationIds: string[];\n externalConfigurationData: Array<[ExtObjId, Record<string, any>]>;\n}> => {\n const objects: UiPlanObject[] = [];\n const itemIds: RapiId[] = [];\n const configurationIds: RapiId[] = [];\n const externalConfigurationData: Array<[ExtObjId, Record<string, any>]> = [];\n await Promise.all(\n planObjects.map(async (planObject: any) => {\n if (\n planObject.configurationRuntimeId &&\n plannerKernelAccess.kernelInstance?.isExternalPlanObject(\n planObject.configurationRuntimeId,\n )\n ) {\n externalConfigurationData.push([\n createExtObjId(planObject.configurationHash as string),\n planObject,\n ]);\n objects.push(convertCObject(planObject) as UiPlanObject);\n } else if (\n planObject.configurationType?.value !== CONFIGURATION_TYPE.EXTERNAL\n ) {\n const obj = convertCObject(planObject) as UiPlanObject;\n if (obj.configurationHash) {\n configurationIds.push(obj.configurationHash);\n } else if (obj.catalogItemId) {\n itemIds.push(obj.catalogItemId);\n }\n if (obj.parts) {\n const hash = obj.configurationHash || obj.catalogItemId;\n obj.parts = await plannerKernelAccess.addUiDataAndPriceToPartList(\n obj.parts,\n hash,\n );\n }\n if (obj.configuration) {\n const configurationData =\n await plannerKernelAccess.getConfigurationData(obj.runtimeId);\n obj.configuration = configurationData.configuration;\n }\n obj.data = null;\n objects.push(obj);\n }\n }),\n );\n return {\n objects,\n itemIds,\n configurationIds,\n externalConfigurationData,\n };\n};\n\nconst fetchData = async (\n itemIds: RapiId[] = [],\n configurationIds: RapiId[] = [],\n externalObjectsDataIn: Array<[ExtObjId, Record<string, any>]> = [],\n rapiAccess: RapiAccess,\n) => {\n const externalObjectsData: Record<string, any> = {} as { [key: string]: any };\n const externalObjectIds = externalObjectsDataIn.map(([id, data]) => {\n externalObjectsData[id as ExtObjId] = data;\n return id;\n });\n const [responseItems, responseConfigurations, responseExternalObjects] =\n await Promise.allSettled([\n rapiAccess.getItems(itemIds),\n rapiAccess.getConfigurations(configurationIds),\n rapiAccess.getExternalObjects(externalObjectIds),\n ]);\n const rootComponentIds: RapiId[] = [];\n const data: Map<RapiId, any> = new Map();\n if (responseItems.status === 'fulfilled') {\n for (const item of responseItems.value) {\n data.set(item.id, item);\n }\n }\n if (responseExternalObjects.status === 'fulfilled') {\n if (responseExternalObjects.value?.length > 0) {\n for (const { data: externalObject } of responseExternalObjects.value) {\n data.set(externalObject.id, externalObject);\n }\n }\n }\n if (responseConfigurations.status === 'fulfilled') {\n for (const configuration of responseConfigurations.value) {\n data.set(configuration.id, configuration);\n rootComponentIds.push(configuration.rootComponentId);\n }\n } else {\n console.warn(\n 'Could not fetch configuration for data property. This happens when a configuration has not been saved yet',\n );\n }\n return { data, rootComponentIds };\n};\n\nexport const mapToUiPlanObjects = async (\n planObjects: any,\n plannerKernelAccess: PlannerKernelAccess,\n rapiAccess: RapiAccess,\n): Promise<UiPlanObject[]> => {\n const { objects, itemIds, configurationIds, externalConfigurationData } =\n await getIds(planObjects, plannerKernelAccess);\n\n const { data, rootComponentIds } = await fetchData(\n itemIds,\n configurationIds,\n externalConfigurationData,\n rapiAccess,\n );\n\n const rootComponents = await rapiAccess.getComponents(rootComponentIds);\n const rootComponentsMap: Map<RapiId, RapiComponent> = new Map();\n for (const rootComponent of rootComponents) {\n rootComponentsMap.set(rootComponent.id, rootComponent);\n }\n for (const obj of objects) {\n const id = obj.catalogItemId || obj.configurationHash;\n const entryData =\n data.get(obj.catalogItemId) || data.get(obj.configurationHash) || null;\n if (\n entryData &&\n !entryData.label &&\n rootComponentsMap.has(entryData.rootComponentId)\n ) {\n const component = rootComponentsMap.get(entryData.rootComponentId);\n entryData.label = component.label;\n }\n if (entryData && !entryData.label) {\n entryData.label = id;\n }\n obj.data = entryData;\n }\n\n return objects;\n};\n","import {\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n RepeatWrapping,\n TextureLoader,\n} from 'three';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport { PAPER_BACKGROUND_FILE_NAME } from '../../../common-core/src/static-files/environment-maps';\n\nexport default class PaperBackground extends Mesh {\n constructor() {\n const geo = new PlaneGeometry(1000, 1000, 8, 8);\n geo.rotateX(-Math.PI / 2);\n\n const material = new MeshBasicMaterial();\n const textureLoader = new TextureLoader();\n\n textureLoader.load(PAPER_BACKGROUND_FILE_NAME, (texture) => {\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n const repeatEveryM = 5;\n texture.repeat.set(1000 / repeatEveryM, 1000 / repeatEveryM);\n material.map = texture;\n material.alphaTest = 0.3;\n material.transparent = true;\n });\n\n super(geo, material);\n\n this.name = '2d paper background';\n this.position.set(0, -0.1, 0);\n this.layers.set(LAYER.BACKGROUND);\n this.userData.ignoreElementHit = true;\n }\n}\n","import { type Box3 } from 'three';\nimport CameraBehaviour from './camera-behaviour';\nimport type CameraControl from './camera-control';\nimport type { CameraParameter } from './camera-control';\n\nexport default abstract class PlannerCameraBehaviour extends CameraBehaviour {\n public get cameraControl(): CameraControl {\n return this._cameraControl;\n }\n\n public abstract resetCameraOnPlanCompletelyLoaded(bounds: Box3): void;\n\n public abstract externalApiResetCameraPosition(bounds: Box3): void;\n\n public abstract updateCameraOnDrawWalls(bounds: Box3): void;\n\n public abstract updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n bounds: Box3\n ): void;\n\n public abstract updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n bounds: Box3\n ): void;\n\n public abstract updateCameraOnPlanElementDraggedOutsidePlanBounds(\n bounds: Box3\n ): void;\n\n public abstract updateCameraOnPlanElementRemoved(bounds: Box3): void;\n\n public abstract updateCameraOnBackToPlanner(\n bounds: Box3,\n startCameraParams: CameraParameter,\n endCameraParams: CameraParameter\n ): void;\n\n public abstract resetCameraOnEnableWallDrawing(bounds: Box3): void;\n}\n","import type CameraControl2D from './camera-control-2d';\nimport PlannerCameraBehaviour from './planner-camera-behaviour';\nimport { type Box3 } from 'three';\nimport { getDrawingMinBounds } from '../utils/threejs-utils';\nimport type { CameraParameter } from './camera-control';\n\nexport default class Planner2dCameraBehaviour extends PlannerCameraBehaviour {\n public get cameraControl(): CameraControl2D {\n return this._cameraControl as CameraControl2D;\n }\n\n public resetCameraOnPlanCompletelyLoaded(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(\n getDrawingMinBounds(\n bounds,\n this.cameraControl.domHelper.element.clientWidth,\n this.cameraControl.domHelper.element.clientHeight,\n 1.1\n ),\n true\n );\n }\n\n public externalApiResetCameraPosition(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(\n getDrawingMinBounds(\n bounds,\n this.cameraControl.domHelper.element.clientWidth,\n this.cameraControl.domHelper.element.clientHeight,\n 1.1\n ),\n true\n );\n }\n\n public resetCameraOnSwitchTo2d(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(\n getDrawingMinBounds(\n bounds,\n this.cameraControl.domHelper.element.clientWidth,\n this.cameraControl.domHelper.element.clientHeight,\n 1.1\n ),\n true\n );\n }\n\n public updateCameraOnDrawWalls(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n bounds: Box3\n ): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n _bounds: Box3\n ): void {\n // Camera doesn't need to be updated\n }\n\n public updateCameraOnPlanElementDraggedOutsidePlanBounds(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public updateCameraOnPlanElementRemoved(_bounds: Box3): void {\n // Camera doesn't need to be updated\n }\n\n public updateCameraOnBackToPlanner(\n bounds: Box3,\n _startCameraParams: CameraParameter,\n _endCameraParams: CameraParameter\n ): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n\n public resetCameraOnEnableWallDrawing(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, false, true);\n }\n}\n","import type CameraControl3D from './camera-control-3d';\nimport PlannerCameraBehaviour from './planner-camera-behaviour';\nimport { type Box3 } from 'three';\nimport type { CameraParameter } from './camera-control';\n\nexport default class Planner3dCameraBehaviour extends PlannerCameraBehaviour {\n public get cameraControl(): CameraControl3D {\n return this._cameraControl as CameraControl3D;\n }\n\n public resetCameraOnPlanCompletelyLoaded(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, true);\n }\n\n public externalApiResetCameraPosition(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, true);\n }\n\n public resetCameraOnSwitchTo3d(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, false);\n }\n\n public disablePanningOnShiftRelease() {\n this.cameraControl.disablePanning();\n }\n\n public enablePanningOnShiftClick() {\n this.cameraControl.enablePanning();\n }\n\n public updateCameraOnDrawWalls(bounds: Box3): void {\n this.cameraControl.zoomToFitBounds(bounds, true);\n }\n\n public updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n bounds: Box3,\n ): void {\n this.cameraControl.zoomToFitBounds(bounds, false);\n }\n\n public updateCameraOnPlanElementDraggedOutsidePlanBounds(bounds: Box3): void {\n this.cameraControl.adjustToBoundsWithoutChangingDistance(bounds);\n }\n\n public updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n bounds: Box3,\n ): void {\n this.cameraControl.adjustToBoundsWithoutChangingDistance(bounds);\n }\n\n public updateCameraOnPlanElementRemoved(bounds: Box3): void {\n this.cameraControl.adjustToBoundsWithoutChangingDistance(bounds);\n }\n\n public async updateCameraOnBackToPlanner(\n bounds: Box3,\n startCameraParams: CameraParameter,\n endCameraParams: CameraParameter,\n ) {\n if (!endCameraParams) {\n return;\n }\n this.cameraControl.setObjectRotation(0);\n const cameraTargetIsZero = Math.abs(0 - endCameraParams.targetX) <= 0.01 &&\n Math.abs(0 - endCameraParams.targetY) <= 0.01 &&\n Math.abs(0 - endCameraParams.targetZ) <= 0.01;\n if (cameraTargetIsZero) {\n await this.cameraControl.updateAndReset(bounds, true);\n } else {\n await this._cameraControl.setToState(startCameraParams, endCameraParams);\n }\n }\n\n public resetCameraOnEnableWallDrawing(bounds: Box3): void {\n this.cameraControl.updateAndReset(bounds, true);\n }\n\n public async externalApiMoveCamera(\n cameraParameter: CameraParameter,\n ): Promise<void> {\n await this.cameraControl.moveCamera(cameraParameter);\n this._onCameraChanged();\n }\n}\n","import type CameraControlFirstPerson from '../../../planner-core/src/camera-control/camera-control-first-person';\nimport PlannerCameraBehaviour from './planner-camera-behaviour';\nimport { type Box3 } from 'three';\nimport type { CameraParameter } from './camera-control';\n\nexport default class PlannerFpCameraBehaviour extends PlannerCameraBehaviour {\n public get cameraControl(): CameraControlFirstPerson {\n return this._cameraControl as CameraControlFirstPerson;\n }\n\n public resetCameraOnPlanCompletelyLoaded(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public externalApiResetCameraPosition(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnDrawWalls(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n _bounds: Box3\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n _bounds: Box3\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementDraggedOutsidePlanBounds(\n _bounds: Box3\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnPlanElementRemoved(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public updateCameraOnBackToPlanner(\n _bounds: Box3,\n _startCameraParams: CameraParameter,\n _endCameraParams: CameraParameter\n ): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public resetCameraOnEnableWallDrawing(_bounds: Box3): void {\n // not implemented\n this.cameraControl.updateCamera();\n }\n\n public resetCameraOnSwitchToFirstPerson(): void {\n this.cameraControl.updateCamera();\n }\n}\n","import type { Object3D } from 'three';\nimport type PlannerSceneEventHandler from './planner-scene-event-handler';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport type { RoomleWebGLRenderer } from '../../../common-core/src/webgl/roomle-webgl-renderer';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport ConstructionPlanObjectViewModel from '../view-model/construction-plan-object-view-model';\nimport type { KernelWall } from '../../../typings/planner';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\n\nexport default class PlanElementHighlighter {\n private _sceneEventHandler: PlannerSceneEventHandler;\n private _roomleRenderer: RoomleWebGLRenderer;\n private _planViewModel: PlanViewModel;\n\n constructor(\n sceneEventHandler: PlannerSceneEventHandler,\n roomleRenderer: RoomleWebGLRenderer,\n planViewModel: PlanViewModel\n ) {\n this._sceneEventHandler = sceneEventHandler;\n this._roomleRenderer = roomleRenderer;\n this._planViewModel = planViewModel;\n }\n\n private _processViewModel(\n viewModel: PlanElementViewModel,\n selectedMeshes: Set<Object3D>\n ) {\n const isWallHasAttachedAttic =\n viewModel instanceof WallPlanElementViewModel &&\n (viewModel.getKernelObject() as KernelWall).getAttachedAttics?.().size() >\n 0;\n if (isWallHasAttachedAttic) {\n viewModel.getBoundingBox().children.forEach((child) => {\n if (!(child as any).isChildPlanObject) {\n selectedMeshes.add(child);\n }\n });\n } else {\n if (\n (viewModel instanceof ConstructionPlanObjectViewModel ||\n viewModel instanceof ConfigurableConstructionPlanObjectViewModel) &&\n viewModel.getTopViewContainer()\n ) {\n selectedMeshes.add(viewModel.getTopViewContainer());\n }\n if (viewModel.getObject()?.children) {\n viewModel.getObject().children.forEach((child) => {\n if (!(child as any).isChildPlanObject) {\n selectedMeshes.add(child);\n }\n });\n }\n }\n }\n\n private _processSelectedPlanElementIds(selectedMeshes: Set<Object3D>) {\n const selectedIds = this._sceneEventHandler?.getSelectedIds() || [];\n\n selectedIds.forEach((id) => {\n const viewModel = this._planViewModel.getPlanObjectForId(id);\n if (viewModel) {\n this._processViewModel(viewModel, selectedMeshes);\n }\n });\n }\n\n private _highlightPlanElementsBase(\n runtimeIds?: number[],\n planElementViewModel?: PlanElementViewModel\n ) {\n let selectedMeshes = new Set<Object3D>();\n\n if (planElementViewModel) {\n this._processViewModel(planElementViewModel, selectedMeshes);\n }\n\n runtimeIds?.forEach((id) => {\n const viewModel = this._planViewModel.getPlanObjectForId(id);\n if (viewModel) {\n this._processViewModel(viewModel, selectedMeshes);\n }\n });\n\n this._processSelectedPlanElementIds(selectedMeshes);\n\n this._roomleRenderer?.highlightObjects(Array.from(selectedMeshes));\n }\n\n public highlightPlanElements(runtimeIds?: number[]) {\n this._highlightPlanElementsBase(runtimeIds);\n }\n\n public highlightPlanElement(planElementViewModel?: PlanElementViewModel) {\n this._highlightPlanElementsBase(undefined, planElementViewModel);\n }\n\n public clearHighlighting() {\n this._highlightPlanElementsBase();\n }\n}\n","import type { Group, Vector3 } from 'three';\nimport { Mesh, MeshBasicMaterial, SphereGeometry, type Camera } from 'three';\nimport type {\n WallDimension,\n WallDimensionTransferable,\n} from '../view-model/wall-plan-element-view-model';\nimport { wallDimensionToTransferable } from '../view-model/wall-plan-element-view-model';\nimport { getScreenXY } from '../../../common-core/src/utils/threejs-utils';\nimport CameraControl2D from '../../../common-core/src/cameracontrol/camera-control-2d';\nimport type UnitFormatter from '../../../configurator-core/src/services/unit-formatter';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport type PlannerSceneEventHandler from '../webgl/planner-scene-event-handler';\nimport type PlanViewModel from '../view-model/plan-view-model';\nimport type { WallPlanObject } from '../../../typings/planner';\nimport type CameraBehaviour from '../../../common-core/src/cameracontrol/camera-behaviour';\nimport type { AtticDimension } from './measurements';\nimport type DomHelper from '../../../common-core/src/utils/dom-helper';\n\nexport function sendWallDimensions(\n domHelper: DomHelper,\n cameraBehaviour: CameraBehaviour,\n roomlePlannerUiCallback: RoomlePlannerUiCallback,\n plannerSceneEventHandler: PlannerSceneEventHandler,\n viewModel: PlanViewModel,\n unitFormatter: UnitFormatter,\n debugSpheres: {\n wallPoints: Group;\n constructionElementsPoints: Group;\n floorPoints: Group;\n },\n isFixedWalls = true,\n isDebug = false\n): void {\n if (!(cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n if (cameraBehaviour.cameraControl.isLocked() && isFixedWalls) {\n return;\n }\n\n const wallDimensions: WallDimensionTransferable[] = [];\n const { x: clientWidth, y: clientHeight } = domHelper.getClientDimensions();\n const wallViewModels = viewModel.getWallPlanObjectViewModels();\n const zoomFactor = cameraBehaviour.cameraControl.getKernelZoomFactor();\n const camera = cameraBehaviour.cameraControl.getCamera();\n\n for (const planViewModel of wallViewModels) {\n const wallDimension = planViewModel.getWallDimension(\n zoomFactor,\n clientWidth,\n clientHeight\n );\n wallDimension.isCurrentlyDrawn =\n plannerSceneEventHandler.isCurrentlyDrawing &&\n (planViewModel.getPlanElement() as WallPlanObject).getTo().extRef\n .jsObject === viewModel.latestNodePlanObjectViewModel;\n\n const { isVectorWall } = planViewModel.getKernelObject();\n if (wallDimension.length <= 0 && !isVectorWall) {\n continue;\n }\n\n convertWallTo2D(wallDimension, camera, clientWidth, clientHeight);\n\n if (wallDimension.attic) {\n convertAtticTo2D(wallDimension.attic, camera, clientWidth, clientHeight);\n }\n\n wallDimension.lengthFormatted = unitFormatter.formatMMValueToUnitString(\n wallDimension.length\n );\n\n if (isDebug) {\n debugWallDimensions(wallDimension, debugSpheres);\n }\n\n wallDimensions.push(wallDimensionToTransferable(wallDimension));\n }\n\n roomlePlannerUiCallback.onUpdateWallDimensions(wallDimensions);\n}\n\nfunction convertWallTo2D(\n wallDimension: WallDimension,\n camera: Camera,\n clientWidth: number,\n clientHeight: number\n) {\n wallDimension.fromPosition2d = getScreenXY(\n wallDimension.fromPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.toPosition2d = getScreenXY(\n wallDimension.toPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.textPosition2d = getScreenXY(\n wallDimension.textPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.fromWithoutPadding = getScreenXY(\n wallDimension.fromWithoutPadding,\n camera,\n clientWidth,\n clientHeight\n );\n wallDimension.toWithoutPadding = getScreenXY(\n wallDimension.toWithoutPadding,\n camera,\n clientWidth,\n clientHeight\n );\n}\n\nfunction convertAtticTo2D(\n attic: AtticDimension<Vector3, Vector3>,\n camera: Camera,\n clientWidth: number,\n clientHeight: number\n) {\n attic.textPosition2d = attic.fromPosition3d\n ? getScreenXY(attic.textPosition3d, camera, clientWidth, clientHeight)\n : undefined;\n\n attic.fromPosition2d = attic.fromPosition3d\n ? getScreenXY(attic.fromPosition3d, camera, clientWidth, clientHeight)\n : undefined;\n\n attic.toPosition2d = attic.toPosition3d\n ? getScreenXY(attic.toPosition3d, camera, clientWidth, clientHeight)\n : undefined;\n\n attic.atticCenterPosition2d = attic.atticCenterPosition3d\n ? getScreenXY(\n attic.atticCenterPosition3d,\n camera,\n clientWidth,\n clientHeight\n )\n : undefined;\n\n attic.wallCenterPosition2d = getScreenXY(\n attic.wallCenterPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n\n attic.labelCPosition2d = getScreenXY(\n attic.labelCPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n attic.labelHeightPosition2d = getScreenXY(\n attic.labelHeightPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n\n attic.shiftedWallCenter2d = getScreenXY(\n attic.shiftedWallCenter3d,\n camera,\n clientWidth,\n clientHeight\n );\n\n attic.heightAt2mPosition2d = getScreenXY(\n attic.heightAt2mPosition3d,\n camera,\n clientWidth,\n clientHeight\n );\n attic.attic2mCornerFrom2d = getScreenXY(\n attic.attic2mCornerFrom3d,\n camera,\n clientWidth,\n clientHeight\n );\n attic.attic2mCornerto2d = getScreenXY(\n attic.attic2mCornerto3d,\n camera,\n clientWidth,\n clientHeight\n );\n}\n\nfunction debugWallDimensions(\n wallDimension: WallDimension,\n debugSpheres: {\n wallPoints: Group;\n constructionElementsPoints: Group;\n floorPoints: Group;\n }\n) {\n console.log('Wall dimension', wallDimension);\n\n const geometry = new SphereGeometry(0.1, 32, 16);\n const material = new MeshBasicMaterial({ color: 0xff0000 });\n\n const fromSphere = new Mesh(geometry, material);\n fromSphere.position.copy(wallDimension.fromPosition3d);\n\n const toSphere = new Mesh(geometry, material);\n toSphere.position.copy(wallDimension.toPosition3d);\n\n const centerSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0x00ff00 })\n );\n centerSphere.position.copy(wallDimension.textPosition3d);\n\n debugSpheres.wallPoints.add(fromSphere);\n debugSpheres.wallPoints.add(toSphere);\n debugSpheres.wallPoints.add(centerSphere);\n\n if (wallDimension.attic) {\n const atticFromSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0x0000ff })\n );\n if (wallDimension.attic.fromPosition3d) {\n atticFromSphere.position.copy(wallDimension.attic.fromPosition3d);\n }\n\n const atticToSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0xff00ff })\n );\n if (wallDimension.attic.toPosition3d) {\n atticToSphere.position.copy(wallDimension.attic.toPosition3d);\n }\n\n const atticCenterSphere = new Mesh(\n geometry,\n new MeshBasicMaterial({ color: 0xffff00 })\n );\n if (wallDimension.attic.atticCenterPosition3d) {\n atticCenterSphere.position.copy(\n wallDimension.attic.atticCenterPosition3d\n );\n }\n\n debugSpheres.wallPoints.add(atticFromSphere);\n debugSpheres.wallPoints.add(atticToSphere);\n debugSpheres.wallPoints.add(atticCenterSphere);\n }\n}\n","/**\n * Manages clipboard operations (copy and paste) with a fallback to localStorage\n * if the native Clipboard API is not fully supported.\n *\n * Note: The localStorage fallback only works for copy/paste operations within\n * the same browser tab and origin. It does not interact with the system clipboard.\n */\nexport default class ClipboardManager {\n private static LOCAL_STORAGE_KEY = 'clipboardManagerFallback';\n\n /**\n * Checks if the modern Clipboard API (writeText) is likely supported.\n * @returns true if navigator.clipboard.writeText is available, false otherwise.\n */\n private static hasNativeClipboardWriteSupport(): boolean {\n return !!(\n navigator.clipboard && typeof navigator.clipboard.writeText === 'function'\n );\n }\n\n /**\n * Checks if the modern Clipboard API (readText) is likely supported.\n * @returns true if navigator.clipboard.readText is available, false otherwise.\n */\n private static async hasNativeClipboardReadSupport(): Promise<boolean> {\n const hasClipboardReadSupport = !!(\n navigator.clipboard && typeof navigator.clipboard.readText === 'function'\n );\n if (hasClipboardReadSupport) {\n const permission = await navigator.permissions.query({\n name: 'clipboard-read' as any, //neded for linter\n });\n return permission.state !== 'denied';\n }\n return false;\n }\n\n /**\n * Copies the given text. It first tries the native Clipboard API.\n * If that's not available, it falls back to localStorage.\n *\n * @param text The string to copy.\n * @returns A Promise that resolves when the text has been successfully copied\n */\n public static async copy(text: string): Promise<void> {\n if (this.hasNativeClipboardWriteSupport()) {\n try {\n await navigator.clipboard.writeText(text);\n } catch (err) {\n console.warn(\n 'Native clipboard writeText failed, attempting localStorage fallback.',\n err\n );\n }\n }\n\n // Also copy to localStorage in case read permisions are denied\n try {\n localStorage.setItem(this.LOCAL_STORAGE_KEY, text);\n } catch (e) {\n console.error('Failed to copy text using localStorage:', e);\n }\n }\n\n /**\n * Pastes text. It first tries the native Clipboard API.\n * If that's not available or fails, it falls back to reading from localStorage.\n *\n * @returns A Promise that resolves with the text content (from system clipboard or localStorage).\n * Resolves with an empty string if localStorage fallback is used and no item is found.\n * Rejects if both operations fail.\n * @throws Will throw an error if both native clipboard and localStorage paste operations fail.\n *\n * Note: Reading from the system clipboard often requires user permission and the document to be focused.\n */\n public static async paste(): Promise<string> {\n if (await this.hasNativeClipboardReadSupport()) {\n try {\n return await navigator.clipboard.readText();\n } catch (err) {\n console.warn(\n 'Native clipboard readText failed, attempting localStorage fallback.',\n err\n );\n // Common errors for native paste include:\n // - NotAllowedError: User denied clipboard read permission.\n // - DOMException: Document is not focused.\n // - SecurityError: Operation is insecure (e.g. not HTTPS).\n // Fall through to localStorage if native fails\n }\n }\n\n // Fallback to localStorage\n try {\n const text = localStorage.getItem(this.LOCAL_STORAGE_KEY);\n if (text === null) {\n return ''; // Return empty string if nothing in localStorage\n }\n return text;\n } catch (e) {\n console.error(\n 'Failed to paste text using native clipboard and localStorage fallback:',\n e\n );\n throw new Error(\n 'Failed to paste text. Both clipboard and localStorage methods failed.'\n );\n }\n }\n}\n","import inject from '../../../common-core/src/di/inject';\nimport type {\n Base64Image,\n CanvasOffset,\n} from '../../../common-core/src/common-interfaces';\nimport type { PlannerKernelCallbackI } from '../services/planner-kernel-access';\nimport type RapiAccess from '../../../common-core/src/rapi-access';\nimport type { default as PlannerMeshGenerator } from './planner-mesh-generator';\nimport Benchmark from '../../../common-core/src/utils/benchmark';\nimport {\n createEmptySceneFromCurrent,\n dispose,\n fadeIn,\n getDrawingMinBounds,\n getScreenXY,\n hideWallsBasedOnCamera,\n isBox3InFrustum,\n kernelBoxToThreeBox,\n setWallTransparency,\n threeVectorToTransferableXY,\n viewSpacePositionFromUV,\n} from '../../../common-core/src/utils/threejs-utils';\nimport PlannerLightSetting from './lightsetting/planner-light-setting';\nimport type {\n CancelSelectionReasons,\n KernelFloor,\n KernelFloorMaterial,\n KernelWall,\n Plan,\n PlanElement,\n PlanObject,\n PlanObjectPosition,\n} from '../../../typings/planner';\nimport CameraControl3D from '../../../common-core/src/cameracontrol/camera-control-3d';\nimport CameraControl2D from '../../../common-core/src/cameracontrol/camera-control-2d';\nimport type { KernelPlanObjectComponent } from '../../../typings/kernel';\nimport {\n CONFIGURATION_TYPE,\n type KernelEnum,\n type KernelObjectPtrList,\n type KernelPlanObject,\n type KernelVector3,\n type RuntimeId,\n type UiPlanObject,\n} from '../../../typings/kernel';\nimport PlannerSceneEventHandler, {\n PLANNER_SCENE_EVENT,\n PLANNER_SCENE_EVENT_STATE,\n type SceneEventInfo,\n} from './planner-scene-event-handler';\nimport type {\n BatchPaintMaterial,\n InsertItemIdInfo,\n InsertItemResult,\n RoomlePlannerCallback,\n SceneEvents,\n} from '../roomle-planner';\nimport type PlanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport type {\n ObjectToWallDimensionTransferable,\n ObjectWallDimension,\n} from '../../../common-core/src/view-model/plan-object-view-model';\nimport { objectToWallDimensionToTransferable } from '../../../common-core/src/view-model/plan-object-view-model';\nimport type { InputEvent } from '../../../common-core/src/input/input-manager';\nimport type InputManager from '../../../common-core/src/input/input-manager';\nimport { INPUT_EVENT } from '../../../common-core/src/input/input-manager';\nimport type PlannerInputManager from '../input/planner-input-manager';\nimport CameraControlFirstPerson from '../camera-control/camera-control-first-person';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport type { SelectionPayload } from '../roomle-planner-ui-callback';\nimport { PLAN_ELEMENT_CHANGE_TYPES } from '../roomle-planner-ui-callback';\nimport type { RapiConfiguration, RapiItem } from '../../../typings/rapi-types';\nimport StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\nimport { SELECTION_MODE } from '../../../configurator-core/src/utils/selection-handler';\nimport type LocalStorageHelper from '../../../common-core/src/utils/local-storage-helper';\nimport { CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport AsyncGuard from '../../../common-core/src/async-guard';\nimport BackgroundEnvironment from '../../../common-core/src/environment/background-environment';\nimport type { CameraParameter } from '../../../common-core/src/cameracontrol/camera-control';\nimport { CAMERA_EVENT } from '../../../common-core/src/cameracontrol/camera-control';\nimport {\n convertToKernel,\n convertToTHREE,\n} from '../../../common-core/src/utils/kernel-utils';\nimport {\n getHostname,\n isIdItemId,\n} from '../../../common-core/src/utils/rapi-utils';\nimport {\n applyMaterialToKernelMaterial,\n copy,\n ctrlOrCmd,\n getColor,\n getIdQueryParam,\n hashCode,\n isCtrlOrCmd,\n} from '../../../common-core/src/utils/common-utils';\nimport PlanViewModel, {\n GROUP_CEILING_LIGHTS,\n} from '../view-model/plan-view-model';\nimport ConfiguratorSceneManager from '../../../configurator-core/src/webgl/configurator-scene-manager';\nimport { BASE_CONTEXT } from '../../../common-core/src/main';\nimport WallPlanElementViewModel from '../view-model/wall-plan-element-view-model';\nimport NodePlanElementViewModel from '../view-model/node-plan-element-view-model';\nimport {\n addDemoLights,\n type CallbackObjectType,\n} from '../utils/planner-scene-utils';\nimport {\n createTransferableObjectPosition,\n getCallbackObjectType,\n} from '../utils/planner-scene-utils';\nimport type { Enumify } from '../../../common-core/src/types';\nimport {\n Group,\n type Camera,\n type Material,\n type Object3D,\n type OrthographicCamera,\n type PerspectiveCamera,\n} from 'three';\nimport {\n Box3,\n MathUtils,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n SphereGeometry,\n Vector2,\n Vector3,\n} from 'three';\nimport { Sky } from 'three/examples/jsm/objects/Sky.js';\nimport { RenderMode } from '../../../common-core/src/webgl/roomle-webgl-renderer';\nimport { mapToUiPlanObjects } from '../utils/map-to-ui-plan-objects';\nimport type { FloorAreaDataTransferable } from '../view-model/floor-plan-element-view-model';\nimport FloorPlanElementViewModel, {\n toFloorAreaDataTransferable,\n} from '../view-model/floor-plan-element-view-model';\nimport type {\n CameraTarget,\n PrepareImageOptions,\n} from '../../../common-core/src/webgl/image-renderer';\nimport ImageRenderer from '../../../common-core/src/webgl/image-renderer';\nimport MaterialCreator from '../../../common-core/src/utils/material-creator';\nimport PaperBackground from './paper-background';\nimport type {\n OrthographicOffsetCamera,\n PerspectiveOffsetCamera,\n} from '../../../common-core/src/webgl/roomle-component-factory';\nimport Planner2dCameraBehaviour from '../../../common-core/src/cameracontrol/planner-2d-camera-behaviour';\nimport Planner3dCameraBehaviour from '../../../common-core/src/cameracontrol/planner-3d-camera-behaviour';\nimport PlannerFpCameraBehaviour from '../../../common-core/src/cameracontrol/planner-fp-camera-behaviour';\nimport type { MeasurementLineDimensionTransferable } from '../view-model/measurement-line-plan-element-view-model';\nimport MeasurementLinePlanElementViewModel, {\n toMeasurementLineDimensionToTransferable,\n} from '../view-model/measurement-line-plan-element-view-model';\nimport GlbViewerCameraBehaviour from '../../../common-core/src/cameracontrol/glb-viewer-camera-behaviour';\nimport ConfiguratorCameraBehaviour from '../../../common-core/src/cameracontrol/configurator-camera-behaviour';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport ConstructionPlanObjectViewModel from '../view-model/construction-plan-object-view-model';\nimport {\n type ConstructionMeasurement,\n type ConstructionMeasurementsTransferable,\n convertToStandardArray,\n toConstructionMeasurementTransferable,\n} from '../utils/measurements';\nimport PlannerCameraBehaviour from '../../../common-core/src/cameracontrol/planner-camera-behaviour';\nimport {\n WALL_SIDES,\n type EMSConstant,\n} from '../../../typings/planner-kernel-container';\nimport PlanElementHighlighter from './planner-element-highlighter';\nimport { sendWallDimensions } from '../utils/dimensions-helper';\nimport type InitData from '../../../common-core/src/utils/init-data';\nimport {\n DEFAULT_ENV_MAP_ROTATION,\n DEFAULT_ENV_MAP_INTENSITY,\n} from '../../../common-core/src/utils/init-data';\nimport {\n INTERIOR_LIGHTS_ENV_MAP_ROTATION,\n INTERIOR_LIGHTS_ENV_MAP_INTENSITY,\n} from '../../../common-core/src/webgl/scene-manager';\nimport ClipboardManager from '../../../common-core/src/utils/clipboard-manager';\nimport type { RoomleLightSource } from '../../../common-core/src/light/light-source';\n\nexport function isLockedElement(\n planElementViewModel: PlanElementViewModel,\n initData: InitData,\n): boolean {\n const planElementType = getCallbackObjectType(planElementViewModel);\n const lockPlanEnabled = initData?.lockPlan;\n\n const isConstructionProduct =\n planElementViewModel &&\n 'getPlanElement' in planElementViewModel &&\n planElementViewModel.getPlanElement() &&\n 'getAttachedWall' in planElementViewModel.getPlanElement();\n\n const isWallOrFloorOrConstructionElement =\n planElementType === 'wall' ||\n planElementType === 'floor' ||\n isConstructionProduct;\n\n return !!(lockPlanEnabled && isWallOrFloorOrConstructionElement);\n}\n\nconst PLAN_STORE = 'rml_plans';\n\nconst SET_WALL_MATERIAL_TYPE = {\n INTERIOR: 'interior',\n EXTERIOR: 'exterior',\n} as const;\n\ninterface PrepareImageOptionsPlanner extends PrepareImageOptions {\n object?: Object3D;\n externalObjectsOnly?: boolean;\n}\n\nconst getPressedKeysCount = (event: KeyboardEvent) =>\n ['altKey', 'ctrlKey', 'shiftKey', 'metaKey'].reduce((acc, key) => {\n if ((event as any)[key]) {\n acc++;\n }\n return acc;\n }, 0);\n\nexport default class PlannerSceneManager\n extends ConfiguratorSceneManager\n implements PlannerKernelCallbackI\n{\n @inject\n private _rapiAccess: RapiAccess;\n\n @inject\n private _plannerMeshGenerator: PlannerMeshGenerator;\n\n @inject\n private _plannerInputManager: PlannerInputManager;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n @inject\n private _localStorageHelper: LocalStorageHelper;\n\n private _plannerSceneEventHandler: PlannerSceneEventHandler;\n\n private _roomlePlannerCallback: RoomlePlannerCallback;\n\n private _itemsLoadingStatePromises: Array<Promise<void>> = [];\n\n private _sky: any;\n private _drawingEnabled: boolean;\n private _configureInRoom: boolean;\n\n private _planId: string;\n private _preloadScene: Object3D;\n\n private _staticItemGuard: AsyncGuard<void> = new AsyncGuard();\n private _completelyLoaded: boolean = false;\n private _configurableItemGuard: AsyncGuard<void> = new AsyncGuard();\n private _planCompletelyLoadedGuard: AsyncGuard<void> = new AsyncGuard();\n private _dragStartBounds: Box3;\n public currentSelection: SelectionPayload | null = null;\n private _paperBackground: PaperBackground | null = null;\n private _cameraState: CameraParameter | null = null;\n private _planElementHighlighter: PlanElementHighlighter;\n\n // debug variables\n private _debugSpheres: {\n wallPoints: Group;\n constructionElementsPoints: Group;\n floorPoints: Group;\n } = {\n wallPoints: new Group(),\n constructionElementsPoints: new Group(),\n floorPoints: new Group(),\n };\n\n constructor(\n creator: string,\n offset: CanvasOffset,\n plannerCallback: RoomlePlannerCallback,\n mode: Enumify<typeof CAMERA_TYPE>,\n ) {\n super(creator, offset, mode);\n this._stopRendering = true;\n this._configureInRoom = !!this._initData.configureInRoom;\n this._configuratorContext.baseContext = BASE_CONTEXT.PLANNER;\n this._roomlePlannerCallback = plannerCallback;\n this._plannerMeshGenerator.maxAnisotropy =\n this._renderer.capabilities.getMaxAnisotropy();\n this._plannerMeshGenerator.maxTextures =\n this._renderer.capabilities.maxTextures;\n this._plannerSceneEventHandler = new PlannerSceneEventHandler(\n creator,\n this._scene,\n this.cameraBehaviour.cameraControl.getCamera(),\n this._getInputManager(),\n );\n\n this._roomleRenderer?.switchToPlanner(RenderMode.Mode3D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._imageRenderer.switchToPlannerSettings();\n this._planElementHighlighter = new PlanElementHighlighter(\n this._plannerSceneEventHandler,\n this._roomleRenderer!,\n this._getViewModel(),\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.STATE_CHANGED,\n ({ state, oldState }) => {\n if (\n oldState === PLANNER_SCENE_EVENT_STATE.ROTATE &&\n state !== oldState\n ) {\n this._roomlePlannerUiCallback.onRotationCancel();\n }\n if (\n state === PLANNER_SCENE_EVENT_STATE.ROTATE ||\n state === PLANNER_SCENE_EVENT_STATE.DRAG ||\n state === PLANNER_SCENE_EVENT_STATE.MEASURE ||\n state === PLANNER_SCENE_EVENT_STATE.DRAW\n ) {\n this.cameraBehaviour.cameraControl.lock();\n this._onCameraMove();\n } else {\n this.cameraBehaviour.cameraControl.unlock();\n this._onCameraIdle();\n }\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.INTERACTION,\n () => this._renderWithoutShadowsAndAO(),\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.ACTIVATE_PLAN_ELEMENT,\n (sceneEventInfo) => this._activateElement(sceneEventInfo),\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.SELECT_PLAN_ELEMENT,\n (sceneEventInfo) => {\n this._activateElement(sceneEventInfo);\n const planElementViewModel = sceneEventInfo.planElementViewModel;\n this._sendElementMeasurements();\n\n if (\n planElementViewModel instanceof StaticPlanObjectViewModel &&\n this._initData.debug\n ) {\n console.log(planElementViewModel.getGLBUrl());\n }\n if (!isLockedElement(planElementViewModel, this._initData)) {\n this._planElementHighlighter.highlightPlanElement(\n planElementViewModel,\n );\n }\n\n this._onSelectionChange(planElementViewModel);\n this._renderWithoutShadowsAndAO();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DESELECT_PLAN_ELEMENT,\n ({ planElementViewModel, reason }) => {\n this._planElementHighlighter.clearHighlighting();\n this._onSelectionCancel(planElementViewModel, reason);\n this._roomlePlannerUiCallback.onSelectionCancel(reason);\n this._renderWithoutShadowsAndAO();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.BEFORE_DRAG_START,\n () => {\n this.cameraBehaviour.cameraControl.lock();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_START,\n ({ planElementViewModel }) => {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.startInteraction();\n this._sendElementMeasurements();\n\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n this._sendWallDimensions();\n }\n this._requestRender();\n this._dragStartBounds = this.getBounds();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_MOVE,\n ({ planElementViewModel }) => {\n this.cameraBehaviour.cameraControl.checkNearFarDistance(\n planElementViewModel.getPosition(),\n );\n this._requestRender();\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_END,\n async ({ planElementViewModel }) => {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.endInteraction();\n this.cameraBehaviour.cameraControl.unlock();\n const position = this._getDragPosition(\n planElementViewModel.getPosition(),\n );\n if (position) {\n planInteractionHandler.moveElementTo(\n planElementViewModel.getPlanElement(),\n convertToKernel(position),\n );\n }\n this.updateEnvironment(this.getBounds(), true);\n this._renderEverything();\n const planObject = this.getPlanObject(planElementViewModel.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.MOVED,\n planObjects.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n\n const isConstructionOrMeasurementPlanElement =\n planElementViewModel instanceof WallPlanElementViewModel ||\n planElementViewModel instanceof MeasurementLinePlanElementViewModel ||\n planElementViewModel instanceof NodePlanElementViewModel;\n if (\n !this._cameraBehaviourState.isWithinPlanBounds(\n planElementViewModel.getPosition(),\n this.getBounds(),\n ) &&\n !isConstructionOrMeasurementPlanElement\n ) {\n this.plannerCameraBehaviour.updateCameraOnPlanElementDraggedOutsidePlanBounds(\n this.getBounds(),\n );\n }\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_CANCEL,\n () => {\n this.cameraBehaviour.cameraControl.unlock();\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_START,\n () => {\n this.cameraBehaviour.cameraControl.lock();\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAG_MEASUREMENT_LINE,\n () => {\n this._roomlePlannerUiCallback.onUpdateMeasurementLineDimensions([]);\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.ADD_MEASUREMENT_LINE_END,\n () => {\n this.cameraBehaviour.cameraControl.unlock();\n this._roomlePlannerUiCallback.onMeasurementLineStateChange(false);\n },\n this,\n );\n\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAWING_START,\n () => {\n this._setKernelZoomFactor();\n this._renderWithoutShadowsAndAO();\n this._roomleRenderer?.setGroundShadow(false);\n },\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAW,\n () => this._renderWithoutShadowsAndAO(),\n this,\n );\n this._plannerSceneEventHandler.addEventListener(\n PLANNER_SCENE_EVENT.DRAWING_END,\n () => {\n this._renderWithoutShadowsAndAO();\n this._roomleRenderer?.setGroundShadow(true);\n },\n this,\n );\n\n this._getKernelAccess().addPlannerListener(this);\n\n this._plannerMeshGenerator.setMaterialLoadedListener(() => {\n // disabled because it has not been implemented for BufferGeometry yet\n // this._getViewModel().tryToMergeComponents();\n this._configurableItemGuard.resolve();\n this._requestRender();\n });\n\n window.onbeforeunload = this.clearScene.bind(this);\n\n this._getInputManager().addEventListener(\n INPUT_EVENT.ZOOM_IN,\n this._renderListener,\n this,\n );\n this._getInputManager().addEventListener(\n INPUT_EVENT.ZOOM_OUT,\n this._renderListener,\n this,\n );\n // https://github.com/roomle-dev/web-sdk/pull/1264#discussion_r2086492744\n this._getInputManager().addEventListener(\n INPUT_EVENT.DOWN,\n this._onMouseDown,\n this,\n );\n\n this.disableConfiguratorEvents();\n if (mode !== CAMERA_TYPE.CAMERA_FP) {\n this.enablePlannerEvents();\n }\n // relevant for mode=2d\n // move to next frame otherwise we stop rendering before setting the color and thus have a black background\n setTimeout(() => this._updatePaperBackground(), 0);\n if (this._initData.debug) {\n this._debugSpheres.wallPoints.name = 'Walls debug points';\n this._debugSpheres.constructionElementsPoints.name =\n 'Construction elements debug points';\n this._debugSpheres.floorPoints.name = 'Floor debug points';\n this._scene.add(this._debugSpheres.wallPoints);\n this._scene.add(this._debugSpheres.constructionElementsPoints);\n this._scene.add(this._debugSpheres.floorPoints);\n }\n }\n\n get configuratorContext() {\n return this._configuratorContext;\n }\n\n public get hasSingleRoom(): boolean {\n const floorPlanObjects =\n this._getViewModel().getFloorPlanObjectViewModels();\n\n const uniqueFloors = new Set(floorPlanObjects.map((obj) => obj.getId()));\n\n return uniqueFloors.size === 1;\n }\n\n public get scenePlanElementLightSources() {\n const elementLights: Array<Map<number, RoomleLightSource>> = [];\n this._scene.traverse((element) => {\n if (\n 'getAllLightSources' in element &&\n typeof element.getAllLightSources === 'function'\n ) {\n const lights: Map<number, RoomleLightSource> =\n element.getAllLightSources();\n if (lights.size > 0) {\n elementLights.push(lights);\n }\n }\n });\n return elementLights;\n }\n\n public setAllLightsOnOff(state: boolean) {\n for (const lightsMaps of this.scenePlanElementLightSources) {\n for (const light of Array.from(lightsMaps.values())) {\n light.setLightOnOff(state);\n }\n }\n this._renderEverything();\n }\n\n public setLightsOnOffByIds(ids: number[], state: boolean) {\n // Nested for loop is because it's possible that a single configuration can have many light sources.\n for (const lightsMaps of this.scenePlanElementLightSources) {\n for (const light of Array.from(lightsMaps.values())) {\n if (ids.includes(light.lightSourceId)) {\n light.setLightOnOff(state);\n }\n }\n }\n this._renderEverything();\n }\n\n private _activateElement(\n { planElementViewModel }: SceneEventInfo,\n notifyUiSelectionCallback = (): void => void 0,\n ) {\n const planElement = this._plannerSceneEventHandler.isDragIn()\n ? planElementViewModel\n : null;\n this._sendElementMeasurements(planElement);\n\n if (\n planElementViewModel instanceof StaticPlanObjectViewModel &&\n this._initData.debug\n ) {\n console.log(planElementViewModel.getGLBUrl());\n }\n\n if (!isLockedElement(planElementViewModel, this._initData)) {\n this._planElementHighlighter.highlightPlanElement(planElementViewModel);\n }\n notifyUiSelectionCallback();\n this._renderWithoutShadowsAndAO();\n }\n\n planCleared(): void {\n // unused\n }\n\n planHistoryStateChanged(): void {\n this._sendRoomMeasurements();\n\n if (this._completelyLoaded) {\n // Save plan to IDB\n const { configuratorId } = this._globalInitData;\n const planInteractionHandler =\n this._plannerKernelAccess?.planInteractionHandler;\n const planXml = planInteractionHandler.getPlan()?.getPlanXML(false, 2);\n const key = this._idbManager.getKey(\n getHostname(),\n configuratorId,\n this._initData.id,\n );\n this._idbManager.setValue(key, planXml, this._idbManager.configStore);\n }\n }\n\n protected _getViewModel(): PlanViewModel {\n if (!this._viewModel) {\n this._viewModel = new PlanViewModel(this._creator_);\n this._viewModel.setRequestRenderCallback(() => this._renderEverything());\n this._viewModel.setRequestRenderSceneUpdateCallback(() =>\n this._roomleRenderer?.clearCache(),\n );\n this._viewModel.setInvalidateRenderCallback(() =>\n this._roomleRenderer?.forceShadowUpdates(true),\n );\n }\n\n return this._viewModel as PlanViewModel;\n }\n\n private _getDragPosition(elementPosition: Vector3) {\n // only check position if an element gets dragged in\n if (!this._plannerSceneEventHandler.isDragIn()) {\n return null;\n }\n const bounds = this._dragStartBounds\n ? this._dragStartBounds\n : this.getBounds();\n const center = bounds.getCenter(new Vector3());\n const distance = elementPosition.distanceTo(center);\n const size = bounds.getSize(new Vector3());\n const boundsSize = Math.max(size.x, size.z);\n // add distance of 3 meters to max bounds distance\n const maxAllowedDistance = boundsSize + 3;\n if (distance > maxAllowedDistance) {\n const direction = new Vector3()\n .subVectors(elementPosition, center)\n .normalize();\n // set new element position to max allowed distance from center and original position\n return center.clone().add(direction.multiplyScalar(maxAllowedDistance));\n }\n return null;\n }\n\n private _hideAllMeasurementsNodeOnElementChange(\n planElementViewModel: PlanElementViewModel,\n ) {\n const measurementLineViewModels =\n this._getViewModel().getMeasurementLineObjectViewModels();\n measurementLineViewModels.forEach((measurementModel) =>\n measurementModel.hideDraggableNodes(),\n );\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.showDraggableNodes();\n }\n }\n\n private _onSelectionChange(planElementViewModel: PlanElementViewModel) {\n this._hideAllMeasurementsNodeOnElementChange(planElementViewModel);\n const payload: SelectionPayload = {};\n if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n payload.item = planElementViewModel.getRapiItem();\n payload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n this._configuratorUiCallbacks.onUpdateParameters([]);\n }\n if (\n planElementViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel\n ) {\n payload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n }\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planElementId = planElementViewModel.getId();\n const rootPlanElementId = this.getRootPlanObjectId(planElementId);\n const rootPlanElementViewModel =\n this._getViewModel().getPlanObjectForId(rootPlanElementId);\n payload.configurationRuntimeId = (\n rootPlanElementViewModel as ConfiguratorPlanObjectViewModel\n ).getConfigurationRuntimeId();\n }\n if (planElementViewModel instanceof WallPlanElementViewModel) {\n const zoomFactor =\n this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n const { clientWidth, clientHeight } = this._domHelper.element;\n payload.wall = planElementViewModel.getWallDimension(\n zoomFactor,\n clientWidth,\n clientHeight,\n );\n }\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n payload.measurementLine =\n planElementViewModel.getMeasurementLineDimension();\n }\n if (planElementViewModel instanceof FloorPlanElementViewModel) {\n payload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n }\n\n let objectType: CallbackObjectType =\n getCallbackObjectType(planElementViewModel);\n\n const fetchPayloadData = async (): Promise<SelectionPayload> => {\n const promisePayload: SelectionPayload = {};\n if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n promisePayload.item = planElementViewModel.getRapiItem();\n promisePayload.staticItemRuntimeId = planElementViewModel\n .getPlanElement()\n .getId();\n }\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n await planElementViewModel.isInitDone();\n const configurationRuntimeId =\n planElementViewModel.getConfigurationRuntimeId();\n this._getKernelAccess().updatePlanObjectDependencies(\n configurationRuntimeId,\n );\n const catalogItemId = planElementViewModel\n .getPlanObject()\n .getCatalogItemId();\n let idToUse = catalogItemId;\n if (!idToUse) {\n const configurationHash =\n this._getKernelAccess().kernelInstance.getHashOfConfiguration(\n configurationRuntimeId,\n );\n idToUse = configurationHash;\n }\n const isExternalConfiguration =\n this._getKernelAccess().kernelInstance.isExternalPlanObject(\n configurationRuntimeId,\n );\n if (isExternalConfiguration) {\n const rootPlanElementId = this.getRootPlanObjectId(\n planElementViewModel.getId(),\n );\n const rootPlanElementViewModel =\n this._getViewModel().getPlanObjectForId(\n rootPlanElementId,\n ) as ConfiguratorPlanObjectViewModel;\n this._planObjectSelectionChanged(\n rootPlanElementViewModel.getConfigurationRuntimeId(),\n planElementViewModel.getRootComponentRuntimeId(),\n );\n }\n this._configuratorContext.planObjectId = configurationRuntimeId;\n this._configuratorContext.planElementId = planElementViewModel.getId();\n this._configuratorContext.rootComponentId =\n planElementViewModel.getRootComponentRuntimeId();\n let rootComponentId;\n if (!isExternalConfiguration) {\n if (catalogItemId && isIdItemId(catalogItemId)) {\n const item = await this._rapiAccess.getItem(catalogItemId);\n promisePayload.item = item;\n rootComponentId = item.rootComponentId\n ? item.rootComponentId\n : null;\n } else {\n try {\n const configuration =\n await this._rapiAccess.getConfiguration(idToUse);\n promisePayload.configuration = configuration;\n rootComponentId = configuration.rootComponentId\n ? configuration.rootComponentId\n : null;\n } catch (_e) {\n console.warn(\n 'Could not get RAPI configuration for kernel hash ' +\n idToUse +\n ', saving configuration...',\n );\n const configurationData =\n (await this._getKernelAccess().getConfigurationData(\n configurationRuntimeId,\n )) as RapiConfiguration;\n const rapiConfiguration =\n await this._rapiAccess.saveConfiguration(configurationData);\n promisePayload.configuration = rapiConfiguration;\n rootComponentId = rapiConfiguration.rootComponentId\n ? rapiConfiguration.rootComponentId\n : null;\n }\n }\n }\n if (rootComponentId) {\n const component =\n await this._rapiAccess.getComponent(rootComponentId);\n promisePayload.component = component;\n }\n promisePayload.configurationRuntimeId = configurationRuntimeId;\n objectType = 'configuration';\n }\n promisePayload.planElementId = planElementViewModel.getId();\n return copy(promisePayload);\n };\n\n // no await on purpose because we want to return\n // the promise and not the actual value\n const payloadPromise = fetchPayloadData();\n this.currentSelection = copy(payload);\n\n this._sendElementMeasurements();\n this._sendPlanObjectPositions();\n\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const configurationRuntimeId =\n planElementViewModel.getConfigurationRuntimeId();\n if (configurationRuntimeId && configurationRuntimeId !== -1) {\n const isExternalConfiguration =\n this._getKernelAccess().kernelInstance.isExternalPlanObject(\n configurationRuntimeId,\n );\n if (isExternalConfiguration) {\n objectType = 'external-configuration';\n payload.externalConfigurationType = 'tc-config';\n }\n }\n }\n\n this._roomlePlannerUiCallback.onSelectionChange(\n copy(this._plannerSceneEventHandler.getSelectionMode()),\n copy<CallbackObjectType>(objectType),\n copy(payload),\n payloadPromise,\n planElementViewModel,\n );\n if (\n planElementViewModel instanceof WallPlanElementViewModel ||\n planElementViewModel instanceof NodePlanElementViewModel\n ) {\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.show());\n this._updateNodeSize();\n }\n this._renderWithoutShadowsAndAO();\n }\n\n private _onSelectionCancel(\n _planElementViewModel: PlanElementViewModel,\n reason: CancelSelectionReasons,\n ) {\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.hide());\n this._renderWithoutShadowsAndAO();\n this.resetConfiguratorContext(reason);\n this.cancelComponentSelection(false, reason);\n this._handleMeasurementLineDraggablePoints(_planElementViewModel);\n this.currentSelection = null;\n }\n\n private _handleMeasurementLineDraggablePoints(\n planElementViewModel: PlanElementViewModel,\n ) {\n this._getViewModel()\n .getMeasurementLineObjectViewModels()\n .forEach((measurementLineViewModel) => {\n measurementLineViewModel.hideDraggableNodes();\n measurementLineViewModel.deselectAllDraggablePoints();\n });\n if (planElementViewModel instanceof MeasurementLinePlanElementViewModel) {\n planElementViewModel.deselectAllDraggablePoints();\n planElementViewModel.currentPoint = null;\n }\n }\n\n public resetConfiguratorContext(reason: CancelSelectionReasons) {\n try {\n if (this._configuratorContext.planObjectId) {\n const planObject = this.getPlanObject(\n this._configuratorContext.planElementId,\n );\n if (\n planObject.configurationType?.value === CONFIGURATION_TYPE.EXTERNAL\n ) {\n this.notifyPlannerOnComponentSelectionCancel(true, reason);\n }\n }\n } catch (e) {\n console.error(e);\n }\n this._configuratorContext.planObjectId = 0;\n this._configuratorContext.planElementId = 0;\n this._configuratorContext.rootComponentId = 0;\n this._configuratorContext.dockingRootComponentId = 0;\n }\n\n protected _setupScene(offset?: CanvasOffset, transparent?: boolean) {\n super._setupScene(offset, transparent, true);\n\n if (this._initData.legacyLight) {\n this._lightSetting = new PlannerLightSetting(\n this._scene,\n this._lightSetting,\n );\n }\n if (!this._initData.moc) {\n this._addSky();\n }\n if (!transparent) {\n this._setEnvironment(\n new BackgroundEnvironment(\n this._scene,\n this._environment,\n getColor(this._initData.colors.DEFAULT_BACKGROUND),\n ),\n );\n }\n }\n\n protected onBeforeRender(): void {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n const anyVisibilityChanged = hideWallsBasedOnCamera(\n this.cameraBehaviour.cameraControl.getCamera(),\n this._getViewModel().getWallPlanObjectViewModels(),\n );\n if (anyVisibilityChanged) {\n this._roomleRenderer?.forceShadowUpdates(true); // this._roomleRenderer could be null e.g.: if e2e=true\n }\n }\n }\n\n protected _getInputManager(): InputManager {\n return this._plannerInputManager;\n }\n\n protected createCameraControl(\n mode: Enumify<typeof CAMERA_TYPE>,\n _offset: CanvasOffset,\n ) {\n this.setMode(mode);\n }\n\n public startViewing() {\n this._configuratorContext.baseContext = BASE_CONTEXT.GLB_VIEWER;\n\n const ids = this._plannerSceneEventHandler.getSelectedIds();\n if (ids.length === 1) {\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(\n ids[0],\n );\n\n this._setCameraPosition();\n const currentCameraParameters =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n\n this._changeCameraBehaviour(\n new GlbViewerCameraBehaviour(\n this._getCameraControl3D(currentCameraParameters),\n this._cameraBehaviourState,\n ),\n );\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.setObjectRotation(\n planObjectViewModel.getPlanElement().rotation,\n );\n }\n if (!this._configureInRoom) {\n this._getViewModel().hideAllExcept(planObjectViewModel.getId());\n }\n\n (this.cameraBehaviour as GlbViewerCameraBehaviour)\n .updateCameraOnItemLoaded(this.getBounds())\n .then(() => {\n // update environment because we did hide other objects\n this.updateEnvironment(this.getBounds(), true);\n });\n }\n\n this.disablePlannerEvents();\n this.updateScene();\n }\n\n public startConfiguring() {\n this._configuratorContext.baseContext = BASE_CONTEXT.CONFIGURATOR;\n\n let { planElementId } = this._configuratorContext;\n planElementId = this.getRootPlanObjectId(planElementId);\n\n if (this._configuratorContext.planElementId !== planElementId) {\n this.selectPlanObject(planElementId);\n }\n this._selectExternalObjectModule();\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(\n planElementId,\n ) as ConfiguratorPlanObjectViewModel;\n\n this._setCameraPosition();\n const currentCameraParameters =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n\n this._changeCameraBehaviour(\n new ConfiguratorCameraBehaviour(\n this._getCameraControl3D(currentCameraParameters),\n this._cameraBehaviourState,\n ),\n );\n\n let objectRotation = 0;\n let lookAtSide = 0;\n if (planObjectViewModel) {\n this.setRootComponentId(planObjectViewModel.getRootComponentRuntimeId());\n const preferredRotation = planObjectViewModel\n .getPlanElement()\n .getRotationToPreferredFront();\n objectRotation = preferredRotation.rotationRoundTo90deg;\n lookAtSide =\n preferredRotation.lookAtSide.value === WALL_SIDES.LEFT ? -1 : 1;\n this._componentRaycastHelper?.setObject(planObjectViewModel.getObject());\n }\n const planObjectId = planObjectViewModel?.getConfigurationRuntimeId();\n if (this._configuratorContext.planObjectId !== planObjectId) {\n this._configuratorContext.planObjectId = planObjectId;\n }\n\n // unselect all plan elements, otherwise meshes are still highlighted in configurator\n this._plannerSceneEventHandler.removeSelection();\n this._planElementHighlighter.clearHighlighting();\n\n if (!this._configureInRoom) {\n this._getViewModel().hideAllExcept(planElementId);\n }\n\n // Turn off lights, return lighting and env maps to normal conditions for configure.\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(false);\n }\n\n this.configuratorCameraBehaviour\n .resetCameraOnStartConfiguring(\n this.getBounds(),\n currentCameraParameters,\n objectRotation,\n lookAtSide,\n )\n .then(() => {\n // update environment because we did hide other objects\n this.updateEnvironment(this.getBounds(), true);\n });\n\n this.setEventHandlerObject(planObjectViewModel.getContainer());\n\n this.disablePlannerEvents();\n this.enableConfiguratorEvents();\n this._roomleRenderer?.switchToConfigurator(); // this._roomleRenderer could be null e.g.: if e2e=true\n this._imageRenderer.switchToConfiguratorSettings();\n this.updateScene();\n this._getKernelAccess().updatePlanObjectDependencies(planObjectId);\n this._getKernelAccess().requestPartListAndUpdatePricesOfParts();\n this._getKernelAccess().planObjectUpdated(planObjectId, false);\n\n const planInteractionHandler =\n this._plannerKernelAccess?.planInteractionHandler;\n planInteractionHandler?.startInteraction();\n }\n\n private _setCameraPosition() {\n this._cameraState =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n }\n\n private _resetCameraPosition(cameraParameters: CameraParameter) {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n if (!this._cameraState) {\n return;\n }\n this.plannerCameraBehaviour.updateCameraOnBackToPlanner(\n this.getBounds(),\n cameraParameters,\n this._cameraState,\n );\n }\n }\n\n public async selectPlanObject(runtimeId: number) {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n if (selectedIds.includes(runtimeId)) {\n return;\n }\n runtimeId = this.getRootPlanObjectId(runtimeId);\n\n const planObjectViewModel =\n this._getViewModel().getPlanObjectForId(runtimeId);\n await this._plannerSceneEventHandler.selectPlanElement(planObjectViewModel);\n }\n\n public backToPlanner() {\n if (this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER) {\n return;\n }\n if (this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n const planInteractionHandler =\n this._plannerKernelAccess?.planInteractionHandler;\n planInteractionHandler?.endInteraction();\n const isExtObj = this._getKernelAccess().kernelInstance.getPlanObject(\n this.currentSelection?.configurationRuntimeId ?? 0,\n )?.externalObject;\n if (isExtObj) {\n this.notifyPlannerOnComponentSelectionCancel(\n true,\n 'isolation_mode_cancelled',\n );\n }\n }\n this._configuratorContext.baseContext = BASE_CONTEXT.PLANNER;\n\n const currentCameraParams =\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters();\n\n const cameraType = this._getViewModel().cameraType;\n this._changeCameraBehaviour(\n cameraType === CAMERA_TYPE.CAMERA_3D ||\n cameraType === CAMERA_TYPE.CAMERA_FP\n ? new Planner3dCameraBehaviour(\n this._getCameraControl3D(currentCameraParams),\n this._cameraBehaviourState,\n )\n : new Planner2dCameraBehaviour(\n this._getCameraControl2D(),\n this._cameraBehaviourState,\n ),\n );\n\n // Turn on lights, return lighting and env maps to lighting conditions when done configuring.\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(true);\n }\n\n this._resetCameraPosition(currentCameraParams);\n this._getViewModel().showAll();\n\n this.setEventHandlerObject(this._scene);\n\n this.enablePlannerEvents();\n\n const is3D =\n this.cameraBehaviour.cameraControl instanceof CameraControl3D ||\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson;\n this._getViewModel().setCameraType(\n is3D ? CAMERA_TYPE.CAMERA_3D : CAMERA_TYPE.CAMERA_2D,\n );\n this.disableConfiguratorEvents();\n this._roomleRenderer?.switchToPlanner(\n // this._roomleRenderer could be null e.g.: if e2e=true\n this.cameraBehaviour.cameraControl instanceof CameraControl3D\n ? RenderMode.Mode3D\n : RenderMode.Mode2D,\n );\n this._imageRenderer.switchToPlannerSettings();\n this.updateScene();\n }\n\n private _getYRotationOfObject(object: Object3D): number {\n let objectDirection = object.getWorldDirection(new Vector3()).clone();\n objectDirection.y = 0;\n if (objectDirection.lengthSq() < 0.01) {\n objectDirection = new Vector3(0, 1, 0);\n objectDirection.applyQuaternion(object.quaternion);\n objectDirection.y = 0;\n }\n objectDirection.normalize();\n let angle = Math.asin(objectDirection.x);\n if (objectDirection.z < 0) {\n angle = Math.PI - angle;\n }\n // clamp to a value between 0 and 2 PI\n if (angle < 0) {\n angle += Math.PI * 2;\n }\n return angle;\n }\n\n public loadStaticPlanObjects() {\n const kernelPlanObjects: Map<string, StaticPlanObjectViewModel[]> =\n new Map();\n this._getViewModel()\n .getStaticPlanObjectViewModels()\n .forEach((planObjectViewModel) => {\n const planObject = planObjectViewModel.getPlanObject();\n if (kernelPlanObjects.has(planObject.getCatalogItemId())) {\n const objects = kernelPlanObjects.get(planObject.getCatalogItemId());\n objects.push(planObjectViewModel);\n } else {\n kernelPlanObjects.set(planObject.getCatalogItemId(), [\n planObjectViewModel,\n ]);\n }\n });\n\n this._rapiAccess\n .getItems(Array.from(kernelPlanObjects.keys()))\n .then((rapiItems: RapiItem[]) => {\n const promises: Array<Promise<void>> = [];\n rapiItems.forEach((rapiItem: RapiItem) => {\n this._getKernelAccess().catalogItemLoaded(rapiItem);\n kernelPlanObjects.get(rapiItem.id).forEach((planObjectViewModel) => {\n promises.push(\n new Promise<void>((resolve, reject) => {\n planObjectViewModel.setRapiItem(rapiItem).then(() => {\n this._requestRender();\n resolve();\n }, reject);\n }),\n );\n });\n });\n Promise.all(promises).then(() => this._staticItemsLoaded());\n });\n }\n\n public requestCatalogItem(catalogItemId: string): void {\n this._rapiAccess.getItem(catalogItemId).then((rapiItem: RapiItem) => {\n this._getKernelAccess().catalogItemLoaded(rapiItem);\n });\n }\n\n private _staticItemsLoaded() {\n this._requestRender();\n this._staticItemGuard.resolve();\n this._roomlePlannerUiCallback.onItemsLoaded();\n }\n\n public preload(id: string) {\n this._planId = id;\n const planGLTF = this._localStorageHelper.getItem(this._planId, PLAN_STORE);\n if (planGLTF) {\n this._loadGLTF(planGLTF).then((glb) => {\n this._preloadScene = glb;\n if (this._preloadScene) {\n this._scene.add(this._preloadScene);\n }\n this._requestRender();\n });\n }\n }\n\n public planXMLLoaded(plan: Plan): void {\n this.endPlanConstruction(plan);\n this.loadStaticPlanObjects();\n }\n\n private _activateCeilingLight() {\n this._getViewModel().handleInitialLights(\n this._renderer.capabilities.maxTextures,\n this._roomleRenderer.sceneRenderer.getQualityLevel(),\n );\n this._getViewModel().handleCeilingLights();\n }\n\n public planCompletelyLoaded(_plan: Plan): void {\n this._stopRendering = false;\n this._renderEverything();\n // move call to the next run loop otherwise elements will still be added to the scene\n setTimeout(() => this._planCompletelyLoadedGuard.resolve(), 0);\n\n // Handle ceiling lights and env map for lighting mode when plan loads.\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(true);\n this._activateCeilingLight();\n }\n\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.hide());\n this._getViewModel()\n .getMeasurementLineObjectViewModels()\n .forEach((measurementLineViewModel) =>\n measurementLineViewModel.hideDraggableNodes(),\n );\n }\n\n public handlerSwitchedPlans(fromPlan: Plan, toPlan: Plan): void {\n this._completelyLoaded = false;\n this._roomlePlannerUiCallback.onHandlerSwitchedPlans();\n this._getViewModel().setReference(toPlan);\n this._getKernelAccess().coupleReferences(this._getViewModel(), toPlan);\n this._getViewModel().setPlannerSceneEventHandler(\n this._plannerSceneEventHandler,\n );\n this._getViewModel().setGeometriesMergedListener(() => {\n this._renderEverything();\n });\n this._plannerSceneEventHandler.setPlanViewModel(this._getViewModel());\n if (fromPlan) {\n this.clearScene();\n }\n if (!this._initData.moc) {\n this._addSky();\n const planeGeometry = new PlaneGeometry(1000, 1000);\n planeGeometry.rotateX(-Math.PI / 2);\n const planeMaterial = MaterialCreator.createMeshStandardMaterial({\n color: '#f0f0f0',\n roughness: 1,\n metalness: 0,\n depthWrite: false,\n });\n // planeMaterial.opacity = 0.2;\n const plane = new Mesh(planeGeometry, planeMaterial);\n plane.name = 'Ground';\n plane.position.y = -0.01;\n plane.userData.isFloor = true;\n this._scene.add(plane);\n }\n this._setCeiling();\n\n this._staticItemGuard.reset();\n this._configurableItemGuard.reset();\n this._planCompletelyLoadedGuard.reset();\n\n const configurableItemPromise =\n this._plannerMeshGenerator.materialQueue.length > 0\n ? this._configurableItemGuard.wait()\n : Promise.resolve();\n Promise.all([\n this._staticItemGuard.wait(),\n configurableItemPromise,\n this._planCompletelyLoadedGuard.wait(),\n ]).then(this._itemsLoaded.bind(this));\n }\n\n private async _itemsLoaded() {\n const plan = this._getViewModel().getCorePlan();\n\n if (this._roomleRenderer) {\n const box = kernelBoxToThreeBox(plan.getBounds());\n this._roomleRenderer.updateBounds(box);\n this._imageRenderer.updateBounds(box);\n }\n\n await Promise.allSettled(this._itemsLoadingStatePromises);\n\n this._roomlePlannerUiCallback.onCompletelyLoaded();\n\n this.updateEnvironment(this.getBounds(), true);\n this._renderEverything();\n\n if (this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER) {\n this.plannerCameraBehaviour.resetCameraOnPlanCompletelyLoaded(\n this.getBounds(),\n );\n }\n this._completelyLoaded = true;\n\n Benchmark.end('loadingTime');\n\n this._readyForRender();\n }\n\n public beginPlanConstruction(_plan: Plan): void {\n // Keep tslint quite\n }\n\n public addPlanMesh(\n _plan: Plan,\n _material: any,\n _vertices: Float32Array,\n _indices: Int32Array,\n _uvCoords: Float32Array,\n _normals: Float32Array,\n _type: KernelEnum,\n ): void {\n // Keep tslint quite\n }\n\n public endPlanConstruction(_plan: Plan): void {\n this._renderLoopFunction = () => {\n this._scene.add(this._getViewModel().getConstructionGroup());\n this._scene.add(this._getViewModel().getCeilingGroup());\n this._scene.add(this._getViewModel().getFloorGroup());\n this._scene.add(this._getViewModel().getMeasurementLineGroup());\n this._scene.add(this._getViewModel().getWallAtticsGroup());\n\n if (this._isInteriorLightActive) {\n this._createCeilingLightGroup();\n }\n\n if (this._lightSetting?.needsBounds()) {\n this._lightSetting.updateBounds(this._getViewModel().getBoundingBox());\n }\n this._scene.remove(this._preloadScene);\n };\n }\n\n public async addPlanObjectToScene(\n planViewModel: PlanObjectViewModel,\n ): Promise<void> {\n if (!planViewModel) {\n return Promise.resolve();\n }\n\n let resolveItemLoadedPromise: () => void;\n let rejectItemLoadedPromise: () => void;\n try {\n const promise = new Promise<void>(\n (resolve, reject) => (\n (resolveItemLoadedPromise = resolve),\n (rejectItemLoadedPromise = reject)\n ),\n );\n this._itemsLoadingStatePromises.push(promise);\n const object3D = planViewModel.getContainer();\n fadeIn(object3D);\n this._scene.add(object3D);\n if (this._plannerSceneEventHandler.isDragIn()) {\n this._plannerSceneEventHandler.addComponentDragInHandler(planViewModel);\n this._requestRender();\n }\n this._roomlePlannerUiCallback.onPlanChanged();\n await planViewModel.isInitDone();\n this.updateEnvironment(this.getBounds());\n this._renderEverything();\n const planObject = this.getPlanObject(planViewModel.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.ADDED,\n planObjects.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n\n const isItemOrConfiguration =\n planViewModel instanceof ConfiguratorPlanObjectViewModel ||\n planViewModel instanceof StaticPlanObjectViewModel;\n\n if (this._initData.featureFlags.interiorLights) {\n addDemoLights(\n planViewModel as StaticPlanObjectViewModel,\n this._getViewModel(),\n this._isInteriorLightActive,\n );\n if (this.scenePlanElementLightSources.length > 0) {\n this.toggleInteriorLightsSceneSettings(true);\n }\n }\n\n if (\n isItemOrConfiguration &&\n !this._plannerSceneEventHandler.isDragIn() &&\n this.cameraBehaviour instanceof PlannerCameraBehaviour\n ) {\n {\n const isItemInFrustum = isBox3InFrustum(\n this.cameraBehaviour.cameraControl.getCamera(),\n planViewModel.getBounds(),\n );\n if (!isItemInFrustum) {\n this.plannerCameraBehaviour.updateCameraOnPlanElementInsertedOutsideCurrentCameraView(\n this.getBounds(),\n );\n } else {\n this.plannerCameraBehaviour.updateCameraOnPlanElementInsertedInsideCurrentCameraView(\n this.getBounds(),\n );\n }\n }\n }\n } catch (e: any) {\n console.error(e);\n rejectItemLoadedPromise();\n }\n resolveItemLoadedPromise();\n }\n\n removePlanObjectFromScene(planViewModel: PlanElementViewModel): void {\n if (\n planViewModel instanceof WallPlanElementViewModel ||\n planViewModel instanceof NodePlanElementViewModel\n ) {\n this._sendWallDimensions();\n }\n if (planViewModel instanceof MeasurementLinePlanElementViewModel) {\n this._sendMeasurementLineDimension();\n }\n this._scene.remove(planViewModel.getContainer());\n planViewModel.clear();\n this.updateEnvironment(this.getBounds(), true);\n const isConstructionOrMeasurementPlanElement =\n planViewModel instanceof WallPlanElementViewModel ||\n planViewModel instanceof MeasurementLinePlanElementViewModel ||\n planViewModel instanceof NodePlanElementViewModel;\n if (\n !isConstructionOrMeasurementPlanElement &&\n this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER\n ) {\n this.plannerCameraBehaviour.updateCameraOnPlanElementRemoved(\n this.getBounds(),\n );\n }\n this._renderEverything();\n }\n\n public planElementChanged(\n plan: Plan,\n planElementViewModel: PlanElementViewModel,\n ): void {\n if (this._drawingEnabled) {\n this._sendWallDimensions(false); // show the measurements while wall drawing\n }\n\n const planElement = this._plannerSceneEventHandler.isDragIn()\n ? planElementViewModel\n : null;\n this._sendElementMeasurements(planElement);\n this._sendRoomAreaData();\n\n this.updateEnvironment(this.getBounds(), true);\n this._renderEverything();\n this._onPlanChanged();\n if (!this._plannerSceneEventHandler.isDragIn()) {\n const planObject = this.getPlanObject(planElementViewModel.getId());\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.MOVED,\n { ...planObject, ...{ data: null } },\n );\n }\n // Recalculate ceiling light power when the walls move around.\n if (\n planElementViewModel instanceof WallPlanElementViewModel &&\n plan.extRef &&\n plan.extRef.jsObject &&\n this._isInteriorLightActive\n ) {\n const planViewModel = plan.extRef.jsObject as PlanViewModel;\n planViewModel.handleCeilingLights();\n }\n }\n\n public exportGLB(_exportObjects?: Object3D[], _id?: string) {\n // three-refactor - GLTFExporter\n //this._scriptLoader\n // .fetch(GLTF_EXPORTER_FILE_NAME, { id: 'gltf-exporter' })\n // .then(() => {\n // let exporter = new (THREE as any).GLTFExporter();\n //\n // if (!exportObjects) {\n // exportObjects = [];\n // this._scene.children.forEach((child: any) => {\n // if (this._isPartOfScene(child)) {\n // exportObjects.push(child);\n // }\n // });\n // }\n //\n // // Parse the input and generate the glTF output\n // exporter.parse(\n // exportObjects,\n // (gltf: any) => {\n // let key = id ? id : 'test';\n // this._localStorageHelper.addItem(\n // key,\n // JSON.stringify(gltf),\n // PLAN_STORE\n // );\n // // download(gltf);\n //\n // // const blob = new Blob([gltf], {type: 'model/gltf-binary'});\n // // a.href = URL.createObjectURL(blob);\n // // a.download = 'scene.glb';\n // },\n // { binary: false, embedImages: true, forceIndices: true }\n // );\n // });\n }\n\n public importGLB(url: string) {\n this._loadGLB(url).then((object) => this._scene.add(object));\n }\n\n public clearScene() {\n this._plannerMeshGenerator.clear();\n this._getViewModel().sceneCleared();\n super.clearScene();\n }\n\n //https://threejs.org/examples/webgl_shaders_sky.html\n private _addSky() {\n const skyParams = {\n distance: 400000,\n turbidity: 10,\n rayleigh: 2,\n mieCoefficient: 0.005,\n mieDirectionalG: 0.8,\n inclination: 0.6, // elevation / inclination\n azimuth: 0, // Facing front\n };\n\n if (!this._sky) {\n //SKY\n this._sky = new Sky();\n this._sky.name = 'Sky';\n this._sky.scale.setScalar(450000);\n this._sky.frustumCulled = false;\n this._scene.add(this._sky);\n\n this._sky.material.uniforms.turbidity.value = skyParams.turbidity;\n this._sky.material.uniforms.rayleigh.value = skyParams.rayleigh;\n this._sky.material.uniforms.mieCoefficient.value =\n skyParams.mieCoefficient;\n this._sky.material.uniforms.mieDirectionalG.value =\n skyParams.mieDirectionalG;\n const sunPosition = viewSpacePositionFromUV(\n skyParams.distance,\n skyParams.azimuth,\n skyParams.inclination,\n );\n this._sky.material.uniforms.sunPosition.value.copy(sunPosition);\n\n // Add Sun Helper\n // three-refactor\n const sunSphere = new Mesh(\n new SphereGeometry(20000, 16, 8),\n new MeshBasicMaterial({ color: 0xffffff }),\n );\n sunSphere.name = 'Sunsphere';\n sunSphere.position.y = -700000;\n sunSphere.visible = false;\n //this._scene.add(sunSphere);\n sunSphere.position.set(sunPosition.x, -sunPosition.z, sunPosition.y);\n //sunSphere.visible = true;\n }\n\n if (this._lightSetting instanceof PlannerLightSetting) {\n this._lightSetting.updateSunPosition(\n skyParams.inclination,\n skyParams.azimuth,\n );\n }\n }\n\n public toggleConfigureInRoom() {\n this._configureInRoom = !this._configureInRoom;\n if (!this._roomleRenderer.isConfiguring) {\n return;\n }\n if (this._configureInRoom) {\n this._getViewModel().showAll();\n } else {\n this._hideAllExceptSelectedElement();\n }\n this._renderEverything();\n this.updateScene();\n }\n\n public switchTo2D() {\n if (this.cameraBehaviour?.cameraControl instanceof CameraControl2D) {\n return;\n }\n if (\n this.cameraBehaviour?.cameraControl instanceof CameraControlFirstPerson\n ) {\n this._getCameraControlFirstPerson().cleanUp();\n }\n\n this._roomleRenderer?.setCameraType(CAMERA_TYPE.CAMERA_2D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._plannerSceneEventHandler?.enable();\n\n for (const wallPlanObject of this._getViewModel().getWallPlanObjectViewModels()) {\n wallPlanObject.show();\n }\n\n this._getViewModel()\n .setCameraType(CAMERA_TYPE.CAMERA_2D)\n .then(() => this._planElementHighlighter.highlightPlanElement());\n\n this._roomleRenderer?.switchToPlanner(RenderMode.Mode2D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._renderEverything();\n\n this._changeCameraBehaviour(\n new Planner2dCameraBehaviour(\n this._getCameraControl2D(),\n this._cameraBehaviourState,\n ),\n );\n\n this._onCameraMove();\n (\n this.plannerCameraBehaviour as Planner2dCameraBehaviour\n ).resetCameraOnSwitchTo2d(this.getBounds());\n this._addCameraControlListener();\n this._setCeiling();\n\n this._roomlePlannerUiCallback.onCameraChanged(CAMERA_TYPE.CAMERA_2D);\n\n // set initial zoom factor, otherwise kernel won't send callbacks\n this._setKernelZoomFactor();\n\n this._onCameraMove();\n this._sendRoomMeasurements();\n }\n\n public switchTo3D() {\n if (this.cameraBehaviour?.cameraControl instanceof CameraControl3D) {\n return;\n }\n\n this._roomleRenderer?.setCameraType(CAMERA_TYPE.CAMERA_3D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._plannerSceneEventHandler?.enable();\n\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_3D);\n\n this._roomleRenderer?.switchToPlanner(RenderMode.Mode3D); // this._roomleRenderer could be null e.g.: if e2e=true\n this._renderEverything();\n\n this._changeCameraBehaviour(\n new Planner3dCameraBehaviour(\n this._getCameraControl3D(),\n this._cameraBehaviourState,\n ),\n );\n\n this._onCameraMove();\n (\n this.plannerCameraBehaviour as Planner3dCameraBehaviour\n ).resetCameraOnSwitchTo3d(this.getBounds());\n this._addCameraControlListener();\n this._setCeiling();\n this._roomlePlannerUiCallback.onCameraChanged(CAMERA_TYPE.CAMERA_3D);\n }\n\n public switchToFirstPerson() {\n if (\n this.cameraBehaviour?.cameraControl instanceof CameraControlFirstPerson\n ) {\n return;\n }\n\n this._roomleRenderer?.setCameraType(CAMERA_TYPE.CAMERA_FP); // this._roomleRenderer could be null e.g.: if e2e=true\n this._plannerSceneEventHandler?.disable();\n\n this._plannerMeshGenerator.wallMeshes.forEach((mesh) =>\n setWallTransparency(mesh.material as Material, false, false),\n );\n\n this._getViewModel()\n .getWallPlanObjectViewModels()\n .forEach((wall) => {\n wall.show();\n });\n\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_FP);\n\n this._renderEverything();\n\n this._changeCameraBehaviour(\n new PlannerFpCameraBehaviour(\n this._getCameraControlFirstPerson(),\n this._cameraBehaviourState,\n ),\n );\n\n this._addCameraControlListener();\n this._setCeiling();\n\n this._roomlePlannerUiCallback.onCameraChanged(CAMERA_TYPE.CAMERA_FP);\n\n (\n this.plannerCameraBehaviour as PlannerFpCameraBehaviour\n ).resetCameraOnSwitchToFirstPerson();\n }\n\n protected onCameraChanged() {\n // do not call super\n }\n\n protected _setCameraControlListeners() {\n super._setCameraControlListeners();\n if (!(this.cameraBehaviour instanceof PlannerCameraBehaviour)) {\n return;\n }\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.IDLE,\n () => {\n this._onCameraIdle();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_MOVE,\n () => {\n this._onCameraMove();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.MOVING,\n () => {\n this._onCameraMove();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_IN,\n () => {\n this._onCameraMove();\n },\n this,\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_OUT,\n () => {\n this._onCameraMove();\n },\n this,\n );\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_CHANGE,\n () => {\n this._onCameraZoomChange();\n },\n this,\n );\n }\n\n private _onCameraZoomChange() {\n this._setKernelZoomFactor();\n }\n\n private _setKernelZoomFactor() {\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n if (zoomFactor && isFinite(zoomFactor) && zoomFactor >= 0) {\n this._getKernelAccess().planInteractionHandler?.setZoomFactor(zoomFactor);\n }\n this._plannerSceneEventHandler?.setKernelZoomFactor(zoomFactor);\n }\n\n private _setCeiling() {\n if (!this._getViewModel()) {\n return;\n }\n if (\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson\n ) {\n this._getViewModel().getCeilingGroup().visible = true;\n } else {\n this._getViewModel().getCeilingGroup().visible = false;\n }\n }\n\n public cameraBehaviourChanged() {\n super.cameraBehaviourChanged();\n this._plannerSceneEventHandler?.setCamera(\n this.cameraBehaviour.cameraControl.getCamera(),\n );\n this._updatePaperBackground();\n }\n\n private _updatePaperBackground() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n if (!this._paperBackground) {\n this._paperBackground = new PaperBackground();\n }\n this._scene?.add(this._paperBackground);\n this._requestRender();\n } else {\n if (this._paperBackground) {\n this._scene?.remove(this._paperBackground);\n }\n }\n }\n\n public sceneChanged() {\n // if this is called from constructor we do not need to setScene because this happens on instantiation\n // therefore _plannerSceneEventHandler is still undefined\n if (this._plannerSceneEventHandler) {\n // sceneChanges after everything is setup, tell all the others\n this._plannerSceneEventHandler.setObject(this._scene);\n }\n }\n\n protected _onKeyDown(event: KeyboardEvent) {\n super._onKeyDown(event);\n if (this._initData.debug) {\n this._checkNumKey(event);\n }\n\n // Copy (Ctrl+C or Cmd+C) and Paste (Ctrl+V or Cmd+V) events\n this._checkCopyPaste(event);\n\n // Undo (Ctrl+z or Cmd+z) and Paste (Ctrl+shift+z or Cmd+shift+z) events\n this._checkUndoRedo(event);\n\n //CMD or CTRL\n if (ctrlOrCmd(event)) {\n const numPressedKeys = getPressedKeysCount(event);\n const correctKeyPressed =\n (event.metaKey && event.key === 'Meta') ||\n (event.ctrlKey && event.key === 'Control');\n const selectionMode =\n numPressedKeys > 1\n ? SELECTION_MODE.STANDARD\n : correctKeyPressed\n ? SELECTION_MODE.MULTISELECT\n : SELECTION_MODE.STANDARD;\n this._plannerSceneEventHandler.setSelectionMode(selectionMode);\n }\n\n // Shift\n this._checkPanning(event);\n\n //Backspace\n if (\n this._plannerSceneEventHandler &&\n this._plannerSceneEventHandler.hasSelection() &&\n event.key &&\n (event.key === 'Backspace' || event.key === 'Delete')\n ) {\n this.deletePlanElementSelection();\n event.preventDefault();\n }\n }\n\n private async _checkCopyPaste(event: KeyboardEvent) {\n // Copy (Ctrl+C or Cmd+C)\n if (ctrlOrCmd(event) && event.key === 'c') {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n\n const selectedItemsIds: string[] = [];\n selectedIds.forEach((runtimeId) => {\n const item = this._getViewModel().getPlanObjectForId(runtimeId);\n const planElement = item.getPlanElement();\n const id =\n planElement.getCatalogItemId() || planElement.getConfigurationHash();\n selectedItemsIds.push(id);\n });\n ClipboardManager.copy(selectedItemsIds.join());\n }\n\n // Paste (Ctrl+V or Cmd+V)\n if (ctrlOrCmd(event) && event.key === 'v') {\n const clipboard = await ClipboardManager.paste();\n if (clipboard) {\n const selectedItemsIds = clipboard.split(',');\n const validItemIds = selectedItemsIds\n .map((id) => getIdQueryParam(id) || id)\n .filter((id) => id.includes(':'));\n this._insertRapiItems(validItemIds);\n }\n }\n }\n\n private _checkPanning(event: KeyboardEvent | MouseEvent) {\n if (\n event.shiftKey === true ||\n ((event as KeyboardEvent).key &&\n (event as KeyboardEvent).key.includes('Shift'))\n ) {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.enablePanning();\n event.preventDefault();\n }\n }\n }\n\n private _onMouseDown(inputEvent: InputEvent) {\n if ('event' in inputEvent) {\n this._checkPanning(inputEvent.event as KeyboardEvent);\n }\n }\n\n private _checkNumKey(event: KeyboardEvent) {\n //1\n if (event.key && event.key === '1') {\n this.switchTo2D();\n event.preventDefault();\n }\n\n //2\n if (event.key && event.key === '2') {\n this.switchTo3D();\n event.preventDefault();\n }\n\n //3\n if (event.key && event.key === '3') {\n this.switchToFirstPerson();\n event.preventDefault();\n }\n }\n\n protected _onKeyUp(event: KeyboardEvent, cleanup: boolean = false) {\n super._onKeyUp(event, cleanup);\n //CMD or CTRL\n if (ctrlOrCmd(event, true)) {\n const numPressedKeys = getPressedKeysCount(event);\n let selectionMode = SELECTION_MODE.STANDARD;\n const isMultiSelectKey = isCtrlOrCmd(event);\n if (!isMultiSelectKey && numPressedKeys === 1) {\n selectionMode = SELECTION_MODE.MULTISELECT;\n }\n this._plannerSceneEventHandler.setSelectionMode(selectionMode);\n event.preventDefault();\n }\n\n // Shift\n if (event.key && event.key.includes('Shift')) {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.disablePanning();\n event.preventDefault();\n }\n }\n // Escape\n if (event.key && (event.key === 'Escape' || event.key === 'Esc')) {\n if (this._drawingEnabled) {\n this.escapeDrawing(true);\n this._roomlePlannerUiCallback.onDrawCancel();\n }\n this.cancelDragIn();\n }\n }\n\n public async undo(): Promise<void> {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.cancelDrawing();\n planInteractionHandler.undo();\n this.cancelPlanElementSelection('undo');\n return Promise.resolve();\n }\n\n public async redo(): Promise<void> {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.redo();\n this.cancelPlanElementSelection('redo');\n return Promise.resolve();\n }\n\n public setMode(mode: Enumify<typeof CAMERA_TYPE>) {\n switch (mode) {\n case CAMERA_TYPE.CAMERA_2D:\n this.switchTo2D();\n break;\n case CAMERA_TYPE.CAMERA_3D:\n this.switchTo3D();\n break;\n case CAMERA_TYPE.CAMERA_FP:\n this.switchToFirstPerson();\n break;\n }\n }\n\n private _clearHighlighting() {\n this._planElementHighlighter.clearHighlighting();\n this._renderWithoutShadowsAndAO();\n }\n\n public highlightPlanElementsById(runtimeIds: number[] | null) {\n if (runtimeIds === null) {\n this._clearHighlighting();\n return;\n }\n\n this._planElementHighlighter.highlightPlanElements(runtimeIds);\n }\n\n public highlightPlanElementById(runtimeId: number | null) {\n if (runtimeId === null) {\n this._clearHighlighting();\n return;\n }\n runtimeId = this.getRootPlanObjectId(runtimeId);\n const planObjectViewModel =\n this._getViewModel().getPlanObjectForId(runtimeId);\n this._planElementHighlighter.highlightPlanElement(planObjectViewModel);\n }\n\n public destroy() {\n super.destroy();\n this._plannerMeshGenerator.removeMaterialLoadedListener();\n this._getViewModel().removeGeometriesMergedListener();\n }\n\n public planObjectConfigurationLoaded(\n plan: Plan,\n element: PlanElement,\n success: boolean,\n ): void {\n if (!success) {\n console.error(\n 'Plan object configuration loading failed',\n (element as PlanObject).getCatalogItemId() ||\n (element as PlanObject).getConfigurationHash(),\n );\n }\n if (plan && plan.extRef && element && element.extRef) {\n const planObjectViewModel = element.extRef\n .jsObject as PlanObjectViewModel;\n const runtimeId = planObjectViewModel\n .getPlanObject()\n .getConfigurationRuntimeId();\n if (runtimeId > 0) {\n this._getViewModel().constructComponents(runtimeId);\n }\n }\n }\n\n public async planObjectConfigurationChanged(\n _plan: Plan,\n element: PlanElementViewModel,\n ) {\n const planObject = this.getPlanObject(element.getId());\n let planObjects: UiPlanObject[];\n\n if (\n planObject &&\n !(element instanceof ConfiguratorPlanObjectViewModel) &&\n !(element instanceof ConfigurableConstructionPlanObjectViewModel)\n ) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.CHANGED,\n planObjects?.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n }\n\n public addMesh(\n _planElement: PlanElement,\n _material: any,\n _vertices: Float32Array,\n _indices: Int32Array,\n _uvCoords: Float32Array,\n _normals: Float32Array,\n ): void {\n // unused\n }\n\n public updateCameraOnDrawWalls() {\n this.plannerCameraBehaviour.updateCameraOnDrawWalls(this.getBounds());\n }\n\n public getBounds(): Box3 {\n if (!this._getViewModel()) {\n return null;\n }\n return this._getViewModel().getBoundingBox();\n }\n\n public getGeometryBounds(): Box3 {\n if (this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n return super.getGeometryBounds();\n }\n return this.getBounds();\n }\n\n public getPlanObject(id: number): KernelPlanObject {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n const planModelViewHelper = this._plannerKernelAccess.planModelViewHelper;\n const plan = planInteractionHandler.getPlan();\n return planModelViewHelper.getPlanObject(plan, id);\n }\n\n /**\n * This is needed to get the root plan object id in case a plan element is selected\n * which has been docked using `advanced docking`\n * @param id\n */\n public getRootPlanObjectId(id: number): number {\n if (!this._plannerKernelAccess?.kernelContainer) {\n return id;\n }\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n const planModelViewHelper = this._plannerKernelAccess.planModelViewHelper;\n const plan = planInteractionHandler.getPlan();\n return planModelViewHelper.getRootPlanObjectId(plan, id);\n }\n\n public cancelPlanElementSelection(reason: CancelSelectionReasons) {\n this._plannerSceneEventHandler.cancelSelection(reason);\n this._planElementHighlighter.clearHighlighting();\n this._requestRender();\n }\n\n public async deletePlanElements(runtimeIds: RuntimeId[]) {\n this.cancelPlanElementSelection('delete_object');\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.startInteraction();\n await this.deletePlanElementByIds(runtimeIds);\n planInteractionHandler.endInteraction();\n }\n\n public async deletePlanElementSelection() {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n await this.deletePlanElements(selectedIds);\n }\n\n public async deletePlanElementByIds(runtimeIds: number[]) {\n for (const id of runtimeIds) {\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(id);\n if (planObjectViewModel && planObjectViewModel.getObject()) {\n const planObject = this.getPlanObject(planObjectViewModel.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.REMOVED,\n planObjects.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n this._getKernelAccess().planInteractionHandler.removeElement(\n planObjectViewModel.getKernelObject(),\n );\n }\n }\n }\n\n public rotatePlanElements(ids: RuntimeId[], rotateBy: number) {\n const list =\n new (this._getKernelAccess().kernelContainer.PlanObjectPtrList)();\n const bounds = new Box3();\n let kernelCenter: KernelVector3 = { x: 0, y: 0, z: 0 };\n ids.forEach((id) => {\n const planObjectViewModel = this._getViewModel().getPlanObjectForId(id);\n if (planObjectViewModel && planObjectViewModel.getObject()) {\n kernelCenter = planObjectViewModel.getPlanElement().getCenter();\n list.push_back(planObjectViewModel.getPlanElement());\n bounds.expandByObject(planObjectViewModel.getContainer());\n }\n });\n if (list.size() > 1) {\n const center = bounds.getCenter(new Vector3());\n kernelCenter = convertToKernel(center);\n }\n this._getKernelAccess().planInteractionHandler.rotateObjectsBy(\n list,\n rotateBy,\n kernelCenter,\n );\n }\n\n public rotatePlanElementSelection(rotateBy: number) {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n this.rotatePlanElements(selectedIds, rotateBy);\n }\n\n public planBoundsChanged(): void {\n this.updateEnvironment(this.getBounds());\n this._requestRender();\n }\n\n public planElementRemoved(element: PlanElement): void {\n if (this._configuratorContext.planElementId === element.getId()) {\n this._roomlePlannerUiCallback.onSelectionCancel('delete_object');\n this._configuratorContext.planElementId = 0;\n }\n this._onPlanChanged();\n this._renderEverything();\n\n if (this.scenePlanElementLightSources.length === 0) {\n this.toggleInteriorLightsSceneSettings(false);\n }\n }\n\n private _onPlanChanged() {\n this._roomlePlannerUiCallback.onPlanChanged();\n }\n\n public prepareTopImage(\n options: PrepareImageOptions = {},\n isolationMode?: boolean,\n ): Promise<Base64Image> {\n if (\n this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR &&\n isolationMode\n ) {\n return super.preparePerspectiveImage(options);\n }\n return new Promise<Base64Image>((resolve) => {\n this._getViewModel()\n .materialQueue.finished(true)\n .then(async () => {\n const cameraTarget = options.runtimeIds\n ? ImageRenderer.getCameraTargetForBBox(\n this._getViewModel().getBoundingBoxFromRuntimeIds(\n options.runtimeIds,\n ),\n 0.1,\n )\n : this._calculateBoundingBoxOfAllMeshes(0.1);\n this._lightSetting?.removeFromScene();\n\n const invisibleWalls = [];\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n await this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_2D);\n this._getViewModel().setNodeVisibility(false);\n\n for (const wallPlanObject of this._getViewModel().getWallPlanObjectViewModels()) {\n if (!wallPlanObject.isVisible()) {\n invisibleWalls.push(wallPlanObject);\n }\n wallPlanObject.show();\n }\n }\n\n if (options.runtimeIds) {\n this._getViewModel().hideAllExceptRuntimeIds(options.runtimeIds);\n }\n\n const image = await this._imageRenderer.prepareTopImage(\n this._scene,\n null,\n cameraTarget,\n options,\n );\n\n if (options.runtimeIds) {\n this._getViewModel().showAll();\n }\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n await this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_3D);\n }\n\n if (invisibleWalls.length) {\n for (const wallPlanObject of invisibleWalls) {\n wallPlanObject.hide();\n }\n }\n\n this._lightSetting?.addToScene();\n this._roomleRenderer?.clearCache();\n this._requestRender();\n resolve(image);\n });\n });\n }\n\n public preparePerspectiveImageOf(\n runtimeId: RuntimeId,\n options: PrepareImageOptions = {},\n ): Promise<Base64Image> {\n const object = this._getViewModel().getPlanObjectForId(runtimeId);\n if (!object) {\n const error = 'Object with runtimeId ' + runtimeId + ' not found';\n console.warn(error);\n throw new Error(error);\n }\n return this._preparePerspectiveImage({\n ...options,\n object: object.getObject().clone(),\n });\n }\n\n protected async _waitForAssets(): Promise<void> {\n await super._waitForAssets();\n await this._getViewModel().materialQueue.finished(true);\n }\n\n private _preparePerspectiveImage(\n options: PrepareImageOptionsPlanner = {},\n isolationMode?: boolean,\n ): Promise<Base64Image> {\n if (\n this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR &&\n isolationMode\n ) {\n return super.preparePerspectiveImage(options);\n }\n\n const restorePlannerEditModeState =\n this._handlePlannerIsolationModeState(isolationMode);\n\n return new Promise<Base64Image>((resolve, reject) => {\n this._getViewModel()\n .materialQueue.finished(true)\n .then(async () => {\n let camera: PerspectiveOffsetCamera | OrthographicOffsetCamera;\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n camera = this.cameraBehaviour.cameraControl.getCamera().clone();\n } else {\n camera = this.getPerspectiveOffsetCamera().clone();\n this._getViewModel().getCeilingGroup().visible = false;\n camera.layers.enableAll();\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_3D);\n }\n\n camera.resetOffset();\n const cameraTarget = !options.object\n ? options.runtimeIds\n ? ImageRenderer.getCameraTargetForBBox(\n this._getViewModel().getBoundingBoxFromRuntimeIds(\n options.runtimeIds,\n ),\n )\n : this._calculateBoundingBoxOfAllMeshes()\n : ImageRenderer.getCameraTargetForBBox(\n new Box3().setFromObject(options.object),\n );\n this._lightSetting?.removeFromScene();\n const scene = !options.object\n ? this._scene\n : createEmptySceneFromCurrent(this._scene);\n if (options.object) {\n scene.add(options.object);\n }\n\n if (options.runtimeIds) {\n this._getViewModel().hideAllExceptRuntimeIds(options.runtimeIds);\n }\n\n const image = await this._imageRenderer.preparePerspectiveImage(\n scene,\n null,\n camera as PerspectiveCamera,\n cameraTarget,\n options,\n undefined,\n (placedCamera) => {\n hideWallsBasedOnCamera(\n placedCamera,\n this._getViewModel().getWallPlanObjectViewModels(),\n );\n },\n );\n\n dispose(camera);\n\n if (options.runtimeIds) {\n this._getViewModel().showAll();\n }\n\n if (options.object) {\n dispose(scene);\n }\n\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n this._getViewModel().setCameraType(CAMERA_TYPE.CAMERA_2D);\n this._getViewModel()\n .getWallPlanObjectViewModels()\n .forEach((node) => node.show());\n } else {\n hideWallsBasedOnCamera(\n this.cameraBehaviour.cameraControl.getCamera(),\n this._getViewModel().getWallPlanObjectViewModels(),\n );\n }\n\n this._lightSetting?.addToScene();\n this._roomleRenderer?.clearCache();\n this._requestRender();\n this._setCeiling();\n\n restorePlannerEditModeState();\n\n resolve(image);\n }, reject);\n });\n }\n\n private _handlePlannerIsolationModeState(\n isolationMode?: boolean,\n ): () => void {\n if (!isolationMode) {\n const previousContext = this._configuratorContext.baseContext;\n\n this._getViewModel().showAll();\n this._configuratorContext.baseContext = BASE_CONTEXT.PLANNER;\n\n return () => {\n this._configuratorContext.baseContext = previousContext;\n if (previousContext === BASE_CONTEXT.CONFIGURATOR) {\n // Because there might be a case that we already inside the focuse mode in edit mode\n if (!this._configureInRoom) {\n this._hideAllExceptSelectedElement();\n }\n }\n };\n }\n\n return () => null;\n }\n\n private _hideAllExceptSelectedElement(): void {\n const { planElementId } = this._configuratorContext;\n const selectedElement = this.getRootPlanObjectId(planElementId);\n this._getViewModel().hideAllExcept(selectedElement);\n }\n\n public preparePerspectiveImage(\n options: PrepareImageOptions = {},\n isolationMode?: boolean,\n ): Promise<Base64Image> {\n return this._preparePerspectiveImage(options, isolationMode);\n }\n\n protected _calculateBoundingBoxOfAllMeshes(\n spacing: number = 0,\n ): CameraTarget {\n const bounds = this.getBounds();\n return ImageRenderer.getCameraTargetForBBox(bounds, spacing);\n }\n\n public enableRotation() {\n this._plannerSceneEventHandler.setState(PLANNER_SCENE_EVENT_STATE.ROTATE);\n }\n\n public disableRotation() {\n this._plannerSceneEventHandler.resetState();\n }\n\n public enableSnapping() {\n this._plannerSceneEventHandler.enableSnapping();\n }\n\n public disableSnapping() {\n this._plannerSceneEventHandler.disableSnapping();\n }\n\n public enableAdvancedDocking() {\n this._plannerSceneEventHandler.enableAdvancedDocking();\n }\n\n public disableAdvancedDocking() {\n this._plannerSceneEventHandler.disableAdvancedDocking();\n }\n\n public showsChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ): boolean {\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planObject = planElementViewModel.getKernelObject();\n return this._plannerSceneEventHandler.showsChildrenOfPlanObject(\n planObject,\n );\n }\n return false;\n }\n\n public enableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planObject = planElementViewModel.getKernelObject();\n this._plannerSceneEventHandler.enableShowChildrenOfPlanObject(planObject);\n }\n }\n\n public disableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n const planObject = planElementViewModel.getKernelObject();\n this._plannerSceneEventHandler.disableShowChildrenOfPlanObject(\n planObject,\n );\n }\n }\n\n public dragIn(dragEvent: DragEvent) {\n if (this._plannerSceneEventHandler.getSelectedIds().length > 0) {\n this._plannerSceneEventHandler.cancelSelection('dragIn');\n }\n this._plannerSceneEventHandler.setDragIn(true, dragEvent);\n }\n\n public getPlannerSceneEventHandler() {\n return this._plannerSceneEventHandler;\n }\n\n public disablePlannerEvents() {\n this._plannerSceneEventHandler.disable();\n }\n\n public enablePlannerEvents() {\n this._plannerSceneEventHandler.enable();\n }\n\n protected _onCameraIdle() {\n if (super._onCameraIdle()) {\n this._sendRoomMeasurements();\n this._sendPlanObjectPositions();\n this._roomlePlannerUiCallback.onCameraIdle();\n this._sendElementMeasurements();\n this._hideAllNodeIfThereAreNoSelections();\n this._sendWallDimensions();\n }\n return true;\n }\n\n private _hideAllNodeIfThereAreNoSelections() {\n if (\n !this.currentSelection &&\n !this.getPlannerSceneEventHandler().isCurrentlyDrawing\n ) {\n this._getViewModel()\n .getMeasurementLineObjectViewModels()\n .forEach((measurementLineViewModel) =>\n measurementLineViewModel.hideDraggableNodes(),\n );\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.hide());\n }\n }\n\n protected _onCameraMove() {\n if (super._onCameraMove()) {\n this._roomlePlannerUiCallback.disableWallDimensions();\n this._roomlePlannerUiCallback.cameraStartsMoving();\n }\n this._updateNodeSize();\n this._renderEverything();\n return true;\n }\n\n private _showWallNodes() {\n this._getViewModel()\n .getNodePlanObjectViewModels()\n .forEach((node) => node.show());\n }\n\n private _updateNodeSize() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n const zoom =\n 1 /\n (this.cameraBehaviour.cameraControl.getCamera() as OrthographicCamera)\n .zoom;\n this._getViewModel().setNodeZoom(zoom);\n }\n }\n\n private _sendPlanObjectPositions(): void {\n if (this.cameraBehaviour.cameraControl.isLocked()) {\n return;\n }\n\n const { clientWidth, clientHeight } = this._domHelper.element;\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n\n if (selectedIds.length > 1) {\n this._sendMultiSelectionPosition(\n selectedIds,\n camera,\n clientWidth,\n clientHeight,\n );\n } else {\n this._sendSelectedPlanObjectPositions(camera, clientWidth, clientHeight);\n }\n }\n\n private _sendMultiSelectionPosition(\n selectedIds: RuntimeId[],\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ): void {\n const combinedBounds = new Box3();\n\n for (const id of selectedIds) {\n const planElement = this._getViewModel().getPlanObjectForId(id);\n if (planElement) {\n combinedBounds.expandByObject(planElement.getContainer());\n }\n }\n\n const center = combinedBounds.getCenter(new Vector3());\n const position2d = threeVectorToTransferableXY(\n getScreenXY(center, camera, clientWidth, clientHeight),\n );\n\n this._roomlePlannerUiCallback.onUpdatePlanObjectPositions([\n { runtimeIds: selectedIds, position2d },\n ]);\n }\n\n private _sendSelectedPlanObjectPositions(\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ): void {\n const viewModel = this._getViewModel();\n const planObjectPositions: PlanObjectPosition[] = [];\n\n const allPlanObjects: PlanElementViewModel[] = [\n ...viewModel.getStaticPlanObjectViewModels(),\n ...viewModel.getConfigurablePlanObjectViewModels(),\n ...viewModel.getConfigurableConstructionPlanObjectViewModels(),\n ...viewModel.getConstructionPlanObjectViewModels(),\n ...viewModel.getWallPlanObjectViewModels(),\n ...viewModel.getFloorPlanObjectViewModels(),\n ...viewModel.getNodePlanObjectViewModels(),\n ];\n\n for (const planElement of allPlanObjects) {\n planObjectPositions.push(\n createTransferableObjectPosition(\n planElement,\n camera,\n clientWidth,\n clientHeight,\n ),\n );\n }\n\n this._roomlePlannerUiCallback.onUpdatePlanObjectPositions(\n planObjectPositions,\n );\n }\n\n private _sendRoomAreaData(): void {\n const floorPlanObjectViewModels =\n this._getViewModel().getFloorPlanObjectViewModels();\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const floorsData: FloorAreaDataTransferable[] = [];\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n\n if (\n this._initData.debug &&\n this._debugSpheres.floorPoints.children.length\n ) {\n this._debugSpheres.floorPoints.clear();\n }\n\n for (const floor of floorPlanObjectViewModels) {\n const floorData = floor.getFloorData(zoomFactor);\n\n if (!floorData || !floorData.textPosition3d) {\n return;\n }\n\n floorData.roomLabel = (\n floor.getKernelObject() as KernelFloor\n ).getLabelObject();\n floorData.formattedArea =\n this._unitFormatter.formatSquareMMValueToUnitString(floorData.area);\n\n floorData.textPosition2d = getScreenXY(\n floorData.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n\n floorsData.push(toFloorAreaDataTransferable(floorData));\n\n if (this._initData.debug) {\n const geometry = new SphereGeometry(0.1, 32, 16);\n const material = new MeshBasicMaterial({ color: 0x0000ff });\n const textSphere = new Mesh(geometry, material);\n textSphere.position.copy(floorData.textPosition3d);\n this._debugSpheres.floorPoints.add(textSphere);\n }\n }\n\n if (floorsData.length > 0) {\n this._roomlePlannerUiCallback.onFloorPlanAreasUpdated(floorsData);\n }\n }\n\n private _updateMeasurementPositions(\n measurements: ConstructionMeasurement,\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ) {\n if (measurements.fromPosition3d) {\n measurements.fromPosition2d = getScreenXY(\n measurements.fromPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n }\n if (measurements.toPosition3d) {\n measurements.toPosition2d = getScreenXY(\n measurements.toPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n }\n if (measurements.textPosition3d) {\n measurements.textPosition2d = getScreenXY(\n measurements.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n }\n return measurements;\n }\n\n private _sendElementMeasurements(\n planElementViewModel?: PlanElementViewModel,\n ) {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n this._sendConstructionElementDimensions(planElementViewModel);\n this._sendObjectMeasurements(planElementViewModel);\n this._sendMeasurementLineDimension();\n }\n\n private _sendRoomMeasurements() {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n this._sendWallDimensions();\n this._sendRoomAreaData();\n }\n\n private _sendMeasurementLineDimension() {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const measurementLineDimensions: MeasurementLineDimensionTransferable[] =\n [];\n\n const measurementLineViewModels =\n this._getViewModel().getMeasurementLineObjectViewModels();\n for (const measurementLineViewModel of measurementLineViewModels) {\n const measurementLineDimension =\n measurementLineViewModel.getMeasurementLineDimension();\n\n measurementLineDimension.fromPosition2d = getScreenXY(\n measurementLineDimension.fromPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n measurementLineDimension.toPosition2d = getScreenXY(\n measurementLineDimension.toPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n\n measurementLineDimension.textPosition2d = getScreenXY(\n measurementLineDimension.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n measurementLineDimension.lengthFormatted =\n this._unitFormatter.formatMMValueToUnitString(\n measurementLineDimension.length,\n );\n\n measurementLineDimensions.push(\n toMeasurementLineDimensionToTransferable(measurementLineDimension),\n );\n }\n\n this._roomlePlannerUiCallback.onUpdateMeasurementLineDimensions(\n measurementLineDimensions,\n );\n }\n\n private _sendObjectMeasurements(planElementViewModel?: PlanElementViewModel) {\n if (!(this.cameraBehaviour.cameraControl instanceof CameraControl2D)) {\n return;\n }\n\n if (!this.currentSelection && !planElementViewModel) {\n return;\n }\n\n const ids = this._plannerSceneEventHandler.getSelectedIds();\n if (ids.length === 0 && !planElementViewModel) {\n // We did not show object to wall Measurements for multi-select case\n return;\n }\n\n const planObjectViewModel =\n planElementViewModel || this._getViewModel().getPlanObjectForId(ids[0]);\n if (\n !planObjectViewModel ||\n planObjectViewModel instanceof ConstructionPlanObjectViewModel ||\n planObjectViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel ||\n (!(planObjectViewModel instanceof StaticPlanObjectViewModel) &&\n !(planObjectViewModel instanceof ConfiguratorPlanObjectViewModel))\n ) {\n return;\n }\n\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n\n const objectDimensions = planObjectViewModel.getObjectMeasurements(\n zoomFactor,\n clientWidth,\n clientHeight,\n );\n const transferableRectMeasurements = this.transformMeasurements(\n objectDimensions.rectMeasurements,\n camera,\n clientWidth,\n clientHeight,\n );\n const transferableObjectMeasurements = this.transformMeasurements(\n objectDimensions.objectMeasurements,\n camera,\n clientWidth,\n clientHeight,\n );\n const transferableObjectToWallsMeasurements = this.transformMeasurements(\n objectDimensions.objectToWallsMeasurements,\n camera,\n clientWidth,\n clientHeight,\n );\n\n this._roomlePlannerUiCallback.onUpdateObjectMeasurements({\n rectMeasurements: transferableRectMeasurements,\n objectMeasurements: transferableObjectMeasurements,\n objectToWallsMeasurements: transferableObjectToWallsMeasurements,\n });\n }\n\n private transformMeasurements(\n dimensions: ObjectWallDimension[],\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n ): ObjectToWallDimensionTransferable[] {\n return dimensions.map((dimension) => {\n const fromPosition2d = getScreenXY(\n dimension.fromPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n const toPosition2d = getScreenXY(\n dimension.toPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n const textPosition2d = getScreenXY(\n dimension.textPosition3d,\n camera,\n clientWidth,\n clientHeight,\n );\n\n return objectToWallDimensionToTransferable({\n ...dimension,\n fromPosition2d,\n toPosition2d,\n textPosition2d,\n });\n });\n }\n\n private _sendConstructionElementDimensions(\n planElementViewModel?: PlanElementViewModel,\n ) {\n if (!this.currentSelection && !planElementViewModel) {\n return;\n }\n\n const planObjectViewModel =\n planElementViewModel ||\n this._getViewModel().getPlanObjectForId(\n this.currentSelection.staticItemRuntimeId ||\n this.currentSelection.configurationRuntimeId,\n );\n if (\n !planObjectViewModel ||\n !(\n planObjectViewModel instanceof ConstructionPlanObjectViewModel ||\n planObjectViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel\n )\n ) {\n return;\n }\n if (\n this._initData.debug &&\n this._debugSpheres.constructionElementsPoints.children.length > 0\n ) {\n this._debugSpheres.constructionElementsPoints.clear();\n }\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const { clientWidth, clientHeight } = this._domHelper.element;\n const zoomFactor = this.cameraBehaviour.cameraControl.getKernelZoomFactor();\n const constructionMeasurements = (\n planObjectViewModel as\n | ConstructionPlanObjectViewModel\n | ConfigurableConstructionPlanObjectViewModel\n ).getConstructionElementMeasurements(zoomFactor, clientWidth, clientHeight);\n\n if (!constructionMeasurements) {\n return;\n }\n\n if (this._initData.debug) {\n const redMaterial = new MeshBasicMaterial({ color: 0xff0000 });\n const greenMaterial = new MeshBasicMaterial({ color: 0x00ff00 });\n const blueMaterial = new MeshBasicMaterial({ color: 0x0000ff });\n const sphereGeometry = new SphereGeometry(0.1, 32, 16);\n\n const leftFromSphere = new Mesh(sphereGeometry, redMaterial);\n leftFromSphere.position.copy(\n constructionMeasurements.leftMeasurement.fromPosition3d,\n );\n leftFromSphere.position.y = 5;\n const leftToSphere = new Mesh(sphereGeometry, redMaterial);\n leftToSphere.position.copy(\n constructionMeasurements.leftMeasurement.toPosition3d,\n );\n leftToSphere.position.y = 5;\n\n const rightFromSphere = new Mesh(sphereGeometry, greenMaterial);\n rightFromSphere.position.copy(\n constructionMeasurements.rightMeasurement.fromPosition3d,\n );\n rightFromSphere.position.y = 5;\n const rightToSphere = new Mesh(sphereGeometry, greenMaterial);\n rightToSphere.position.copy(\n constructionMeasurements.rightMeasurement.toPosition3d,\n );\n rightToSphere.position.y = 5;\n const rangeFromSphere = new Mesh(sphereGeometry, blueMaterial);\n rangeFromSphere.position.copy(\n constructionMeasurements.elementRange.fromPosition3d,\n );\n rangeFromSphere.position.y = 5;\n const rangeToSphere = new Mesh(sphereGeometry, blueMaterial);\n rangeToSphere.position.copy(\n constructionMeasurements.elementRange.toPosition3d,\n );\n rangeToSphere.position.y = 5;\n\n this._debugSpheres.constructionElementsPoints.add(leftFromSphere);\n this._debugSpheres.constructionElementsPoints.add(leftToSphere);\n this._debugSpheres.constructionElementsPoints.add(rightFromSphere);\n this._debugSpheres.constructionElementsPoints.add(rightToSphere);\n this._debugSpheres.constructionElementsPoints.add(rangeFromSphere);\n this._debugSpheres.constructionElementsPoints.add(rangeToSphere);\n }\n constructionMeasurements.leftMeasurement = this._updateMeasurementPositions(\n constructionMeasurements.leftMeasurement,\n camera,\n clientWidth,\n clientHeight,\n );\n constructionMeasurements.rightMeasurement =\n this._updateMeasurementPositions(\n constructionMeasurements.rightMeasurement,\n camera,\n clientWidth,\n clientHeight,\n );\n constructionMeasurements.elementRange = this._updateMeasurementPositions(\n constructionMeasurements.elementRange,\n camera,\n clientWidth,\n clientHeight,\n );\n const transferableMeasurements: ConstructionMeasurementsTransferable = {\n leftMeasurement: {\n ...toConstructionMeasurementTransferable(\n constructionMeasurements.leftMeasurement,\n ),\n },\n rightMeasurement: {\n ...toConstructionMeasurementTransferable(\n constructionMeasurements.rightMeasurement,\n ),\n },\n elementRange: {\n ...toConstructionMeasurementTransferable(\n constructionMeasurements.elementRange,\n ),\n },\n };\n this._roomlePlannerUiCallback.onUpdateConstructionElementsMeasurements(\n transferableMeasurements,\n );\n }\n\n private _sendWallDimensions(isFixedWalls = true) {\n if (\n this._initData.debug &&\n this._debugSpheres.wallPoints.children.length > 0\n ) {\n this._debugSpheres.wallPoints.clear();\n }\n\n sendWallDimensions(\n this._domHelper,\n this.cameraBehaviour,\n this._roomlePlannerUiCallback,\n this._plannerSceneEventHandler,\n this._getViewModel(),\n this._unitFormatter,\n this._debugSpheres,\n isFixedWalls,\n this._initData.debug,\n );\n }\n\n enableWallDrawing() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl2D) {\n const bounds = getDrawingMinBounds(\n this.getBounds(),\n this._domHelper.element.clientWidth,\n this._domHelper.element.clientHeight,\n );\n this.plannerCameraBehaviour.resetCameraOnEnableWallDrawing(bounds);\n }\n\n if (this._drawingEnabled) {\n // return if drawing is enabled so that eventListeners are not added multiple times\n return;\n }\n this._drawingEnabled = true;\n this._scene.add(this._plannerSceneEventHandler.enableWallDrawing());\n }\n\n disableWallDrawing() {\n this._drawingEnabled = false;\n this.cameraBehaviour.cameraControl.unlock();\n this._scene.remove(this._plannerSceneEventHandler.cancelWallDrawing());\n }\n\n public escapeDrawing(cancelDrawing: boolean) {\n this._plannerSceneEventHandler.stopDrawing(cancelDrawing);\n }\n\n public cancelDragIn() {\n if (this._plannerSceneEventHandler.isDragIn()) {\n const selectedIds = this._plannerSceneEventHandler.getSelectedIds();\n this._plannerSceneEventHandler.cancelSelection('delete_object');\n this._plannerSceneEventHandler.setDragIn(false);\n this._getInputManager().forceMouseUp();\n this.deletePlanElements(selectedIds);\n }\n }\n\n public setSceneEvents(sceneEvents: SceneEvents) {\n if (\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson\n ) {\n return;\n }\n if (sceneEvents.construction !== undefined) {\n this._plannerSceneEventHandler?.enableConstructionEvents(\n sceneEvents.construction,\n );\n }\n if (sceneEvents.objects !== undefined) {\n this._plannerSceneEventHandler?.enableObjectEvents(sceneEvents.objects);\n }\n }\n\n /**\n * called by kernel\n */\n public startedDrawing(): void {\n this._plannerSceneEventHandler.startDrawing();\n this._showWallNodes();\n }\n\n /**\n * called by kernel\n */\n public stoppedDrawing(): void {\n this._plannerSceneEventHandler.stopDrawing();\n }\n\n public disableEvents() {\n super.disableEvents();\n this.disablePlannerEvents();\n }\n\n public enableEvents() {\n super.enableEvents();\n if (\n this._configuratorContext.baseContext === BASE_CONTEXT.PLANNER &&\n !(this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson)\n ) {\n this.enablePlannerEvents();\n }\n }\n\n public resetCameraPositionToStart() {\n this.plannerCameraBehaviour.externalApiResetCameraPosition(\n this.getBounds(),\n );\n }\n\n async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n if (\n this.plannerCameraBehaviour instanceof Planner3dCameraBehaviour ||\n this.plannerCameraBehaviour instanceof ConfiguratorCameraBehaviour\n ) {\n return this.plannerCameraBehaviour.externalApiMoveCamera(cameraParameter);\n }\n return Promise.resolve();\n }\n\n protected _setInteriorOrExteriorWallMaterial(\n type: Enumify<typeof SET_WALL_MATERIAL_TYPE>,\n material: BatchPaintMaterial,\n ) {\n const viewModel = this._getViewModel();\n const wallPlanObjectViewModels = viewModel.getWallPlanObjectViewModels();\n\n if (!wallPlanObjectViewModels.length) {\n return;\n }\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n\n const setLeftMaterial = (wall: KernelWall) => {\n planInteractionHandler.setWallLeftMaterial(\n wall,\n applyMaterialToKernelMaterial(wall.leftMaterial, material),\n );\n };\n const setRightMaterial = (wall: KernelWall) => {\n planInteractionHandler.setWallRightMaterial(\n wall,\n applyMaterialToKernelMaterial(wall.rightMaterial, material),\n );\n };\n\n const kernelWalls = wallPlanObjectViewModels.map((wall) =>\n wall.getKernelObject(),\n );\n\n // TODO: Find a way to deal with standalone walls\n // const kernelStandAloneWallEnum =\n // this._plannerKernelAccess.kernelContainer.WallType.StandAloneWall;\n const kernelInnerWallEnum =\n this._plannerKernelAccess.kernelContainer.WallType.InnerWall;\n const kernelOuterWallLeftEnum =\n this._plannerKernelAccess.kernelContainer.WallType.OuterWallLeft;\n const kernelOuterWallRightEnum =\n this._plannerKernelAccess.kernelContainer.WallType.OuterWallRight;\n\n for (const wall of kernelWalls) {\n if (\n wall.wallType === kernelInnerWallEnum &&\n type === SET_WALL_MATERIAL_TYPE.INTERIOR\n ) {\n setLeftMaterial(wall);\n setRightMaterial(wall);\n }\n\n if (wall.wallType === kernelOuterWallLeftEnum) {\n if (type === SET_WALL_MATERIAL_TYPE.INTERIOR) {\n setRightMaterial(wall);\n } else {\n setLeftMaterial(wall);\n }\n }\n\n if (wall.wallType === kernelOuterWallRightEnum) {\n if (type === SET_WALL_MATERIAL_TYPE.EXTERIOR) {\n setRightMaterial(wall);\n } else {\n setLeftMaterial(wall);\n }\n }\n\n // TODO: Find a way to deal with standalone walls\n // if (wall.wallType === kernelStandAloneWallEnum) {\n // setLeftMaterial(wall);\n // setRightMaterial(wall);\n // }\n }\n }\n\n public changeInteriorWallsMaterial(material: BatchPaintMaterial) {\n this._setInteriorOrExteriorWallMaterial(\n SET_WALL_MATERIAL_TYPE.INTERIOR,\n material,\n );\n }\n\n public changeExteriorWallsMaterial(material: BatchPaintMaterial) {\n this._setInteriorOrExteriorWallMaterial(\n SET_WALL_MATERIAL_TYPE.EXTERIOR,\n material,\n );\n }\n\n public changeFloorsMaterial(material: BatchPaintMaterial) {\n const viewModel = this._getViewModel();\n const floorPlanObjectViewModels = viewModel.getFloorPlanObjectViewModels();\n\n if (!floorPlanObjectViewModels.length) {\n return;\n }\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n\n const kernelFloors = floorPlanObjectViewModels.map(\n (floor: FloorPlanElementViewModel) =>\n floor.getKernelObject() as KernelFloor,\n );\n\n planInteractionHandler.startInteraction();\n for (const floor of kernelFloors) {\n planInteractionHandler.setFloorMaterial(\n floor as KernelFloor,\n applyMaterialToKernelMaterial(\n floor.material,\n material,\n ) as KernelFloorMaterial,\n );\n }\n planInteractionHandler.endInteraction();\n }\n\n public getWallAngleDegrees(wall: WallPlanElementViewModel): number {\n if (!(wall instanceof WallPlanElementViewModel)) {\n return 0;\n }\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const cameraPosition = new Vector2(camera.position.x, camera.position.z);\n const wallPosition = new Vector2(\n wall.getPosition().x,\n wall.getPosition().z,\n );\n const cameraToWall = wallPosition.clone().sub(cameraPosition).normalize();\n const wallKernelObject = wall.getKernelObject();\n const wallForward = new Vector2(\n Math.sin(wallKernelObject.getAngle()),\n Math.cos(wallKernelObject.getAngle()),\n );\n const angleRadians = cameraToWall.angle() - wallForward.angle();\n return MathUtils.radToDeg(angleRadians);\n }\n\n public moveElementPosition(\n selectedElement: PlanElementViewModel,\n position: KernelVector3,\n ) {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.setObjectFixedZ(\n selectedElement.getPlanElement(),\n true,\n );\n const elementCenter = selectedElement.getPlanElement().getCenter();\n const distance = convertToTHREE(position).sub(\n convertToTHREE(elementCenter),\n );\n planInteractionHandler.moveElementBy(\n selectedElement.getPlanElement(),\n convertToKernel(distance),\n );\n planInteractionHandler.setObjectFixedZ(\n selectedElement.getPlanElement(),\n false,\n );\n this._sendPlanObjectPositions();\n }\n\n public moveElementsPosition(\n selectedElements: PlanElementViewModel[],\n position: KernelVector3,\n ) {\n const planObjectPtrList: KernelObjectPtrList =\n new this._plannerKernelAccess.kernelContainer.PlanObjectPtrList();\n const distance = convertToTHREE(position).sub(\n selectedElements[selectedElements.length - 1].getPosition(),\n );\n selectedElements.forEach((planElementViewModel) =>\n planObjectPtrList.push_back(planElementViewModel.getPlanElement()),\n );\n const vector3 = convertToKernel(distance);\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n planInteractionHandler.moveObjectsBy(planObjectPtrList, vector3);\n\n this._sendPlanObjectPositions();\n }\n\n protected get plannerCameraBehaviour() {\n return this.cameraBehaviour as\n | Planner2dCameraBehaviour\n | Planner3dCameraBehaviour\n | PlannerFpCameraBehaviour;\n }\n\n public enableMeasurementLineDrawing() {\n this._roomlePlannerUiCallback.onMeasurementLineStateChange(true);\n this._plannerSceneEventHandler.enableMeasurementLineDrawing();\n }\n\n public disableMeasurementLineDrawing() {\n this._plannerSceneEventHandler.disableMeasurementLineDrawing();\n }\n\n public setCompletelyLoaded(completelyLoaded: boolean) {\n this._completelyLoaded = completelyLoaded;\n }\n\n protected enablePanning() {\n if (this.plannerCameraBehaviour instanceof Planner3dCameraBehaviour) {\n this.plannerCameraBehaviour.enablePanningOnShiftClick();\n }\n }\n\n protected disablePanning() {\n if (this.plannerCameraBehaviour instanceof Planner3dCameraBehaviour) {\n this.plannerCameraBehaviour.disablePanningOnShiftRelease();\n }\n }\n\n public setObjectToWallMeasurementLength(\n planElementId: number,\n measurementId: number,\n length: number,\n ) {\n const planObject = this._getViewModel().getPlanObjectForId(planElementId);\n\n const kernelPlanElement = planObject.getPlanElement();\n\n const wallDistances = convertToStandardArray(\n kernelPlanElement.getWallDistances(),\n );\n const wallDistance = wallDistances.find(\n (w) => hashCode(w.angle + '_' + w.length) === measurementId,\n );\n\n if (!wallDistance) {\n return;\n }\n\n const startPoint = convertToTHREE(wallDistance.startPoint);\n const endPoint = convertToTHREE(wallDistance.endPoint);\n\n const direction = startPoint.clone().sub(endPoint).normalize();\n\n const newLength = (length - wallDistance.length) / 1000;\n\n const position = planObject\n .getPosition()\n .clone()\n .add(direction.multiplyScalar(newLength));\n\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n\n planInteractionHandler.moveElementToIn2d(\n kernelPlanElement,\n convertToKernel(position),\n );\n\n this._sendObjectMeasurements();\n }\n\n public setWallMeasurementLength(\n measurementId: number,\n length: number,\n wallDirection: EMSConstant,\n ) {\n const isCurrentlyDrawing =\n this.getPlannerSceneEventHandler().isCurrentlyDrawing;\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n let wallPlanObject = this._getViewModel().getPlanObjectForId(measurementId);\n const isVectorPreviewModeEnabled =\n planInteractionHandler.isVectorPreviewModeEnabled();\n if (isCurrentlyDrawing && !isVectorPreviewModeEnabled) {\n const nodePlanObject = this._getViewModel().latestNodePlanObjectViewModel;\n const kernelPosition = convertToKernel(nodePlanObject.getPosition());\n planInteractionHandler.endDrawing(kernelPosition);\n this.escapeDrawing(false);\n wallPlanObject = this._getViewModel().latestWallPlanObjectViewModel;\n }\n\n if (wallPlanObject) {\n const wallKernelObject = wallPlanObject.getKernelObject();\n\n planInteractionHandler.startInteraction();\n planInteractionHandler.setLengthOfWall(\n wallKernelObject as KernelWall,\n length,\n (wallKernelObject as any).getPreferredSide(),\n wallDirection,\n true,\n );\n planInteractionHandler.endInteraction();\n }\n if (isCurrentlyDrawing && !isVectorPreviewModeEnabled) {\n planInteractionHandler.startInteraction();\n const nodePlanObject = this._getViewModel().latestNodePlanObjectViewModel;\n const kernelPosition = convertToKernel(nodePlanObject.getPosition());\n planInteractionHandler.beginDrawing(kernelPosition, false);\n this._plannerSceneEventHandler.startDrawing();\n }\n }\n\n public setMeasurementLineLength(\n measurementId: number,\n length: number,\n wallDirection: string,\n ) {\n const planObject = this._getViewModel().getPlanObjectForId(measurementId);\n this._plannerSceneEventHandler.setMeasurementLineLength(\n planObject as MeasurementLinePlanElementViewModel,\n length,\n wallDirection,\n );\n }\n\n protected setEventHandlerObject(object: Object3D) {\n super.setEventHandlerObject(object);\n this._plannerSceneEventHandler.setObject(object);\n }\n\n // info when scene is ready to render, used for testing\n protected _readyForRender() {\n console.log('ready_for_render');\n this._roomlePlannerUiCallback.onReadyForRender();\n this._globalCallback.onReadyForRender();\n }\n\n protected notifyPlannerOnComponentSelectionCancel(\n isExtObj: boolean,\n reason: CancelSelectionReasons,\n ): void {\n if (isExtObj) {\n if (this.configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n if (reason === 'click_outside') {\n const selectedPlanObjectComponent = this.getObjectComponent(\n this.configuratorContext.rootComponentId ??\n this.configuratorContext.planObjectId,\n );\n this._roomlePlannerUiCallback.onExternalObjectModuleSelected(\n selectedPlanObjectComponent.externalObjectGroupId,\n null,\n null,\n );\n }\n } else {\n this._roomlePlannerUiCallback.onExternalObjectSelectionCancel(reason);\n }\n } else {\n this._roomlePlannerUiCallback.onComponentSelectionCancel();\n }\n }\n\n private _planObjectSelectionChanged(\n configurationRuntimeId: number,\n elementRuntimeId: number,\n ) {\n const planObjectComponent = this.getObjectComponent(\n elementRuntimeId ?? configurationRuntimeId,\n );\n if (\n planObjectComponent?.configurationType?.value !==\n CONFIGURATION_TYPE.EXTERNAL\n ) {\n return;\n }\n const selectedPlanObjectComponent = this.getObjectComponent(\n this.configuratorContext.selectedRuntimeComponentId ??\n this.configuratorContext.planObjectId,\n );\n if (\n selectedPlanObjectComponent.externalRootModuleId ===\n planObjectComponent.externalRootModuleId &&\n selectedPlanObjectComponent.externalSubModuleId ===\n planObjectComponent.externalSubModuleId\n ) {\n return;\n }\n this._getKernelAccess().planObjectSelectionChanged(\n configurationRuntimeId,\n elementRuntimeId,\n );\n }\n\n public highlightExternalObject(\n planObjectComponent: KernelPlanObjectComponent,\n ) {\n this.highlightPlanElementById(planObjectComponent.runtimeId);\n this._renderWithoutShadowsAndAO();\n }\n\n private _selectExternalObjectModule() {\n if (\n this._getKernelAccess()?.kernelContainer &&\n !this._configuratorContext.selectedRuntimeComponentId\n ) {\n const planObject = this.getPlanObject(\n this._configuratorContext.planElementId,\n );\n if (planObject.configurationType?.value === CONFIGURATION_TYPE.EXTERNAL) {\n this.selectComponent(this._configuratorContext.rootComponentId);\n }\n }\n }\n\n public getObjectComponent(id: number): KernelPlanObjectComponent {\n const planInteractionHandler =\n this._getKernelAccess().planInteractionHandler;\n const plan = planInteractionHandler.getPlan();\n const planModelViewHelper = this._getKernelAccess().planModelViewHelper;\n return planModelViewHelper.getObjectComponent(plan, id);\n }\n\n public getCameraParameters3d(): NonNullable<CameraParameter> {\n if (this._getViewModel().cameraType === CAMERA_TYPE.CAMERA_3D) {\n return this.cameraBehaviour3d.cameraControl.getCurrentCameraParameters();\n }\n return null;\n }\n\n private _createCeilingLightGroup() {\n const existingCeilingLightGroup = this._scene.children.find(\n (child) => child.name === GROUP_CEILING_LIGHTS,\n );\n if (!existingCeilingLightGroup) {\n this._scene.add(this._getViewModel().getCeilingLightsGroup());\n }\n }\n\n public toggleInteriorLightsSceneSettings(on: boolean) {\n if (this._initData.featureFlags.interiorLights) {\n this._isInteriorLightActive = on;\n this._scene.userData.environmentDefinition.rotation = on\n ? INTERIOR_LIGHTS_ENV_MAP_ROTATION\n : DEFAULT_ENV_MAP_ROTATION;\n this._scene.userData.environmentDefinition.intensity = on\n ? INTERIOR_LIGHTS_ENV_MAP_INTENSITY\n : DEFAULT_ENV_MAP_INTENSITY;\n if (this._isInteriorLightActive) {\n this._createCeilingLightGroup();\n this._activateCeilingLight();\n }\n this._getViewModel().toggleCeilingLights(on);\n this._requestRender();\n }\n }\n\n private async _insertRapiItems(ids: string[]): Promise<InsertItemResult[]> {\n const idInfos: InsertItemIdInfo[] = ids.map((id, index) => ({\n id,\n index,\n }));\n\n const rapiIds: InsertItemIdInfo[] = [];\n for (const { index, id } of idInfos) {\n rapiIds.push({ index, id });\n }\n\n return await this.insertRapiObjects(rapiIds);\n }\n\n public async insertRapiObjects(\n rapiIds: InsertItemIdInfo[],\n ): Promise<InsertItemResult[]> {\n const mapFun = ({ id }: InsertItemIdInfo) => {\n const item = isIdItemId(id)\n ? this._rapiAccess.getItem(id)\n : this._rapiAccess.getConfiguration(id);\n return item as Promise<RapiItem | RapiConfiguration>;\n };\n const itemsPromise = rapiIds.map(mapFun);\n const itemList = await Promise.all(itemsPromise);\n const rapiRuntimeIds =\n await this._plannerKernelAccess.insertItems(itemList);\n return rapiRuntimeIds.map((runtimeId, index) => {\n return { runtimeId, originalIndex: rapiIds[index].index };\n });\n }\n}\n","import type DomHelper from '../../common-core/src/utils/dom-helper';\nimport inject from '../../common-core/src/di/inject';\nimport PlannerSceneManager from './webgl/planner-scene-manager';\nimport type PlannerKernelAccess from './services/planner-kernel-access';\nimport Benchmark from '../../common-core/src/utils/benchmark';\nimport type RapiAccess from '../../common-core/src/rapi-access';\nimport {\n isPlanSnapshotId,\n USER_ACTION_MODULE,\n} from '../../common-core/src/rapi-access';\nimport type SinglePromiseFactory from '../../common-core/src/utils/single-promise-factory';\nimport { PROMISE_CATEGORY } from '../../common-core/src/utils/single-promise-factory';\nimport type RoomlePlannerUiCallback from './roomle-planner-ui-callback';\nimport { PLAN_ELEMENT_CHANGE_TYPES } from './roomle-planner-ui-callback';\nimport type { GlbViewer } from '../../glb-viewer-core/src/glb-viewer';\nimport {\n BASE_CONTEXT,\n type ExternalEmbeddable,\n type GlobalAPI,\n type KernelUtilityForUi,\n type RubensAPI,\n} from '../../common-core/src/main';\nimport type Main from '../../common-core/src/main';\nimport type { Configurator } from '../../configurator-core/src/configurator';\nimport type {\n GlobalInitDataDefinition,\n InitDataDefinition,\n} from '../../common-core/src/utils/shims';\nimport type {\n ConfigurationString,\n RapiConfiguration,\n RapiId,\n RapiItem,\n RapiPlan,\n RapiPlanSnapshotGetData,\n RapiPlanSnapshotGetDataWith3dUrls,\n RapiPlanSnapshotPostData,\n} from '../../typings/rapi-types';\nimport type LifeCycleManager from '../../common-core/src/life-cycle-manager';\nimport type { Context } from '../../common-core/src/di/context';\nimport {\n CORE_CHILD_ENTITY_MODE,\n type CancelSelectionReasons,\n type KernelObject,\n type KernelWall,\n type Plan,\n type PlanInteractionHandler,\n type PlanModelViewHelper,\n type PlanOverview,\n type KernelObjectConfiguration,\n} from '../../typings/planner';\nimport type { KernelAccessCallbackI } from '../../common-core/src/kernel-access-callback';\nimport type KernelAccessCallback from '../../common-core/src/kernel-access-callback';\nimport type DataSyncer from '../../common-core/src/services/data-syncer';\nimport type InitData from '../../common-core/src/utils/init-data';\nimport type GlobalInitData from '../../common-core/src/utils/global-init-data';\nimport type {\n CanvasOffset,\n Position3,\n} from '../../common-core/src/common-interfaces';\nimport { isIdItemId } from '../../common-core/src/utils/rapi-utils';\nimport {\n convertCObject,\n convertToKernel,\n} from '../../common-core/src/utils/kernel-utils';\nimport type { PrepareImageOptions } from '../../common-core/src/webgl/image-renderer';\nimport DynamicLightSettingLoader from '../../common-core/src/lightsetting/dynamic-light-setting-loader';\nimport { CONFIGURATION_TYPE } from '../../typings/kernel';\nimport type {\n KernelParameter,\n KernelPartList,\n KernelPartListPrice,\n KernelPlanObjectComponent,\n KernelVector3,\n RuntimeId,\n UiPlanObject,\n} from '../../typings/kernel';\nimport type UnitFormatter from '../../configurator-core/src/services/unit-formatter';\nimport RoomleConfigurator from '../../configurator-core/src/roomle-configurator';\nimport type {\n EMSConstant,\n PlannerKernelContainer,\n} from '../../typings/planner-kernel-container';\nimport type { Scene } from 'three';\nimport { Vector3 } from 'three';\nimport { mapToUiPlanObjects } from './utils/map-to-ui-plan-objects';\nimport type { CameraParameter } from '../../common-core/src/cameracontrol/camera-control';\nimport type PlanElementViewModel from '../../common-core/src/view-model/plan-element-view-model';\nimport type WallPlanElementViewModel from './view-model/wall-plan-element-view-model';\nimport { SELECTION_MODE } from '../../configurator-core/src/utils/selection-handler';\nimport type ConfiguratorContext from '../../common-core/src/webgl/configurator-context';\nimport type { KernelAttic, PlanObject, WallSide } from '../../typings/planner';\nimport type IdbManager from '../../common-core/src/services/idb-manager';\nimport type PlanViewModel from './view-model/plan-view-model';\nimport type ConfiguratorPlanObjectViewModel from '../../common-core/src/view-model/configurator-plan-object-view-model';\nimport type {\n ExternalObjectAPI,\n ExternalObjectApiConfiguration,\n ExternalRoomInformation,\n} from './external-object-api';\nimport type { GlobalCallback } from '../../common-core/src/services/global-callback';\nimport type {\n ExternalGroupData,\n ExternalObject,\n ExtObjId,\n} from '../../typings/external-objects';\nimport { isExternalObject, isExtObjId } from '../../common-core/src/roomle-sdk';\nimport type { PluginName } from '../../configurator-core/src/utils/plugin-types';\nimport { toDegrees, toRadiant } from '../../common-core/src/utils/math-helper';\nimport type { Nullable } from '../../typings/helper';\nimport { type MaybePromise } from '../../common-core/src/utils/common-utils';\nimport type { HomagIntelligence } from '../../homag-intelligence/src/homag-intelligence';\nimport type { RoomleLightSource } from '../../common-core/src/light/light-source';\n\nexport type ID_TYPE = 'rml_id' | 'tc_id' | 'rml_serialized' | 'tc_serialized';\nexport const EXT_OBJ_EXCEPTION =\n 'Could not retrieve configuration for external object! Did you implement onGetConfigurationForExternalObject?';\n\nexport interface RoomlePlannerCallback {\n switchToConfigurator: () => Promise<Configurator>;\n\n switchToViewer: () => Promise<GlbViewer>;\n\n cancelSelection: (reason: CancelSelectionReasons) => void;\n\n deleteSelection: () => void;\n\n rotateSelection: (rotateBy: number) => void;\n}\n\nexport interface WallDefinition {\n from: Position3;\n to: Position3;\n props?: { thickness?: number; height?: number };\n}\n\nexport interface InteractionOptions {\n keepInteractionOpen?: boolean;\n}\n\nconst OFFSET = { left: 0, top: 1, right: 1, bottom: 0 };\n\nconst enum MODE {\n CONFIGURATOR,\n PLANNER,\n GLB,\n}\n\nexport interface SceneEvents {\n /**\n * walls and wall nodes\n */\n construction?: boolean;\n /**\n * static and configurable items\n */\n objects?: boolean;\n}\n\nexport interface BatchPaintMaterial {\n id?: RapiId;\n materialId?: RapiId;\n color?: string;\n rgbValue?: number;\n catalogItemId?: RapiId;\n}\n\nexport interface InsertItemIdInfo {\n id: RapiId | ExtObjId;\n index: number;\n}\n\nexport interface InsertItemResult {\n runtimeId: RuntimeId;\n originalIndex: number;\n}\n\nexport default class RoomlePlanner<\n P extends readonly PluginName[] = readonly [],\n >\n implements\n KernelAccessCallbackI,\n RoomlePlannerCallback,\n GlobalAPI,\n Context,\n KernelUtilityForUi,\n ExternalEmbeddable<RoomlePlannerUiCallback>,\n RubensAPI,\n ExternalObjectAPI\n{\n public _creator_: string;\n\n private _activePlugins: P;\n\n private _homagIntelligence: HomagIntelligence | null = null;\n\n @inject\n private _configuratorContext: ConfiguratorContext;\n\n @inject\n private _domHelper: DomHelper;\n\n @inject\n private _kernelAccessCallback: KernelAccessCallback;\n\n @inject\n private _plannerKernelAccess: PlannerKernelAccess;\n\n @inject\n private _rapiAccess: RapiAccess;\n\n @inject\n private _singlePromiseFactory: SinglePromiseFactory;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n @inject\n private _lifeCycleManager: LifeCycleManager;\n\n @inject\n private _dataSyncer: DataSyncer;\n\n @inject\n protected _initData: InitData;\n\n @inject\n protected _idbManager: IdbManager;\n\n @inject\n private _globalInitData: GlobalInitData;\n\n @inject\n private _globalCallback: GlobalCallback;\n\n @inject\n private _unitFormatter: UnitFormatter;\n\n private _planInteractionHandler: PlanInteractionHandler;\n private _sceneManager: PlannerSceneManager;\n private _plan: Plan;\n private _preloadPlanId: string;\n private _kernelReadyCallback: () => void;\n private _hscInstance: Configurator = null;\n private _glbInstance: GlbViewer = null;\n private _configurator: RoomleConfigurator<P> = null;\n private _currentMode: MODE = MODE.PLANNER;\n\n constructor(creator: string, activePlugins?: P) {\n this._creator_ = creator;\n this._activePlugins = (activePlugins || []) as P;\n this._kernelAccessCallback.addListener(this);\n }\n\n public setEnvironmentMap(params: {\n url?: string;\n intensity?: number;\n rotation?: number;\n maxLightSources?: number;\n }): void {\n const { url, intensity, rotation, maxLightSources } = params;\n this._sceneManager.setEnvironmentMap(\n url,\n intensity,\n rotation,\n maxLightSources,\n );\n }\n\n public deleteSelection() {\n this._sceneManager.deletePlanElementSelection();\n }\n\n /**\n * rotates the selected item(s)\n * @param rotateBy angle in rad\n */\n public rotateSelection(rotateBy: number) {\n this._sceneManager.rotatePlanElementSelection(rotateBy);\n }\n\n public cancelSelection(reason: CancelSelectionReasons = 'unknown') {\n this._sceneManager.cancelPlanElementSelection(reason);\n }\n\n public init(\n element: HTMLElement,\n preloadPlanId?: string,\n options?: InitDataDefinition & GlobalInitDataDefinition,\n ): Promise<void> {\n Benchmark.start('loadingTime');\n this._domHelper.setDomElement(element);\n\n if (this._sceneManager) {\n this._lifeCycleManager.resume();\n return Promise.resolve();\n }\n this._preloadPlanId = preloadPlanId;\n this.setOverrides(options);\n return new Promise<void>(this._initPromiseCallback.bind(this));\n }\n\n /**\n * creates and loads a plan from a given object\n * @param id\n * @param position\n * @param rotation\n *\n * return the object runtime id\n */\n public async createPlanFromObject(\n id: RapiId,\n position?: Position3,\n rotation?: number,\n ): Promise<number> {\n if (!this._planInteractionHandler) {\n throw new Error('no plan interaction handler');\n }\n if (position) {\n position = convertToKernel(\n new Vector3(position.x, position.y, position.z),\n );\n }\n const rapiItem = await (isIdItemId(id)\n ? this._rapiAccess.getItem(id)\n : this._rapiAccess.getConfiguration(id));\n\n this._plan = this._plannerKernelAccess.createPlanFromObject(\n rapiItem,\n position,\n rotation,\n );\n\n this._sceneManager.planXMLLoaded(this._plan);\n\n this._sceneManager.updateScene();\n this.resetCameraPosition();\n\n const planObjects = convertCObject(this._plan.getPlanObjects());\n if (planObjects?.length) {\n return planObjects[0].getId();\n }\n return -1;\n }\n\n public loadPlanXml(\n xml: string,\n options?: InitDataDefinition & GlobalInitDataDefinition,\n ): Promise<void> {\n this._sceneManager.setCompletelyLoaded(false);\n this.setOverrides(options);\n return new Promise<void>((resolve) => {\n this._plan = this._planInteractionHandler.loadPlanXML(xml);\n this._sceneManager.planXMLLoaded(this._plan);\n this._roomlePlannerUiCallback.onTotalFloorAreaChanged(\n this._planInteractionHandler.getPlan().getTotalFloorArea(),\n );\n this._currentMode = MODE.PLANNER;\n if (this._initData.moc) {\n if (options.id) {\n this._rapiAccess.trackView(\n options.id,\n USER_ACTION_MODULE.ROOM_DESIGNER,\n );\n } else {\n this._rapiAccess.trackView(\n 'planXML',\n USER_ACTION_MODULE.ROOM_DESIGNER,\n );\n }\n }\n resolve();\n });\n }\n\n public loadPlan(\n id: string,\n options?: InitDataDefinition & GlobalInitDataDefinition,\n ): Promise<RapiPlan | RapiPlanSnapshotGetData> {\n this.setOverrides(options);\n return new Promise<RapiPlan | RapiPlanSnapshotGetData>(\n (resolve, reject) => {\n const isPlanSnapshot = isPlanSnapshotId(id);\n const planPromise = isPlanSnapshot\n ? this._rapiAccess.getPlanSnapshot(id)\n : this._rapiAccess.getPlan(id);\n planPromise.then((plan: RapiPlan | RapiPlanSnapshotGetData) => {\n this._sceneManager.backToPlanner();\n this._sceneManager.setCompletelyLoaded(false);\n const planObjects = isPlanSnapshot ? plan.plan : plan.planObjects;\n this._plan = this._planInteractionHandler.loadPlanXML(planObjects);\n this._sceneManager.planXMLLoaded(this._plan);\n this._roomlePlannerUiCallback.onTotalFloorAreaChanged(\n this._planInteractionHandler.getPlan().getTotalFloorArea(),\n );\n this._configuratorContext.lastLoadedPlanId = id;\n this._currentMode = MODE.PLANNER;\n if (this._initData.moc) {\n this._rapiAccess.trackView(id, USER_ACTION_MODULE.ROOM_DESIGNER);\n }\n resolve(plan);\n }, reject);\n },\n );\n }\n\n /**\n * Set general configuration parameter\n * @param initData\n */\n public setOverrides(\n initData: InitDataDefinition & GlobalInitDataDefinition,\n ): void {\n if (!initData) {\n return;\n }\n\n this._initData.setOverrides(initData);\n this._globalInitData.setOverrides(initData);\n }\n\n public toggleConfigureInRoom() {\n this._sceneManager.toggleConfigureInRoom();\n }\n\n public switch2D() {\n this._sceneManager.switchTo2D();\n }\n\n public switch3D() {\n this._sceneManager.switchTo3D();\n }\n\n public switchToFirstPerson() {\n this._sceneManager.switchToFirstPerson();\n }\n\n public resetCameraPosition(): void {\n this._sceneManager.resetCameraPositionToStart();\n }\n\n public exportGLB() {\n this._sceneManager.exportGLB();\n }\n\n public importGLB(url: string) {\n this._sceneManager.importGLB(url);\n }\n\n private _initPromiseCallback(resolve: () => void, _reject: () => void) {\n this._kernelReadyCallback = resolve;\n const { dls, ls, mode, stats } = this._initData;\n if (!this._sceneManager) {\n this._sceneManager = new PlannerSceneManager(\n this._creator_,\n OFFSET,\n this,\n mode,\n );\n }\n if (this._preloadPlanId) {\n this._sceneManager.preload(this._preloadPlanId);\n }\n const dynamicLightSettingSource =\n DynamicLightSettingLoader.createDynamicLightSettingSource(dls, ls);\n\n if (stats) {\n this.showStats();\n }\n\n this._sceneManager.enableHD(dynamicLightSettingSource);\n if (this._planInteractionHandler) {\n this._kernelReadyCallback();\n }\n }\n\n public isReady(): void {\n this._planInteractionHandler =\n this._plannerKernelAccess.planInteractionHandler;\n if (this._kernelReadyCallback) {\n this._kernelReadyCallback();\n }\n }\n\n public showBenchmarks() {\n Benchmark.showBenchmarks();\n }\n\n public getConfiguratorApi(): RoomleConfigurator<P> {\n if (!this._configurator) {\n this._configurator = new RoomleConfigurator(\n this._creator_,\n this._activePlugins,\n );\n this._configurator.setOverrides(this._initData);\n this._configurator.initSceneManager(this._sceneManager);\n }\n return this._configurator;\n }\n\n public startViewing() {\n this._sceneManager.startViewing();\n this._roomlePlannerUiCallback.onContextChanged(BASE_CONTEXT.GLB_VIEWER);\n }\n\n public startConfiguring() {\n const currentSelection = this._sceneManager.currentSelection;\n const id = currentSelection.item?.id || currentSelection.configuration?.id;\n this._sceneManager.startConfiguring();\n if (id) {\n this._configurator.notifyUiAboutNewLabel(id);\n }\n this._roomlePlannerUiCallback.onContextChanged(BASE_CONTEXT.CONFIGURATOR);\n }\n\n /**\n * select an object in the scene based on its runtime id\n * @param runtimeId\n */\n public async selectPlanObjectById(runtimeId: RuntimeId): Promise<void> {\n return this._sceneManager.selectPlanObject(runtimeId);\n }\n\n /**\n * Highlights one or more objects in the scene based on their runtime IDs.\n * If `runtimeIds` is `null`, all highlighted objects will be unhighlighted.\n *\n * @param runtimeIds A single runtime ID, an array of runtime IDs, or null.\n */\n public highlightPlanElements(runtimeIds: number | number[] | null): void {\n if (runtimeIds === null) {\n this._sceneManager.highlightPlanElementsById(null);\n } else if (Array.isArray(runtimeIds)) {\n this._sceneManager.highlightPlanElementsById(runtimeIds);\n } else {\n this._sceneManager.highlightPlanElementById(runtimeIds);\n }\n }\n\n public backToPlanner() {\n this._sceneManager.backToPlanner();\n this._roomlePlannerUiCallback.onContextChanged(BASE_CONTEXT.PLANNER);\n }\n\n public showGUI() {\n this._sceneManager.showGUI();\n }\n\n public async switchToConfigurator(): Promise<Configurator> {\n const configurator = await this._singlePromiseFactory.create<Configurator>(\n PROMISE_CATEGORY.START_HSC,\n 'startHSC',\n (resolve) => {\n if (this._hscInstance) {\n return resolve(this._hscInstance);\n }\n\n import('../../configurator-core/src/configurator').then(\n ({ Configurator: ConfiguratorClass }) => {\n const hsc = new ConfiguratorClass(this._creator_);\n hsc.boot({\n kernelInstance:\n this._planInteractionHandler.getConfiguratorKernel(),\n kernelContainer: this._plannerKernelAccess.kernelContainer,\n });\n hsc.getApi().setOverrides(this._initData);\n hsc.getApi().initSceneManager(this._sceneManager);\n hsc\n .getApi()\n .init(this._domHelper.element)\n .then(() => {\n this._hscInstance = hsc;\n resolve(this._hscInstance);\n });\n },\n );\n },\n );\n this._currentMode = MODE.CONFIGURATOR;\n this.cancelSelection('isolation_mode_started');\n return configurator;\n }\n\n public async switchToViewer(): Promise<GlbViewer> {\n const viewer = await this._singlePromiseFactory.create<GlbViewer>(\n PROMISE_CATEGORY.START_GLB,\n 'startGLB',\n (resolve) => {\n if (this._glbInstance) {\n return resolve(this._glbInstance);\n }\n import('../../glb-viewer-core/src/glb-viewer').then(\n (GLBViewerModule) => {\n const glb = new GLBViewerModule.GlbViewer(this._creator_);\n glb.boot();\n glb.getApi().setOverrides(this._initData);\n glb\n .getApi()\n .init(this._domHelper.element)\n .then(() => {\n this._glbInstance = glb;\n resolve(this._glbInstance);\n });\n },\n );\n },\n );\n this._currentMode = MODE.GLB;\n this.cancelSelection('isolation_mode_started');\n return viewer;\n }\n\n public switchToPlanner(id?: string) {\n if (id) {\n this.loadPlan(id);\n }\n this._currentMode = MODE.PLANNER;\n }\n\n public updateSize() {\n this._sceneManager.updateCamera();\n }\n\n /**\n * Return the main class which has access to lifecycle events and RapiAccess.\n * Hidden because it's only useful for embedding API.\n * Has to be overridden by main class.\n * @hidden\n */\n public getMain(): Main {\n return undefined;\n }\n\n public update() {\n this.updateSize();\n if (this._glbInstance) {\n this._glbInstance.getApi().updateSize();\n }\n if (this._hscInstance) {\n this._hscInstance.getApi().updateSize();\n }\n }\n\n get callbacks(): RoomlePlannerUiCallback {\n return this._roomlePlannerUiCallback;\n }\n\n set callbacks(callback: RoomlePlannerUiCallback) {\n this._roomlePlannerUiCallback = callback;\n }\n\n /**\n * Check if the 3D scene contains only one room\n * @returns {boolean} True if there is only one room, false otherwise\n */\n get hasSingleRoom(): boolean {\n return this._sceneManager.hasSingleRoom;\n }\n\n public showStats() {\n this._sceneManager.showStats();\n }\n\n public onCloseHSC() {\n if (this._hscInstance) {\n this._hscInstance.getApi().pauseKernelCallbacks();\n }\n }\n\n public back() {\n if (this._currentMode === MODE.GLB && this._glbInstance) {\n const roomleGLBViewer = this._glbInstance.getApi();\n roomleGLBViewer.clearScene();\n }\n if (this._currentMode === MODE.CONFIGURATOR && this._hscInstance) {\n const roomleConfigurator = this._hscInstance.getApi();\n roomleConfigurator.cancelSelection({\n reason: 'isolation_mode_cancelled',\n });\n roomleConfigurator.cancelDockings();\n roomleConfigurator.hideDimensions();\n roomleConfigurator.disableMultiselect();\n this._sceneManager.updateScene();\n }\n this._currentMode = MODE.PLANNER;\n }\n\n public backTo(_cssClass: string) {\n console.error('backTo in planner Needs to be implemented later');\n }\n\n public getConfigurator(): Configurator {\n return this._hscInstance;\n }\n\n public getCurrentSkin() {\n return this._rapiAccess.getCurrentSkin();\n }\n\n /**\n * Returns the runtime component id of the plan object with the given id\n * @param planObjectId id of the plan object you want to get the runtime component id of the root component from\n * @returns number the number of the runtime id of the root component\n */\n public getRuntimeComponentIdOfRootComponent(planObjectId: number): number {\n // Maybe we refactor this to a own class in future\n // abstract class then must have a getConfiguratorKernelMethod and getRuntimeComponentIdOfRootComponent\n // further more we need to think how to deal with planObjectId vs no planObjectId (see roomle-configurator vs roomle-planner)\n if (!planObjectId) {\n console.warn('Can not retrieve runtime id without planObjectId');\n return 0; // Kernel returns 0 if something is invalid, to be same as kernel also return 0 here\n }\n if (!this._plannerKernelAccess.planInteractionHandler) {\n console.warn(\n 'Can not retrieve runtime id without planInteractionHandler',\n );\n return 0; // Kernel returns 0 if something is invalid, to be same as kernel also return 0 here\n }\n return this._plannerKernelAccess.planInteractionHandler\n .getConfiguratorKernel()\n .getRootPlanComponentIdFromObjectId(planObjectId);\n }\n\n /**\n * This method is used for lifecycle tests only\n * @hidden\n */\n public resumeTest(element: HTMLElement) {\n this._domHelper.setDomElement(element);\n this._lifeCycleManager.resume();\n }\n\n /**\n * This method is used for lifecycle tests only\n * @hidden\n */\n public pauseTest() {\n this._lifeCycleManager.pause();\n }\n\n public syncCatalog(catalogId: string): Promise<void> {\n return this._dataSyncer.syncCatalog(catalogId);\n }\n\n public loadError(error?: any): void {\n console.log(error);\n }\n\n public getPlanInteractionHandler(): Promise<PlanInteractionHandler> {\n return Promise.resolve(this._planInteractionHandler);\n }\n\n public getPlanModelViewHelper(): Promise<PlanModelViewHelper> {\n return Promise.resolve(this._plannerKernelAccess.planModelViewHelper);\n }\n\n /**\n * Inserts the object into the scene (at a given position and rotation)\n * @param id\n * @param position x (left/right),y (up, down) and z(front, back) in meters\n * @param rotation in radians\n */\n public async insertObject(\n id: RapiId | ExtObjId,\n position?: Position3,\n rotation?: number,\n ): Promise<RuntimeId> {\n if (!this._planInteractionHandler) {\n throw new Error('no plan interaction handler');\n }\n if (position) {\n position = convertToKernel(\n new Vector3(position.x, position.y, position.z),\n );\n }\n if (isExtObjId(id)) {\n return this._insertExternalObject(id, {\n findFreeSpaceInPlan: !position,\n position,\n rotation,\n });\n }\n const rapiItem = await (isIdItemId(id)\n ? this._rapiAccess.getItem(id)\n : this._rapiAccess.getConfiguration(id));\n const object = await this._plannerKernelAccess.addPlanObjectFromItem(\n rapiItem,\n position,\n rotation,\n );\n this._sceneManager.updateScene();\n return object;\n }\n\n public async insertItemList(\n ids: Array<RapiId | ExtObjId>,\n ): Promise<RuntimeId[]> {\n if (ids.length === 0) {\n return [];\n }\n\n const idInfos: InsertItemIdInfo[] = ids.map((id, index) => {\n return {\n id,\n index,\n };\n });\n\n const insertExternalObject = async (\n id: ExtObjId,\n originalIndex: number,\n ): Promise<InsertItemResult> => {\n return { runtimeId: await this._insertExternalObject(id), originalIndex };\n };\n\n const externalObjectsPromise: Array<Promise<InsertItemResult>> = [];\n const rapiIds: InsertItemIdInfo[] = [];\n for (const { index, id } of idInfos) {\n if (isExtObjId(id)) {\n externalObjectsPromise.push(insertExternalObject(id, index));\n } else {\n rapiIds.push({ index, id });\n }\n }\n const rapiObjectsPromise = this._sceneManager.insertRapiObjects(rapiIds);\n const [externalObjects, rapiObjects] = await Promise.all([\n Promise.all(externalObjectsPromise),\n rapiObjectsPromise,\n ]);\n const results: InsertItemResult[] = [...externalObjects, ...rapiObjects];\n results.sort((a, b) => a.originalIndex - b.originalIndex);\n return results.map((result) => result.runtimeId);\n }\n\n /**\n * Inserts all of the items in the array into current plan\n * @param itemList Array of items received from the Roomle API\n */\n public async insertItems(\n itemList: Array<RapiItem | RapiConfiguration | ExtObjId | ExternalObject>,\n ): Promise<RuntimeId[]> {\n if (itemList.length === 0) {\n return [];\n }\n const ids = itemList.map((item) =>\n typeof item === 'string' ? item : item.id,\n );\n return this.insertItemList(ids);\n }\n\n /**\n * Duplicates all planObjects in the array and inserts them into the current plan\n * @param itemList Array of PlanObjects\n */\n public duplicateItems(itemList: PlanObject[]): PlanObject[] {\n return this._plannerKernelAccess.duplicateItems(itemList);\n }\n\n public getScene(): Scene {\n return this._sceneManager.getScene();\n }\n\n public updateScene(): void {\n this._sceneManager?.updateScene();\n }\n\n public getCameraOffset(): CanvasOffset {\n return this._sceneManager.getCameraOffset();\n }\n\n public setCameraOffset(offset: CanvasOffset): void {\n this._sceneManager.setCameraOffset(offset);\n }\n\n /**\n * returns all objects found in the current plan\n * this includes info about size, rotation, id and parts\n */\n public async getObjects(): Promise<UiPlanObject[]> {\n const planOverview = (await this.getPlanModelViewHelper()).getPlanOverview(\n this._plan,\n );\n const planObjects = convertCObject(planOverview.objects);\n return mapToUiPlanObjects(\n planObjects,\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n\n /**\n * get all info available for the current plan, including objects, rooms and walls\n */\n public async getPlanOverview(): Promise<PlanOverview> {\n const planOverview = (await this.getPlanModelViewHelper()).getPlanOverview(\n this._plan,\n );\n return convertCObject(planOverview);\n }\n\n /**\n * Generates a top image (birds eye view) and returns it as base64\n * @param options\n */\n public prepareTopImage(options: PrepareImageOptions = {}) {\n return this._sceneManager.prepareTopImage(options);\n }\n\n /**\n * Generates a perspective image (slightly from the side) and returns it as base64\n * @param options\n @param isolationMode - defaults to false. Determines whether to generate a perspective image for the current configuration.\n */\n public preparePerspectiveImage(\n options: PrepareImageOptions = {},\n isolationMode = false,\n ) {\n return this._sceneManager.preparePerspectiveImage(options, isolationMode);\n }\n\n /**\n * Enables rotation of selected elements\n */\n public enableRotation() {\n this._sceneManager.enableRotation();\n }\n\n /**\n * Disable rotation of selected elements\n */\n public disableRotation() {\n this._sceneManager.disableRotation();\n }\n\n /**\n * Enable the selection of multiple elements.\n * Common parameters shared between those elements can then be changed at once\n */\n\n public enableMultiselect() {\n this._sceneManager\n .getPlannerSceneEventHandler()\n .setSelectionMode(SELECTION_MODE.MULTISELECT);\n this._configuratorContext.selectionMode = SELECTION_MODE.MULTISELECT;\n }\n\n /**\n * Disable the selection of multiple elements.\n */\n public disableMultiselect() {\n this._sceneManager\n .getPlannerSceneEventHandler()\n .setSelectionMode(SELECTION_MODE.STANDARD);\n // since we set it in enableMultiselect we need to reset it here\n // there is also an ongoing discussion why we set configuratorContext\n // here in the planner for more details see:\n // https://roomle.slack.com/archives/GQD67DDC5/p1700748062512249\n this._configuratorContext.selectionMode = SELECTION_MODE.STANDARD;\n }\n\n private async _insertExternalObject(\n idOrConfig: ExtObjId | ExternalGroupData | ExternalObject,\n options: {\n findFreeSpaceInPlan?: boolean;\n dragIn?: boolean;\n position?: Position3;\n rotation?: number;\n } = {}\n ): Promise<number> {\n let config = idOrConfig;\n\n if (isExtObjId(idOrConfig)) {\n config = await this.newPosDataFromId(idOrConfig);\n if (!config) {\n throw new Error(EXT_OBJ_EXCEPTION);\n }\n }\n if (isExternalObject(idOrConfig) && idOrConfig.externalMeta?.refresh) {\n config =\n await this._roomlePlannerUiCallback.onGetConfigurationForExternalObject(\n idOrConfig.id,\n );\n if (!config) {\n throw new Error(EXT_OBJ_EXCEPTION);\n }\n }\n const findFreeSpaceInPlan = options.findFreeSpaceInPlan ?? true;\n const dragIn = options.dragIn ?? false;\n await this._loadExternalObjectGroup(\n config,\n findFreeSpaceInPlan,\n dragIn,\n false,\n [],\n options.position,\n options.rotation\n );\n return -1;\n }\n\n public async dragInObject(\n idOrSerializedConfigString: string,\n dragEvent: DragEvent,\n type: ID_TYPE = 'rml_id',\n ): Promise<RuntimeId> {\n if (type === 'rml_serialized') {\n throw new Error(\n 'dragInObject is not supported for tc_id or rml_serialized',\n );\n }\n this._sceneManager.dragIn(dragEvent);\n if (type === 'rml_id') {\n const object = isIdItemId(idOrSerializedConfigString)\n ? await this._rapiAccess.getItem(idOrSerializedConfigString)\n : await this._rapiAccess.getConfiguration(idOrSerializedConfigString);\n const objects = await this.insertItems([object]);\n await this._sceneManager.selectPlanObject(objects[0]);\n if (objects.length !== 1) {\n throw new Error('More than one object added, abort');\n }\n return objects[0];\n } else if (type === 'tc_id' || type === 'tc_serialized') {\n return this._insertExternalObject(idOrSerializedConfigString, {\n dragIn: true,\n });\n } else {\n throw new Error('dragInObject is not supported for ' + type);\n }\n }\n\n /**\n * Will remove an element that was dragged into the scene while still dragging it.\n * This is mainly used in the context of pressing ESC while dragging or dragging the element away from the scene again.\n */\n public cancelDragIn() {\n this._sceneManager.cancelDragIn();\n }\n\n /**\n * enable snapping of object to object and object to wall\n */\n public enableSnapping() {\n this._sceneManager.enableSnapping();\n }\n\n /**\n * disable all types of snapping\n */\n public disableSnapping() {\n this._sceneManager.disableSnapping();\n }\n\n /**\n * enable docking of objects that fit together when objects are snapped in the plan\n */\n public enableAdvancedDocking() {\n this._sceneManager.enableAdvancedDocking();\n }\n\n /**\n * disable docking of objects that fit together when objects are snapped in the plan\n */\n public disableAdvancedDocking() {\n this._sceneManager.disableAdvancedDocking();\n }\n\n /**\n * returns true if interaction with the child components of a configuration object is enabled, and flashes otherwise\n */\n public showsChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ): boolean {\n return this._sceneManager.showsChildrenOfPlanObject(planElementViewModel);\n }\n\n /**\n * enable interaction with child components of configurable objects in the plan\n */\n public enableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n this._sceneManager.enableShowChildrenOfPlanObject(planElementViewModel);\n }\n\n /**\n * disable interaction with child components of configurable objects in the plan\n */\n public disableShowChildrenOfPlanObject(\n planElementViewModel: PlanElementViewModel,\n ) {\n this._sceneManager.disableShowChildrenOfPlanObject(planElementViewModel);\n }\n\n /**\n * get the Partlist of certain runtimeID\n * can be used if partlist of a selected Item is needed\n * @param id runtimeID of a configurable item\n * @returns kernelPartlist with processed price, currency and RAL colors\n */\n public async getPartlistOf(id: number): Promise<KernelPartList | null> {\n const configurationHash =\n this._plannerKernelAccess.kernelInstance.getHashOfConfiguration(id);\n if (!configurationHash) {\n const warning =\n 'Object has no partlist because it is not a configuration: ' +\n configurationHash;\n console.warn(warning);\n return Promise.reject(warning);\n }\n const element = this._plannerKernelAccess.kernelInstance.getPartList(id);\n const enhancedPartList =\n await this._plannerKernelAccess.addUiDataAndPriceToPartList(\n element,\n configurationHash,\n );\n return enhancedPartList;\n }\n\n /**\n * Returns the formatted value based on the parameter.unitType\n *\n * @param value\n * @param parameter\n */\n public formatValueToUnitString(value: number, parameter: KernelParameter) {\n return this._unitFormatter.formatValueToUnitString(value, parameter);\n }\n\n /**\n * Draws walls according to the wall definitions\n * this can be used to create a room on the fly\n */\n public drawWalls(\n wallDefinitions: WallDefinition[],\n interactionOptions: InteractionOptions = {},\n ): KernelWall[] {\n const planInteractionHandler = this._planInteractionHandler;\n planInteractionHandler.startInteraction();\n const createdWalls = [];\n for (const wallDefinition of wallDefinitions) {\n const nodeFrom = planInteractionHandler.addNode(wallDefinition.from);\n const nodeTo = planInteractionHandler.addNode(wallDefinition.to);\n const wall = planInteractionHandler.addWall(nodeFrom, nodeTo);\n if (wallDefinition.props?.height !== undefined) {\n planInteractionHandler.setWallHeight(wall, wallDefinition.props.height);\n }\n if (wallDefinition.props?.thickness !== undefined) {\n planInteractionHandler.setWallThickness(\n wall,\n wallDefinition.props.thickness,\n );\n }\n createdWalls.push(wall);\n }\n if (!interactionOptions.keepInteractionOpen) {\n planInteractionHandler.endInteraction();\n }\n this._sceneManager.updateCameraOnDrawWalls();\n this._sceneManager.updateScene();\n return createdWalls;\n }\n\n public async removeElements(\n kernelPlanElements: KernelObject[],\n interactionOptions: InteractionOptions = {},\n ) {\n this._sceneManager.lockCamera();\n const planInteractionHandler = this._planInteractionHandler;\n for (const element of kernelPlanElements) {\n const planObject = this._sceneManager.getPlanObject(element.getId());\n let planObjects: UiPlanObject[];\n if (planObject) {\n planObjects = await mapToUiPlanObjects(\n [planObject],\n this._plannerKernelAccess,\n this._rapiAccess,\n );\n }\n this._roomlePlannerUiCallback.onPlanElementChanged(\n PLAN_ELEMENT_CHANGE_TYPES.REMOVED,\n planObjects?.length\n ? planObjects[0]\n : { ...planObject, ...{ data: null } },\n );\n this._planInteractionHandler.removeElement(element);\n }\n if (!interactionOptions.keepInteractionOpen) {\n planInteractionHandler.endInteraction();\n }\n this._sceneManager.unlockCamera();\n }\n\n public hasWalls(): boolean {\n const planInteractionHandler = this._planInteractionHandler;\n const plan = planInteractionHandler?.getPlan();\n if (!plan) {\n return false;\n }\n if (plan.getWallCount() < 1) {\n return false;\n }\n return true;\n }\n\n public enableWallDrawing() {\n this._sceneManager.enableWallDrawing();\n }\n\n public disableWallDrawing() {\n this._sceneManager.disableWallDrawing();\n }\n\n /**\n * returns unit formatter for formatting input und output values in scene\n */\n public getUnitFormatter(): UnitFormatter {\n return this._unitFormatter;\n }\n\n /**\n * returns manager class to interface with indexedDB storage\n */\n public getStorage(): IdbManager {\n return this._idbManager;\n }\n\n /**\n * returns class containing configurator specific data properties\n */\n public getConfiguratorContext(): ConfiguratorContext {\n return this._configuratorContext;\n }\n\n /**\n * @returns an object which has all type constants from Roomle Core (C/C++)\n */\n public get PlannerCoreTypes(): PlannerKernelContainer {\n return this._plannerKernelAccess.kernelContainer;\n }\n\n /**\n * set which events are enabled in the scene, for example disable selection of walls and wall nodes\n * @param sceneEvents\n */\n public setSceneEvents(sceneEvents: SceneEvents) {\n this._sceneManager.setSceneEvents(sceneEvents);\n }\n\n /**\n * Saves a snapshot of the external objects in the plan without walls and other objects\n * Also contains the urls to the glb and usdz files\n * @param parentPlanId id of the current plan, optional\n * @returns the snapshot of the external objects if there are no external objects it returns null\n */\n public async saveExternalObjectSnapshot(\n parentPlanId?: RapiId,\n ): Promise<Nullable<RapiPlanSnapshotGetDataWith3dUrls>> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const externalObjects = convertCObject(\n planModelViewHelper.getExternalObjectGroups(plan),\n ) as KernelObjectConfiguration[];\n if (externalObjects.length === 0) {\n return null;\n }\n const planSnapshot = await this._savePlanSnapshotExternalObjects(\n parentPlanId,\n externalObjects,\n );\n\n return {\n ...planSnapshot,\n glb: `https://api.roomle.com/v2/planSnapshots/${planSnapshot.id}/3dAssets/glTF/plan.glb`,\n usdz: `https://api.roomle.com/v2/planSnapshots/${planSnapshot.id}/3dAssets/usdz/plan.usdz`,\n };\n }\n\n private async _savePlanSnapshotExternalObjects(\n parentPlanId: RapiId,\n externalObjects: KernelObjectConfiguration[],\n ) {\n const externalObjectUniqueIds = externalObjects.map(\n (externalObject) => externalObject.uniqueId,\n );\n const externalObjectRuntimeIds = externalObjects.map(\n (externalObject) => externalObject.runtimeId,\n );\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planOverview = planModelViewHelper.getPlanOverview(plan);\n const planXML = plan.createPlanXmlWithObjects(\n externalObjectUniqueIds,\n false /** includeRuntimeId */,\n 2 /** XML version */,\n );\n const snapshot: RapiPlanSnapshotPostData = {\n parentId: parentPlanId || null,\n planObjects: [],\n combinedIds: [],\n plan: planXML,\n };\n const objects = planOverview.objects;\n const objectsSize = objects.size();\n for (let i = 0; i < objectsSize; i++) {\n const object = objects.get(i);\n const id = object.configurationHash || object.catalogItemId;\n if (externalObjectRuntimeIds.includes(object.runtimeId)) {\n const { center, dimensions, rotation, rootComponentCenter } = object;\n const locationString = JSON.stringify({\n center,\n dimensions,\n rotation,\n // for static items rootComponentCenter is equal to center\n rootComponentCenter,\n });\n snapshot.planObjects.push({\n combinedId: id,\n position: locationString,\n });\n }\n }\n const planSnapshot = await this._rapiAccess.savePlanSnapshot(snapshot);\n this._plannerKernelAccess.planSnapshotCreated(planSnapshot);\n const result = new Promise<RapiPlanSnapshotGetData>((resolve, reject) => {\n Promise.allSettled([\n this.preparePerspectiveImage({ runtimeIds: externalObjectRuntimeIds }),\n this.prepareTopImage({ runtimeIds: externalObjectRuntimeIds }),\n ]).then(async ([perspectiveImage, topImage]) => {\n if (\n perspectiveImage.status === 'rejected' ||\n topImage.status === 'rejected'\n ) {\n reject('Could not generate images of plan snapshot');\n return;\n }\n try {\n const responsePlanSnapshotResult =\n await this._rapiAccess.savePlanSnapshotImage(\n planSnapshot,\n perspectiveImage.value,\n 'perspectiveImage',\n topImage.value,\n 'topImage',\n );\n resolve({ ...responsePlanSnapshotResult });\n } catch (e) {\n reject(e);\n }\n });\n });\n try {\n return await result;\n } catch (e) {\n console.error(e);\n return planSnapshot;\n }\n }\n\n public async saveCurrentPlanSnapshot(\n parentPlanId?: RapiId,\n configurationHashOrGroupId?: string | string[],\n ): Promise<RapiPlanSnapshotGetData> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planOverview = planModelViewHelper.getPlanOverview(plan);\n const planXML = configurationHashOrGroupId\n ? plan.createPlanXmlWithObjects(\n configurationHashOrGroupId,\n false /** includeRuntimeId */,\n 2 /** XML version */,\n )\n : plan.getPlanXML(false, 2);\n const snapshot: RapiPlanSnapshotPostData = {\n parentId: parentPlanId || null,\n planObjects: [],\n combinedIds: [],\n plan: planXML,\n };\n const objects = planOverview.objects;\n const objectsSize = objects.size();\n for (let i = 0; i < objectsSize; i++) {\n const object = objects.get(i);\n const id = object.configurationHash || object.catalogItemId;\n if (!configurationHashOrGroupId || id === configurationHashOrGroupId) {\n const { center, dimensions, rotation, rootComponentCenter } = object;\n const locationString = JSON.stringify({\n center,\n dimensions,\n rotation,\n // for static items rootComponentCenter is equal to center\n rootComponentCenter,\n });\n snapshot.planObjects.push({\n combinedId: id,\n position: locationString,\n });\n }\n }\n const planSnapshot = await this._rapiAccess.savePlanSnapshot(snapshot);\n this._plannerKernelAccess.planSnapshotCreated(planSnapshot);\n const result = new Promise<RapiPlanSnapshotGetData>((resolve, reject) => {\n Promise.allSettled([\n this.preparePerspectiveImage(),\n this.prepareTopImage(),\n ]).then(async ([perspectiveImage, topImage]) => {\n if (\n perspectiveImage.status === 'rejected' ||\n topImage.status === 'rejected'\n ) {\n reject('Could not generate images of plan snapshot');\n return;\n }\n try {\n const responsePlanSnapshotResult =\n await this._rapiAccess.savePlanSnapshotImage(\n planSnapshot,\n perspectiveImage.value,\n 'perspectiveImage',\n topImage.value,\n 'topImage',\n );\n resolve({ ...responsePlanSnapshotResult });\n } catch (e) {\n reject(e);\n }\n });\n });\n try {\n return await result;\n } catch (e) {\n console.error(e);\n return planSnapshot;\n }\n }\n\n public getPlanXmlFrom(plan: RapiPlan | RapiPlanSnapshotGetData) {\n if (!plan) {\n return null;\n }\n return isPlanSnapshotId(plan.id as string) ? plan.plan : plan.planObjects;\n }\n\n public async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n return this._sceneManager.moveCamera(cameraParameter);\n }\n\n public async createNewSerializedConfiguration(\n configurationRuntimeId: number,\n ): Promise<ConfigurationString> {\n return Promise.resolve(\n this._plannerKernelAccess.createNewSerializedConfiguration(\n configurationRuntimeId,\n ),\n );\n }\n\n public changeInteriorWallsMaterial(material: BatchPaintMaterial) {\n this._sceneManager.changeInteriorWallsMaterial(material);\n }\n\n public changeExteriorWallsMaterial(material: BatchPaintMaterial) {\n this._sceneManager.changeExteriorWallsMaterial(material);\n }\n\n public changeFloorsMaterial(material: BatchPaintMaterial) {\n this._sceneManager.changeFloorsMaterial(material);\n }\n\n /**\n * Returns the wall angle in degrees relative to the camera\n * @param wall a WallPlanElementViewModel instance\n */\n public getWallAngleDegrees(wall: WallPlanElementViewModel): number {\n return this._sceneManager.getWallAngleDegrees(wall);\n }\n\n public calcPartsPriceSum(\n partList: KernelPartList,\n ): Promise<KernelPartListPrice> {\n return this._plannerKernelAccess.calcPartsPriceSum(partList);\n }\n\n /**\n * Swap two plan objects in the scene in the same position for example swap two object variants\n * @param old this is the current selected plan object (runtime ID number or PlanElementViewModel)\n * @param idOfNew the RAPI id of the new plan object\n * @returns runtime ID of the new object\n */\n public async swapObject(\n old: number | PlanElementViewModel,\n idOfNew: RapiId,\n ): Promise<number> {\n let planElementViewModel: PlanElementViewModel;\n\n if (typeof old === 'number') {\n planElementViewModel = await this.getPlanObjectForRuntimeId(old);\n } else {\n planElementViewModel = old;\n }\n\n const pos = planElementViewModel.getPosition();\n const rot = planElementViewModel.getRotation();\n\n await this._sceneManager.deletePlanElementByIds([\n planElementViewModel.getPlanElement().getId(),\n ]);\n\n this.cancelSelection('swap_object');\n\n return await this.insertObject(idOfNew, pos, rot);\n }\n\n public exportImageFromCamera(\n filename: string = 'image',\n shouldWaitForAssets: boolean = false,\n ) {\n this._sceneManager.clearHighlighting();\n\n return this._sceneManager.exportImageFromCamera(\n filename,\n shouldWaitForAssets,\n );\n }\n\n public exportCanvasScreenshot(quality?: number): Promise<string> {\n return this._sceneManager.exportCanvasScreenshot(quality);\n }\n\n /**\n * Move the current selected element in the 3D space\n * @param selectedElement this is the current selected plan object\n * @param position new KernelVector3 position of the current selected element\n * returns runtime ID of the new object\n */\n public moveElementPosition(\n selectedElement: PlanElementViewModel,\n position: KernelVector3,\n ) {\n this._sceneManager.moveElementPosition(selectedElement, position);\n }\n\n /**\n * Moves the current multi-selected elements in the 3D space\n * @param selectedElements this is the current selected plan object\n * @param position new KernelVector3 position of the current selected element\n * returns runtime ID of the new object\n */\n public moveElementsPosition(\n selectedElements: PlanElementViewModel[],\n position: KernelVector3,\n ) {\n this._sceneManager.moveElementsPosition(selectedElements, position);\n }\n\n /**\n * Generates a perspective image (slightly from the side) of a plan element by a\n * given runtime-id and returns it as base64\n * @param runtimeId runtime-id of the plan element, e.g.: a selected element\n * @param options PrepareImageOptions\n */\n public preparePerspectiveImageOf(\n runtimeId: RuntimeId,\n options: PrepareImageOptions = {},\n ) {\n return this._sceneManager.preparePerspectiveImageOf(runtimeId, options);\n }\n\n public async generateTCExport(planObjectIds: string[] = []): Promise<any> {\n try {\n const stringArray =\n new this._plannerKernelAccess.kernelContainer.StringArray();\n for (const id of planObjectIds) {\n stringArray.push(id);\n }\n return Promise.resolve(\n JSON.parse(\n (this._planInteractionHandler as any).generateTCExport(stringArray),\n ),\n );\n } catch (e) {\n console.error(e);\n return Promise.reject('Could not create Blue Ocean MVP JSON');\n }\n }\n\n public enableMeasurementLineDrawing() {\n this._sceneManager.enableMeasurementLineDrawing();\n }\n\n public disableMeasurementLineDrawing() {\n this._sceneManager.disableMeasurementLineDrawing();\n }\n\n public setObjectToWallMeasurementLength(\n planElementId: number,\n measurementId: number,\n length: number,\n ) {\n this._sceneManager.setObjectToWallMeasurementLength(\n planElementId,\n measurementId,\n length,\n );\n }\n\n public setWallMeasurementLength(\n measurementId: number,\n length: number,\n wallDirection: EMSConstant,\n ) {\n this._sceneManager.setWallMeasurementLength(\n measurementId,\n length,\n wallDirection,\n );\n }\n\n public setMeasurementLineLength(\n measurementId: number,\n length: number,\n wallDirection: string,\n ) {\n this._sceneManager.setMeasurementLineLength(\n measurementId,\n length,\n wallDirection,\n );\n }\n\n public escapeDrawing(cancelDrawing: boolean) {\n this._sceneManager.escapeDrawing(cancelDrawing);\n this._roomlePlannerUiCallback.onDrawCancel();\n }\n\n public isCurrentlyDrawing(): boolean {\n return this._sceneManager.getPlannerSceneEventHandler().isCurrentlyDrawing;\n }\n\n /**\n * Resolves a shortened URL.\n *\n * @param {string} shortUrl - The shortened URL to resolve.\n * @returns {Promise<string>} - A promise that resolves to the URL.\n */\n public async resolveShortUrl(shortUrl: string): Promise<string> {\n const [, , , id] = shortUrl.split('/');\n const response = await this._rapiAccess.resolveShortUrl(id);\n if (!response) {\n throw new Error('Failed to resolve short URL');\n }\n const { url } = response;\n return url;\n }\n\n public enableEvents() {\n this._sceneManager.enableEvents();\n }\n\n public disableEvents() {\n this._sceneManager.disableEvents();\n }\n\n public async downloadHomagIxExportPoC(): Promise<any> {\n const { downloadHomagIxExportPoC } = await import(\n '../../configurator-core/src/utils/imos-ix-poc-export-helper'\n );\n const planOverview = (await this.getPlanModelViewHelper()).getPlanOverview(\n this._plan,\n );\n return downloadHomagIxExportPoC(\n planOverview,\n this._plannerKernelAccess.configurationExporter,\n this._plannerKernelAccess.kernelInstance,\n );\n }\n\n public async configureExternalObjectApi(\n configurationJson: string | ExternalObjectApiConfiguration,\n ): Promise<void> {\n const properties =\n typeof configurationJson === 'string'\n ? JSON.parse(configurationJson)\n : configurationJson;\n await this._plannerKernelAccess.configureExternalObjectApi(properties);\n }\n\n public loadExternalObjectLibrary(libraryJson: string | object): void {\n const configuratorKernel =\n this._planInteractionHandler.getConfiguratorKernel();\n const serializedJson =\n typeof libraryJson === 'string'\n ? libraryJson\n : JSON.stringify(libraryJson);\n configuratorKernel.loadExternalAttributeDefinition(serializedJson);\n this.updateScene();\n }\n\n public async loadExternalObjectGroup(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n verifyArrangement: boolean = false,\n mergedGroups: string[] = [],\n ): Promise<void> {\n return this._loadExternalObjectGroup(\n groupData,\n findFreeSpaceInPlan,\n false,\n verifyArrangement,\n mergedGroups,\n );\n }\n\n private async _loadExternalObjectGroup(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[] = [],\n position?: Position3,\n rotation?: number\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n if (configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n await this._loadExternalObjectGroupInConfigurator(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n );\n } else {\n await this._loadExternalObjectGroupInPlanner(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n position,\n rotation\n );\n }\n }\n\n private async _loadExternalObjectGroupInConfigurator(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[] = [],\n ): Promise<void> {\n await this._loadOrUpdateExternalObjectGroup(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n true,\n );\n this.updateScene();\n }\n\n private async _loadExternalObjectGroupInPlanner(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[] = [],\n position?: Position3,\n rotation?: number\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const selectedPlanObject = this._sceneManager.getPlanObject(\n configuratorContext.planElementId,\n );\n await this._loadOrUpdateExternalObjectGroup(\n groupData,\n findFreeSpaceInPlan,\n dragIn,\n correctArrangement,\n mergedGroups,\n false,\n position,\n rotation\n );\n if (\n selectedPlanObject.configurationType?.value ===\n CONFIGURATION_TYPE.EXTERNAL\n ) {\n if (mergedGroups.includes(selectedPlanObject.configurationHash)) {\n const serializedGroups =\n this._createSerializedGroupCollection(groupData);\n const firstGroupId = JSON.parse(serializedGroups[0]).id;\n await this._selectExternalObjectGroup(firstGroupId, false);\n } else {\n await this._selectExternalObjectGroup(\n selectedPlanObject.configurationHash,\n false,\n );\n }\n }\n this.updateScene();\n }\n\n private async _loadOrUpdateExternalObjectGroup(\n groupData: ExternalGroupData,\n findFreeSpaceInPlan: boolean,\n dragIn: boolean,\n correctArrangement: boolean,\n mergedGroups: string[],\n inConfigurator: boolean,\n position?: Position3,\n rotation?: number\n ): Promise<void> {\n const serializedGroups = this._createSerializedGroupCollection(groupData);\n if (dragIn) {\n this._planInteractionHandler.startInteraction();\n } else {\n this._planInteractionHandler.resumeInteraction();\n }\n const objectPosition = position ?? { x: 0, y: 0, z: 0 };\n const objectRotation =\n rotation ??\n (dragIn && !inConfigurator ? this._getFaceTheCameraAngle(90) : 0);\n const updateConfiguration = {\n findFreeSpaceInPlan,\n applyGlobalChildMode: false,\n isVisible: !dragIn,\n correctArrangement,\n respondWithPositionInPlan: false,\n };\n const planObjects =\n this._planInteractionHandler.addOrUpdateExternalPlanObjects(\n serializedGroups,\n objectPosition,\n objectRotation,\n updateConfiguration,\n mergedGroups,\n );\n if (!dragIn) {\n this._planInteractionHandler.endInteraction();\n }\n const planViewModel: PlanViewModel =\n this._planInteractionHandler.getPlan().extRef.jsObject;\n const newObjects: ConfiguratorPlanObjectViewModel[] = [];\n for (const planObject of planObjects) {\n if (planObject.hasConfiguration()) {\n newObjects.push(\n planViewModel.getConfigurablePlanObjectForId(planObject.getId()),\n );\n }\n }\n await Promise.all(\n newObjects.map(async (object): Promise<void> => {\n await object.isInitDone();\n }),\n );\n }\n\n private _createSerializedGroupCollection(\n groupData: ExternalGroupData,\n ): string[] {\n const arrayOfGroups = Array.isArray(groupData) ? groupData : [groupData];\n const posDataCollection: string[] = [];\n for (const groupPosData of arrayOfGroups) {\n const serializedJson =\n typeof groupPosData === 'string'\n ? groupPosData\n : JSON.stringify(groupPosData);\n posDataCollection.push(serializedJson);\n }\n return posDataCollection;\n }\n\n private _getFaceTheCameraAngle(stepInDegrees: number): number {\n const cameraParameters = this._sceneManager.getCameraParameters3d();\n if (!cameraParameters?.yaw) {\n return 0;\n }\n const cameraAngleInDegrees = toDegrees(cameraParameters.yaw);\n const faceToAngleInDegrees =\n Math.round(cameraAngleInDegrees / stepInDegrees) * stepInDegrees;\n return toRadiant(faceToAngleInDegrees);\n }\n\n public async renderImagesOfExternalObjectGroup(groups: object): Promise<{\n [key: string]: string;\n }> {\n const jsonObjects = Array.isArray(groups) ? groups : [groups];\n const generatedImages: {\n [key: string]: string;\n } = {};\n const animateCamera = this._initData.animateCamera;\n this._initData.animateCamera = false;\n for (const objectGroup of jsonObjects) {\n try {\n await this._loadExternalObjectGroup(objectGroup, false, false, false);\n await this._selectExternalObjectModule(\n objectGroup.id,\n null,\n true,\n true,\n false,\n false,\n );\n this.preparePerspectiveImage();\n await this._sceneManager.waitForMaterialQueue();\n this.updateScene();\n const canvasScreenshot = await this.exportCanvasScreenshot();\n generatedImages[objectGroup.id] = canvasScreenshot;\n } catch (e) {\n console.error(e);\n }\n this.backToPlanner();\n }\n for (const objectGroup of jsonObjects) {\n await this.removeExternalObjectGroup(objectGroup.id, false);\n }\n this._initData.animateCamera = animateCamera;\n return generatedImages;\n }\n\n public async removeExternalObjectGroup(\n groupId: string,\n wasMerged: boolean = false,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n groupId,\n '',\n );\n const configuratorContext = this.getConfiguratorContext();\n if (configuratorContext.planElementId === planObjectComponent.runtimeId) {\n this._sceneManager.cancelPlanElementSelection('delete_object');\n }\n if (planObjectComponent.runtimeId !== 0) {\n if (wasMerged) {\n this._planInteractionHandler.resumeInteraction();\n this._planInteractionHandler.removeObjectWithId(groupId);\n this._planInteractionHandler.endInteraction();\n } else {\n this._planInteractionHandler.startInteraction();\n this._sceneManager.deletePlanElementByIds([\n planObjectComponent.runtimeId,\n ]);\n this._planInteractionHandler.endInteraction();\n }\n }\n this.updateScene();\n }\n\n public removeExternalObjectRootModule(rootModuleId: string): void {\n this._planInteractionHandler.startInteraction();\n this._planInteractionHandler.removeObjectWithId(rootModuleId);\n this._planInteractionHandler.endInteraction();\n this.updateScene();\n }\n\n public async selectExternalObjectGroup(groupId: string): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const isConfiguratorContext =\n configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR;\n if (!isConfiguratorContext) {\n this._planInteractionHandler.setShowChildrenOfExternalObject(\n groupId,\n {\n value: CORE_CHILD_ENTITY_MODE.OFF,\n },\n false,\n );\n }\n await this._selectExternalObjectGroup(groupId, true);\n this.updateScene();\n }\n\n public async selectExternalObjectRootModule(\n rootModuleId: string,\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const isConfiguratorContext =\n configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR;\n if (!isConfiguratorContext) {\n this._planInteractionHandler.setShowChildrenOfExternalObject(\n rootModuleId,\n {\n value: CORE_CHILD_ENTITY_MODE.GROUND_COMPONENTS,\n },\n false,\n );\n }\n await this._selectExternalObjectModule(\n rootModuleId,\n null,\n !isConfiguratorContext,\n isConfiguratorContext,\n true,\n true,\n );\n this.updateScene();\n }\n\n public async selectExternalObjectSubModule(\n rootModuleId: string,\n subModuleId: string,\n ): Promise<void> {\n const configuratorContext = this.getConfiguratorContext();\n const selectPlanObject =\n configuratorContext.baseContext !== BASE_CONTEXT.CONFIGURATOR;\n await this._selectExternalObjectModule(\n rootModuleId,\n subModuleId,\n selectPlanObject,\n true,\n true,\n true,\n );\n this.updateScene();\n }\n\n public async openOrCloseGeometryOfExternalObject(\n groupIdOrRootModuleId: string,\n _subModuleId: string | null,\n open: boolean,\n animate: boolean,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n groupIdOrRootModuleId,\n '',\n );\n if (planObjectComponent?.configurationRuntimeId) {\n const value = open ? 'open' : 'close';\n this._sceneManager.animateElement(\n planObjectComponent.configurationRuntimeId,\n 'openClose',\n value,\n true,\n animate,\n );\n this.updateScene();\n }\n }\n\n private async _selectKernelComponent(\n selectedPlanObjectComponent: KernelPlanObjectComponent,\n ) {\n if (\n selectedPlanObjectComponent.configurationHash &&\n selectedPlanObjectComponent.configurationType.value ===\n CONFIGURATION_TYPE.EXTERNAL\n ) {\n await this._selectExternalObjectModule(\n selectedPlanObjectComponent.configurationHash,\n selectedPlanObjectComponent.componentId,\n true,\n true,\n true,\n false,\n );\n }\n this.updateScene();\n }\n\n public async _selectExternalObjectGroup(\n groupId: string,\n switchToPlanner: boolean,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n groupId,\n '',\n );\n if (planObjectComponent.runtimeId === 0) {\n return;\n }\n if (switchToPlanner) {\n await this._roomlePlannerUiCallback.onBackToPlanner();\n }\n await this._sceneManager.selectPlanObject(planObjectComponent.runtimeId);\n }\n\n public async _selectExternalObjectModule(\n rootModuleId: string,\n subModuleId: string | null,\n selectPlanObject: boolean,\n switchToConfigurator: boolean,\n selectComponent: boolean,\n highlightSelection: boolean,\n ): Promise<void> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const planObjectComponent = planModelViewHelper.getExternalObjectComponent(\n plan,\n rootModuleId,\n subModuleId ?? '',\n );\n if (planObjectComponent.runtimeId === 0) {\n return;\n }\n const isConfiguratorContext =\n this.getConfiguratorContext().baseContext === BASE_CONTEXT.CONFIGURATOR;\n const currentlySelectedPlanObjectComponent =\n this._getSelectedPlanObjectComponent();\n let configuratorObjectAlreadySelected = false;\n let invokeSelectPlanObject = selectPlanObject;\n if (isConfiguratorContext) {\n configuratorObjectAlreadySelected =\n currentlySelectedPlanObjectComponent?.configurationRuntimeId ===\n planObjectComponent.configurationRuntimeId;\n invokeSelectPlanObject = !configuratorObjectAlreadySelected;\n if (!configuratorObjectAlreadySelected) {\n this._sceneManager.backToPlanner();\n }\n }\n if (invokeSelectPlanObject) {\n await this._selectPlanObject(planObjectComponent);\n }\n if (switchToConfigurator && !configuratorObjectAlreadySelected) {\n await this._roomlePlannerUiCallback.onStartConfiguring();\n }\n if (planObjectComponent.planComponentRuntimeId !== 0 && selectComponent) {\n this._sceneManager.selectComponent(\n planObjectComponent.planComponentRuntimeId,\n false,\n );\n }\n if (highlightSelection && !isConfiguratorContext) {\n this._sceneManager.highlightExternalObject(planObjectComponent);\n }\n }\n\n private async _selectPlanObject(\n planObjectComponent: KernelPlanObjectComponent,\n ) {\n let runtimeId = planObjectComponent.runtimeId;\n const planObjects = convertCObject(this._plan.getPlanObjects());\n for (const planObject of planObjects) {\n if (\n planObject.getConfigurationRuntimeId() ===\n planObjectComponent.planComponentRuntimeId\n ) {\n runtimeId = planObject.getId();\n break;\n }\n }\n await this._sceneManager.selectPlanObject(runtimeId);\n }\n\n private _getSelectedPlanObjectComponent(): KernelPlanObjectComponent {\n const configuratorContext = this.getConfiguratorContext();\n const runtimeId =\n configuratorContext.selectedRuntimeComponentId ??\n configuratorContext.planObjectId;\n const selectedPlanObjectComponent =\n this._sceneManager.getObjectComponent(runtimeId);\n return selectedPlanObjectComponent;\n }\n\n public async getExternalObjectGroups(): Promise<object[]> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const groupDefinitions: object[] = [];\n const externalObjectGroups = convertCObject(\n planModelViewHelper.getExternalObjectGroups(plan),\n );\n for (const group of externalObjectGroups) {\n groupDefinitions.push(JSON.parse(group.serializedDefinition));\n }\n return groupDefinitions;\n }\n\n public async getExternalRoomInformation(): Promise<ExternalRoomInformation> {\n const planModelViewHelper = await this.getPlanModelViewHelper();\n const plan = this._planInteractionHandler.getPlan();\n const externalRoomInformation = convertCObject(\n planModelViewHelper.getExternalRoomInformation(plan)\n );\n return externalRoomInformation;\n }\n\n /**\n * @internal\n * Use this callbacks to hook in your functionality\n */\n public get globalCallbacks(): GlobalCallback {\n return this._globalCallback;\n }\n\n /**\n * Handles interaction with the planner kernel, ensuring start and end interaction are tracked.\n * @param action A function representing the action to perform.\n * @returns The result of the action, if any.\n */\n private _executeWithInteraction<T>(action: () => T): T {\n const planInteractionHandler =\n this._plannerKernelAccess.planInteractionHandler;\n planInteractionHandler.startInteraction();\n const result = action();\n planInteractionHandler.endInteraction();\n return result;\n }\n\n /**\n * Creates a sloping roof attic on a given wall.\n * @param wall The wall to add an attic to.\n * @param kneeHeight Height of the attic knee wall.\n * @param width Width of the sloping roof.\n * @param preferredSide The side where the attic should be added.\n * @returns The newly created attic.\n */\n public addAtticToWall(\n wall: KernelWall,\n kneeHeight: number,\n width: number,\n preferredSide?: WallSide,\n ): KernelAttic | null {\n return this._executeWithInteraction(\n () =>\n this._plannerKernelAccess.planInteractionHandler.addAttic(\n wall,\n kneeHeight,\n width,\n preferredSide,\n ) || null,\n );\n }\n\n /**\n * Removes an attic from a wall.\n * @param attic The attic to be removed.\n */\n public removeAttic(attic: KernelAttic): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.removeElement(attic),\n );\n }\n\n /**\n * Set the attic direction from a wall.\n * @param attic The attic to be removed.\n */\n public setAtticSide(attic: KernelAttic, side: WallSide): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.setAtticSide(\n attic,\n side,\n ),\n );\n }\n\n /**\n * Gets the attached attic from a wall.\n * @param wall The wall to retrieve the attic from.\n * @returns The first attached attic or null.\n */\n public getAttachedAttic(wall: KernelWall): KernelAttic | null {\n const arrayOfAttachedAttics = wall.getAttachedAttics();\n return arrayOfAttachedAttics.size() > 0\n ? arrayOfAttachedAttics.get(0)\n : null;\n }\n\n /**\n * Updates the knee height of an attic.\n * @param attic The attic to update.\n * @param kneeHeight The new knee height value.\n */\n public updateAtticKneeHeight(attic: KernelAttic, kneeHeight: number): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.setAtticKneeHeight(\n attic,\n kneeHeight,\n ),\n );\n }\n\n /**\n * Updates the width of an attic.\n * @param attic The attic to update.\n * @param width The new width value.\n */\n public updateAtticWidth(attic: KernelAttic, width: number): void {\n this._executeWithInteraction(() =>\n this._plannerKernelAccess.planInteractionHandler.setAtticWidth(\n attic,\n width,\n ),\n );\n }\n\n /**\n * Runs a given function with a call to start and end interaction in the planInteractionHandler,\n * this should be used when you want to add a history step after interacting with the plan.\n * @param callback any function.\n */\n public async executeWithInteraction<T>(\n callback: MaybePromise<T>,\n ): Promise<T> {\n const planInteractionHandler =\n this._plannerKernelAccess.planInteractionHandler;\n\n planInteractionHandler.startInteraction();\n\n try {\n const result = callback();\n if (result instanceof Promise) {\n return await result;\n }\n return result;\n } finally {\n planInteractionHandler.endInteraction();\n }\n }\n\n /**\n * Temporarily stops all input event listeners on the canvas.\n */\n public pauseInputListeners(): void {\n return this._sceneManager.pause();\n }\n\n /**\n * Resumes all input event listeners on the canvas.\n */\n public resumeInputListeners(): void {\n return this._sceneManager.resume();\n }\n\n /**\n * Returns all configurable element's light/lamp sources in the scene.\n */\n public getScenePlanElementLightSources(): Array<\n Map<number, RoomleLightSource>\n > {\n return this._sceneManager.scenePlanElementLightSources;\n }\n\n /**\n * Turns all lights in the scene on or off.\n * @param state whether the lights should be on or off\n */\n public setAllLightsOnOff(state: boolean): void {\n this._sceneManager.setAllLightsOnOff(state);\n }\n\n /**\n * Turns lights by list of light IDs in the scene on or off\n * @param state whether the lights should be on or off\n * @param ids array of light IDs, see type interface RoomleLightSource._lightSourceId\n */\n public setLightsOnOffByIds(ids: number[], state: boolean): void {\n this._sceneManager.setLightsOnOffByIds(ids, state);\n }\n\n public async getPlanObjectForRuntimeId(\n runtimeId: number,\n ): Promise<PlanElementViewModel | null> {\n const planViewModel: PlanViewModel =\n this._planInteractionHandler.getPlan()?.extRef?.jsObject;\n return Promise.resolve(planViewModel.getPlanObjectForId(runtimeId) || null);\n }\n\n public async rotateByRuntimeId(\n runtimeId: number,\n rotateBy: number,\n ): Promise<void> {\n this._sceneManager.rotatePlanElements([runtimeId], rotateBy);\n return Promise.resolve();\n }\n\n public async deleteByRuntimeId(runtimeId: number): Promise<void> {\n this._sceneManager.deletePlanElements([runtimeId]);\n return Promise.resolve();\n }\n\n public async moveByRuntimeId(\n runtimeId: number,\n position: KernelVector3,\n ): Promise<void> {\n const selectedElement = await this.getPlanObjectForRuntimeId(runtimeId);\n this._sceneManager.moveElementPosition(selectedElement, position);\n return Promise.resolve();\n }\n\n /**\n * Undo last action\n */\n public undo(): Promise<void> {\n return this._sceneManager.undo();\n }\n\n /**\n * Redo last action\n * only possible if undo was called before\n */\n public redo(): Promise<void> {\n return this._sceneManager.redo();\n }\n\n public setHomagIntelligence(homagIntelligence: HomagIntelligence): void {\n this._homagIntelligence = homagIntelligence;\n }\n\n public newPosDataFromId(id: string) {\n return this._homagIntelligence.getEmulator().newPosDataFromId(id);\n }\n\n public sendToOM(withPrice: boolean = true) {\n return this._homagIntelligence.sendToOM(withPrice);\n }\n\n public async fetchPrice(planId?: string) {\n return this._homagIntelligence.fetchPrice(planId);\n }\n\n public async getOrderManagerGroupData(planId?: string) {\n return this._homagIntelligence.getEmulator().getGroupDataForOrder(planId);\n }\n\n public getRapiAccess(): RapiAccess {\n return this._rapiAccess;\n }\n}\n","import type { INPUT_EVENT_TYPE } from '../../../common-core/src/input/input-manager';\nimport InputManager from '../../../common-core/src/input/input-manager';\n\nexport default class PlannerInputManager extends InputManager {\n protected _canDrag(_type: INPUT_EVENT_TYPE): boolean {\n return true;\n }\n}\n","import ScriptLoader from '../../../common-core/src/script-loader';\nimport {\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../../common-core/src/di/container';\nimport Logger from '../../../common-core/src/logger';\nimport { default as PlannerMeshGenerator } from '../webgl/planner-mesh-generator';\nimport RapiAccess from '../../../common-core/src/rapi-access';\nimport PlannerInputManager from '../input/planner-input-manager';\nimport PlannerSelectionHandler from './planner-selection-handler';\nimport GlobalInitData from '../../../common-core/src/utils/global-init-data';\nimport ConfiguratorViewModel from '../../../common-core/src/view-model/configurator-view-model';\n\nexport const INJECTABLES: DependencyInjectionAssignment[] = [\n new DependencyInjectionAssignment('script-loader', ScriptLoader),\n new DependencyInjectionAssignment(\n 'planner-input-manager',\n PlannerInputManager,\n DI_TYPE.CONTEXT\n ),\n new DependencyInjectionAssignment('logger', Logger),\n new DependencyInjectionAssignment(\n 'planner-mesh-generator',\n PlannerMeshGenerator\n ),\n new DependencyInjectionAssignment(\n 'configurator-view-model',\n ConfiguratorViewModel,\n DI_TYPE.CONTEXT\n ),\n new DependencyInjectionAssignment('rapi-access', RapiAccess),\n new DependencyInjectionAssignment('global-init-data', GlobalInitData),\n new DependencyInjectionAssignment(\n 'planner-selection-handler',\n PlannerSelectionHandler\n ),\n];\n","import type { Emulator } from './emulator';\nimport inject from '../../common-core/src/di/inject';\nimport type { GlobalCallback } from '../../common-core/src/services/global-callback';\nimport type { Context } from '../../common-core/src/di/context';\nimport {\n createExtObj,\n createExtObjId,\n} from '../../common-core/src/utils/external-objects';\nimport type {\n ExternalConfiguration,\n ExternalItem,\n ExternalObjectOnFetchDataMap,\n} from '../../typings/external-objects';\nimport type { ExternalItems, ExternalObjects } from './homag-intelligence';\nimport type ConfiguratorViewModel from '../../common-core/src/view-model/configurator-view-model';\n\nexport const FAKE_ROOT_TAG = 'external:root-tag';\n\nexport class HiTagCatalogCallbacks implements Context {\n public _creator_: string;\n private _emulator: Emulator;\n private _articlesPromise: Promise<any>;\n private _externalItems: ExternalItems = new Map();\n private _externalConfigurations = new Map();\n private _tagIds: string[] = [];\n\n @inject\n private _globalCallback: GlobalCallback;\n\n @inject\n private _configuratorViewModel: ConfiguratorViewModel;\n\n constructor(creator: string, articles: Promise<any>) {\n this._creator_ = creator;\n this._articlesPromise = articles;\n this._init();\n }\n\n public setEmulator(emulator: Emulator) {\n this._emulator = emulator;\n }\n\n private _init() {\n const onCheckExternalCacheOriginal =\n this._globalCallback.onCheckExternalCache;\n\n this._globalCallback.onCheckExternalCache = async (\n url: string,\n requestData: RequestInit,\n ) => {\n const ogReq = await onCheckExternalCacheOriginal(url, requestData);\n if (ogReq !== null) {\n return ogReq;\n } else {\n return this._onCheckExternalCache(url);\n }\n };\n\n this._globalCallback.onFetchExternalData =\n this._onFetchExternalData.bind(this);\n }\n\n private async _onCheckExternalCache(url: string) {\n if (url === '/tags/' + createExtObjId(FAKE_ROOT_TAG)) {\n const articles = await this._processedArticles();\n this._tagIds = [...articles.keys()].sort((a, b) => {\n return a.localeCompare(b);\n });\n return Promise.resolve({\n tag: { id: createExtObjId(FAKE_ROOT_TAG), tags: this._tagIds, sort: 1 },\n });\n }\n\n for (const tagId of this._tagIds) {\n if (url === '/tags/' + tagId) {\n const articles = await this._processedArticles();\n return Promise.resolve({\n tag: { id: tagId, label: articles.get(tagId)!.label, sort: 1 },\n });\n }\n if (url === '/tags/' + tagId + '/items') {\n const articles = await this._processedArticles();\n const items = articles.get(tagId)!.items;\n items.sort((a: any, b: any) => {\n return a.label.localeCompare(b.label);\n });\n return Promise.resolve({\n items,\n });\n }\n }\n return null;\n }\n\n private _onFetchExternalData<\n T extends keyof ExternalObjectOnFetchDataMap,\n K extends string | string[],\n >(\n _type: T,\n ids: K,\n ): Promise<\n K extends string\n ? ExternalObjectOnFetchDataMap[T]\n : K extends string[]\n ? Array<ExternalObjectOnFetchDataMap[T]>\n : never | undefined\n > {\n const idArray = Array.isArray(ids) ? ids : [ids];\n const externalObjects: Array<ExternalItem | ExternalConfiguration> = [];\n for (const id of idArray) {\n const externalConfiguration =\n this._configuratorViewModel.getExternalConfigurationById(id as string);\n if (externalConfiguration) {\n externalObjects.push(externalConfiguration);\n } else if (this._externalItems.has(id as string)) {\n externalObjects.push(this._externalItems.get(id as string)!);\n } else {\n console.warn('ID', id, 'is unknown');\n }\n }\n\n if (Array.isArray(ids)) {\n // The `as any` cast is used here because TypeScript cannot correctly infer\n // the complex conditional return type of the `onFetchExternalData` callback.\n // The implementation correctly returns an array of objects when `ids` is an array.\n return Promise.resolve(externalObjects) as any;\n }\n\n // The `as any` cast is used here for the same reason as above.\n // The implementation correctly returns a single object or undefined when `ids` is a string.\n return Promise.resolve(externalObjects[0]) as any;\n }\n\n private async _processedArticles() {\n let articles = await this._articlesPromise;\n // NOBILIA DEMO HACKS -- connect.homag.com sends differently shaped data.\n if (articles.articles) {\n articles = articles.articles;\n }\n return articles.reduce((acc: ExternalObjects, article: any) => {\n const category = article.category || 'Uncategorized';\n const id = createExtObjId(category.toLowerCase());\n if (!acc.has(id)) {\n acc.set(id, {\n id,\n label: category,\n items: [],\n });\n }\n const entry = acc.get(id)!;\n const { depth, width, height } = article.roots.reduce(\n (\n dimensions: { depth: number; width: number; height: number },\n { attributes }: any,\n ) => {\n if (attributes) {\n attributes.forEach((attribute: { id: string; value: string }) => {\n if (attribute.id === 'mod_Depth') {\n dimensions.depth += parseInt(attribute.value, 10) / 10;\n }\n if (attribute.id === 'mod_Width') {\n dimensions.width += parseInt(attribute.value, 10) / 10;\n }\n if (attribute.id === 'mod_Height') {\n dimensions.height += parseInt(attribute.value, 10) / 10;\n }\n });\n }\n return dimensions;\n },\n { depth: 0, width: 0, height: 0 },\n );\n const addDimensions = depth > 0 && width > 0 && height > 0;\n const extObj = createExtObj({\n id: article.articleId as string,\n uiLabels: {\n desktop: {\n line1: article.name,\n line2: article.desc,\n line3: addDimensions ? `${height}x${width}x${depth}` : '',\n },\n mobile: {\n line1: article.name,\n line2: addDimensions ? `${height}x${width}x${depth}` : '',\n line3: article.desc,\n },\n },\n label: article.name ?? 'external-objects.no-name',\n // configuration: this._emulator.newPosDataFromId(article.articleId),\n // perspectiveImage: article.imageUrl,\n externalObject: true,\n // We add this configuration object so we can get grid view thumbnail images without requesting newPosDataFromId\n configuration: {\n imageUrl: article.imageUrl,\n },\n });\n this._externalItems.set(\n extObj.id as string,\n extObj as any as ExternalItem,\n );\n entry.items.push(extObj);\n return acc;\n }, new Map() as ExternalObjects);\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst proxyMarker = Symbol(\"Comlink.proxy\");\nconst createEndpoint = Symbol(\"Comlink.endpoint\");\nconst releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst finalizer = Symbol(\"Comlink.finalizer\");\nconst throwMarker = Symbol(\"Comlink.thrown\");\nconst isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n};\n/**\n * Allows customizing the serialization of certain values.\n */\nconst transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\nfunction isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\nfunction expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n}\nfunction isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n}\nfunction closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n}\nfunction wrap(ep, target) {\n const pendingListeners = new Map();\n ep.addEventListener(\"message\", function handleMessage(ev) {\n const { data } = ev;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n try {\n resolver(data);\n }\n finally {\n pendingListeners.delete(data.id);\n }\n });\n return createProxy(ep, pendingListeners, [], target);\n}\nfunction throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\nfunction releaseEndpoint(ep) {\n return requestResponseMessage(ep, new Map(), {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n}\nconst proxyCounter = new WeakMap();\nconst proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\nfunction registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n}\nfunction unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\nfunction createProxy(ep, pendingListeners, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n}\nfunction myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n}\nfunction processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\nconst transferCache = new WeakMap();\nfunction transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n}\nfunction proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n}\nfunction windowEndpoint(w, context = globalThis, targetOrigin = \"*\") {\n return {\n postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\nfunction toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\nfunction fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n}\nfunction requestResponseMessage(ep, pendingListeners, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n}\nfunction generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n\nexport { createEndpoint, expose, finalizer, proxy, proxyMarker, releaseProxy, transfer, transferHandlers, windowEndpoint, wrap };\n//# sourceMappingURL=comlink.mjs.map\n","import './utils/global-definitions';\nimport Main, { BASE_CONTEXT } from '../../common-core/src/main';\nimport RoomlePlanner from './roomle-planner';\nimport RoomleDependencyInjection from '../../common-core/src/di/roomle-dependency-injection';\nimport { INJECTABLES } from './utils/injectables';\nimport type PlannerKernelAccess from './services/planner-kernel-access';\nimport type Logger from '../../common-core/src/logger';\nimport { KERNEL_TYPE } from '../../common-core/src/services/common-kernel-access';\nimport type { PluginName } from '../../configurator-core/src/utils/plugin-types';\nimport type InitData from '../../common-core/src/utils/init-data';\nimport { HiTagCatalogCallbacks } from '../../homag-intelligence/src/hi-tag-catalog-callbacks';\nimport { wrap } from 'comlink';\nimport type { Remote } from 'comlink';\nimport type { HiCallbacks } from '../../../../embedding-lib/src/embedding-lib';\nimport { isInIframe } from '../../common-core/src/utils/rapi-utils';\n\nexport class Planner<\n P extends readonly PluginName[] = readonly [],\n> extends Main {\n private _planner: RoomlePlanner<P>;\n private _activePlugins: P;\n\n constructor(creator?: string, activePlugins?: P) {\n super(creator);\n this._activePlugins = (activePlugins || []) as P;\n }\n protected setupGlobals(): void {\n //globals are initialized in bootFinished()\n }\n\n protected setupDependencies(): void {\n RoomleDependencyInjection.setup(INJECTABLES);\n this.lookup<Logger>('logger', this._context);\n // instantiate kernel acccess\n // instantiate pka\n // set pka on kernel access\n const plannerKernelAccess = this.lookup<PlannerKernelAccess>(\n 'planner-kernel-access',\n this._context,\n );\n plannerKernelAccess.init(KERNEL_TYPE.PLANNER);\n }\n\n protected cleanUpGlobals(): void {\n throw new Error('Method not implemented.');\n }\n\n protected cleanUpDependencies(): void {\n throw new Error('Method not implemented.');\n }\n\n protected async bootFinished(): Promise<void> {\n this._planner = new RoomlePlanner<P>(this._context, this._activePlugins);\n\n this._planner.getMain = () => {\n return this;\n };\n\n if (!window.RoomlePlanner) {\n if (this._activePlugins.length === 0) {\n // cast to unknown because we know that the planner is a RoomlePlanner\n window.RoomlePlanner = this._planner as unknown as RoomlePlanner;\n } else {\n window.RoomlePlanner = this._planner as RoomlePlanner<\n readonly PluginName[]\n >;\n }\n }\n\n const initData = this.lookup<InitData>('init-data', this._context);\n\n if (initData?.hi && isInIframe()) {\n const channel = new MessageChannel();\n window.parent.postMessage({ type: \"connect_hi\", port: channel.port2 }, \"*\", [channel.port2]);\n const hiCallbacks: Remote<HiCallbacks> = wrap(channel.port1);\n\n const articleJson = hiCallbacks.onLoadArticleCatalog(initData.hi.libraryId);\n\n const catalogsCallbacks = new HiTagCatalogCallbacks(\n this._context,\n articleJson,\n );\n\n const hiModule = await import(\n '../../homag-intelligence/src/homag-intelligence'\n );\n const homagIntelligence = new hiModule.HomagIntelligence();\n await homagIntelligence.init(\n articleJson,\n catalogsCallbacks,\n // cast to unknown because we know that the planner is a RoomlePlanner\n this._planner as unknown as RoomlePlanner,\n initData.hi.libraryId,\n initData.hi.serverOptions,\n hiCallbacks,\n );\n }\n }\n\n public getApi(): RoomlePlanner<P> {\n return this._planner;\n }\n\n protected getContextName(): string {\n return BASE_CONTEXT.PLANNER;\n }\n}\n"],"names":["PAPER_BACKGROUND_FILE_NAME","PlannerLightSetting","LightSetting","scene","oldLightSetting","Vector3","AmbientLight","Color","LAYER","DirectionalLight","Vector2","_inclination","_azimuth","bounds","boundingSphere","Sphere","maxSize","lightDirection","gui","getGUI","ambiLight","color","hemiLight","mainDirectionalLight","SELECTION_EVENT","isWallOrFloor","planElementViewModel","WallPlanElementViewModel","FloorPlanElementViewModel","PlannerSelectionHandlerEvent","data","planElementViewModels","selectionMode","reason","PlannerSelectionHandler","EventDispatcher","SELECTION_MODE","id","planElementId","value","mode","_id","result","component","PLANNER_SCENE_EVENT","PLANNER_SCENE_EVENT_STATE","SceneEventInfo","resetCamera","state","oldState","PlannerSceneEventHandler","SceneEventHandler","creator","camera","inputManager","INPUT_EVENT","INTERSECTION_MODE","RAYCAST_EVENT","event","layers","Layers","enable","planObjectViewModel","object","planObjectEventInfo","RAYCAST_PRIORITY","componentEventInfo","MEASUREMENTS_LINE_DRAGGABLE_POINTS_NAME","deepMerge","OBJECT_EVENT","point","updateCurrentPoint","geo","PlaneGeometry","mat","MeshBasicMaterial","plane","Mesh","convertToKernel","clickPoint","inputType","INPUT_EVENT_TYPE","closeToPoint","nodePlanViewModel","point1","point2","isLockedElement","MeasurementLinePlanElementViewModel","intersectionPoint","NodePlanElementViewModel","kernelPosition","setCursor","CURSOR_STYLE","isSafari","planViewModel","wait","INPUT_DELAY_TYPE","position","planInteractionHandler","distance","planObjectPtrList","vector3","isWallOrNode","planElement","CAMERA_TYPE","currentPosition","convertToTHREE","_position","rotation","planObject","delta","x","y","list","Box3","center","ConfiguratorPlanObjectViewModel","StaticPlanObjectViewModel","_forceRender","boundingBox","snapToWall","ConstructionPlanObjectViewModel","ConfigurableConstructionPlanObjectViewModel","CORE_CHILD_ENTITY_MODE","snappingEnabled","isMultiselect","Group","cancelDrawing","vectorDrawPreviewMode","DRAW_PREVIEW_MODES","DrawingType","ContinuousDrawingHelperClass","kernelZoomFactor","eventNumber","eventType","action","viewModel","newPosition","planMeasure","newCenter","measurementLine","targetLengthMM","direction","targetLengthUnits","isLeftDirection","basePoint","scaledDirectionVector","newPoint","__decorateClass","inject","createTransferableObjectPosition","clientWidth","clientHeight","threeVectorToTransferableXY","getScreenXY","getCallbackObjectType","objectType","WallAtticPlanElementViewModel","addDemoLights","active","rapiItem","targetPos","lightPos","dimensions","dimensions2","lightPos2","Sky","shader","material","ShaderMaterial","UniformsUtils","BackSide","BoxGeometry","getIds","planObjects","plannerKernelAccess","objects","itemIds","configurationIds","externalConfigurationData","createExtObjId","convertCObject","CONFIGURATION_TYPE","obj","hash","configurationData","fetchData","externalObjectsDataIn","rapiAccess","externalObjectIds","responseItems","responseConfigurations","responseExternalObjects","rootComponentIds","item","externalObject","configuration","mapToUiPlanObjects","rootComponents","rootComponentsMap","rootComponent","entryData","PaperBackground","TextureLoader","texture","RepeatWrapping","repeatEveryM","PlannerCameraBehaviour","CameraBehaviour","Planner2dCameraBehaviour","getDrawingMinBounds","_bounds","_startCameraParams","_endCameraParams","Planner3dCameraBehaviour","startCameraParams","endCameraParams","cameraParameter","PlannerFpCameraBehaviour","PlanElementHighlighter","sceneEventHandler","roomleRenderer","selectedMeshes","child","runtimeIds","sendWallDimensions","domHelper","cameraBehaviour","roomlePlannerUiCallback","plannerSceneEventHandler","unitFormatter","debugSpheres","isFixedWalls","isDebug","CameraControl2D","wallDimensions","wallViewModels","zoomFactor","wallDimension","isVectorWall","convertWallTo2D","convertAtticTo2D","debugWallDimensions","wallDimensionToTransferable","attic","geometry","SphereGeometry","fromSphere","toSphere","centerSphere","atticFromSphere","atticToSphere","atticCenterSphere","_ClipboardManager","text","err","e","ClipboardManager","initData","planElementType","lockPlanEnabled","isConstructionProduct","PLAN_STORE","SET_WALL_MATERIAL_TYPE","getPressedKeysCount","acc","key","PlannerSceneManager","ConfiguratorSceneManager","offset","plannerCallback","AsyncGuard","BASE_CONTEXT","RenderMode","sceneEventInfo","PLAN_ELEMENT_CHANGE_TYPES","isConstructionOrMeasurementPlanElement","floorPlanObjects","elementLights","element","lights","lightsMaps","light","ids","notifyUiSelectionCallback","configuratorId","planXml","getHostname","PlanViewModel","elementPosition","size","maxAllowedDistance","measurementModel","payload","rootPlanElementId","rootPlanElementViewModel","payloadPromise","promisePayload","configurationRuntimeId","catalogItemId","idToUse","isExternalConfiguration","rootComponentId","isIdItemId","rapiConfiguration","copy","node","_planElementViewModel","measurementLineViewModel","transparent","BackgroundEnvironment","getColor","CameraControl3D","hideWallsBasedOnCamera","_offset","currentCameraParameters","GlbViewerCameraBehaviour","ConfiguratorCameraBehaviour","objectRotation","lookAtSide","preferredRotation","WALL_SIDES","planObjectId","cameraParameters","runtimeId","currentCameraParams","cameraType","is3D","CameraControlFirstPerson","objectDirection","angle","kernelPlanObjects","rapiItems","promises","resolve","reject","planGLTF","glb","plan","_plan","fromPlan","toPlan","planeGeometry","planeMaterial","MaterialCreator","configurableItemPromise","box","kernelBoxToThreeBox","_material","_vertices","_indices","_uvCoords","_normals","_type","resolveItemLoadedPromise","rejectItemLoadedPromise","promise","object3D","fadeIn","isItemOrConfiguration","isBox3InFrustum","_exportObjects","url","skyParams","sunPosition","viewSpacePositionFromUV","sunSphere","wallPlanObject","mesh","setWallTransparency","wall","CAMERA_EVENT","ctrlOrCmd","numPressedKeys","correctKeyPressed","selectedIds","selectedItemsIds","clipboard","validItemIds","getIdQueryParam","inputEvent","cleanup","isCtrlOrCmd","success","_planElement","planModelViewHelper","rotateBy","kernelCenter","options","isolationMode","cameraTarget","ImageRenderer","invisibleWalls","image","error","restorePlannerEditModeState","createEmptySceneFromCurrent","placedCamera","dispose","previousContext","selectedElement","spacing","dragEvent","zoom","combinedBounds","position2d","planObjectPositions","allPlanObjects","floorPlanObjectViewModels","floorsData","floor","floorData","toFloorAreaDataTransferable","textSphere","measurements","measurementLineDimensions","measurementLineViewModels","measurementLineDimension","toMeasurementLineDimensionToTransferable","objectDimensions","transferableRectMeasurements","transferableObjectMeasurements","transferableObjectToWallsMeasurements","dimension","fromPosition2d","toPosition2d","textPosition2d","objectToWallDimensionToTransferable","constructionMeasurements","redMaterial","greenMaterial","blueMaterial","sphereGeometry","leftFromSphere","leftToSphere","rightFromSphere","rightToSphere","rangeFromSphere","rangeToSphere","transferableMeasurements","toConstructionMeasurementTransferable","sceneEvents","type","wallPlanObjectViewModels","setLeftMaterial","applyMaterialToKernelMaterial","setRightMaterial","kernelWalls","kernelInnerWallEnum","kernelOuterWallLeftEnum","kernelOuterWallRightEnum","kernelFloors","cameraPosition","cameraToWall","wallKernelObject","wallForward","angleRadians","MathUtils","elementCenter","selectedElements","completelyLoaded","measurementId","length","kernelPlanElement","wallDistance","convertToStandardArray","w","hashCode","startPoint","endPoint","newLength","wallDirection","isCurrentlyDrawing","isVectorPreviewModeEnabled","nodePlanObject","isExtObj","selectedPlanObjectComponent","elementRuntimeId","planObjectComponent","GROUP_CEILING_LIGHTS","on","INTERIOR_LIGHTS_ENV_MAP_ROTATION","DEFAULT_ENV_MAP_ROTATION","INTERIOR_LIGHTS_ENV_MAP_INTENSITY","DEFAULT_ENV_MAP_INTENSITY","idInfos","index","rapiIds","mapFun","itemsPromise","itemList","EXT_OBJ_EXCEPTION","OFFSET","RoomlePlanner","activePlugins","params","intensity","maxLightSources","preloadPlanId","Benchmark","xml","USER_ACTION_MODULE","isPlanSnapshot","isPlanSnapshotId","_reject","dls","ls","stats","dynamicLightSettingSource","DynamicLightSettingLoader","RoomleConfigurator","currentSelection","configurator","PROMISE_CATEGORY","ConfiguratorClass","hsc","viewer","GLBViewerModule","callback","roomleConfigurator","_cssClass","catalogId","isExtObjId","insertExternalObject","originalIndex","externalObjectsPromise","rapiObjectsPromise","externalObjects","rapiObjects","results","a","b","planOverview","idOrConfig","config","isExternalObject","findFreeSpaceInPlan","dragIn","idOrSerializedConfigString","configurationHash","warning","parameter","wallDefinitions","interactionOptions","createdWalls","wallDefinition","nodeFrom","nodeTo","kernelPlanElements","parentPlanId","planSnapshot","externalObjectUniqueIds","externalObjectRuntimeIds","planXML","snapshot","objectsSize","i","rootComponentCenter","locationString","perspectiveImage","topImage","responsePlanSnapshotResult","configurationHashOrGroupId","partList","old","idOfNew","pos","rot","filename","shouldWaitForAssets","quality","planObjectIds","stringArray","shortUrl","response","downloadHomagIxExportPoC","configurationJson","properties","libraryJson","configuratorKernel","serializedJson","groupData","verifyArrangement","mergedGroups","correctArrangement","configuratorContext","selectedPlanObject","serializedGroups","firstGroupId","inConfigurator","objectPosition","updateConfiguration","newObjects","arrayOfGroups","posDataCollection","groupPosData","stepInDegrees","cameraAngleInDegrees","toDegrees","faceToAngleInDegrees","toRadiant","groups","jsonObjects","generatedImages","animateCamera","objectGroup","canvasScreenshot","groupId","wasMerged","rootModuleId","isConfiguratorContext","subModuleId","selectPlanObject","groupIdOrRootModuleId","_subModuleId","open","animate","switchToPlanner","switchToConfigurator","selectComponent","highlightSelection","currentlySelectedPlanObjectComponent","configuratorObjectAlreadySelected","invokeSelectPlanObject","groupDefinitions","externalObjectGroups","group","kneeHeight","width","preferredSide","side","arrayOfAttachedAttics","homagIntelligence","withPrice","planId","PlannerInputManager","InputManager","INJECTABLES","DependencyInjectionAssignment","ScriptLoader","DI_TYPE","Logger","PlannerMeshGenerator","ConfiguratorViewModel","RapiAccess","GlobalInitData","FAKE_ROOT_TAG","HiTagCatalogCallbacks","articles","emulator","onCheckExternalCacheOriginal","requestData","ogReq","tagId","items","idArray","externalConfiguration","article","category","entry","depth","height","attributes","attribute","addDimensions","extObj","createExtObj","proxyMarker","createEndpoint","releaseProxy","finalizer","throwMarker","isObject","val","proxyTransferHandler","port1","port2","expose","port","wrap","throwTransferHandler","serialized","transferHandlers","isAllowedOrigin","allowedOrigins","origin","allowedOrigin","ep","ev","path","argumentList","fromWireValue","returnValue","parent","prop","rawValue","proxy","transfer","wireValue","transferables","toWireValue","closeEndPoint","isMessagePort","endpoint","target","pendingListeners","resolver","createProxy","throwIfProxyReleased","isReleased","releaseEndpoint","requestResponseMessage","proxyCounter","proxyFinalizers","newCount","registerProxy","unregisterProxy","isProxyReleased","_target","r","p","_thisArg","rawArgumentList","last","processArguments","myFlat","arr","processed","v","transferCache","transfers","name","handler","serializedValue","msg","generateUUID","Planner","Main","RoomleDependencyInjection","KERNEL_TYPE","isInIframe","channel","hiCallbacks","articleJson","catalogsCallbacks","hiModule"],"mappings":"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","x_google_ignoreList":[5,20]}
|