@crystaldesign/web-planner-logic 26.13.0-beta.32 → 26.13.0-beta.34
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/build/cjs/{DivaBoxPlanner-f9f577b0.js → DivaBoxPlanner-7f6bd584.js} +3 -3
- package/build/cjs/{DivaStandardPlanner-fd71c557.js → DivaStandardPlanner-77c603dc.js} +1903 -195
- package/build/cjs/{DoorPlanner-1e941d6e.js → DoorPlanner-5de2bbf0.js} +2 -2
- package/build/cjs/{Host3DSignalR-7aa4d347.js → Host3DSignalR-26b95303.js} +2 -2
- package/build/cjs/{LiviqueWWSHandler-c8f83739.js → LiviqueWWSHandler-1e419862.js} +2 -2
- package/build/cjs/{PfisterWWSHandler-d3fd59c5.js → PfisterWWSHandler-b2f7a5ec.js} +2 -2
- package/build/cjs/{PlannerHandler2D-e6d1cebc.js → PlannerHandler2D-ff734c3e.js} +10 -10
- package/build/cjs/{SeriousBasketHandler-c8abdb16.js → SeriousBasketHandler-e54bd31b.js} +2 -2
- package/build/cjs/{ShelfPlanner-173ee746.js → ShelfPlanner-08e15d16.js} +489 -193
- package/build/cjs/{StandardWWSHandler-e31f5446.js → StandardWWSHandler-0e7b20dc.js} +2 -2
- package/build/cjs/{index-76d3a1ec.js → index-5dd5fb4b.js} +7067 -2170
- package/build/cjs/index.js +9 -3
- package/build/esm/{DivaBoxPlanner-086b4c02.js → DivaBoxPlanner-6ac448b4.js} +3 -3
- package/build/esm/{DivaStandardPlanner-9864a9dd.js → DivaStandardPlanner-abd9609d.js} +1893 -186
- package/build/esm/{DoorPlanner-d29bc13e.js → DoorPlanner-fde32e61.js} +2 -2
- package/build/esm/{Host3DSignalR-dbe6624e.js → Host3DSignalR-0f97c7f3.js} +2 -2
- package/build/esm/{LiviqueWWSHandler-60691979.js → LiviqueWWSHandler-9ee5b7cb.js} +2 -2
- package/build/esm/{PfisterWWSHandler-1fe8accd.js → PfisterWWSHandler-b9699549.js} +2 -2
- package/build/esm/{PlannerHandler2D-88b9a108.js → PlannerHandler2D-8d963e77.js} +2 -2
- package/build/esm/{SeriousBasketHandler-0a3966d6.js → SeriousBasketHandler-40e7e46c.js} +2 -2
- package/build/esm/{ShelfPlanner-614b7281.js → ShelfPlanner-69cbb2c1.js} +489 -193
- package/build/esm/{StandardWWSHandler-12b16709.js → StandardWWSHandler-dbf02663.js} +2 -2
- package/build/esm/{index-8d311c4b.js → index-88148ccc.js} +7022 -2163
- package/build/esm/index.js +2 -2
- package/build/types/web-planner-logic/src/index.d.ts +6 -1
- package/build/types/web-planner-logic/src/index.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts +13 -0
- package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts +5 -0
- package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/FunctionTypes/index.d.ts +15 -1
- package/build/types/web-planner-logic/src/interface/FunctionTypes/index.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/OptionTypes/CatalogOptionDataTypes.d.ts +10 -0
- package/build/types/web-planner-logic/src/interface/OptionTypes/CatalogOptionDataTypes.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/Planner/ISaveSetPlanner.d.ts +10 -0
- package/build/types/web-planner-logic/src/interface/Planner/ISaveSetPlanner.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/Planner/RoomSceneTypes.d.ts +76 -0
- package/build/types/web-planner-logic/src/interface/Planner/RoomSceneTypes.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/interface/Rendering/AlternativeRendering.d.ts +4 -0
- package/build/types/web-planner-logic/src/interface/Rendering/AlternativeRendering.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/ShelfPlanner/ShelfAccessoiresView.d.ts +5 -0
- package/build/types/web-planner-logic/src/interface/ShelfPlanner/ShelfAccessoiresView.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/webPlannerParams/WebPlannerParamsType.d.ts +1 -1
- package/build/types/web-planner-logic/src/interface/webPlannerParams/WebPlannerParamsType.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Article/ArticleOptionState.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/ConfigTree/DivaConfigTreeHandler.d.ts +7 -0
- package/build/types/web-planner-logic/src/logic/ConfigTree/DivaConfigTreeHandler.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlanner.d.ts +51 -7
- package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlanner.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlannerGrid.d.ts +14 -2
- package/build/types/web-planner-logic/src/logic/ConfigTree/Shelfplanner/ShelfPlannerGrid.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/ConfigTree/viewerStateToggles.d.ts +19 -0
- package/build/types/web-planner-logic/src/logic/ConfigTree/viewerStateToggles.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/ConfigTree/viewerStateToggles.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/ConfigTree/viewerStateToggles.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/DivaWebPlanner.d.ts +107 -23
- package/build/types/web-planner-logic/src/logic/DivaWebPlanner.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/DivaPlannerHandler.d.ts +74 -9
- package/build/types/web-planner-logic/src/logic/Planner/DivaPlannerHandler.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/DivaStandardPlanner.d.ts +175 -4
- package/build/types/web-planner-logic/src/logic/Planner/DivaStandardPlanner.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.d.ts +6 -7
- package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/carrierGuests.d.ts +75 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/carrierGuests.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/guestPlacement.d.ts +47 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/guestPlacement.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/guestPlacement.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/guestPlacement.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementDefaults.d.ts +9 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementDefaults.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementRules.d.ts +78 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementRules.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementRules.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementRules.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementSlots.d.ts +81 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementSlots.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementTypes.d.ts +13 -0
- package/build/types/web-planner-logic/src/logic/Planner/Placement/placementTypes.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/DockingPointHandler.d.ts +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/DockingPointHandler.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/PlannerUtils/SVGUtils.d.ts +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/Rendering/PlannerHandler3D.d.ts +13 -1
- package/build/types/web-planner-logic/src/logic/Planner/Rendering/PlannerHandler3D.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Planner/Room/elementShapes.d.ts +56 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/elementShapes.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/elementShapes.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/elementShapes.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomCollisions.d.ts +90 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomCollisions.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomCollisions.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomCollisions.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomGroups.d.ts +32 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomGroups.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomGroups.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomGroups.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomProperties.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomProperties.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomScenes.d.ts +21 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomScenes.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomScenes.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomScenes.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomValidation.d.ts +13 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomValidation.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomValidation.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/roomValidation.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/rtvFeatures.d.ts +17 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/rtvFeatures.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/rtvFeatures.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/rtvFeatures.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/wallBinding.d.ts +72 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/wallBinding.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/wallBinding.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/wallBinding.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/wallMode.d.ts +7 -0
- package/build/types/web-planner-logic/src/logic/Planner/Room/wallMode.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/plannerSwitch.d.ts +32 -0
- package/build/types/web-planner-logic/src/logic/Planner/plannerSwitch.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/plannerSwitch.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Planner/plannerSwitch.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/logic/Set/DivaSet.d.ts +12 -6
- package/build/types/web-planner-logic/src/logic/Set/DivaSet.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Set/DivaSetHandler.d.ts +26 -6
- package/build/types/web-planner-logic/src/logic/Set/DivaSetHandler.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Articles/Article/CatalogArticleData.d.ts +4 -0
- package/build/types/web-planner-logic/src/model/Articles/Article/CatalogArticleData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts +27 -0
- package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Catalog/DivaCatalogData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Catalog/IDMCatalogData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Options/ArticleOptionData.d.ts +10 -0
- package/build/types/web-planner-logic/src/model/Options/ArticleOptionData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Options/CatalogOptionData.d.ts +4 -1
- package/build/types/web-planner-logic/src/model/Options/CatalogOptionData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Planner/DockingPoint.d.ts +1 -1
- package/build/types/web-planner-logic/src/model/Planner/DockingPoint.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Planner/PlannerElementData.d.ts +29 -0
- package/build/types/web-planner-logic/src/model/Planner/PlannerElementData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Properties/propertySchemaRegistry.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/test/alternateRenderingToggle.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/alternateRenderingToggle.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/capturedSetImages.test.d.ts +1 -0
- package/build/types/web-planner-logic/src/test/capturedSetImages.test.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/test/carrierGuests.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/carrierGuests.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/copyRestoreConnectors.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/copyRestoreConnectors.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/dragZones.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/dragZones.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/familySwapInPlace.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/familySwapInPlace.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/headlessRoomScenes.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/headlessRoomScenes.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/liveArUpdate.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/liveArUpdate.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/oltRectBody.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/oltRectBody.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/plannerRoomScenesSwitch.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/plannerRoomScenesSwitch.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/planning2DCapture.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/planning2DCapture.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/planningRoundTrip.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/planningRoundTrip.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/roomDragContact.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/roomDragContact.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/roomPlacement.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/roomPlacement.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/roomScenePlanning.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/roomScenePlanning.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/rotationSnap.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/rotationSnap.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/shelfEditNoting.test.d.ts +3 -0
- package/build/types/web-planner-logic/src/test/shelfEditNoting.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/shelfGridCarryOver.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/shelfGridCarryOver.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/shelfMoveLocks.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/shelfMoveLocks.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/shelfOfferedCells.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/shelfOfferedCells.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/sideCopySubstitute.test.d.ts +3 -0
- package/build/types/web-planner-logic/src/test/sideCopySubstitute.test.d.ts.map +1 -0
- package/package.json +3 -3
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
2
1
|
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
2
|
+
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
3
3
|
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
|
|
4
4
|
import _createClass from '@babel/runtime/helpers/createClass';
|
|
5
5
|
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
6
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
6
7
|
import _regeneratorRuntime from '@babel/runtime/regenerator';
|
|
7
|
-
import { V as Vector3, P as PlannerElementData,
|
|
8
|
+
import { V as Vector3, p as poseOf, g as getSnapPlace, c as getDockingGroups, d as getElementShape, e as getCarrierSlots, h as getSlotPlaces, m as moveGroupRigidly, i as isSamePose, j as getGroupBlock, k as fitsInsideRoom, l as keepInsideRoom, n as bindToWalls, o as sameGeoExtent, q as getCornerEnd, r as getDoorClearanceRects, t as rectCorners, u as Vector2, M as MAX_GUEST_DEPTH, v as slotExempt, w as bodiesOverlap, x as getNearestMember, y as toPlacementOffset, z as getTurnDeg, A as moveSlotMember, B as moveShape, C as layersCollide, D as shapesCollide, P as PlannerElementData, E as parseGuestPlacement, F as saveElementArticleCodex, H as parseSetPlanData, I as isSavePlannerV2, J as BoundingBox, K as movePoints } from './index-88148ccc.js';
|
|
8
9
|
import DivaUtils, { DivaError, md5 } from '@crystaldesign/diva-utils';
|
|
9
|
-
import { computeDockedTransform } from '@crystaldesign/planner-
|
|
10
|
-
import { d as dockingPointHandlerInst, h as handler2D } from './PlannerHandler2D-
|
|
11
|
-
import '@babel/runtime/helpers/slicedToArray';
|
|
10
|
+
import { computeDockedTransform } from '@crystaldesign/planner-core';
|
|
11
|
+
import { d as dockingPointHandlerInst, h as handler2D } from './PlannerHandler2D-8d963e77.js';
|
|
12
12
|
import '@babel/runtime/helpers/objectWithoutProperties';
|
|
13
13
|
import 'axios';
|
|
14
14
|
import '@babel/runtime/helpers/typeof';
|
|
@@ -23,28 +23,76 @@ import '@crystaldesign/basket-handler';
|
|
|
23
23
|
import 'socket.io-client';
|
|
24
24
|
import '@babel/runtime/helpers/get';
|
|
25
25
|
|
|
26
|
-
/** Configurator 2.0 set planner payload (`SetPlanData` after base64 decode). */
|
|
27
|
-
|
|
28
|
-
/** Legacy planner 1.x payload (no `v: 2` wrapper). */
|
|
29
|
-
|
|
30
|
-
function parseSetPlanData(setPlanData) {
|
|
31
|
-
var planDataString = DivaUtils.decodeBase64(setPlanData);
|
|
32
|
-
return JSON.parse(planDataString);
|
|
33
|
-
}
|
|
34
|
-
function isSavePlannerV2(planData) {
|
|
35
|
-
return planData.v === 2;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** Article codex from a V2 or legacy element record. */
|
|
39
|
-
function saveElementArticleCodex(element) {
|
|
40
|
-
return element.articleCodex || element.Codex;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
26
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
44
27
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
45
28
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
29
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
30
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
46
31
|
var LOG = DivaUtils.initLog('Planner', 'WEB-PLANNER-LOGIC');
|
|
47
32
|
var ACC_DOCK_TYPES = ['AVO', 'AVU', 'AVC', 'AVS', 'AVN'];
|
|
33
|
+
|
|
34
|
+
/** An element of the set as a drag checks it: its shape, and its layer for the catalog's layer rule. */
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Something a dragged group may not run into: an element of another docking group of this set or of another set (its id,
|
|
38
|
+
* its layer where the catalog's layer rule applies; of another set its set and that set's rules), or a door's clearance,
|
|
39
|
+
* its swing or doorway (none).
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/** A pose on the floor moved rigidly from `from` to `to`, as the points it carries (see `movePoints`). */
|
|
43
|
+
function movePose(pose, from, to) {
|
|
44
|
+
var _movePoints = movePoints([new Vector2(pose.center.x, pose.center.z)], from, to),
|
|
45
|
+
_movePoints2 = _slicedToArray(_movePoints, 1),
|
|
46
|
+
center = _movePoints2[0];
|
|
47
|
+
return {
|
|
48
|
+
center: {
|
|
49
|
+
x: center.x,
|
|
50
|
+
z: center.y
|
|
51
|
+
},
|
|
52
|
+
rotDeg: pose.rotDeg + to.rotDeg - from.rotDeg
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** How close (cm) a 'snap' group's wall pose has to be to the dragged position for it to dock to the wall. */
|
|
57
|
+
var WALL_SNAP_DISTANCE = 30;
|
|
58
|
+
/** The free-pose search around a group that landed on another: ring spacing (cm) and directions per ring. */
|
|
59
|
+
var CLEAR_SEARCH_STEP = 10;
|
|
60
|
+
var CLEAR_SEARCH_DIRECTIONS = 16;
|
|
61
|
+
/** cm a blocked turn's release looks around for a free place at least (farther where the group's longer side is longer). */
|
|
62
|
+
var TURN_PLACE_REACH = 100;
|
|
63
|
+
/** cm the room rule may move a suggested place before it no longer counts as that place. */
|
|
64
|
+
var PLACE_TOLERANCE = 1;
|
|
65
|
+
/** cm the room rule may move a pose a guest snaps to off its place (the float noise of moved outlines). */
|
|
66
|
+
var ROOM_RULE_NOISE = 0.01;
|
|
67
|
+
/** cm between the poses a drag checks on its way: less than the thinnest part (a table leg), so nothing is jumped. */
|
|
68
|
+
var PATH_STEP = 2;
|
|
69
|
+
/** cm a pair that overlapped at the start may vary in depth while it moves along (the float noise of moved outlines). */
|
|
70
|
+
var DEPTH_NOISE = 1e-6;
|
|
71
|
+
/** cm within which a dragged guest snaps into a free place of a slot that takes it. */
|
|
72
|
+
var SLOT_SNAP_DISTANCE = 20;
|
|
73
|
+
/** cm within which a drag counts as back at its start (the float noise of the summed moves). */
|
|
74
|
+
var START_NOISE = 1e-6;
|
|
75
|
+
var toFloorRect = function toFloorRect(block, pose) {
|
|
76
|
+
return {
|
|
77
|
+
center: pose.center,
|
|
78
|
+
halfWidth: block.halfWidth,
|
|
79
|
+
halfDepth: block.halfDepth,
|
|
80
|
+
rotDeg: pose.rotDeg
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/** The article codex the room rules read: a main element's; none for an accessory. */
|
|
85
|
+
var mainCodex = function mainCodex(member) {
|
|
86
|
+
return member.IsAccessoire ? '' : member.ArticleCodex;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/** `pose` moved back inside the room, its rotation kept. */
|
|
90
|
+
var insidePose = function insidePose(block, pose, room) {
|
|
91
|
+
return {
|
|
92
|
+
center: keepInsideRoom(toFloorRect(block, pose), room),
|
|
93
|
+
rotDeg: pose.rotDeg
|
|
94
|
+
};
|
|
95
|
+
};
|
|
48
96
|
var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
49
97
|
/*
|
|
50
98
|
This function updates te planner data of all Elements if they changed.
|
|
@@ -56,7 +104,13 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
56
104
|
|
|
57
105
|
function DivaStandardPlanner(set, updatePlannerMsgContainer, plannerId, globalBoundingBox, doDisablePlanner2D, plannerHasStaticBackground) {
|
|
58
106
|
var _this = this;
|
|
107
|
+
var getOtherCollisionSets = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : function () {
|
|
108
|
+
return [];
|
|
109
|
+
};
|
|
110
|
+
var findCarrier = arguments.length > 7 ? arguments[7] : undefined;
|
|
59
111
|
_classCallCheck(this, DivaStandardPlanner);
|
|
112
|
+
this.getOtherCollisionSets = getOtherCollisionSets;
|
|
113
|
+
this.findCarrier = findCarrier;
|
|
60
114
|
_defineProperty(this, "plannerID", void 0);
|
|
61
115
|
_defineProperty(this, "set", void 0);
|
|
62
116
|
_defineProperty(this, "plannerBoundingBox", void 0);
|
|
@@ -70,6 +124,16 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
70
124
|
_defineProperty(this, "IDM3DCatCodex", '');
|
|
71
125
|
_defineProperty(this, "IDM3DEnvironment", 'diva.ro');
|
|
72
126
|
_defineProperty(this, "nextElementId", 1);
|
|
127
|
+
_defineProperty(this, "room", void 0);
|
|
128
|
+
_defineProperty(this, "roomDrag", void 0);
|
|
129
|
+
/** Elements whose group a room rule placed (insert, resize, drag, scene switch, …): a measurement re-binds them. */
|
|
130
|
+
_defineProperty(this, "roomPlaced", new WeakSet());
|
|
131
|
+
/** The elements the current drag moves (ids): the grabbed one, those the viewer moves with it, a room drag's group, their guests. */
|
|
132
|
+
_defineProperty(this, "dragUnit", void 0);
|
|
133
|
+
/** Of the current drag's elements, the guests it carries along (ids, see `getFollowers`). */
|
|
134
|
+
_defineProperty(this, "dragFollowers", new Set());
|
|
135
|
+
/** The free slot places the grabbed element may snap into (see `findSlotSnap`), found when the drag starts where it stood. */
|
|
136
|
+
_defineProperty(this, "dragSlots", void 0);
|
|
73
137
|
_defineProperty(this, "collisionHandler", void 0);
|
|
74
138
|
_defineProperty(this, "dockToAVUorAVOororAVNorAVSorAVC", function (plannerElement, targetElements) {
|
|
75
139
|
// Capability comes from the SVG-parsed docking points, not the catalog metadata counts
|
|
@@ -167,6 +231,18 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
167
231
|
if (!this.getCatalogData().dontSetPosNrFromPlanner) startChainElements = startChainElements.sort(function (a, b) {
|
|
168
232
|
return a.WorldPosCenter.x - b.WorldPosCenter.x;
|
|
169
233
|
});
|
|
234
|
+
// Elements put into a carrier's slot come after the chains, by the numbers they have; a new one last.
|
|
235
|
+
var keptPosNr = function keptPosNr(element) {
|
|
236
|
+
return element.PosNr > 0 ? element.PosNr : Infinity;
|
|
237
|
+
};
|
|
238
|
+
var atEnd = startChainElements.filter(function (element) {
|
|
239
|
+
return element.PosNrAtEnd;
|
|
240
|
+
}).sort(function (a, b) {
|
|
241
|
+
return keptPosNr(a) - keptPosNr(b);
|
|
242
|
+
});
|
|
243
|
+
startChainElements = [].concat(_toConsumableArray(startChainElements.filter(function (element) {
|
|
244
|
+
return !element.PosNrAtEnd;
|
|
245
|
+
})), _toConsumableArray(atEnd));
|
|
170
246
|
var posNrAcc;
|
|
171
247
|
var _updateAccessoiresOfElement = function updateAccessoiresOfElement(curElement, posNrParent) {
|
|
172
248
|
//Nun habe ich ein Element und muss überprüfen, ob es Accessoires hat. Das sind Elemente, die über AVO, AVU oder AVC gedockt sind.
|
|
@@ -278,16 +354,217 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
278
354
|
* {@link applyDockTransform} (apply → read → restore, no docking relations touched). Returns the
|
|
279
355
|
* delta from the element's current transform (cm / deg), or null if nothing is in snapping range.
|
|
280
356
|
* `excludeElementIds` skips the element's own move-group so it doesn't "snap" to siblings that
|
|
281
|
-
* are translating with it.
|
|
357
|
+
* are translating with it. In a room drag it is the room pose instead, with what blocks it at contact.
|
|
282
358
|
*/
|
|
283
359
|
}, {
|
|
284
360
|
key: "getDockSnapPreview",
|
|
285
361
|
value: function getDockSnapPreview(elementId, autoDockingDistance) {
|
|
362
|
+
var _this$roomDrag, _this$findDockSnap;
|
|
286
363
|
var excludeElementIds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
287
364
|
var element = this.plannerElements.get(elementId);
|
|
288
365
|
if (!element) return null;
|
|
366
|
+
// A room drag that turned into a rotation moves the normal way: its preview only names what the turned group runs into.
|
|
367
|
+
if (this.room && ((_this$roomDrag = this.roomDrag) === null || _this$roomDrag === void 0 ? void 0 : _this$roomDrag.elementId) === elementId) {
|
|
368
|
+
return this.roomDrag.rotating ? this.getRoomTurnPreview(element, this.roomDrag) : this.getRoomDragPreview(element, this.roomDrag);
|
|
369
|
+
}
|
|
370
|
+
return (_this$findDockSnap = this.findDockSnap(element, autoDockingDistance, [].concat(_toConsumableArray(excludeElementIds), _toConsumableArray(this.dragFollowers)))) !== null && _this$findDockSnap !== void 0 ? _this$findDockSnap : this.findSlotSnap(element);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* The move (cm / deg, about the element's centre) into the nearest free slot place found when its drag started (see
|
|
375
|
+
* `findDragSlotPlaces`), within SLOT_SNAP_DISTANCE: lined up and turned as the place says, at its own distance to the
|
|
376
|
+
* carrier as far as the slot's band allows. Null when no place is that near, the element is not the one dragged or it
|
|
377
|
+
* is back where the drag started (a cancel ends there exactly).
|
|
378
|
+
*/
|
|
379
|
+
}, {
|
|
380
|
+
key: "findSlotSnap",
|
|
381
|
+
value: function findSlotSnap(element) {
|
|
382
|
+
var _this$dragSlots;
|
|
383
|
+
var slots = ((_this$dragSlots = this.dragSlots) === null || _this$dragSlots === void 0 ? void 0 : _this$dragSlots.elementId) === element.ElementId ? this.dragSlots : undefined;
|
|
384
|
+
var _poseOf = poseOf(element),
|
|
385
|
+
center = _poseOf.center;
|
|
386
|
+
var places = slots && Math.hypot(center.x - slots.start.x, center.z - slots.start.z) > START_NOISE ? slots.places : [];
|
|
387
|
+
var nearest = getSnapPlace(places, center, SLOT_SNAP_DISTANCE);
|
|
388
|
+
if (!nearest) return null;
|
|
389
|
+
return {
|
|
390
|
+
dx: nearest.center.x - center.x,
|
|
391
|
+
dz: nearest.center.z - center.z,
|
|
392
|
+
dRotDeg: getTurnDeg(element.RotDeg, places[nearest.index].rotDeg)
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// The group's pose where the grabbed element snaps into a free slot place (see findSlotSnap) from where the pointer has
|
|
397
|
+
// it in a room drag; undefined when no place is near.
|
|
398
|
+
}, {
|
|
399
|
+
key: "getSlotSnapPose",
|
|
400
|
+
value: function getSlotSnapPose(drag) {
|
|
401
|
+
var _this$dragSlots2;
|
|
402
|
+
var places = ((_this$dragSlots2 = this.dragSlots) === null || _this$dragSlots2 === void 0 ? void 0 : _this$dragSlots2.elementId) === drag.elementId ? this.dragSlots.places : [];
|
|
403
|
+
if (places.length === 0) return undefined;
|
|
404
|
+
var raw = {
|
|
405
|
+
center: {
|
|
406
|
+
x: drag.grabbedStart.x + drag.dx,
|
|
407
|
+
z: drag.grabbedStart.z + drag.dz
|
|
408
|
+
},
|
|
409
|
+
rotDeg: drag.grabbedStartRotDeg
|
|
410
|
+
};
|
|
411
|
+
var nearest = getSnapPlace(places, raw.center, SLOT_SNAP_DISTANCE);
|
|
412
|
+
if (!nearest) return undefined;
|
|
413
|
+
var block = {
|
|
414
|
+
center: {
|
|
415
|
+
x: drag.start.center.x + drag.dx,
|
|
416
|
+
z: drag.start.center.z + drag.dz
|
|
417
|
+
},
|
|
418
|
+
rotDeg: drag.start.rotDeg
|
|
419
|
+
};
|
|
420
|
+
return movePose(block, raw, {
|
|
421
|
+
center: nearest.center,
|
|
422
|
+
rotDeg: places[nearest.index].rotDeg
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* The free places of the slots that take the grabbed element, at carriers outside the dragged unit in this and the
|
|
428
|
+
* other sets, for a unit of one main element; free where the element stands clear of every body and zone there (its
|
|
429
|
+
* carrier's zone and a slot's reach under its carrier allowed). Found once when the drag starts.
|
|
430
|
+
*/
|
|
431
|
+
}, {
|
|
432
|
+
key: "findDragSlotPlaces",
|
|
433
|
+
value: function findDragSlotPlaces(element, unit) {
|
|
434
|
+
var _this3 = this;
|
|
435
|
+
var _ref = element.IsAccessoire ? [] : this.getPlacementTypes(element),
|
|
436
|
+
_ref2 = _slicedToArray(_ref, 1),
|
|
437
|
+
type = _ref2[0];
|
|
438
|
+
var group = this.getDockingGroupOf(element);
|
|
439
|
+
if (!type || group.filter(function (member) {
|
|
440
|
+
return !member.IsAccessoire;
|
|
441
|
+
}).length !== 1) return [];
|
|
442
|
+
var otherSets = this.getOtherCollisionSets(group.map(function (member) {
|
|
443
|
+
return member.ElementId;
|
|
444
|
+
}));
|
|
445
|
+
var own = getDockingGroups(this.getAllPlannerElements().filter(function (other) {
|
|
446
|
+
return !unit.includes(other);
|
|
447
|
+
})).filter(function (carrier) {
|
|
448
|
+
return carrier.some(function (member) {
|
|
449
|
+
return !member.IsAccessoire;
|
|
450
|
+
});
|
|
451
|
+
}).map(function (carrier) {
|
|
452
|
+
return {
|
|
453
|
+
rules: _this3.getCatalogData().placementOptions.rules,
|
|
454
|
+
members: _this3.getSlotMembers(carrier)
|
|
455
|
+
};
|
|
456
|
+
});
|
|
457
|
+
var others = otherSets.flatMap(function (set) {
|
|
458
|
+
return _toConsumableArray(new Set(set.parts.map(function (part) {
|
|
459
|
+
return part.group;
|
|
460
|
+
}))).map(function (members) {
|
|
461
|
+
return {
|
|
462
|
+
rules: set.rules,
|
|
463
|
+
members: members
|
|
464
|
+
};
|
|
465
|
+
});
|
|
466
|
+
});
|
|
467
|
+
var body = getElementShape(element, false).body[0];
|
|
468
|
+
var pose = poseOf(element);
|
|
469
|
+
var outline = function outline(rotDeg) {
|
|
470
|
+
return movePoints(body, pose, {
|
|
471
|
+
center: {
|
|
472
|
+
x: 0,
|
|
473
|
+
z: 0
|
|
474
|
+
},
|
|
475
|
+
rotDeg: rotDeg
|
|
476
|
+
});
|
|
477
|
+
};
|
|
478
|
+
var drag = this.room ? this.createRoomDrag(element.ElementId, false, otherSets) : undefined;
|
|
479
|
+
return [].concat(_toConsumableArray(own), _toConsumableArray(others)).flatMap(function (_ref3) {
|
|
480
|
+
var rules = _ref3.rules,
|
|
481
|
+
members = _ref3.members;
|
|
482
|
+
return getCarrierSlots(rules, members, type);
|
|
483
|
+
}).flatMap(function (slot) {
|
|
484
|
+
return getSlotPlaces(slot, outline);
|
|
485
|
+
}).filter(function (place) {
|
|
486
|
+
return _this3.placeIsFree(element, group, place, otherSets);
|
|
487
|
+
}).map(function (place) {
|
|
488
|
+
return drag ? _this3.cutBandToRoom(drag, place) : place;
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// The free place with its band cut to the offsets at which the room rule leaves the dragged group where it is: a guest
|
|
493
|
+
// never snaps where the rule would move it.
|
|
494
|
+
}, {
|
|
495
|
+
key: "cutBandToRoom",
|
|
496
|
+
value: function cutBandToRoom(drag, place) {
|
|
497
|
+
var _this4 = this;
|
|
498
|
+
var grabbed = {
|
|
499
|
+
center: drag.grabbedStart,
|
|
500
|
+
rotDeg: drag.grabbedStartRotDeg
|
|
501
|
+
};
|
|
502
|
+
var kept = function kept(offset) {
|
|
503
|
+
var center = {
|
|
504
|
+
x: place.center.x + place.normal.x * offset,
|
|
505
|
+
z: place.center.z + place.normal.z * offset
|
|
506
|
+
};
|
|
507
|
+
return !!_this4.getKeptPose(drag, movePose(drag.start, grabbed, {
|
|
508
|
+
center: center,
|
|
509
|
+
rotDeg: place.rotDeg
|
|
510
|
+
}), ROOM_RULE_NOISE);
|
|
511
|
+
};
|
|
512
|
+
var cut = function cut(end) {
|
|
513
|
+
if (kept(end)) return end;
|
|
514
|
+
var free = 0;
|
|
515
|
+
var blocked = end;
|
|
516
|
+
for (var i = 0; i < 12; i++) {
|
|
517
|
+
var mid = (free + blocked) / 2;
|
|
518
|
+
if (kept(mid)) free = mid;else blocked = mid;
|
|
519
|
+
}
|
|
520
|
+
return free;
|
|
521
|
+
};
|
|
522
|
+
return _objectSpread(_objectSpread({}, place), {}, {
|
|
523
|
+
band: [cut(place.band[0]), cut(place.band[1])]
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Whether the element's group, moved so the element stands at `place`, stands there by the room rule and collides with
|
|
528
|
+
// nothing (see fitsAt); it is put back where it stood.
|
|
529
|
+
}, {
|
|
530
|
+
key: "placeIsFree",
|
|
531
|
+
value: function placeIsFree(element, group, place, otherSets) {
|
|
532
|
+
var saved = group.map(function (member) {
|
|
533
|
+
return {
|
|
534
|
+
member: member,
|
|
535
|
+
center: member.WorldPosCenter,
|
|
536
|
+
rotDeg: member.RotDeg
|
|
537
|
+
};
|
|
538
|
+
});
|
|
539
|
+
moveGroupRigidly(group, poseOf(element), place);
|
|
540
|
+
var drag = this.createRoomDrag(element.ElementId, false, otherSets);
|
|
541
|
+
var free = !!drag && !!this.getKeptPose(drag) && !this.isBlocked(drag, drag.start);
|
|
542
|
+
var _iterator = _createForOfIteratorHelper(saved),
|
|
543
|
+
_step;
|
|
544
|
+
try {
|
|
545
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
546
|
+
var _step$value = _step.value,
|
|
547
|
+
member = _step$value.member,
|
|
548
|
+
center = _step$value.center,
|
|
549
|
+
rotDeg = _step$value.rotDeg;
|
|
550
|
+
member.WorldPosCenter = center;
|
|
551
|
+
member.RotDeg = rotDeg;
|
|
552
|
+
}
|
|
553
|
+
} catch (err) {
|
|
554
|
+
_iterator.e(err);
|
|
555
|
+
} finally {
|
|
556
|
+
_iterator.f();
|
|
557
|
+
}
|
|
558
|
+
return free;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// The move (cm / deg, about the element's centre) onto the element's nearest dock within `autoDockingDistance`, to an
|
|
562
|
+
// element not in `excludeElementIds`; null when none is in range. Nothing changes.
|
|
563
|
+
}, {
|
|
564
|
+
key: "findDockSnap",
|
|
565
|
+
value: function findDockSnap(element, autoDockingDistance, excludeElementIds) {
|
|
289
566
|
var targets = this.getAllPlannerElements().filter(function (e) {
|
|
290
|
-
return e
|
|
567
|
+
return e !== element && !excludeElementIds.includes(e.getElementId());
|
|
291
568
|
});
|
|
292
569
|
var pairs = dockingPointHandlerInst.searchDockableElementsInArea(element, targets, autoDockingDistance);
|
|
293
570
|
if (!pairs || pairs.size === 0) return null;
|
|
@@ -316,6 +593,1273 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
316
593
|
return result;
|
|
317
594
|
}
|
|
318
595
|
|
|
596
|
+
/**
|
|
597
|
+
* The rigid move from where the planner holds a dragged element's group to where a viewer shows it with `preview` (see
|
|
598
|
+
* {@link getDockSnapPreview}): none in a room drag, which holds the group where it shows; else the dock snap, turning
|
|
599
|
+
* about the element's centre.
|
|
600
|
+
*/
|
|
601
|
+
}, {
|
|
602
|
+
key: "getPreviewMove",
|
|
603
|
+
value: function getPreviewMove(elementId, preview) {
|
|
604
|
+
var _this$roomDrag2;
|
|
605
|
+
var element = this.plannerElements.get(elementId);
|
|
606
|
+
if (!element || !preview || this.room && ((_this$roomDrag2 = this.roomDrag) === null || _this$roomDrag2 === void 0 ? void 0 : _this$roomDrag2.elementId) === elementId) return undefined;
|
|
607
|
+
return this.snapMove(element, preview);
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// The rigid move of a dock snap (see findDockSnap): shifted and turned about the element's centre.
|
|
611
|
+
}, {
|
|
612
|
+
key: "snapMove",
|
|
613
|
+
value: function snapMove(element, snap) {
|
|
614
|
+
var center = {
|
|
615
|
+
x: element.WorldPosCenter.x,
|
|
616
|
+
z: element.WorldPosCenter.z
|
|
617
|
+
};
|
|
618
|
+
return {
|
|
619
|
+
from: {
|
|
620
|
+
center: center,
|
|
621
|
+
rotDeg: 0
|
|
622
|
+
},
|
|
623
|
+
to: {
|
|
624
|
+
center: {
|
|
625
|
+
x: center.x + snap.dx,
|
|
626
|
+
z: center.z + snap.dz
|
|
627
|
+
},
|
|
628
|
+
rotDeg: snap.dRotDeg
|
|
629
|
+
}
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* Activates (or clears) the room the elements are bound to. With `bindGroups` every docking group of main elements
|
|
635
|
+
* gets the room rule once: a forced group goes to its nearest wall pose, any other is pushed inside the room. A group
|
|
636
|
+
* the rules leave on other furniture or in a door's clearance (swing or doorway), where it did not stand so before, then
|
|
637
|
+
* goes to the nearest free pose (see {@link moveClearOfObstacles}). Returns false when a forced group fits on no wall
|
|
638
|
+
* (it stays where it is).
|
|
639
|
+
*/
|
|
640
|
+
}, {
|
|
641
|
+
key: "setRoom",
|
|
642
|
+
value: function setRoom(room, bindGroups) {
|
|
643
|
+
// Measured in the room the elements stood in so far.
|
|
644
|
+
var blockedBefore = room && bindGroups ? this.getBlockedGroupKeys() : new Set();
|
|
645
|
+
this.room = room;
|
|
646
|
+
this.roomDrag = undefined;
|
|
647
|
+
if (!room || !bindGroups) return true;
|
|
648
|
+
var allGroupsFit = this.placeGroupsInRoom();
|
|
649
|
+
this.clearNewlyBlockedGroups(room, blockedBefore);
|
|
650
|
+
this.updatePlannerPosNr();
|
|
651
|
+
this.checkCollision(false);
|
|
652
|
+
this.updatePlannerBoundingBox();
|
|
653
|
+
return allGroupsFit;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// Applies the room rules to every docking group of main elements, or only to the groups holding one of `elements`;
|
|
657
|
+
// false when a forced group fits on no wall. A group of guests goes with its carrier instead.
|
|
658
|
+
}, {
|
|
659
|
+
key: "placeGroupsInRoom",
|
|
660
|
+
value: function placeGroupsInRoom(elements) {
|
|
661
|
+
var allGroupsFit = true;
|
|
662
|
+
var _iterator2 = _createForOfIteratorHelper(getDockingGroups(this.getAllPlannerElements())),
|
|
663
|
+
_step2;
|
|
664
|
+
try {
|
|
665
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
666
|
+
var group = _step2.value;
|
|
667
|
+
if (elements && !group.some(function (member) {
|
|
668
|
+
return elements.includes(member);
|
|
669
|
+
})) continue;
|
|
670
|
+
if (this.followsCarrier(group)) continue;
|
|
671
|
+
if (!this.placeGroupInRoom(group)) allGroupsFit = false;
|
|
672
|
+
}
|
|
673
|
+
} catch (err) {
|
|
674
|
+
_iterator2.e(err);
|
|
675
|
+
} finally {
|
|
676
|
+
_iterator2.f();
|
|
677
|
+
}
|
|
678
|
+
return allGroupsFit;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// The first main element of each docking group (not a guest at its carrier) that stands on another group, of this set
|
|
682
|
+
// or of another set in the room, or in a door's clearance in the active room.
|
|
683
|
+
}, {
|
|
684
|
+
key: "getBlockedGroupKeys",
|
|
685
|
+
value: function getBlockedGroupKeys() {
|
|
686
|
+
var blocked = new Set();
|
|
687
|
+
var _iterator3 = _createForOfIteratorHelper(getDockingGroups(this.getAllPlannerElements())),
|
|
688
|
+
_step3;
|
|
689
|
+
try {
|
|
690
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
691
|
+
var group = _step3.value;
|
|
692
|
+
var main = group.find(function (member) {
|
|
693
|
+
return !member.IsAccessoire;
|
|
694
|
+
});
|
|
695
|
+
if (!main || this.followsCarrier(group)) continue;
|
|
696
|
+
var drag = this.createRoomDrag(main.ElementId);
|
|
697
|
+
if (drag && this.isBlocked(drag, drag.start)) blocked.add(main.ElementId);
|
|
698
|
+
}
|
|
699
|
+
} catch (err) {
|
|
700
|
+
_iterator3.e(err);
|
|
701
|
+
} finally {
|
|
702
|
+
_iterator3.f();
|
|
703
|
+
}
|
|
704
|
+
return blocked;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// Every group (but a guest at its carrier) whose first main element is not in `blockedBefore` and that stands on
|
|
708
|
+
// another group or in a door's clearance goes to the nearest free pose (moveClearOfObstacles).
|
|
709
|
+
}, {
|
|
710
|
+
key: "clearNewlyBlockedGroups",
|
|
711
|
+
value: function clearNewlyBlockedGroups(room, blockedBefore) {
|
|
712
|
+
var _iterator4 = _createForOfIteratorHelper(getDockingGroups(this.getAllPlannerElements())),
|
|
713
|
+
_step4;
|
|
714
|
+
try {
|
|
715
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
716
|
+
var group = _step4.value;
|
|
717
|
+
var main = group.find(function (member) {
|
|
718
|
+
return !member.IsAccessoire;
|
|
719
|
+
});
|
|
720
|
+
if (main && !blockedBefore.has(main.ElementId) && !this.followsCarrier(group)) this.moveClearOfObstacles(main.ElementId, room);
|
|
721
|
+
}
|
|
722
|
+
} catch (err) {
|
|
723
|
+
_iterator4.e(err);
|
|
724
|
+
} finally {
|
|
725
|
+
_iterator4.f();
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// Elements added in a room: their groups get the room rules, and with `clearOfObstacles` a group standing on another or
|
|
730
|
+
// in a door's clearance moves to the nearest free pose.
|
|
731
|
+
}, {
|
|
732
|
+
key: "placeAddedInRoom",
|
|
733
|
+
value: function placeAddedInRoom(added, clearOfObstacles) {
|
|
734
|
+
var room = this.room;
|
|
735
|
+
if (!room) return;
|
|
736
|
+
if (!this.placeGroupsInRoom(added)) {
|
|
737
|
+
this.updateRoomNoFitMsg(true);
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
if (!clearOfObstacles) return;
|
|
741
|
+
var _iterator5 = _createForOfIteratorHelper(getDockingGroups(this.getAllPlannerElements())),
|
|
742
|
+
_step5;
|
|
743
|
+
try {
|
|
744
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
745
|
+
var group = _step5.value;
|
|
746
|
+
var main = group.find(function (member) {
|
|
747
|
+
return !member.IsAccessoire && added.includes(member);
|
|
748
|
+
});
|
|
749
|
+
if (main && !this.followsCarrier(group)) this.moveClearOfObstacles(main.ElementId, room);
|
|
750
|
+
}
|
|
751
|
+
} catch (err) {
|
|
752
|
+
_iterator5.e(err);
|
|
753
|
+
} finally {
|
|
754
|
+
_iterator5.f();
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
// Placing some groups can only show ROOM_NO_FIT_MSG: whether every set fits is DivaPlannerHandler's to say.
|
|
759
|
+
}, {
|
|
760
|
+
key: "updateRoomNoFitMsg",
|
|
761
|
+
value: function updateRoomNoFitMsg(show) {
|
|
762
|
+
var _this$collisionHandle, _this$collisionHandle2;
|
|
763
|
+
(_this$collisionHandle = (_this$collisionHandle2 = this.collisionHandler).updatePlannerMsgContainer) === null || _this$collisionHandle === void 0 || _this$collisionHandle.call(_this$collisionHandle2, 'ROOM_NO_FIT_MSG', show, 'WARNING', 'ROOM_NO_FIT_MSG', false);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/**
|
|
767
|
+
* Whether every docking group of the set has its place in the active room: a forced group stands on its wall pose, any other
|
|
768
|
+
* (but guests at their carrier) room within the footprint as it stands turned, with its followers (no room: true). Until the
|
|
769
|
+
* viewer measured its main elements a group that has a wall pose counts as standing on it: an opened one was saved
|
|
770
|
+
* with their measured extents, which reach at least as far as the outline, a placed one goes there once measured (see
|
|
771
|
+
* setElementFootprints).
|
|
772
|
+
*/
|
|
773
|
+
}, {
|
|
774
|
+
key: "groupsFitInRoom",
|
|
775
|
+
value: function groupsFitInRoom() {
|
|
776
|
+
var _this5 = this;
|
|
777
|
+
var room = this.room;
|
|
778
|
+
if (!room) return true;
|
|
779
|
+
return getDockingGroups(this.getAllPlannerElements()).every(function (group) {
|
|
780
|
+
if (group.every(function (member) {
|
|
781
|
+
return member.IsAccessoire;
|
|
782
|
+
})) return true;
|
|
783
|
+
if (!_this5.isWallBound(group)) return _this5.followsCarrier(group) || _this5.fitsInside(group, room);
|
|
784
|
+
var _this5$getWallBinding = _this5.getWallBinding(group, room),
|
|
785
|
+
groupBlock = _this5$getWallBinding.groupBlock,
|
|
786
|
+
pose = _this5$getWallBinding.pose;
|
|
787
|
+
if (!pose) return false;
|
|
788
|
+
return isSamePose(pose, groupBlock) || group.some(function (member) {
|
|
789
|
+
return !member.IsAccessoire && !member.GeoExtent;
|
|
790
|
+
});
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Whether the group with its followers, pushed inside the room (see insidePose), lies within it.
|
|
795
|
+
}, {
|
|
796
|
+
key: "fitsInside",
|
|
797
|
+
value: function fitsInside(group, room) {
|
|
798
|
+
var groupBlock = getGroupBlock([].concat(_toConsumableArray(group), _toConsumableArray(this.getFollowers(group))), this.getRoomFrame(group).RotDeg);
|
|
799
|
+
return fitsInsideRoom(toFloorRect(groupBlock.block, insidePose(groupBlock.block, groupBlock, room)), room);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// A forced group goes to its nearest wall pose (false when it fits on none), any other group is pushed inside the room
|
|
803
|
+
// with its followers (their bodies too; false when it is wider or deeper than the room). The followers go along
|
|
804
|
+
// either way.
|
|
805
|
+
}, {
|
|
806
|
+
key: "placeGroupInRoom",
|
|
807
|
+
value: function placeGroupInRoom(group, frameElement) {
|
|
808
|
+
var _this6 = this;
|
|
809
|
+
var followers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getFollowers(group);
|
|
810
|
+
if (!this.room || group.every(function (member) {
|
|
811
|
+
return member.IsAccessoire;
|
|
812
|
+
})) return true;
|
|
813
|
+
group.forEach(function (member) {
|
|
814
|
+
return _this6.roomPlaced.add(member);
|
|
815
|
+
});
|
|
816
|
+
if (this.isWallBound(group)) return this.bindGroupToWalls(group, frameElement, followers);
|
|
817
|
+
var frame = this.getRoomFrame(group, frameElement);
|
|
818
|
+
var unit = [].concat(_toConsumableArray(group), _toConsumableArray(followers));
|
|
819
|
+
var groupBlock = getGroupBlock(unit, frame.RotDeg);
|
|
820
|
+
var pose = insidePose(groupBlock.block, groupBlock, this.room);
|
|
821
|
+
moveGroupRigidly(unit, groupBlock, pose);
|
|
822
|
+
return fitsInsideRoom(toFloorRect(groupBlock.block, pose), this.room);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
// The element whose rotation frames the group: `preferred` unless it is an accessory, else the oldest main element.
|
|
826
|
+
}, {
|
|
827
|
+
key: "getRoomFrame",
|
|
828
|
+
value: function getRoomFrame(members, preferred) {
|
|
829
|
+
var _members$find;
|
|
830
|
+
if (preferred && !preferred.IsAccessoire) return preferred;
|
|
831
|
+
return (_members$find = members.find(function (member) {
|
|
832
|
+
return !member.IsAccessoire;
|
|
833
|
+
})) !== null && _members$find !== void 0 ? _members$find : members[0];
|
|
834
|
+
}
|
|
835
|
+
}, {
|
|
836
|
+
key: "bindGroupToWalls",
|
|
837
|
+
value: function bindGroupToWalls(members, frameElement) {
|
|
838
|
+
var followers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
839
|
+
if (!this.room || !members.length) return false;
|
|
840
|
+
var _this$getWallBinding = this.getWallBinding(members, this.room, frameElement),
|
|
841
|
+
groupBlock = _this$getWallBinding.groupBlock,
|
|
842
|
+
pose = _this$getWallBinding.pose;
|
|
843
|
+
if (!pose) return false;
|
|
844
|
+
moveGroupRigidly([].concat(_toConsumableArray(members), _toConsumableArray(followers)), groupBlock, pose);
|
|
845
|
+
return true;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* The group as one block, and its wall pose (null: it fits on no wall), in the frame it is bound in: `preferred`'s,
|
|
850
|
+
* else the rotation of a main element in which it already stands on its wall pose (a group released by a turned
|
|
851
|
+
* element keeps that frame), else the oldest main element's (see getRoomFrame).
|
|
852
|
+
*/
|
|
853
|
+
}, {
|
|
854
|
+
key: "getWallBinding",
|
|
855
|
+
value: function getWallBinding(members, room, preferred) {
|
|
856
|
+
var _this7 = this;
|
|
857
|
+
var bindingIn = function bindingIn(frame) {
|
|
858
|
+
var groupBlock = _this7.getRoomBlock(members, frame);
|
|
859
|
+
return {
|
|
860
|
+
groupBlock: groupBlock,
|
|
861
|
+
pose: bindToWalls(groupBlock.center, groupBlock.block, room)
|
|
862
|
+
};
|
|
863
|
+
};
|
|
864
|
+
var first = bindingIn(this.getRoomFrame(members, preferred));
|
|
865
|
+
if (preferred && !preferred.IsAccessoire) return first;
|
|
866
|
+
var standsOn = function standsOn(_ref4) {
|
|
867
|
+
var groupBlock = _ref4.groupBlock,
|
|
868
|
+
pose = _ref4.pose;
|
|
869
|
+
return !!pose && isSamePose(pose, groupBlock);
|
|
870
|
+
};
|
|
871
|
+
if (standsOn(first)) return first;
|
|
872
|
+
var _iterator6 = _createForOfIteratorHelper(members),
|
|
873
|
+
_step6;
|
|
874
|
+
try {
|
|
875
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
876
|
+
var member = _step6.value;
|
|
877
|
+
if (member.IsAccessoire || member.RotDeg === first.groupBlock.rotDeg) continue;
|
|
878
|
+
var binding = bindingIn(member);
|
|
879
|
+
if (standsOn(binding)) return binding;
|
|
880
|
+
}
|
|
881
|
+
} catch (err) {
|
|
882
|
+
_iterator6.e(err);
|
|
883
|
+
} finally {
|
|
884
|
+
_iterator6.f();
|
|
885
|
+
}
|
|
886
|
+
return first;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
/**
|
|
890
|
+
* Takes the 3D extents the viewer measured for this set's main elements, so a part reaching beyond the 2D outline
|
|
891
|
+
* stays out of the walls. A forced group a room rule placed goes to its wall pose with them (it was placed before its
|
|
892
|
+
* model was measured); a group as the planning was opened moves only with the next user action. Returns whether an
|
|
893
|
+
* element moved.
|
|
894
|
+
*/
|
|
895
|
+
}, {
|
|
896
|
+
key: "setElementFootprints",
|
|
897
|
+
value: function setElementFootprints(footprints) {
|
|
898
|
+
var _this8 = this;
|
|
899
|
+
var changed = [];
|
|
900
|
+
var _iterator7 = _createForOfIteratorHelper(footprints),
|
|
901
|
+
_step7;
|
|
902
|
+
try {
|
|
903
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
904
|
+
var _step7$value = _step7.value,
|
|
905
|
+
elementId = _step7$value.elementId,
|
|
906
|
+
minX = _step7$value.minX,
|
|
907
|
+
maxX = _step7$value.maxX,
|
|
908
|
+
minZ = _step7$value.minZ,
|
|
909
|
+
maxZ = _step7$value.maxZ,
|
|
910
|
+
top = _step7$value.top;
|
|
911
|
+
var element = this.plannerElements.get(elementId);
|
|
912
|
+
var extent = {
|
|
913
|
+
minX: minX,
|
|
914
|
+
maxX: maxX,
|
|
915
|
+
minZ: minZ,
|
|
916
|
+
maxZ: maxZ,
|
|
917
|
+
top: top
|
|
918
|
+
};
|
|
919
|
+
if (!element || element.IsAccessoire || sameGeoExtent(element.GeoExtent, extent)) continue;
|
|
920
|
+
element.GeoExtent = extent;
|
|
921
|
+
if (this.roomPlaced.has(element)) changed.push(element);
|
|
922
|
+
}
|
|
923
|
+
} catch (err) {
|
|
924
|
+
_iterator7.e(err);
|
|
925
|
+
} finally {
|
|
926
|
+
_iterator7.f();
|
|
927
|
+
}
|
|
928
|
+
if (!this.room || changed.length === 0) return false;
|
|
929
|
+
var groups = getDockingGroups(this.getAllPlannerElements()).filter(function (group) {
|
|
930
|
+
return group.some(function (member) {
|
|
931
|
+
return changed.includes(member);
|
|
932
|
+
}) && _this8.isWallBound(group) && !_this8.followsCarrier(group);
|
|
933
|
+
});
|
|
934
|
+
var members = groups.flat();
|
|
935
|
+
var before = members.map(function (member) {
|
|
936
|
+
return [member.WorldPosCenter.x, member.WorldPosCenter.z, member.RotDeg];
|
|
937
|
+
});
|
|
938
|
+
groups.forEach(function (group) {
|
|
939
|
+
return _this8.placeGroupInRoom(group);
|
|
940
|
+
});
|
|
941
|
+
var moved = members.some(function (member, i) {
|
|
942
|
+
var _before$i = _slicedToArray(before[i], 3),
|
|
943
|
+
x = _before$i[0],
|
|
944
|
+
z = _before$i[1],
|
|
945
|
+
rotDeg = _before$i[2];
|
|
946
|
+
return member.WorldPosCenter.x !== x || member.WorldPosCenter.z !== z || member.RotDeg !== rotDeg;
|
|
947
|
+
});
|
|
948
|
+
if (!moved) return false;
|
|
949
|
+
this.updatePlannerPosNr();
|
|
950
|
+
this.checkCollision(false);
|
|
951
|
+
this.updatePlannerBoundingBox();
|
|
952
|
+
return true;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/** Whether the element's docking group is bound to the walls of the active room. */
|
|
956
|
+
}, {
|
|
957
|
+
key: "isElementWallBound",
|
|
958
|
+
value: function isElementWallBound(elementId) {
|
|
959
|
+
var element = this.plannerElements.get(elementId);
|
|
960
|
+
return !!this.room && !!element && this.isWallBound(this.getDockingGroupOf(element));
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* A group's wall mode: forced when a main element is forced or a corner element, else snap when one snaps, else free. A
|
|
965
|
+
* guest's own wall rule rests while it stands at its carrier.
|
|
966
|
+
*/
|
|
967
|
+
}, {
|
|
968
|
+
key: "getGroupWallMode",
|
|
969
|
+
value: function getGroupWallMode(members) {
|
|
970
|
+
var _this9 = this;
|
|
971
|
+
var catalogData = this.getCatalogData();
|
|
972
|
+
var modes = members.flatMap(function (member) {
|
|
973
|
+
var codex = _this9.getCarrierOf(member) ? '' : mainCodex(member);
|
|
974
|
+
if (!codex) return [];
|
|
975
|
+
return [catalogData.getCornerSide(codex) ? 'forced' : catalogData.getWallMode(codex)];
|
|
976
|
+
});
|
|
977
|
+
return modes.includes('forced') ? 'forced' : modes.includes('snap') ? 'snap' : 'free';
|
|
978
|
+
}
|
|
979
|
+
}, {
|
|
980
|
+
key: "isWallBound",
|
|
981
|
+
value: function isWallBound(members) {
|
|
982
|
+
return this.getGroupWallMode(members) === 'forced';
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// The group as one block in `frame`'s rotation; a corner element at one of its ends pins that end into a corner.
|
|
986
|
+
}, {
|
|
987
|
+
key: "getRoomBlock",
|
|
988
|
+
value: function getRoomBlock(members, frame) {
|
|
989
|
+
var groupBlock = getGroupBlock(members, frame.RotDeg);
|
|
990
|
+
var catalogData = this.getCatalogData();
|
|
991
|
+
var _iterator8 = _createForOfIteratorHelper(members),
|
|
992
|
+
_step8;
|
|
993
|
+
try {
|
|
994
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
|
995
|
+
var member = _step8.value;
|
|
996
|
+
var codex = mainCodex(member);
|
|
997
|
+
var side = codex ? catalogData.getCornerSide(codex) : undefined;
|
|
998
|
+
if (!side) continue;
|
|
999
|
+
var cornerEnd = getCornerEnd(members, frame.RotDeg, member, side);
|
|
1000
|
+
if (cornerEnd) return _objectSpread(_objectSpread({}, groupBlock), {}, {
|
|
1001
|
+
block: _objectSpread(_objectSpread({}, groupBlock.block), {}, {
|
|
1002
|
+
cornerEnd: cornerEnd
|
|
1003
|
+
})
|
|
1004
|
+
});
|
|
1005
|
+
}
|
|
1006
|
+
} catch (err) {
|
|
1007
|
+
_iterator8.e(err);
|
|
1008
|
+
} finally {
|
|
1009
|
+
_iterator8.f();
|
|
1010
|
+
}
|
|
1011
|
+
return groupBlock;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
/** A group collides unless all its main elements are NO_COLLISION (e.g. rugs). */
|
|
1015
|
+
}, {
|
|
1016
|
+
key: "collides",
|
|
1017
|
+
value: function collides(members) {
|
|
1018
|
+
var _this10 = this;
|
|
1019
|
+
return members.some(function (member) {
|
|
1020
|
+
var codex = mainCodex(member);
|
|
1021
|
+
return !!codex && !_this10.hasNoCollision(codex);
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
}, {
|
|
1025
|
+
key: "hasNoCollision",
|
|
1026
|
+
value: function hasNoCollision(codex) {
|
|
1027
|
+
return !!codex && this.getCatalogData().hasNoCollision(codex);
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
/** The article's placement types, primary first (PLACEMENT_TYPE, else palette group); empty without one. */
|
|
1031
|
+
}, {
|
|
1032
|
+
key: "getPlacementTypes",
|
|
1033
|
+
value: function getPlacementTypes(element) {
|
|
1034
|
+
var codex = element.ArticleCodex;
|
|
1035
|
+
return codex && this.getCatalogData().getPlacementType(codex) || [];
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
// The main elements of a group as carriers of placement slots, by their outlines (never the viewer's measures).
|
|
1039
|
+
}, {
|
|
1040
|
+
key: "getSlotMembers",
|
|
1041
|
+
value: function getSlotMembers(group) {
|
|
1042
|
+
var _this11 = this;
|
|
1043
|
+
return group.filter(function (member) {
|
|
1044
|
+
return !member.IsAccessoire;
|
|
1045
|
+
}).map(function (member) {
|
|
1046
|
+
return {
|
|
1047
|
+
types: _this11.getPlacementTypes(member),
|
|
1048
|
+
rotDeg: member.RotDeg,
|
|
1049
|
+
body: getElementShape(member, false).body[0],
|
|
1050
|
+
basketId: member.getBasketId()
|
|
1051
|
+
};
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
// The member with its shape where it stands (with the viewer's measures when `measured`) and its group as slot carrier.
|
|
1056
|
+
}, {
|
|
1057
|
+
key: "toCollisionShape",
|
|
1058
|
+
value: function toCollisionShape(member, slotMembers, measured) {
|
|
1059
|
+
return {
|
|
1060
|
+
elementId: member.ElementId,
|
|
1061
|
+
shape: getElementShape(member, measured),
|
|
1062
|
+
types: this.getPlacementTypes(member),
|
|
1063
|
+
group: slotMembers,
|
|
1064
|
+
layer: Number(member.Layer)
|
|
1065
|
+
};
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
// The members of `group` that take part in collisions (see toCollisionShape).
|
|
1069
|
+
}, {
|
|
1070
|
+
key: "getCollidingShapes",
|
|
1071
|
+
value: function getCollidingShapes(group, measured) {
|
|
1072
|
+
var _this12 = this;
|
|
1073
|
+
var slotMembers = this.getSlotMembers(group);
|
|
1074
|
+
return group.filter(function (member) {
|
|
1075
|
+
return !_this12.hasNoCollision(member.ArticleCodex);
|
|
1076
|
+
}).map(function (member) {
|
|
1077
|
+
return _this12.toCollisionShape(member, slotMembers, measured);
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
// Every element of the other colliding groups (not those of `unit`, the group with its followers), the elements of the
|
|
1082
|
+
// other sets (`otherSets`, else those without the guests going with `members`), and in a room the door clearances: the
|
|
1083
|
+
// swings and doorways (getDoorClearanceRects).
|
|
1084
|
+
}, {
|
|
1085
|
+
key: "getObstacles",
|
|
1086
|
+
value: function getObstacles(members, measured) {
|
|
1087
|
+
var _this13 = this;
|
|
1088
|
+
var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : members;
|
|
1089
|
+
var otherSets = arguments.length > 3 ? arguments[3] : undefined;
|
|
1090
|
+
if (!this.collides(members)) return [];
|
|
1091
|
+
var others = getDockingGroups(this.getAllPlannerElements()).filter(function (group) {
|
|
1092
|
+
return !group.some(function (member) {
|
|
1093
|
+
return unit.includes(member);
|
|
1094
|
+
}) && _this13.collides(group);
|
|
1095
|
+
});
|
|
1096
|
+
var _this$getCatalogData = this.getCatalogData(),
|
|
1097
|
+
catalogCodex = _this$getCatalogData.catalogCodex;
|
|
1098
|
+
// Two catalogs always collide; one catalog in two sets by its layer rule.
|
|
1099
|
+
var foreign = (otherSets !== null && otherSets !== void 0 ? otherSets : this.getOtherCollisionSets(members.map(function (member) {
|
|
1100
|
+
return member.ElementId;
|
|
1101
|
+
}))).flatMap(function (set) {
|
|
1102
|
+
return set.parts.map(function (_ref5) {
|
|
1103
|
+
var shape = _ref5.shape,
|
|
1104
|
+
types = _ref5.types,
|
|
1105
|
+
group = _ref5.group,
|
|
1106
|
+
elementId = _ref5.elementId,
|
|
1107
|
+
layer = _ref5.layer;
|
|
1108
|
+
var ownLayerRule = set.catalogCodex === catalogCodex;
|
|
1109
|
+
return {
|
|
1110
|
+
shape: shape,
|
|
1111
|
+
types: types,
|
|
1112
|
+
group: group,
|
|
1113
|
+
elementId: elementId,
|
|
1114
|
+
layer: ownLayerRule ? layer : undefined,
|
|
1115
|
+
setId: set.setId,
|
|
1116
|
+
rules: set.rules
|
|
1117
|
+
};
|
|
1118
|
+
});
|
|
1119
|
+
});
|
|
1120
|
+
var doors = (this.room ? getDoorClearanceRects(this.room) : []).map(function (swing) {
|
|
1121
|
+
var polygon = rectCorners(swing).map(function (corner) {
|
|
1122
|
+
return new Vector2(corner.x, corner.z);
|
|
1123
|
+
});
|
|
1124
|
+
return {
|
|
1125
|
+
shape: {
|
|
1126
|
+
body: [polygon],
|
|
1127
|
+
free: [polygon]
|
|
1128
|
+
},
|
|
1129
|
+
types: [],
|
|
1130
|
+
group: []
|
|
1131
|
+
};
|
|
1132
|
+
});
|
|
1133
|
+
return [].concat(_toConsumableArray(others.flatMap(function (group) {
|
|
1134
|
+
return _this13.getCollidingShapes(group, measured);
|
|
1135
|
+
})), _toConsumableArray(foreign), _toConsumableArray(doors));
|
|
1136
|
+
}
|
|
1137
|
+
}, {
|
|
1138
|
+
key: "getDockingGroupOf",
|
|
1139
|
+
value: function getDockingGroupOf(element) {
|
|
1140
|
+
var _getDockingGroups$fin;
|
|
1141
|
+
return (_getDockingGroups$fin = getDockingGroups(this.getAllPlannerElements()).find(function (group) {
|
|
1142
|
+
return group.includes(element);
|
|
1143
|
+
})) !== null && _getDockingGroups$fin !== void 0 ? _getDockingGroups$fin : [element];
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/** The element whose article has the basket id; undefined when the set has none. */
|
|
1147
|
+
}, {
|
|
1148
|
+
key: "getElementByBasketId",
|
|
1149
|
+
value: function getElementByBasketId(basketId) {
|
|
1150
|
+
return this.getAllPlannerElements().find(function (element) {
|
|
1151
|
+
return element.getBasketId() === basketId;
|
|
1152
|
+
});
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
// The carrier a guest stands at while its set is loaded; without a resolver only one of this set.
|
|
1156
|
+
}, {
|
|
1157
|
+
key: "getCarrierOf",
|
|
1158
|
+
value: function getCarrierOf(element) {
|
|
1159
|
+
var placement = element.Placement;
|
|
1160
|
+
if (!placement) return undefined;
|
|
1161
|
+
if (this.findCarrier) return this.findCarrier(placement);
|
|
1162
|
+
return this.getElementByBasketId(placement.carrierBasketId);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
// Whether every main element of the group is a guest at a carrier outside it: the group goes with its carrier.
|
|
1166
|
+
}, {
|
|
1167
|
+
key: "followsCarrier",
|
|
1168
|
+
value: function followsCarrier(group) {
|
|
1169
|
+
var _this14 = this;
|
|
1170
|
+
var mains = group.filter(function (member) {
|
|
1171
|
+
return !member.IsAccessoire;
|
|
1172
|
+
});
|
|
1173
|
+
return mains.length > 0 && mains.every(function (member) {
|
|
1174
|
+
var carrier = _this14.getCarrierOf(member);
|
|
1175
|
+
return !!carrier && !group.includes(carrier);
|
|
1176
|
+
});
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
/**
|
|
1180
|
+
* The guests of this set that go with `members`: those standing at one of them, and the guests of those (at most
|
|
1181
|
+
* MAX_GUEST_DEPTH carriers deep), each with its docking group; never one of `members`.
|
|
1182
|
+
*/
|
|
1183
|
+
}, {
|
|
1184
|
+
key: "getFollowers",
|
|
1185
|
+
value: function getFollowers(members) {
|
|
1186
|
+
var _this15 = this;
|
|
1187
|
+
var unit = new Set(members);
|
|
1188
|
+
var followers = [];
|
|
1189
|
+
var carriers = members;
|
|
1190
|
+
for (var depth = 0; depth < MAX_GUEST_DEPTH && carriers.length > 0; depth++) {
|
|
1191
|
+
var guests = this.getAllPlannerElements().filter(function (element) {
|
|
1192
|
+
var carrier = !unit.has(element) && _this15.getCarrierOf(element);
|
|
1193
|
+
return !!carrier && carriers.includes(carrier);
|
|
1194
|
+
});
|
|
1195
|
+
var next = _toConsumableArray(new Set(guests.flatMap(function (guest) {
|
|
1196
|
+
return _this15.getDockingGroupOf(guest);
|
|
1197
|
+
}))).filter(function (element) {
|
|
1198
|
+
return !unit.has(element);
|
|
1199
|
+
});
|
|
1200
|
+
next.forEach(function (element) {
|
|
1201
|
+
return unit.add(element);
|
|
1202
|
+
});
|
|
1203
|
+
followers.push.apply(followers, _toConsumableArray(next));
|
|
1204
|
+
carriers = next;
|
|
1205
|
+
}
|
|
1206
|
+
return followers;
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
/** The ids of the element's docking group, the element included. */
|
|
1210
|
+
}, {
|
|
1211
|
+
key: "getDockingGroupIds",
|
|
1212
|
+
value: function getDockingGroupIds(elementId) {
|
|
1213
|
+
var element = this.plannerElements.get(elementId);
|
|
1214
|
+
return element ? this.getDockingGroupOf(element).map(function (member) {
|
|
1215
|
+
return member.ElementId;
|
|
1216
|
+
}) : [];
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
/** The element's first placement type; undefined for an accessory or an article without one. */
|
|
1220
|
+
}, {
|
|
1221
|
+
key: "getGuestType",
|
|
1222
|
+
value: function getGuestType(elementId) {
|
|
1223
|
+
var element = this.plannerElements.get(elementId);
|
|
1224
|
+
return element && !element.IsAccessoire ? this.getPlacementTypes(element)[0] : undefined;
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
/** The main elements of every docking group as slot carriers (see `getSlotMembers`), but groups holding one of `excludeIds`. */
|
|
1228
|
+
}, {
|
|
1229
|
+
key: "getSlotCarriers",
|
|
1230
|
+
value: function getSlotCarriers(excludeIds) {
|
|
1231
|
+
var _this16 = this;
|
|
1232
|
+
return getDockingGroups(this.getAllPlannerElements()).filter(function (group) {
|
|
1233
|
+
return !group.some(function (member) {
|
|
1234
|
+
return excludeIds.includes(member.ElementId);
|
|
1235
|
+
});
|
|
1236
|
+
}).map(function (group) {
|
|
1237
|
+
return _this16.getSlotMembers(group);
|
|
1238
|
+
}).filter(function (members) {
|
|
1239
|
+
return members.length > 0;
|
|
1240
|
+
});
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
/** Moves the element's docking group rigidly so the element stands at `pose` (a guest following its carrier). */
|
|
1244
|
+
}, {
|
|
1245
|
+
key: "moveGuest",
|
|
1246
|
+
value: function moveGuest(elementId, pose) {
|
|
1247
|
+
var element = this.plannerElements.get(elementId);
|
|
1248
|
+
if (element) moveGroupRigidly(this.getDockingGroupOf(element), poseOf(element), pose);
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
/** After guests moved: position numbers, the collision warning and the bounding box follow. */
|
|
1252
|
+
}, {
|
|
1253
|
+
key: "refreshAfterGuestMoves",
|
|
1254
|
+
value: function refreshAfterGuestMoves() {
|
|
1255
|
+
this.updatePlannerPosNr();
|
|
1256
|
+
this.checkCollision(false);
|
|
1257
|
+
this.updatePlannerBoundingBox();
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
/**
|
|
1261
|
+
* Whether the element's docking group, moved so the element stands at `pose`, runs a body into another body of this set
|
|
1262
|
+
* or of `otherSets` (a zone does not count, a slot guest at its carrier as everywhere); the group stays where it is.
|
|
1263
|
+
*/
|
|
1264
|
+
}, {
|
|
1265
|
+
key: "isBodyBlockedAt",
|
|
1266
|
+
value: function isBodyBlockedAt(elementId, pose, otherSets) {
|
|
1267
|
+
var element = this.plannerElements.get(elementId);
|
|
1268
|
+
if (!element) return true;
|
|
1269
|
+
var group = this.getDockingGroupOf(element);
|
|
1270
|
+
var saved = group.map(function (member) {
|
|
1271
|
+
return {
|
|
1272
|
+
member: member,
|
|
1273
|
+
center: member.WorldPosCenter,
|
|
1274
|
+
rotDeg: member.RotDeg
|
|
1275
|
+
};
|
|
1276
|
+
});
|
|
1277
|
+
moveGroupRigidly(group, poseOf(element), pose);
|
|
1278
|
+
var drag = this.createRoomDrag(elementId, false, otherSets);
|
|
1279
|
+
if (drag) drag.zonesBlock = false;
|
|
1280
|
+
var blocked = !!drag && this.isBlocked(drag, drag.start);
|
|
1281
|
+
var _iterator9 = _createForOfIteratorHelper(saved),
|
|
1282
|
+
_step9;
|
|
1283
|
+
try {
|
|
1284
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
|
1285
|
+
var _step9$value = _step9.value,
|
|
1286
|
+
member = _step9$value.member,
|
|
1287
|
+
center = _step9$value.center,
|
|
1288
|
+
rotDeg = _step9$value.rotDeg;
|
|
1289
|
+
member.WorldPosCenter = center;
|
|
1290
|
+
member.RotDeg = rotDeg;
|
|
1291
|
+
}
|
|
1292
|
+
} catch (err) {
|
|
1293
|
+
_iterator9.e(err);
|
|
1294
|
+
} finally {
|
|
1295
|
+
_iterator9.f();
|
|
1296
|
+
}
|
|
1297
|
+
return blocked;
|
|
1298
|
+
}
|
|
1299
|
+
}, {
|
|
1300
|
+
key: "startRoomDrag",
|
|
1301
|
+
value: function startRoomDrag(elementId) {
|
|
1302
|
+
this.roomDrag = undefined;
|
|
1303
|
+
var drag = this.createRoomDrag(elementId);
|
|
1304
|
+
if (!drag) return;
|
|
1305
|
+
drag.zonesBlock = false;
|
|
1306
|
+
var moved = this.movedShapes(drag, drag.start);
|
|
1307
|
+
var _iterator10 = _createForOfIteratorHelper(drag.obstacles),
|
|
1308
|
+
_step10;
|
|
1309
|
+
try {
|
|
1310
|
+
var _loop = function _loop() {
|
|
1311
|
+
var obstacle = _step10.value;
|
|
1312
|
+
// A guest standing in its slot as far under its carrier as the slot lets it (a chair at the table) overlaps by right.
|
|
1313
|
+
var depths = moved.map(function (member) {
|
|
1314
|
+
var _obstacle$rules;
|
|
1315
|
+
return slotExempt(drag.rules, member, (_obstacle$rules = obstacle.rules) !== null && _obstacle$rules !== void 0 ? _obstacle$rules : drag.rules, obstacle) ? 0 : bodiesOverlap(member.shape, obstacle.shape);
|
|
1316
|
+
});
|
|
1317
|
+
if (depths.some(function (depth) {
|
|
1318
|
+
return depth > 0;
|
|
1319
|
+
})) drag.startOverlaps.set(obstacle, depths);
|
|
1320
|
+
};
|
|
1321
|
+
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
|
|
1322
|
+
_loop();
|
|
1323
|
+
}
|
|
1324
|
+
} catch (err) {
|
|
1325
|
+
_iterator10.e(err);
|
|
1326
|
+
} finally {
|
|
1327
|
+
_iterator10.f();
|
|
1328
|
+
}
|
|
1329
|
+
this.roomDrag = drag;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
/**
|
|
1333
|
+
* The element's group as one block where it stands, with its followers (see `getFollowers`): the members' and the
|
|
1334
|
+
* followers' shapes and every obstacle but them; not started. A forced group's block is its own, any other group's
|
|
1335
|
+
* takes in the followers, so the room rule keeps them inside too.
|
|
1336
|
+
*/
|
|
1337
|
+
}, {
|
|
1338
|
+
key: "createRoomDrag",
|
|
1339
|
+
value: function createRoomDrag(elementId) {
|
|
1340
|
+
var _this17 = this;
|
|
1341
|
+
var measured = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
1342
|
+
var otherSets = arguments.length > 2 ? arguments[2] : undefined;
|
|
1343
|
+
var element = this.plannerElements.get(elementId);
|
|
1344
|
+
if (!element) return undefined;
|
|
1345
|
+
var members = this.getDockingGroupOf(element);
|
|
1346
|
+
if (members.every(function (member) {
|
|
1347
|
+
return member.IsAccessoire;
|
|
1348
|
+
})) return undefined;
|
|
1349
|
+
var followers = this.getFollowers(members);
|
|
1350
|
+
var wallMode = this.getGroupWallMode(members);
|
|
1351
|
+
var frame = this.getRoomFrame(members, element);
|
|
1352
|
+
var start = wallMode === 'forced' ? this.getRoomBlock(members, frame) : getGroupBlock([].concat(_toConsumableArray(members), _toConsumableArray(followers)), frame.RotDeg);
|
|
1353
|
+
var position = element.WorldPosCenter;
|
|
1354
|
+
var followerShapes = getDockingGroups(followers).filter(function (group) {
|
|
1355
|
+
return _this17.collides(group);
|
|
1356
|
+
}).flatMap(function (group) {
|
|
1357
|
+
return _this17.getCollidingShapes(group, measured);
|
|
1358
|
+
});
|
|
1359
|
+
var memberShapes = this.collides(members) ? this.getCollidingShapes(members, measured) : [];
|
|
1360
|
+
var drag = {
|
|
1361
|
+
elementId: elementId,
|
|
1362
|
+
members: members,
|
|
1363
|
+
followers: followers,
|
|
1364
|
+
start: start,
|
|
1365
|
+
current: start,
|
|
1366
|
+
grabbedStart: {
|
|
1367
|
+
x: position.x,
|
|
1368
|
+
z: position.z
|
|
1369
|
+
},
|
|
1370
|
+
grabbedStartRotDeg: element.RotDeg,
|
|
1371
|
+
dx: 0,
|
|
1372
|
+
dz: 0,
|
|
1373
|
+
wallMode: wallMode,
|
|
1374
|
+
shapes: this.collides(members) ? [].concat(_toConsumableArray(memberShapes), _toConsumableArray(followerShapes)) : [],
|
|
1375
|
+
memberShapes: memberShapes.length,
|
|
1376
|
+
obstacles: this.getObstacles(members, measured, [].concat(_toConsumableArray(members), _toConsumableArray(followers)), otherSets),
|
|
1377
|
+
blockedBy: [],
|
|
1378
|
+
startOverlaps: new Map(),
|
|
1379
|
+
rules: this.getCatalogData().placementOptions.rules,
|
|
1380
|
+
zonesBlock: true,
|
|
1381
|
+
rotating: false,
|
|
1382
|
+
slotSnapped: false
|
|
1383
|
+
};
|
|
1384
|
+
return drag;
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
/**
|
|
1388
|
+
* A group placed beside the planning, or by the room rules, that stands on another group (of this set or another set in
|
|
1389
|
+
* the room) or in a door's clearance goes to the nearest free pose, by the room rule of its wall mode, and slides back
|
|
1390
|
+
* until it touches what it was cleared of. It stays where it is when the room has no free pose for it.
|
|
1391
|
+
*/
|
|
1392
|
+
}, {
|
|
1393
|
+
key: "moveClearOfObstacles",
|
|
1394
|
+
value: function moveClearOfObstacles(elementId, room) {
|
|
1395
|
+
var drag = this.createRoomDrag(elementId);
|
|
1396
|
+
if (!drag || !this.isBlocked(drag, drag.start)) return;
|
|
1397
|
+
var _drag$start = drag.start,
|
|
1398
|
+
block = _drag$start.block,
|
|
1399
|
+
rotDeg = _drag$start.rotDeg;
|
|
1400
|
+
_drag$start.center;
|
|
1401
|
+
var poseAt = function poseAt(raw) {
|
|
1402
|
+
return drag.wallMode === 'forced' ? bindToWalls(raw, block, room) : insidePose(block, {
|
|
1403
|
+
center: raw,
|
|
1404
|
+
rotDeg: rotDeg
|
|
1405
|
+
}, room);
|
|
1406
|
+
};
|
|
1407
|
+
var xs = room.footprint.map(function (_ref6) {
|
|
1408
|
+
var _ref7 = _slicedToArray(_ref6, 1),
|
|
1409
|
+
x = _ref7[0];
|
|
1410
|
+
return x;
|
|
1411
|
+
});
|
|
1412
|
+
var zs = room.footprint.map(function (_ref8) {
|
|
1413
|
+
var _ref9 = _slicedToArray(_ref8, 2),
|
|
1414
|
+
z = _ref9[1];
|
|
1415
|
+
return z;
|
|
1416
|
+
});
|
|
1417
|
+
var reach = Math.hypot(Math.max.apply(Math, _toConsumableArray(xs)) - Math.min.apply(Math, _toConsumableArray(xs)), Math.max.apply(Math, _toConsumableArray(zs)) - Math.min.apply(Math, _toConsumableArray(zs)));
|
|
1418
|
+
var target = this.nearestFreePose(drag, drag.start, poseAt, reach);
|
|
1419
|
+
if (target) moveGroupRigidly([].concat(_toConsumableArray(drag.members), _toConsumableArray(drag.followers)), drag.start, target);
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
// Of the free poses on the first ring around `origin` that has one, slid back until they touch, the nearest one.
|
|
1423
|
+
}, {
|
|
1424
|
+
key: "nearestFreePose",
|
|
1425
|
+
value: function nearestFreePose(drag, origin, poseAt, reach) {
|
|
1426
|
+
var center = origin.center;
|
|
1427
|
+
for (var radius = CLEAR_SEARCH_STEP; radius <= reach; radius += CLEAR_SEARCH_STEP) {
|
|
1428
|
+
var nearest = void 0;
|
|
1429
|
+
for (var i = 0; i < CLEAR_SEARCH_DIRECTIONS; i++) {
|
|
1430
|
+
var _this$slideToContact;
|
|
1431
|
+
var angle = i / CLEAR_SEARCH_DIRECTIONS * 2 * Math.PI;
|
|
1432
|
+
var pose = poseAt({
|
|
1433
|
+
x: center.x + radius * Math.cos(angle),
|
|
1434
|
+
z: center.z + radius * Math.sin(angle)
|
|
1435
|
+
});
|
|
1436
|
+
if (!pose || this.isBlocked(drag, pose)) continue;
|
|
1437
|
+
drag.current = pose;
|
|
1438
|
+
var slid = (_this$slideToContact = this.slideToContact(drag, origin)) === null || _this$slideToContact === void 0 ? void 0 : _this$slideToContact.pose;
|
|
1439
|
+
// The way back may cross a notch of the room: the slid pose counts only where the room rule keeps it.
|
|
1440
|
+
var kept = slid && poseAt(slid.center);
|
|
1441
|
+
var target = slid && kept && Math.hypot(kept.center.x - slid.center.x, kept.center.z - slid.center.z) < 0.5 ? slid : pose;
|
|
1442
|
+
var distance = Math.hypot(target.center.x - center.x, target.center.z - center.z);
|
|
1443
|
+
if (!nearest || distance < nearest.distance - START_NOISE) nearest = {
|
|
1444
|
+
pose: target,
|
|
1445
|
+
distance: distance
|
|
1446
|
+
};
|
|
1447
|
+
}
|
|
1448
|
+
if (nearest) return nearest.pose;
|
|
1449
|
+
}
|
|
1450
|
+
return undefined;
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
/**
|
|
1454
|
+
* Puts a new element at the first free place a slot of the `isCarrier` groups suggests (lowest PosNr first, planner
|
|
1455
|
+
* data only), numbers it last (PosNrAtEnd) and makes it a guest of the carrier (see `attachToSlot`); false, the element
|
|
1456
|
+
* unmoved, when no place is free.
|
|
1457
|
+
*/
|
|
1458
|
+
}, {
|
|
1459
|
+
key: "placeAtSuggestedPlace",
|
|
1460
|
+
value: function placeAtSuggestedPlace(element, isCarrier) {
|
|
1461
|
+
var _this18 = this;
|
|
1462
|
+
var _ref10 = element.IsAccessoire ? [] : this.getPlacementTypes(element),
|
|
1463
|
+
_ref11 = _slicedToArray(_ref10, 1),
|
|
1464
|
+
type = _ref11[0];
|
|
1465
|
+
if (!type) return false;
|
|
1466
|
+
var rules = this.getCatalogData().placementOptions.rules;
|
|
1467
|
+
var before = {
|
|
1468
|
+
center: {
|
|
1469
|
+
x: element.WorldPosCenter.x,
|
|
1470
|
+
z: element.WorldPosCenter.z
|
|
1471
|
+
},
|
|
1472
|
+
rotDeg: element.RotDeg
|
|
1473
|
+
};
|
|
1474
|
+
var body = getElementShape(element, false).body[0];
|
|
1475
|
+
var outline = function outline(rotDeg) {
|
|
1476
|
+
return movePoints(body, before, {
|
|
1477
|
+
center: {
|
|
1478
|
+
x: 0,
|
|
1479
|
+
z: 0
|
|
1480
|
+
},
|
|
1481
|
+
rotDeg: rotDeg
|
|
1482
|
+
});
|
|
1483
|
+
};
|
|
1484
|
+
var lowestPosNr = function lowestPosNr(group) {
|
|
1485
|
+
return Math.min.apply(Math, _toConsumableArray(group.map(function (member) {
|
|
1486
|
+
return member.PosNr;
|
|
1487
|
+
})));
|
|
1488
|
+
};
|
|
1489
|
+
var carriers = getDockingGroups(this.getAllPlannerElements().filter(function (other) {
|
|
1490
|
+
return other !== element;
|
|
1491
|
+
})).filter(function (group) {
|
|
1492
|
+
return isCarrier(group) && group.some(function (member) {
|
|
1493
|
+
return !member.IsAccessoire;
|
|
1494
|
+
});
|
|
1495
|
+
}).sort(function (a, b) {
|
|
1496
|
+
return lowestPosNr(a) - lowestPosNr(b);
|
|
1497
|
+
});
|
|
1498
|
+
var otherSets = carriers.length > 0 ? this.getOtherCollisionSets() : [];
|
|
1499
|
+
var _iterator11 = _createForOfIteratorHelper(carriers),
|
|
1500
|
+
_step11;
|
|
1501
|
+
try {
|
|
1502
|
+
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
|
|
1503
|
+
var group = _step11.value;
|
|
1504
|
+
var _iterator12 = _createForOfIteratorHelper(getCarrierSlots(rules, this.getSlotMembers(group), type)),
|
|
1505
|
+
_step12;
|
|
1506
|
+
try {
|
|
1507
|
+
for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
|
|
1508
|
+
var slot = _step12.value;
|
|
1509
|
+
if (!getSlotPlaces(slot, outline).some(function (place) {
|
|
1510
|
+
return _this18.fitsAt(element, place, otherSets);
|
|
1511
|
+
})) continue;
|
|
1512
|
+
element.PosNrAtEnd = true;
|
|
1513
|
+
this.attachToSlot(element, slot);
|
|
1514
|
+
return true;
|
|
1515
|
+
}
|
|
1516
|
+
} catch (err) {
|
|
1517
|
+
_iterator12.e(err);
|
|
1518
|
+
} finally {
|
|
1519
|
+
_iterator12.f();
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
} catch (err) {
|
|
1523
|
+
_iterator11.e(err);
|
|
1524
|
+
} finally {
|
|
1525
|
+
_iterator11.f();
|
|
1526
|
+
}
|
|
1527
|
+
element.WorldPosCenter = new Vector3(before.center.x, element.WorldPosCenter.y, before.center.z);
|
|
1528
|
+
element.RotDeg = before.rotDeg;
|
|
1529
|
+
return false;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
// Makes the element a guest of the member of `slot` nearest to it: it goes with that carrier from now on. Not when the
|
|
1533
|
+
// carrier is a guest MAX_GUEST_DEPTH deep itself.
|
|
1534
|
+
}, {
|
|
1535
|
+
key: "attachToSlot",
|
|
1536
|
+
value: function attachToSlot(element, slot) {
|
|
1537
|
+
var _getNearestMember;
|
|
1538
|
+
var basketId = (_getNearestMember = getNearestMember(slot, poseOf(element).center)) === null || _getNearestMember === void 0 ? void 0 : _getNearestMember.basketId;
|
|
1539
|
+
var carrier = basketId ? this.getElementByBasketId(basketId) : undefined;
|
|
1540
|
+
if (!basketId || !carrier || this.getGuestDepth(carrier) >= MAX_GUEST_DEPTH) return;
|
|
1541
|
+
var offset = toPlacementOffset(poseOf(carrier), poseOf(element));
|
|
1542
|
+
element.Placement = {
|
|
1543
|
+
carrierBasketId: basketId,
|
|
1544
|
+
slotId: slot.id,
|
|
1545
|
+
offset: offset
|
|
1546
|
+
};
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
// How many carriers stand above the element: 0 on its own, 1 at a carrier on its own, …
|
|
1550
|
+
}, {
|
|
1551
|
+
key: "getGuestDepth",
|
|
1552
|
+
value: function getGuestDepth(element) {
|
|
1553
|
+
var depth = 0;
|
|
1554
|
+
for (var carrier = this.getCarrierOf(element); carrier && depth <= MAX_GUEST_DEPTH; carrier = this.getCarrierOf(carrier)) depth++;
|
|
1555
|
+
return depth;
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
// Moves the element to `pose` as the room rule keeps it; whether it fits there: the rule moves it no further than the
|
|
1559
|
+
// tolerance and it collides with nothing of this set or of `otherSets`.
|
|
1560
|
+
}, {
|
|
1561
|
+
key: "fitsAt",
|
|
1562
|
+
value: function fitsAt(element, pose, otherSets) {
|
|
1563
|
+
element.WorldPosCenter = new Vector3(pose.center.x, this.plannerBoundingBox.WorldPos.y, pose.center.z);
|
|
1564
|
+
element.RotDeg = pose.rotDeg;
|
|
1565
|
+
var drag = this.createRoomDrag(element.ElementId, false, otherSets);
|
|
1566
|
+
var kept = drag && this.getKeptPose(drag);
|
|
1567
|
+
if (!drag || !kept) return false;
|
|
1568
|
+
moveGroupRigidly(drag.members, drag.start, kept);
|
|
1569
|
+
return !this.isBlocked(drag, kept);
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1572
|
+
// Where the room rule of its wall mode keeps the drag's group standing at `pose` (no room: the pose); undefined when it
|
|
1573
|
+
// would move the group further than `tolerance`, turn it, or fit it on no wall.
|
|
1574
|
+
}, {
|
|
1575
|
+
key: "getKeptPose",
|
|
1576
|
+
value: function getKeptPose(drag) {
|
|
1577
|
+
var pose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : drag.start;
|
|
1578
|
+
var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : PLACE_TOLERANCE;
|
|
1579
|
+
var room = this.room;
|
|
1580
|
+
if (!room) return pose;
|
|
1581
|
+
var block = drag.start.block;
|
|
1582
|
+
var center = pose.center,
|
|
1583
|
+
rotDeg = pose.rotDeg;
|
|
1584
|
+
var kept = drag.wallMode === 'forced' ? bindToWalls(center, block, room) : insidePose(block, pose, room);
|
|
1585
|
+
if (!kept || Math.hypot(kept.center.x - center.x, kept.center.z - center.z) > tolerance) return undefined;
|
|
1586
|
+
return Math.abs(getTurnDeg(rotDeg, kept.rotDeg)) > 0.01 ? undefined : kept;
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
// The colliding members and followers of the dragged group, moved with it to `pose`, each group's carrier outlines too.
|
|
1590
|
+
}, {
|
|
1591
|
+
key: "movedShapes",
|
|
1592
|
+
value: function movedShapes(drag, pose) {
|
|
1593
|
+
var movedGroups = new Map();
|
|
1594
|
+
return drag.shapes.map(function (member) {
|
|
1595
|
+
var _movedGroups$get;
|
|
1596
|
+
var group = (_movedGroups$get = movedGroups.get(member.group)) !== null && _movedGroups$get !== void 0 ? _movedGroups$get : member.group.map(function (slotMember) {
|
|
1597
|
+
return moveSlotMember(slotMember, drag.start, pose);
|
|
1598
|
+
});
|
|
1599
|
+
movedGroups.set(member.group, group);
|
|
1600
|
+
return _objectSpread(_objectSpread({}, member), {}, {
|
|
1601
|
+
shape: moveShape(member.shape, drag.start, pose),
|
|
1602
|
+
group: group
|
|
1603
|
+
});
|
|
1604
|
+
});
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
// Whether a member collides with an obstacle: body against body (a pair that overlapped at the start once it gets
|
|
1608
|
+
// deeper), and where zones block, a body in the other's free area. A guest standing in a slot of its carrier's group may
|
|
1609
|
+
// stand in the carrier's free area (a hocker in front of the sofa), and reach under its body as far as the slot lets it
|
|
1610
|
+
// (a chair's seat under the table top). Two layers only as the catalog lets them collide, as in the collision warning.
|
|
1611
|
+
}, {
|
|
1612
|
+
key: "overlapsAny",
|
|
1613
|
+
value: function overlapsAny(moved, obstacle, drag) {
|
|
1614
|
+
var startDepths = drag.startOverlaps.get(obstacle);
|
|
1615
|
+
var collidingLayers = this.getCatalogData().checkCollisionForDifferentLayers;
|
|
1616
|
+
return moved.some(function (member, i) {
|
|
1617
|
+
var _obstacle$rules2;
|
|
1618
|
+
if (obstacle.layer !== undefined && !layersCollide(collidingLayers, member.layer, obstacle.layer)) return false;
|
|
1619
|
+
if (startDepths) return bodiesOverlap(member.shape, obstacle.shape) > startDepths[i] + DEPTH_NOISE;
|
|
1620
|
+
return shapesCollide(member.shape, obstacle.shape, !drag.zonesBlock) && !slotExempt(drag.rules, member, (_obstacle$rules2 = obstacle.rules) !== null && _obstacle$rules2 !== void 0 ? _obstacle$rules2 : drag.rules, obstacle);
|
|
1621
|
+
});
|
|
1622
|
+
}
|
|
1623
|
+
}, {
|
|
1624
|
+
key: "isBlocked",
|
|
1625
|
+
value: function isBlocked(drag, pose) {
|
|
1626
|
+
var _this19 = this;
|
|
1627
|
+
var moved = this.movedShapes(drag, pose);
|
|
1628
|
+
return drag.obstacles.some(function (obstacle) {
|
|
1629
|
+
return _this19.overlapsAny(moved, obstacle, drag);
|
|
1630
|
+
});
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
// The obstacles the group runs into at `pose`.
|
|
1634
|
+
}, {
|
|
1635
|
+
key: "blockersAt",
|
|
1636
|
+
value: function blockersAt(drag, pose) {
|
|
1637
|
+
var _this20 = this;
|
|
1638
|
+
var moved = this.movedShapes(drag, pose);
|
|
1639
|
+
return drag.obstacles.filter(function (obstacle) {
|
|
1640
|
+
return _this20.overlapsAny(moved, obstacle, drag);
|
|
1641
|
+
});
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
// The straight way from the current pose to `target`, checked every PATH_STEP and cut at the first contact: the
|
|
1645
|
+
// furthest free pose before it (none when the group cannot move at all), so a blocked group ends up touching, and the
|
|
1646
|
+
// obstacles it runs into just beyond; `target` and none when the whole way is free. Undefined when the way turns the group.
|
|
1647
|
+
}, {
|
|
1648
|
+
key: "slideToContact",
|
|
1649
|
+
value: function slideToContact(drag, target) {
|
|
1650
|
+
if (Math.abs(getTurnDeg(drag.current.rotDeg, target.rotDeg)) > 0.01) return undefined;
|
|
1651
|
+
var from = drag.current.center;
|
|
1652
|
+
var at = function at(s) {
|
|
1653
|
+
return {
|
|
1654
|
+
center: {
|
|
1655
|
+
x: from.x + (target.center.x - from.x) * s,
|
|
1656
|
+
z: from.z + (target.center.z - from.z) * s
|
|
1657
|
+
},
|
|
1658
|
+
rotDeg: target.rotDeg
|
|
1659
|
+
};
|
|
1660
|
+
};
|
|
1661
|
+
var steps = Math.max(1, Math.ceil(Math.hypot(target.center.x - from.x, target.center.z - from.z) / PATH_STEP));
|
|
1662
|
+
var free = 0;
|
|
1663
|
+
for (var step = 1; step <= steps; step++) {
|
|
1664
|
+
var blocked = step / steps;
|
|
1665
|
+
if (!this.isBlocked(drag, at(blocked))) {
|
|
1666
|
+
free = blocked;
|
|
1667
|
+
continue;
|
|
1668
|
+
}
|
|
1669
|
+
for (var i = 0; i < 12; i++) {
|
|
1670
|
+
var mid = (free + blocked) / 2;
|
|
1671
|
+
if (this.isBlocked(drag, at(mid))) blocked = mid;else free = mid;
|
|
1672
|
+
}
|
|
1673
|
+
return {
|
|
1674
|
+
pose: free > 0 ? at(free) : undefined,
|
|
1675
|
+
blockers: this.blockersAt(drag, at(blocked))
|
|
1676
|
+
};
|
|
1677
|
+
}
|
|
1678
|
+
return {
|
|
1679
|
+
pose: target,
|
|
1680
|
+
blockers: []
|
|
1681
|
+
};
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
// The group follows the grabbed element rigidly to the wall or inside-room pose of the raw centre, also where it runs
|
|
1685
|
+
// into an obstacle: what it runs into there is kept as `blockedBy` (the viewer shows the drag blocked, a release there
|
|
1686
|
+
// goes back to the start). A forced group that fits on no wall is kept inside the room like a free one. Back at the
|
|
1687
|
+
// start (a cancel, a blocked release) it stands exactly where it started, nothing snaps.
|
|
1688
|
+
}, {
|
|
1689
|
+
key: "updateRoomDrag",
|
|
1690
|
+
value: function updateRoomDrag(room, drag, deltaMove) {
|
|
1691
|
+
drag.dx += deltaMove.x;
|
|
1692
|
+
drag.dz += deltaMove.z;
|
|
1693
|
+
var _drag$start2 = drag.start,
|
|
1694
|
+
block = _drag$start2.block,
|
|
1695
|
+
rotDeg = _drag$start2.rotDeg;
|
|
1696
|
+
var rawCenter = {
|
|
1697
|
+
x: drag.start.center.x + drag.dx,
|
|
1698
|
+
z: drag.start.center.z + drag.dz
|
|
1699
|
+
};
|
|
1700
|
+
var atStart = Math.hypot(drag.dx, drag.dz) <= START_NOISE;
|
|
1701
|
+
// A free slot place near the pointer comes before the wall.
|
|
1702
|
+
var slotPose = atStart ? undefined : this.getSlotSnapPose(drag);
|
|
1703
|
+
var wallPose = atStart || slotPose || drag.wallMode === 'free' ? null : bindToWalls(rawCenter, block, room);
|
|
1704
|
+
var snapsToWall = !!wallPose && Math.hypot(wallPose.center.x - rawCenter.x, wallPose.center.z - rawCenter.z) <= WALL_SNAP_DISTANCE;
|
|
1705
|
+
var startPose = {
|
|
1706
|
+
center: drag.start.center,
|
|
1707
|
+
rotDeg: rotDeg
|
|
1708
|
+
};
|
|
1709
|
+
var wanted = atStart ? startPose : slotPose !== null && slotPose !== void 0 ? slotPose : wallPose && (drag.wallMode === 'forced' || snapsToWall) ? wallPose : insidePose(block, {
|
|
1710
|
+
center: rawCenter,
|
|
1711
|
+
rotDeg: rotDeg
|
|
1712
|
+
}, room);
|
|
1713
|
+
drag.blockedBy = this.blockersAt(drag, wanted);
|
|
1714
|
+
moveGroupRigidly([].concat(_toConsumableArray(drag.members), _toConsumableArray(drag.followers)), drag.current, wanted);
|
|
1715
|
+
drag.current = wanted;
|
|
1716
|
+
drag.slotSnapped = !!slotPose;
|
|
1717
|
+
// A pair that overlapped at the start may only come apart, never go back in.
|
|
1718
|
+
if (drag.startOverlaps.size === 0) return;
|
|
1719
|
+
var moved = this.movedShapes(drag, wanted);
|
|
1720
|
+
drag.startOverlaps.forEach(function (depths, obstacle) {
|
|
1721
|
+
return drag.startOverlaps.set(obstacle, depths.map(function (depth, i) {
|
|
1722
|
+
return Math.min(depth, bodiesOverlap(moved[i].shape, obstacle.shape));
|
|
1723
|
+
}));
|
|
1724
|
+
});
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
// The unit moved rigidly onto the nearest dock of `element` outside it (see findDockSnap), else with `slots` into the
|
|
1728
|
+
// nearest free slot place (see findSlotSnap).
|
|
1729
|
+
}, {
|
|
1730
|
+
key: "snapToDock",
|
|
1731
|
+
value: function snapToDock(element, unit, autoDockingDistance, slots) {
|
|
1732
|
+
var _this$findDockSnap2;
|
|
1733
|
+
var unitIds = unit.map(function (member) {
|
|
1734
|
+
return member.ElementId;
|
|
1735
|
+
});
|
|
1736
|
+
var snap = (_this$findDockSnap2 = this.findDockSnap(element, autoDockingDistance, unitIds)) !== null && _this$findDockSnap2 !== void 0 ? _this$findDockSnap2 : slots ? this.findSlotSnap(element) : null;
|
|
1737
|
+
if (!snap) return;
|
|
1738
|
+
var move = this.snapMove(element, snap);
|
|
1739
|
+
moveGroupRigidly(unit, move.from, move.to);
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
// The unit of a drag starting at the element: in a room the drag's group, else the element (the viewer's UPDATEs add the
|
|
1743
|
+
// rest of its group), with the guests that go along; and the free slot places it may snap into.
|
|
1744
|
+
}, {
|
|
1745
|
+
key: "startDragUnit",
|
|
1746
|
+
value: function startDragUnit(elementId, roomDrag) {
|
|
1747
|
+
var _roomDrag$followers, _roomDrag$members$map;
|
|
1748
|
+
var element = this.plannerElements.get(elementId);
|
|
1749
|
+
var followers = (_roomDrag$followers = roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.followers) !== null && _roomDrag$followers !== void 0 ? _roomDrag$followers : element ? this.getFollowers(this.getDockingGroupOf(element)) : [];
|
|
1750
|
+
this.dragFollowers = new Set(followers.map(function (follower) {
|
|
1751
|
+
return follower.ElementId;
|
|
1752
|
+
}));
|
|
1753
|
+
this.dragUnit = new Set([elementId].concat(_toConsumableArray((_roomDrag$members$map = roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.members.map(function (member) {
|
|
1754
|
+
return member.ElementId;
|
|
1755
|
+
})) !== null && _roomDrag$members$map !== void 0 ? _roomDrag$members$map : []), _toConsumableArray(this.dragFollowers)));
|
|
1756
|
+
var unit = element ? [].concat(_toConsumableArray(this.getDockingGroupOf(element)), _toConsumableArray(followers)) : [];
|
|
1757
|
+
this.dragSlots = element ? {
|
|
1758
|
+
elementId: elementId,
|
|
1759
|
+
start: poseOf(element).center,
|
|
1760
|
+
places: this.findDragSlotPlaces(element, unit)
|
|
1761
|
+
} : undefined;
|
|
1762
|
+
}
|
|
1763
|
+
|
|
1764
|
+
// Where the group shows against where the pointer put the grabbed element, and what it runs into there.
|
|
1765
|
+
}, {
|
|
1766
|
+
key: "getRoomDragPreview",
|
|
1767
|
+
value: function getRoomDragPreview(element, drag) {
|
|
1768
|
+
var position = element.WorldPosCenter;
|
|
1769
|
+
var preview = {
|
|
1770
|
+
dx: position.x - (drag.grabbedStart.x + drag.dx),
|
|
1771
|
+
dz: position.z - (drag.grabbedStart.z + drag.dz),
|
|
1772
|
+
dRotDeg: getTurnDeg(drag.start.rotDeg, element.RotDeg)
|
|
1773
|
+
};
|
|
1774
|
+
return this.withDragBlock(preview, drag);
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
// What a free group being turned runs into where it is turned now (it moves no further than the turn: no offset). Only
|
|
1778
|
+
// its members count: a guest swung into a body leaves its carrier on release instead (see DivaPlannerHandler).
|
|
1779
|
+
}, {
|
|
1780
|
+
key: "getRoomTurnPreview",
|
|
1781
|
+
value: function getRoomTurnPreview(element, drag) {
|
|
1782
|
+
var members = _objectSpread(_objectSpread({}, drag), {}, {
|
|
1783
|
+
shapes: drag.shapes.slice(0, drag.memberShapes)
|
|
1784
|
+
});
|
|
1785
|
+
drag.blockedBy = this.blockersAt(members, this.getTurnedPose(element, drag));
|
|
1786
|
+
return this.withDragBlock({
|
|
1787
|
+
dx: 0,
|
|
1788
|
+
dz: 0,
|
|
1789
|
+
dRotDeg: 0
|
|
1790
|
+
}, drag);
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
// A blocked turn's release: at its angle, the nearest free place inside the room within reach; undefined when none.
|
|
1794
|
+
}, {
|
|
1795
|
+
key: "findTurnPlace",
|
|
1796
|
+
value: function findTurnPlace(element, drag, room) {
|
|
1797
|
+
var turned = this.getTurnedPose(element, drag);
|
|
1798
|
+
var block = drag.start.block;
|
|
1799
|
+
var members = _objectSpread(_objectSpread({}, drag), {}, {
|
|
1800
|
+
shapes: drag.shapes.slice(0, drag.memberShapes),
|
|
1801
|
+
current: turned
|
|
1802
|
+
});
|
|
1803
|
+
if (!this.isBlocked(members, turned)) return turned;
|
|
1804
|
+
var poseAt = function poseAt(raw) {
|
|
1805
|
+
return insidePose(block, {
|
|
1806
|
+
center: raw,
|
|
1807
|
+
rotDeg: turned.rotDeg
|
|
1808
|
+
}, room);
|
|
1809
|
+
};
|
|
1810
|
+
return this.nearestFreePose(members, turned, poseAt, Math.max(TURN_PLACE_REACH, 2 * Math.max(block.halfWidth, block.halfDepth)));
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
// The pose of the group's block where the grabbed element stands now, moved with it rigidly from the start.
|
|
1814
|
+
}, {
|
|
1815
|
+
key: "getTurnedPose",
|
|
1816
|
+
value: function getTurnedPose(element, drag) {
|
|
1817
|
+
return movePose(drag.start, {
|
|
1818
|
+
center: drag.grabbedStart,
|
|
1819
|
+
rotDeg: drag.grabbedStartRotDeg
|
|
1820
|
+
}, poseOf(element));
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
// `preview` with what the group runs into (`blockedBy`): the elements, and whether a door's clearance; as it is while free.
|
|
1824
|
+
}, {
|
|
1825
|
+
key: "withDragBlock",
|
|
1826
|
+
value: function withDragBlock(preview, drag) {
|
|
1827
|
+
if (drag.blockedBy.length === 0) return preview;
|
|
1828
|
+
var ownSetId = this.set.getSetId();
|
|
1829
|
+
var elements = [];
|
|
1830
|
+
var _iterator13 = _createForOfIteratorHelper(drag.blockedBy),
|
|
1831
|
+
_step13;
|
|
1832
|
+
try {
|
|
1833
|
+
var _loop2 = function _loop2() {
|
|
1834
|
+
var _step13$value = _step13.value,
|
|
1835
|
+
_step13$value$setId = _step13$value.setId,
|
|
1836
|
+
setId = _step13$value$setId === void 0 ? ownSetId : _step13$value$setId,
|
|
1837
|
+
elementId = _step13$value.elementId;
|
|
1838
|
+
if (elementId !== undefined && !elements.some(function (element) {
|
|
1839
|
+
return element.setId === setId && element.elementId === elementId;
|
|
1840
|
+
})) elements.push({
|
|
1841
|
+
setId: setId,
|
|
1842
|
+
elementId: elementId
|
|
1843
|
+
});
|
|
1844
|
+
};
|
|
1845
|
+
for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
|
|
1846
|
+
_loop2();
|
|
1847
|
+
}
|
|
1848
|
+
} catch (err) {
|
|
1849
|
+
_iterator13.e(err);
|
|
1850
|
+
} finally {
|
|
1851
|
+
_iterator13.f();
|
|
1852
|
+
}
|
|
1853
|
+
return _objectSpread(_objectSpread({}, preview), {}, {
|
|
1854
|
+
blockedBy: {
|
|
1855
|
+
elements: elements,
|
|
1856
|
+
door: drag.blockedBy.some(function (obstacle) {
|
|
1857
|
+
return obstacle.elementId === undefined;
|
|
1858
|
+
})
|
|
1859
|
+
}
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1862
|
+
|
|
319
1863
|
/**
|
|
320
1864
|
* This function updates the position information of all elements. It is called after updating the SVG of 1 element.
|
|
321
1865
|
* The position is updated based on the posNr.
|
|
@@ -373,11 +1917,11 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
373
1917
|
var progressed = true;
|
|
374
1918
|
while (progressed) {
|
|
375
1919
|
progressed = false;
|
|
376
|
-
var
|
|
377
|
-
|
|
1920
|
+
var _iterator14 = _createForOfIteratorHelper(sortedPlannerElementsbyPosNr),
|
|
1921
|
+
_step14;
|
|
378
1922
|
try {
|
|
379
|
-
for (
|
|
380
|
-
var _element =
|
|
1923
|
+
for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
|
|
1924
|
+
var _element = _step14.value;
|
|
381
1925
|
if (!_element || moved.has(_element.ElementId)) continue;
|
|
382
1926
|
var dpToMovedPartner = getDockedDPsInPriorityOrder(_element).find(function (dp) {
|
|
383
1927
|
return moved.has(dp.OnElementId);
|
|
@@ -389,9 +1933,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
389
1933
|
}
|
|
390
1934
|
}
|
|
391
1935
|
} catch (err) {
|
|
392
|
-
|
|
1936
|
+
_iterator14.e(err);
|
|
393
1937
|
} finally {
|
|
394
|
-
|
|
1938
|
+
_iterator14.f();
|
|
395
1939
|
}
|
|
396
1940
|
}
|
|
397
1941
|
}
|
|
@@ -412,8 +1956,10 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
412
1956
|
key: "addElementToWorld",
|
|
413
1957
|
value: (function () {
|
|
414
1958
|
var _addElementToWorld = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(plannerElement, dockingPointInfos, suppressDock, globalBoundingBox) {
|
|
1959
|
+
var _this21 = this;
|
|
415
1960
|
var xOffset,
|
|
416
1961
|
setToTransform,
|
|
1962
|
+
placedBeside,
|
|
417
1963
|
_setToTransform$trans,
|
|
418
1964
|
worldPosCenter,
|
|
419
1965
|
height,
|
|
@@ -426,16 +1972,22 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
426
1972
|
targetDP,
|
|
427
1973
|
successDP,
|
|
428
1974
|
success,
|
|
429
|
-
|
|
1975
|
+
selectedId,
|
|
1976
|
+
atSelected,
|
|
1977
|
+
mayPlace,
|
|
1978
|
+
placed,
|
|
430
1979
|
_success,
|
|
1980
|
+
allPlannerElements,
|
|
431
1981
|
_args = arguments;
|
|
432
1982
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
433
1983
|
while (1) switch (_context.prev = _context.next) {
|
|
434
1984
|
case 0:
|
|
435
1985
|
xOffset = _args.length > 4 && _args[4] !== undefined ? _args[4] : 100;
|
|
436
1986
|
setToTransform = _args.length > 5 ? _args[5] : undefined;
|
|
1987
|
+
// Docked to nothing: put beside the planning, where it may land on another group in the room.
|
|
1988
|
+
placedBeside = false;
|
|
437
1989
|
if (!(setToTransform && setToTransform.forceSetToTrans)) {
|
|
438
|
-
_context.next =
|
|
1990
|
+
_context.next = 13;
|
|
439
1991
|
break;
|
|
440
1992
|
}
|
|
441
1993
|
// A switched element keeps the place of the old one; if that stood on the floor, the new one stands there too.
|
|
@@ -443,64 +1995,66 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
443
1995
|
stoodOnFloor = PlannerElementData.standsOnFloor(worldPosCenter.y, height);
|
|
444
1996
|
plannerElement.WorldPosCenter = stoodOnFloor && Number.isFinite(plannerElement.Height) ? new Vector3(worldPosCenter.x, plannerElement.Height / 2, worldPosCenter.z) : worldPosCenter;
|
|
445
1997
|
plannerElement.RotDeg = setToTransform.transform.rotDeg;
|
|
1998
|
+
plannerElement.PosNrAtEnd = !!setToTransform.transform.posNrAtEnd;
|
|
1999
|
+
plannerElement.Placement = setToTransform.transform.placement;
|
|
446
2000
|
this.set.onDockingChanged(plannerElement.ElementId, -1, 'NOT_DOCKED');
|
|
447
|
-
_context.next =
|
|
2001
|
+
_context.next = 52;
|
|
448
2002
|
break;
|
|
449
|
-
case
|
|
2003
|
+
case 13:
|
|
450
2004
|
//Nun unterscheidet man, ob man das Element zu einem bestimmten vorselektierten Element Docken will , zu einem vorselektierten DockingPoint oder an eine Freie Planung.
|
|
451
2005
|
dockingFound = false;
|
|
452
2006
|
if (!dockingPointInfos) {
|
|
453
|
-
_context.next =
|
|
2007
|
+
_context.next = 51;
|
|
454
2008
|
break;
|
|
455
2009
|
}
|
|
456
2010
|
i = 0;
|
|
457
|
-
case
|
|
2011
|
+
case 16:
|
|
458
2012
|
if (!(i < dockingPointInfos.length)) {
|
|
459
|
-
_context.next =
|
|
2013
|
+
_context.next = 51;
|
|
460
2014
|
break;
|
|
461
2015
|
}
|
|
462
2016
|
targetElemIdToDock = dockingPointInfos[i].targetElemIdToDock;
|
|
463
2017
|
targetDockingPointId = dockingPointInfos[i].targetDockingPointId;
|
|
464
2018
|
if (!(targetElemIdToDock && targetElemIdToDock > -1 && this.plannerElements.has(targetElemIdToDock))) {
|
|
465
|
-
_context.next =
|
|
2019
|
+
_context.next = 48;
|
|
466
2020
|
break;
|
|
467
2021
|
}
|
|
468
2022
|
if (!(targetDockingPointId && targetDockingPointId != '')) {
|
|
469
|
-
_context.next =
|
|
2023
|
+
_context.next = 37;
|
|
470
2024
|
break;
|
|
471
2025
|
}
|
|
472
2026
|
targetElem = this.plannerElements.get(targetElemIdToDock);
|
|
473
2027
|
if (!targetElem) {
|
|
474
|
-
_context.next =
|
|
2028
|
+
_context.next = 35;
|
|
475
2029
|
break;
|
|
476
2030
|
}
|
|
477
2031
|
targetDP = targetElem.getDockingPointById(targetDockingPointId);
|
|
478
2032
|
if (!targetDP) {
|
|
479
|
-
_context.next =
|
|
2033
|
+
_context.next = 35;
|
|
480
2034
|
break;
|
|
481
2035
|
}
|
|
482
2036
|
successDP = dockingPointHandlerInst.tryDockElementToDP(plannerElement, targetElem, targetDP);
|
|
483
2037
|
if (!successDP) {
|
|
484
|
-
_context.next =
|
|
2038
|
+
_context.next = 31;
|
|
485
2039
|
break;
|
|
486
2040
|
}
|
|
487
2041
|
this.updateWorldPos(plannerElement, successDP);
|
|
488
2042
|
dockingFound = true;
|
|
489
|
-
_context.next =
|
|
2043
|
+
_context.next = 35;
|
|
490
2044
|
break;
|
|
491
|
-
case
|
|
492
|
-
_context.next =
|
|
2045
|
+
case 31:
|
|
2046
|
+
_context.next = 33;
|
|
493
2047
|
return this.tryToDockWithDifferentSVGWithFormula(plannerElement, targetElemIdToDock);
|
|
494
|
-
case
|
|
2048
|
+
case 33:
|
|
495
2049
|
if (!_context.sent) {
|
|
496
|
-
_context.next =
|
|
2050
|
+
_context.next = 35;
|
|
497
2051
|
break;
|
|
498
2052
|
}
|
|
499
2053
|
dockingFound = true;
|
|
500
|
-
case
|
|
501
|
-
_context.next =
|
|
2054
|
+
case 35:
|
|
2055
|
+
_context.next = 48;
|
|
502
2056
|
break;
|
|
503
|
-
case
|
|
2057
|
+
case 37:
|
|
504
2058
|
success = false;
|
|
505
2059
|
if (plannerElement.HasAVL || plannerElement.HasAVR) {
|
|
506
2060
|
success = this.dockToAVLorAVR(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
|
|
@@ -509,55 +2063,72 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
509
2063
|
success = this.dockToAVUorAVOororAVNorAVSorAVC(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
|
|
510
2064
|
}
|
|
511
2065
|
if (success) {
|
|
512
|
-
_context.next =
|
|
2066
|
+
_context.next = 47;
|
|
513
2067
|
break;
|
|
514
2068
|
}
|
|
515
|
-
_context.next =
|
|
2069
|
+
_context.next = 43;
|
|
516
2070
|
return this.tryToDockWithDifferentSVGWithFormula(plannerElement, targetElemIdToDock);
|
|
517
|
-
case
|
|
2071
|
+
case 43:
|
|
518
2072
|
success = _context.sent;
|
|
519
2073
|
if (success) {
|
|
520
|
-
_context.next =
|
|
2074
|
+
_context.next = 47;
|
|
521
2075
|
break;
|
|
522
2076
|
}
|
|
523
|
-
|
|
524
|
-
return
|
|
525
|
-
case
|
|
526
|
-
return _context.abrupt("return");
|
|
527
|
-
case 45:
|
|
2077
|
+
xOffset = 50;
|
|
2078
|
+
return _context.abrupt("break", 51);
|
|
2079
|
+
case 47:
|
|
528
2080
|
if (success) dockingFound = true;
|
|
529
|
-
case
|
|
2081
|
+
case 48:
|
|
530
2082
|
i++;
|
|
531
|
-
_context.next =
|
|
2083
|
+
_context.next = 16;
|
|
532
2084
|
break;
|
|
533
|
-
case
|
|
2085
|
+
case 51:
|
|
534
2086
|
if (!dockingFound) {
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
2087
|
+
selectedId = dockingPointInfos === null || dockingPointInfos === void 0 ? void 0 : dockingPointInfos.map(function (info) {
|
|
2088
|
+
return info.targetElemIdToDock;
|
|
2089
|
+
}).find(function (id) {
|
|
2090
|
+
return id != null && _this21.plannerElements.has(id);
|
|
2091
|
+
});
|
|
2092
|
+
atSelected = function atSelected(group) {
|
|
2093
|
+
return selectedId === undefined || group.some(function (member) {
|
|
2094
|
+
return member.ElementId === selectedId;
|
|
2095
|
+
});
|
|
2096
|
+
};
|
|
2097
|
+
mayPlace = globalBoundingBox == undefined; // The places the rules suggest at the selected group (without a selection: at any group) come before docking anywhere.
|
|
2098
|
+
placed = mayPlace && this.placeAtSuggestedPlace(plannerElement, atSelected);
|
|
2099
|
+
_success = false;
|
|
2100
|
+
if (!placed) {
|
|
2101
|
+
allPlannerElements = this.getAllPlannerElements();
|
|
2102
|
+
_success = this.dockToAVLorAVR(plannerElement, allPlannerElements);
|
|
541
2103
|
if (suppressDock) _success = false;
|
|
542
2104
|
if (!_success) {
|
|
543
|
-
//
|
|
544
|
-
|
|
545
|
-
if (
|
|
546
|
-
plannerElement.WorldPosCenter = new Vector3(this.plannerBoundingBox.WorldPos.x + this.plannerBoundingBox.Size.x + (this.plannerBoundingBox.Size.x == 0 ? 0 : plannerElement.Width / 2 + xOffset), this.plannerBoundingBox.WorldPos.y, this.plannerBoundingBox.WorldPos.z + plannerElement.Depth / 2);
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
//Tell the set this the element was not docked
|
|
550
|
-
this.set.onDockingChanged(plannerElement.ElementId, -1, 'NOT_DOCKED');
|
|
2105
|
+
//No free AVR or AVL Docking Point
|
|
2106
|
+
_success = this.dockToAVUorAVOororAVNorAVSorAVC(plannerElement, allPlannerElements);
|
|
2107
|
+
if (suppressDock) _success = false;
|
|
551
2108
|
}
|
|
2109
|
+
if (!_success && mayPlace && selectedId !== undefined) placed = this.placeAtSuggestedPlace(plannerElement, function (group) {
|
|
2110
|
+
return !atSelected(group);
|
|
2111
|
+
});
|
|
2112
|
+
}
|
|
2113
|
+
if (!_success) {
|
|
2114
|
+
//This is the center position of the element - This is needed in order to set the static room layout correctly
|
|
2115
|
+
if (mayPlace && !placed) {
|
|
2116
|
+
placedBeside = true;
|
|
2117
|
+
plannerElement.WorldPosCenter = new Vector3(this.plannerBoundingBox.WorldPos.x + this.plannerBoundingBox.Size.x + (this.plannerBoundingBox.Size.x == 0 ? 0 : plannerElement.Width / 2 + xOffset), this.plannerBoundingBox.WorldPos.y, this.plannerBoundingBox.WorldPos.z + plannerElement.Depth / 2);
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
//Tell the set this the element was not docked
|
|
2121
|
+
this.set.onDockingChanged(plannerElement.ElementId, -1, 'NOT_DOCKED');
|
|
552
2122
|
}
|
|
553
2123
|
}
|
|
554
|
-
case
|
|
2124
|
+
case 52:
|
|
555
2125
|
this.updatePlannerPosNr();
|
|
556
2126
|
this.updateAllElementsWorldPos();
|
|
557
2127
|
this.updatePlannerPosNr();
|
|
2128
|
+
if (!plannerElement.IsAccessoire) this.placeAddedInRoom([plannerElement], placedBeside);
|
|
558
2129
|
this.checkCollision(false, plannerElement.getElementId());
|
|
559
2130
|
this.updatePlannerBoundingBox();
|
|
560
|
-
case
|
|
2131
|
+
case 58:
|
|
561
2132
|
case "end":
|
|
562
2133
|
return _context.stop();
|
|
563
2134
|
}
|
|
@@ -745,16 +2316,16 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
745
2316
|
var candidates = [];
|
|
746
2317
|
var seen = new Set();
|
|
747
2318
|
var collect = function collect(connectorFeature, targetFilters) {
|
|
748
|
-
var
|
|
749
|
-
|
|
2319
|
+
var _iterator15 = _createForOfIteratorHelper(targetFilters),
|
|
2320
|
+
_step15;
|
|
750
2321
|
try {
|
|
751
|
-
for (
|
|
752
|
-
var filter =
|
|
753
|
-
var
|
|
754
|
-
|
|
2322
|
+
for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
|
|
2323
|
+
var filter = _step15.value;
|
|
2324
|
+
var _iterator16 = _createForOfIteratorHelper(article.getVariantValuesInfluencingOptions([optPrefix + connectorFeature], opvPrefix + filter)),
|
|
2325
|
+
_step16;
|
|
755
2326
|
try {
|
|
756
|
-
for (
|
|
757
|
-
var vv =
|
|
2327
|
+
for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
|
|
2328
|
+
var vv = _step16.value;
|
|
758
2329
|
var key = JSON.stringify(vv);
|
|
759
2330
|
if (!seen.has(key)) {
|
|
760
2331
|
seen.add(key);
|
|
@@ -762,15 +2333,15 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
762
2333
|
}
|
|
763
2334
|
}
|
|
764
2335
|
} catch (err) {
|
|
765
|
-
|
|
2336
|
+
_iterator16.e(err);
|
|
766
2337
|
} finally {
|
|
767
|
-
|
|
2338
|
+
_iterator16.f();
|
|
768
2339
|
}
|
|
769
2340
|
}
|
|
770
2341
|
} catch (err) {
|
|
771
|
-
|
|
2342
|
+
_iterator15.e(err);
|
|
772
2343
|
} finally {
|
|
773
|
-
|
|
2344
|
+
_iterator15.f();
|
|
774
2345
|
}
|
|
775
2346
|
};
|
|
776
2347
|
//this article's AVL side (feature 89) docks against the target's AVR side and vice versa
|
|
@@ -998,6 +2569,11 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
998
2569
|
}
|
|
999
2570
|
}
|
|
1000
2571
|
this.updateAllElementsWorldPos(undefined, elemtsWhereSomethingChanged);
|
|
2572
|
+
// A resized group must not reach through a wall; where the room moved it, its collisions are checked again.
|
|
2573
|
+
if (this.room) {
|
|
2574
|
+
this.placeGroupsInRoom();
|
|
2575
|
+
this.checkCollision(false);
|
|
2576
|
+
}
|
|
1001
2577
|
this.updatePlannerPosNr();
|
|
1002
2578
|
this.updatePlannerBoundingBox();
|
|
1003
2579
|
}
|
|
@@ -1033,7 +2609,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1033
2609
|
case 0:
|
|
1034
2610
|
planData = parseSetPlanData(setPlanData);
|
|
1035
2611
|
if (!isSavePlannerV2(planData)) {
|
|
1036
|
-
_context5.next =
|
|
2612
|
+
_context5.next = 42;
|
|
1037
2613
|
break;
|
|
1038
2614
|
}
|
|
1039
2615
|
jsonElements = planData.set.elements;
|
|
@@ -1043,7 +2619,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1043
2619
|
i = 0;
|
|
1044
2620
|
case 7:
|
|
1045
2621
|
if (!(i < jsonElements.length)) {
|
|
1046
|
-
_context5.next =
|
|
2622
|
+
_context5.next = 37;
|
|
1047
2623
|
break;
|
|
1048
2624
|
}
|
|
1049
2625
|
_context5.prev = 8;
|
|
@@ -1056,7 +2632,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1056
2632
|
LOG.error(new DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1057
2633
|
code: 'WC_0012'
|
|
1058
2634
|
}));
|
|
1059
|
-
return _context5.abrupt("continue",
|
|
2635
|
+
return _context5.abrupt("continue", 34);
|
|
1060
2636
|
case 14:
|
|
1061
2637
|
plannerElement = new PlannerElementData(this.set.getSetId(), jsonElement.basketID, this.nextElementId, DivaStandardPlanner.plannerType);
|
|
1062
2638
|
oldElementidMapping.set(jsonElement.elementID, plannerElement);
|
|
@@ -1074,6 +2650,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1074
2650
|
case 24:
|
|
1075
2651
|
plannerElement.WorldPosCenter = new Vector3(globalBoundingBox.WorldPos.x + globalBoundingBox.Size.x + jsonElement.x + 100, globalBoundingBox.WorldPos.y + jsonElement.y, globalBoundingBox.WorldPos.z + jsonElement.z);
|
|
1076
2652
|
plannerElement.RotDeg = jsonElement.rot;
|
|
2653
|
+
plannerElement.PosNrAtEnd = !!jsonElement.posNrAtEnd;
|
|
2654
|
+
plannerElement.Placement = parseGuestPlacement(jsonElement.placement);
|
|
1077
2655
|
if (plannerElement.IsDockedAccessoire) {
|
|
1078
2656
|
accElements.push(jsonElement);
|
|
1079
2657
|
plannerElement.PosNr = jsonElement.posNr;
|
|
@@ -1082,20 +2660,20 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1082
2660
|
elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
|
|
1083
2661
|
plannerElement.PosNr = jsonElement.posNr;
|
|
1084
2662
|
}
|
|
1085
|
-
_context5.next =
|
|
2663
|
+
_context5.next = 34;
|
|
1086
2664
|
break;
|
|
1087
|
-
case
|
|
1088
|
-
_context5.prev =
|
|
2665
|
+
case 31:
|
|
2666
|
+
_context5.prev = 31;
|
|
1089
2667
|
_context5.t0 = _context5["catch"](8);
|
|
1090
2668
|
LOG.error(new DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1091
2669
|
cause: _context5.t0,
|
|
1092
2670
|
code: 'WC_0012'
|
|
1093
2671
|
}));
|
|
1094
|
-
case
|
|
2672
|
+
case 34:
|
|
1095
2673
|
i++;
|
|
1096
2674
|
_context5.next = 7;
|
|
1097
2675
|
break;
|
|
1098
|
-
case
|
|
2676
|
+
case 37:
|
|
1099
2677
|
elementsForDockingExtend = [].concat(_toConsumableArray(elementsSortedbyPosNr.filter(function (e) {
|
|
1100
2678
|
return e != null;
|
|
1101
2679
|
})), accElements);
|
|
@@ -1117,17 +2695,19 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1117
2695
|
}
|
|
1118
2696
|
}
|
|
1119
2697
|
}
|
|
1120
|
-
|
|
2698
|
+
// Added beside the planning, the new elements can stand outside the room: they get the room rules like an insert.
|
|
2699
|
+
this.placeAddedInRoom(_toConsumableArray(oldElementidMapping.values()), true);
|
|
2700
|
+
_context5.next = 43;
|
|
1121
2701
|
break;
|
|
1122
|
-
case
|
|
2702
|
+
case 42:
|
|
1123
2703
|
LOG.error(new DivaError('The function extend Planner works only with products that are saved in the configurator 2.0', {
|
|
1124
2704
|
code: 'WC_0012'
|
|
1125
2705
|
}));
|
|
1126
|
-
case
|
|
2706
|
+
case 43:
|
|
1127
2707
|
case "end":
|
|
1128
2708
|
return _context5.stop();
|
|
1129
2709
|
}
|
|
1130
|
-
}, _callee5, this, [[8,
|
|
2710
|
+
}, _callee5, this, [[8, 31]]);
|
|
1131
2711
|
}));
|
|
1132
2712
|
function extendPlanner(_x10, _x11) {
|
|
1133
2713
|
return _extendPlanner.apply(this, arguments);
|
|
@@ -1144,7 +2724,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1144
2724
|
case 0:
|
|
1145
2725
|
planData = parseSetPlanData(setPlanData);
|
|
1146
2726
|
if (!isSavePlannerV2(planData)) {
|
|
1147
|
-
_context6.next =
|
|
2727
|
+
_context6.next = 65;
|
|
1148
2728
|
break;
|
|
1149
2729
|
}
|
|
1150
2730
|
LOG.debug('Initialize set Plan Data - V2\n' + planData, 'DivaStandardPlanner initPlanner');
|
|
@@ -1160,7 +2740,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1160
2740
|
i = 0;
|
|
1161
2741
|
case 9:
|
|
1162
2742
|
if (!(i < jsonElements.length)) {
|
|
1163
|
-
_context6.next =
|
|
2743
|
+
_context6.next = 39;
|
|
1164
2744
|
break;
|
|
1165
2745
|
}
|
|
1166
2746
|
_context6.prev = 10;
|
|
@@ -1173,7 +2753,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1173
2753
|
LOG.error(new DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1174
2754
|
code: 'WC_0012'
|
|
1175
2755
|
}));
|
|
1176
|
-
return _context6.abrupt("continue",
|
|
2756
|
+
return _context6.abrupt("continue", 36);
|
|
1177
2757
|
case 16:
|
|
1178
2758
|
elementID = jsonElement.elementID;
|
|
1179
2759
|
plannerElement = new PlannerElementData(this.set.getSetId(), jsonElement.basketID, elementID, DivaStandardPlanner.plannerType);
|
|
@@ -1193,6 +2773,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1193
2773
|
//plannerElement.WorldPosCenter = new Vector3(jsonElement.x, jsonElement.y, jsonElement.z);
|
|
1194
2774
|
plannerElement.WorldPosCenter = new Vector3(this.plannerBoundingBox.WorldPos.x + jsonElement.x, this.plannerBoundingBox.WorldPos.y + jsonElement.y, this.plannerBoundingBox.WorldPos.z + jsonElement.z);
|
|
1195
2775
|
plannerElement.RotDeg = jsonElement.rot;
|
|
2776
|
+
plannerElement.PosNrAtEnd = !!jsonElement.posNrAtEnd;
|
|
2777
|
+
plannerElement.Placement = parseGuestPlacement(jsonElement.placement);
|
|
1196
2778
|
if (plannerElement.IsDockedAccessoire) {
|
|
1197
2779
|
accElements.push(jsonElement);
|
|
1198
2780
|
plannerElement.PosNr = jsonElement.posNr;
|
|
@@ -1201,34 +2783,34 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1201
2783
|
elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
|
|
1202
2784
|
plannerElement.PosNr = jsonElement.posNr;
|
|
1203
2785
|
}
|
|
1204
|
-
_context6.next =
|
|
2786
|
+
_context6.next = 36;
|
|
1205
2787
|
break;
|
|
1206
|
-
case
|
|
1207
|
-
_context6.prev =
|
|
2788
|
+
case 33:
|
|
2789
|
+
_context6.prev = 33;
|
|
1208
2790
|
_context6.t0 = _context6["catch"](10);
|
|
1209
2791
|
LOG.error(new DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1210
2792
|
cause: _context6.t0,
|
|
1211
2793
|
code: 'WC_0012'
|
|
1212
2794
|
}));
|
|
1213
|
-
case
|
|
2795
|
+
case 36:
|
|
1214
2796
|
i++;
|
|
1215
2797
|
_context6.next = 9;
|
|
1216
2798
|
break;
|
|
1217
|
-
case
|
|
2799
|
+
case 39:
|
|
1218
2800
|
onlyOneBaseElement = elementsSortedbyPosNr.filter(Boolean).length == 1; //Saves if only one base element is in the planning. All the others are only accessoires
|
|
1219
2801
|
elementsForDocking = [].concat(_toConsumableArray(elementsSortedbyPosNr.filter(function (e) {
|
|
1220
2802
|
return e != null;
|
|
1221
2803
|
})), accElements);
|
|
1222
2804
|
i = 0;
|
|
1223
|
-
case
|
|
2805
|
+
case 42:
|
|
1224
2806
|
if (!(i < elementsForDocking.length)) {
|
|
1225
|
-
_context6.next =
|
|
2807
|
+
_context6.next = 63;
|
|
1226
2808
|
break;
|
|
1227
2809
|
}
|
|
1228
|
-
_context6.prev =
|
|
2810
|
+
_context6.prev = 43;
|
|
1229
2811
|
row = elementsForDocking[i];
|
|
1230
2812
|
if (!(i == 0 && onlyOneBaseElement && this.plannerHasStaticBackground)) {
|
|
1231
|
-
_context6.next =
|
|
2813
|
+
_context6.next = 50;
|
|
1232
2814
|
break;
|
|
1233
2815
|
}
|
|
1234
2816
|
//if the planner has a static background room and there is only one base element (ignore docked ACCs) then it should be forced positioned in the center of the room.
|
|
@@ -1240,14 +2822,14 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1240
2822
|
element = this.plannerElements.get(row.elementID);
|
|
1241
2823
|
if (element) element.WorldPosCenter = new Vector3(0, element.Height / 2, element.Depth / 2);
|
|
1242
2824
|
}
|
|
1243
|
-
return _context6.abrupt("continue",
|
|
1244
|
-
case
|
|
2825
|
+
return _context6.abrupt("continue", 60);
|
|
2826
|
+
case 50:
|
|
1245
2827
|
if (!(row.DP == null || row.DP.length == 0)) {
|
|
1246
|
-
_context6.next =
|
|
2828
|
+
_context6.next = 52;
|
|
1247
2829
|
break;
|
|
1248
2830
|
}
|
|
1249
|
-
return _context6.abrupt("continue",
|
|
1250
|
-
case
|
|
2831
|
+
return _context6.abrupt("continue", 60);
|
|
2832
|
+
case 52:
|
|
1251
2833
|
DPsInfo = row.DP;
|
|
1252
2834
|
for (j = 0; j < DPsInfo.length; j++) {
|
|
1253
2835
|
dpInfo = DPsInfo[j];
|
|
@@ -1268,79 +2850,79 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1268
2850
|
}
|
|
1269
2851
|
}
|
|
1270
2852
|
}
|
|
1271
|
-
_context6.next =
|
|
2853
|
+
_context6.next = 60;
|
|
1272
2854
|
break;
|
|
1273
|
-
case
|
|
1274
|
-
_context6.prev =
|
|
1275
|
-
_context6.t1 = _context6["catch"](
|
|
2855
|
+
case 56:
|
|
2856
|
+
_context6.prev = 56;
|
|
2857
|
+
_context6.t1 = _context6["catch"](43);
|
|
1276
2858
|
elementId = (_elementsForDocking$i = elementsForDocking[i]) === null || _elementsForDocking$i === void 0 ? void 0 : _elementsForDocking$i.elementID;
|
|
1277
2859
|
LOG.error(new DivaError('Error initializing dockingPoints of element with elementID ' + elementId, {
|
|
1278
2860
|
cause: _context6.t1,
|
|
1279
2861
|
code: 'WC_0012'
|
|
1280
2862
|
}));
|
|
1281
|
-
case
|
|
2863
|
+
case 60:
|
|
1282
2864
|
i++;
|
|
1283
|
-
_context6.next =
|
|
1284
|
-
break;
|
|
1285
|
-
case 61:
|
|
1286
|
-
_context6.next = 116;
|
|
2865
|
+
_context6.next = 42;
|
|
1287
2866
|
break;
|
|
1288
2867
|
case 63:
|
|
2868
|
+
_context6.next = 118;
|
|
2869
|
+
break;
|
|
2870
|
+
case 65:
|
|
1289
2871
|
LOG.debug('Initialize set Plan Data - old V1\n' + planData, 'DivaStandardPlanner initPlanner');
|
|
1290
2872
|
legacySet = (_planData$Sets = planData.Sets) === null || _planData$Sets === void 0 ? void 0 : _planData$Sets[0];
|
|
1291
2873
|
if (legacySet !== null && legacySet !== void 0 && (_legacySet$Elements = legacySet.Elements) !== null && _legacySet$Elements !== void 0 && _legacySet$Elements.length) {
|
|
1292
|
-
_context6.next =
|
|
2874
|
+
_context6.next = 69;
|
|
1293
2875
|
break;
|
|
1294
2876
|
}
|
|
1295
2877
|
return _context6.abrupt("return");
|
|
1296
|
-
case
|
|
2878
|
+
case 69:
|
|
1297
2879
|
_jsonElements = legacySet.Elements;
|
|
1298
2880
|
_elementsSortedbyPosNr = [];
|
|
1299
2881
|
_accElements = []; //Zuerst initialisiere alle Elemente
|
|
1300
2882
|
//Dann positioniere sie richtig
|
|
1301
2883
|
i = 0;
|
|
1302
|
-
case
|
|
2884
|
+
case 73:
|
|
1303
2885
|
if (!(i < _jsonElements.length)) {
|
|
1304
|
-
_context6.next =
|
|
2886
|
+
_context6.next = 107;
|
|
1305
2887
|
break;
|
|
1306
2888
|
}
|
|
1307
|
-
_context6.prev =
|
|
2889
|
+
_context6.prev = 74;
|
|
1308
2890
|
_jsonElement2 = _jsonElements[i];
|
|
1309
2891
|
_catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo3 = saveElementArticleCodex(_jsonElement2)) !== null && _saveElementArticleCo3 !== void 0 ? _saveElementArticleCo3 : '');
|
|
1310
2892
|
if (!(!_catalogArticle && (_jsonElement2$Accesso = _jsonElement2.AccessoireInitParams) !== null && _jsonElement2$Accesso !== void 0 && _jsonElement2$Accesso.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
|
|
1311
|
-
_context6.next =
|
|
2893
|
+
_context6.next = 80;
|
|
1312
2894
|
break;
|
|
1313
2895
|
}
|
|
1314
2896
|
LOG.error(new DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V1', {
|
|
1315
2897
|
code: 'WC_0012'
|
|
1316
2898
|
}));
|
|
1317
|
-
return _context6.abrupt("continue",
|
|
1318
|
-
case
|
|
2899
|
+
return _context6.abrupt("continue", 104);
|
|
2900
|
+
case 80:
|
|
1319
2901
|
basketID = _jsonElement2.BasketID;
|
|
1320
2902
|
if (this.set.getElementId(basketID) == -1) this.set.setElementId(basketID, Number(_jsonElement2.ID));
|
|
1321
2903
|
_elementId = this.set.getElementId(basketID);
|
|
1322
2904
|
_jsonElement2.elementId = _elementId;
|
|
1323
2905
|
if (!(_elementId == -1)) {
|
|
1324
|
-
_context6.next =
|
|
2906
|
+
_context6.next = 87;
|
|
1325
2907
|
break;
|
|
1326
2908
|
}
|
|
1327
2909
|
LOG.error(new DivaError('Error when initializing planner. The elementID Was not saved in the article. ', {
|
|
1328
2910
|
code: 'WC_0012'
|
|
1329
2911
|
}));
|
|
1330
|
-
return _context6.abrupt("continue",
|
|
1331
|
-
case
|
|
2912
|
+
return _context6.abrupt("continue", 104);
|
|
2913
|
+
case 87:
|
|
1332
2914
|
_plannerElement = new PlannerElementData(this.set.getSetId(), basketID, _elementId, DivaStandardPlanner.plannerType);
|
|
1333
2915
|
this.nextElementId = _elementId + 1;
|
|
1334
2916
|
this.plannerElements.set(_plannerElement.ElementId, _plannerElement);
|
|
1335
2917
|
_data = this.set.getPlannerData(_plannerElement.ElementId);
|
|
1336
2918
|
_plannerElement.updatePlannerData(_data);
|
|
1337
2919
|
if (this.doDisablePlanner2D) {
|
|
1338
|
-
_context6.next =
|
|
2920
|
+
_context6.next = 95;
|
|
1339
2921
|
break;
|
|
1340
2922
|
}
|
|
1341
|
-
_context6.next =
|
|
2923
|
+
_context6.next = 95;
|
|
1342
2924
|
return handler2D.loadSVG(_plannerElement, this.set);
|
|
1343
|
-
case
|
|
2925
|
+
case 95:
|
|
1344
2926
|
//Achtung die Pos Infos im alten Planer waren Zentrumskoordinaten!!! Nicht hinten oben.
|
|
1345
2927
|
centerWorldPos = new Vector3(_jsonElement2.PosX, _jsonElement2.PosZ, _jsonElement2.PosY);
|
|
1346
2928
|
_plannerElement.WorldPosCenter = new Vector3(this.plannerBoundingBox.WorldPos.x + centerWorldPos.x, this.plannerBoundingBox.WorldPos.y + centerWorldPos.y, this.plannerBoundingBox.WorldPos.z + centerWorldPos.z);
|
|
@@ -1357,36 +2939,36 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1357
2939
|
_elementsSortedbyPosNr[_jsonElement2.PosNum - 1] = _jsonElement2;
|
|
1358
2940
|
_plannerElement.PosNr = _jsonElement2.PosNum;
|
|
1359
2941
|
}
|
|
1360
|
-
_context6.next =
|
|
2942
|
+
_context6.next = 104;
|
|
1361
2943
|
break;
|
|
1362
|
-
case
|
|
1363
|
-
_context6.prev =
|
|
1364
|
-
_context6.t2 = _context6["catch"](
|
|
2944
|
+
case 101:
|
|
2945
|
+
_context6.prev = 101;
|
|
2946
|
+
_context6.t2 = _context6["catch"](74);
|
|
1365
2947
|
LOG.error(new DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner - Plan Data old Planner', {
|
|
1366
2948
|
cause: _context6.t2,
|
|
1367
2949
|
code: 'WC_0012'
|
|
1368
2950
|
}));
|
|
1369
|
-
case
|
|
2951
|
+
case 104:
|
|
1370
2952
|
i++;
|
|
1371
|
-
_context6.next =
|
|
2953
|
+
_context6.next = 73;
|
|
1372
2954
|
break;
|
|
1373
|
-
case
|
|
2955
|
+
case 107:
|
|
1374
2956
|
elementsForDockingV1 = [].concat(_toConsumableArray(_elementsSortedbyPosNr.filter(function (e) {
|
|
1375
2957
|
return e != null;
|
|
1376
2958
|
})), _accElements);
|
|
1377
2959
|
i = 0;
|
|
1378
|
-
case
|
|
2960
|
+
case 109:
|
|
1379
2961
|
if (!(i < elementsForDockingV1.length)) {
|
|
1380
|
-
_context6.next =
|
|
2962
|
+
_context6.next = 118;
|
|
1381
2963
|
break;
|
|
1382
2964
|
}
|
|
1383
2965
|
_row = elementsForDockingV1[i];
|
|
1384
2966
|
if (!(_row.DP == null || _row.DP.length == 0)) {
|
|
1385
|
-
_context6.next =
|
|
2967
|
+
_context6.next = 113;
|
|
1386
2968
|
break;
|
|
1387
2969
|
}
|
|
1388
|
-
return _context6.abrupt("continue",
|
|
1389
|
-
case
|
|
2970
|
+
return _context6.abrupt("continue", 115);
|
|
2971
|
+
case 113:
|
|
1390
2972
|
_DPsInfo = _row.DP;
|
|
1391
2973
|
for (j = 0; j < _DPsInfo.length; j++) {
|
|
1392
2974
|
_dpInfo = _DPsInfo[j];
|
|
@@ -1404,21 +2986,21 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1404
2986
|
}
|
|
1405
2987
|
}
|
|
1406
2988
|
}
|
|
1407
|
-
case
|
|
2989
|
+
case 115:
|
|
1408
2990
|
i++;
|
|
1409
|
-
_context6.next =
|
|
2991
|
+
_context6.next = 109;
|
|
1410
2992
|
break;
|
|
1411
|
-
case
|
|
2993
|
+
case 118:
|
|
1412
2994
|
this.plannerElements.forEach(function (el) {
|
|
1413
2995
|
if (!el.IsDockedAccessoire && (anchorElement == undefined || el.PosNr < anchorElement.PosNr)) anchorElement = el;
|
|
1414
2996
|
});
|
|
1415
2997
|
this.updateAllElementsWorldPos(undefined, anchorElement ? [anchorElement.ElementId] : undefined);
|
|
1416
2998
|
this.updatePlannerPosNr();
|
|
1417
|
-
case
|
|
2999
|
+
case 121:
|
|
1418
3000
|
case "end":
|
|
1419
3001
|
return _context6.stop();
|
|
1420
3002
|
}
|
|
1421
|
-
}, _callee6, this, [[10,
|
|
3003
|
+
}, _callee6, this, [[10, 33], [43, 56], [74, 101]]);
|
|
1422
3004
|
}));
|
|
1423
3005
|
function initPlanner(_x12) {
|
|
1424
3006
|
return _initPlanner.apply(this, arguments);
|
|
@@ -1678,7 +3260,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1678
3260
|
transform = {
|
|
1679
3261
|
rotDeg: plannerElement.getRotDeg(),
|
|
1680
3262
|
worldPosCenter: plannerElement.WorldPosCenter,
|
|
1681
|
-
height: plannerElement.Height
|
|
3263
|
+
height: plannerElement.Height,
|
|
3264
|
+
posNrAtEnd: plannerElement.PosNrAtEnd,
|
|
3265
|
+
placement: plannerElement.Placement
|
|
1682
3266
|
};
|
|
1683
3267
|
if (!removeDockingRelation) {
|
|
1684
3268
|
dockingPointHandlerInst.removeDockingPointRelations(plannerElement);
|
|
@@ -1687,6 +3271,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1687
3271
|
this.tryToDockForNotDockedAccessoire(parent);
|
|
1688
3272
|
this.updatePlannerPosNr();
|
|
1689
3273
|
this.updateAllElementsWorldPos();
|
|
3274
|
+
// A group the deletion lets fit, or splits, takes its place in the room.
|
|
3275
|
+
if (this.room) this.placeGroupsInRoom();
|
|
1690
3276
|
this.updatePlannerPosNr();
|
|
1691
3277
|
this.checkCollision(false, plannerElement.getElementId());
|
|
1692
3278
|
this.updatePlannerBoundingBox();
|
|
@@ -1694,7 +3280,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1694
3280
|
newElementToSelect: newSelElemIdPrev >= 0 ? newSelElemIdPrev : newSelElemIdNext >= 0 ? newSelElemIdNext : undefined,
|
|
1695
3281
|
transform: transform
|
|
1696
3282
|
});
|
|
1697
|
-
case
|
|
3283
|
+
case 25:
|
|
1698
3284
|
case "end":
|
|
1699
3285
|
return _context9.stop();
|
|
1700
3286
|
}
|
|
@@ -1737,8 +3323,33 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1737
3323
|
}, {
|
|
1738
3324
|
key: "checkCollision",
|
|
1739
3325
|
value: function checkCollision(calcCollisionPairs, checkSingleElementId) {
|
|
3326
|
+
var _this22 = this;
|
|
1740
3327
|
if (this.doDisablePlanner2D) return;
|
|
1741
3328
|
var allElements = this.getAllPlannerElements();
|
|
3329
|
+
// A NO_COLLISION article (e.g. a rug) neither collides with anything nor is collided with.
|
|
3330
|
+
var noCollisionIds = new Set(allElements.filter(function (element) {
|
|
3331
|
+
return _this22.hasNoCollision(element.ArticleCodex);
|
|
3332
|
+
}).map(function (element) {
|
|
3333
|
+
return element.ElementId;
|
|
3334
|
+
}));
|
|
3335
|
+
// Each colliding element with its outline and its group as slot carrier, built when a pair collides.
|
|
3336
|
+
var slotted;
|
|
3337
|
+
var slottedOf = function slottedOf(element) {
|
|
3338
|
+
var _slotted;
|
|
3339
|
+
(_slotted = slotted) !== null && _slotted !== void 0 ? _slotted : slotted = new Map(getDockingGroups(allElements).flatMap(function (group) {
|
|
3340
|
+
return _this22.getCollidingShapes(group, false);
|
|
3341
|
+
}).map(function (shape) {
|
|
3342
|
+
return [shape.elementId, shape];
|
|
3343
|
+
}));
|
|
3344
|
+
return slotted.get(element.ElementId);
|
|
3345
|
+
};
|
|
3346
|
+
// A guest in its carrier's slot only warns when the bodies overlap.
|
|
3347
|
+
var inSlotClear = function inSlotClear(a, b) {
|
|
3348
|
+
var shapeA = slottedOf(a);
|
|
3349
|
+
var shapeB = slottedOf(b);
|
|
3350
|
+
var rules = _this22.getCatalogData().placementOptions.rules;
|
|
3351
|
+
return !!shapeA && !!shapeB && slotExempt(rules, shapeA, rules, shapeB);
|
|
3352
|
+
};
|
|
1742
3353
|
var collisionDetected = false;
|
|
1743
3354
|
var collisionPairs = [];
|
|
1744
3355
|
for (var i = 0; i < allElements.length; i++) {
|
|
@@ -1749,10 +3360,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1749
3360
|
var _this$set$CatalogData, _this$set$CatalogData2;
|
|
1750
3361
|
var element2 = allElements[j];
|
|
1751
3362
|
if (element1.getElementId() == element2.getElementId()) continue;
|
|
3363
|
+
if (noCollisionIds.has(element1.ElementId) || noCollisionIds.has(element2.ElementId)) continue;
|
|
1752
3364
|
if (dockingPointHandlerInst.checkElementsAreDocking(element1, element2)) continue;
|
|
1753
3365
|
var collision = false;
|
|
1754
3366
|
if (this.set.CatalogData.doCheckConstructionWarnings || (_this$set$CatalogData = this.set.CatalogData.forceConstructionWarningForArticles) !== null && _this$set$CatalogData !== void 0 && _this$set$CatalogData.includes(element1.ArticleCodex) || (_this$set$CatalogData2 = this.set.CatalogData.forceConstructionWarningForArticles) !== null && _this$set$CatalogData2 !== void 0 && _this$set$CatalogData2.includes(element2.ArticleCodex)) {
|
|
1755
3367
|
collision = handler2D.checkCollision(element1, element2, this.set.CatalogData.checkCollisionForDifferentLayers);
|
|
3368
|
+
if (collision && inSlotClear(element1, element2)) collision = false;
|
|
1756
3369
|
}
|
|
1757
3370
|
if (collision) {
|
|
1758
3371
|
collisionDetected = true;
|
|
@@ -1767,17 +3380,56 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1767
3380
|
}
|
|
1768
3381
|
}
|
|
1769
3382
|
if (this.collisionHandler.collisionDetected && !collisionDetected) {
|
|
1770
|
-
var _this$
|
|
3383
|
+
var _this$collisionHandle3, _this$collisionHandle4;
|
|
1771
3384
|
//Collision has changed
|
|
1772
|
-
(_this$
|
|
3385
|
+
(_this$collisionHandle3 = (_this$collisionHandle4 = this.collisionHandler).updatePlannerMsgContainer) === null || _this$collisionHandle3 === void 0 || _this$collisionHandle3.call(_this$collisionHandle4, 'COLLISION_MSG', false, 'WARNING', 'COLLISION_MSG', false);
|
|
1773
3386
|
} else if (!this.collisionHandler.collisionDetected && collisionDetected) {
|
|
1774
|
-
var _this$
|
|
1775
|
-
(_this$
|
|
3387
|
+
var _this$collisionHandle5, _this$collisionHandle6;
|
|
3388
|
+
(_this$collisionHandle5 = (_this$collisionHandle6 = this.collisionHandler).updatePlannerMsgContainer) === null || _this$collisionHandle5 === void 0 || _this$collisionHandle5.call(_this$collisionHandle6, 'COLLISION_MSG', true, 'WARNING', 'COLLISION_MSG', false /*this.collisionHandler.collisionPairs*/);
|
|
1776
3389
|
}
|
|
1777
3390
|
this.collisionHandler.collisionPairs = collisionPairs;
|
|
1778
3391
|
this.collisionHandler.collisionDetected = collisionDetected;
|
|
1779
3392
|
}
|
|
1780
3393
|
|
|
3394
|
+
/**
|
|
3395
|
+
* The set's elements for the planning's collision warning (`ROOM_COLLISION_MSG`): every element of a colliding docking
|
|
3396
|
+
* group but the NO_COLLISION ones, with its outline (never the viewer's measures). None while the 2D planner is off.
|
|
3397
|
+
*/
|
|
3398
|
+
}, {
|
|
3399
|
+
key: "getCollisionSet",
|
|
3400
|
+
value: function getCollisionSet() {
|
|
3401
|
+
return this.toCollisionSet(this.doDisablePlanner2D ? [] : getDockingGroups(this.getAllPlannerElements()));
|
|
3402
|
+
}
|
|
3403
|
+
|
|
3404
|
+
// The colliding ones of the docking groups `groups` as the planning's collision warning checks them.
|
|
3405
|
+
}, {
|
|
3406
|
+
key: "toCollisionSet",
|
|
3407
|
+
value: function toCollisionSet(groups) {
|
|
3408
|
+
var _this23 = this;
|
|
3409
|
+
var catalogData = this.getCatalogData();
|
|
3410
|
+
var parts = groups.filter(function (group) {
|
|
3411
|
+
return _this23.collides(group);
|
|
3412
|
+
}).flatMap(function (group, groupIndex) {
|
|
3413
|
+
var slotMembers = _this23.getSlotMembers(group);
|
|
3414
|
+
return group.filter(function (member) {
|
|
3415
|
+
return !_this23.hasNoCollision(member.ArticleCodex);
|
|
3416
|
+
}).map(function (member) {
|
|
3417
|
+
var _catalogData$forceCon;
|
|
3418
|
+
return _objectSpread(_objectSpread({}, _this23.toCollisionShape(member, slotMembers, false)), {}, {
|
|
3419
|
+
groupIndex: groupIndex,
|
|
3420
|
+
constructionChecked: catalogData.doCheckConstructionWarnings || !!((_catalogData$forceCon = catalogData.forceConstructionWarningForArticles) !== null && _catalogData$forceCon !== void 0 && _catalogData$forceCon.includes(member.ArticleCodex))
|
|
3421
|
+
});
|
|
3422
|
+
});
|
|
3423
|
+
});
|
|
3424
|
+
return {
|
|
3425
|
+
setId: this.set.getSetId(),
|
|
3426
|
+
catalogCodex: catalogData.catalogCodex,
|
|
3427
|
+
rules: catalogData.placementOptions.rules,
|
|
3428
|
+
collidingLayers: catalogData.checkCollisionForDifferentLayers,
|
|
3429
|
+
parts: parts
|
|
3430
|
+
};
|
|
3431
|
+
}
|
|
3432
|
+
|
|
1781
3433
|
/**
|
|
1782
3434
|
* Updates the overall set posNr
|
|
1783
3435
|
* @param startSetPosNr Indicates the start PosNr for the planner
|
|
@@ -1811,8 +3463,24 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1811
3463
|
}, {
|
|
1812
3464
|
key: "updatePlannerTrans",
|
|
1813
3465
|
value: function updatePlannerTrans(elementId, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint) {
|
|
1814
|
-
var
|
|
3466
|
+
var _this$dragUnit,
|
|
3467
|
+
_this24 = this;
|
|
1815
3468
|
var updateConfig = false;
|
|
3469
|
+
var room = this.room;
|
|
3470
|
+
if (room && transState == 'START') this.startRoomDrag(elementId);
|
|
3471
|
+
var roomDrag = room ? this.roomDrag : undefined;
|
|
3472
|
+
if (transState == 'START') this.startDragUnit(elementId, roomDrag);else if (transState == 'UPDATE') (_this$dragUnit = this.dragUnit) === null || _this$dragUnit === void 0 || _this$dragUnit.add(elementId);
|
|
3473
|
+
// A turn keeps its direction: only a move snaps into a slot place.
|
|
3474
|
+
if (transState == 'UPDATE' && deltaAngleDeg !== 0) this.dragSlots = undefined;
|
|
3475
|
+
// Group members follow the grabbed element rigidly, so their own UPDATE deltas are dropped.
|
|
3476
|
+
// A free group's rotation goes the normal way; only wall-bound groups take their rotation from the wall.
|
|
3477
|
+
if (roomDrag && roomDrag.wallMode !== 'forced' && transState == 'UPDATE' && deltaAngleDeg !== 0) roomDrag.rotating = true;
|
|
3478
|
+
if (room && roomDrag && !roomDrag.rotating && transState == 'UPDATE' && roomDrag.members.some(function (member) {
|
|
3479
|
+
return member.ElementId == elementId;
|
|
3480
|
+
})) {
|
|
3481
|
+
if (elementId == roomDrag.elementId) this.updateRoomDrag(room, roomDrag, deltaMove);
|
|
3482
|
+
return false;
|
|
3483
|
+
}
|
|
1816
3484
|
if (this.plannerElements.has(elementId)) {
|
|
1817
3485
|
var plannerElement = this.plannerElements.get(elementId);
|
|
1818
3486
|
plannerElement === null || plannerElement === void 0 || plannerElement.updateDeltaTrans(deltaMove, deltaAngleDeg, rotCorrection, transState == 'END', turningPoint);
|
|
@@ -1825,17 +3493,51 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1825
3493
|
updateConfig = this.set.onDockingChanged(plannerElement.ElementId, undockedElements[i], 'UNDOCK');
|
|
1826
3494
|
}
|
|
1827
3495
|
}
|
|
1828
|
-
} else if (transState == 'END') {
|
|
3496
|
+
} else if (transState == 'END' && plannerElement) {
|
|
3497
|
+
// A drag released where its group runs into something goes back to where it started, a turn only where findTurnPlace finds none.
|
|
3498
|
+
if ((roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.elementId) == elementId && roomDrag.blockedBy.length > 0) {
|
|
3499
|
+
var current = roomDrag.rotating ? this.getTurnedPose(plannerElement, roomDrag) : roomDrag.current;
|
|
3500
|
+
var target = roomDrag.rotating && room && this.findTurnPlace(plannerElement, roomDrag, room) || roomDrag.start;
|
|
3501
|
+
moveGroupRigidly([].concat(_toConsumableArray(roomDrag.members), _toConsumableArray(roomDrag.followers)), current, target);
|
|
3502
|
+
roomDrag.current = target;
|
|
3503
|
+
roomDrag.blockedBy = [];
|
|
3504
|
+
roomDrag.slotSnapped = false;
|
|
3505
|
+
}
|
|
3506
|
+
// Only the dragged unit moves: it is put back into the room and goes onto what it docks to (else into the free slot
|
|
3507
|
+
// place it snapped to), as the drag preview shows it, so docking it re-anchors nothing else. Its guests go with it.
|
|
3508
|
+
var unit = this.getAllPlannerElements().filter(function (element) {
|
|
3509
|
+
var _this24$dragUnit;
|
|
3510
|
+
return element === plannerElement || ((_this24$dragUnit = _this24.dragUnit) === null || _this24$dragUnit === void 0 ? void 0 : _this24$dragUnit.has(element.ElementId));
|
|
3511
|
+
});
|
|
3512
|
+
var followers = unit.filter(function (element) {
|
|
3513
|
+
return _this24.dragFollowers.has(element.ElementId);
|
|
3514
|
+
});
|
|
3515
|
+
var group = unit.filter(function (element) {
|
|
3516
|
+
return !_this24.dragFollowers.has(element.ElementId);
|
|
3517
|
+
});
|
|
3518
|
+
this.dragUnit = undefined;
|
|
3519
|
+
this.dragFollowers = new Set();
|
|
3520
|
+
var roomRule = (roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.elementId) == elementId && !roomDrag.slotSnapped && (roomDrag.wallMode === 'forced' || roomDrag.rotating);
|
|
3521
|
+
if (roomRule) this.placeGroupInRoom(group, plannerElement, followers);
|
|
3522
|
+
this.snapToDock(plannerElement, unit, autoDockingDistance, !roomDrag);
|
|
3523
|
+
this.dragSlots = undefined;
|
|
1829
3524
|
var dockablePairs = dockingPointHandlerInst.searchDockableElementsInArea(plannerElement, this.getAllPlannerElements(), autoDockingDistance); //hier kann jetzt ein DP drinnen stehen - docke alle
|
|
1830
3525
|
if (dockablePairs != null && dockablePairs.size > 0) {
|
|
1831
3526
|
dockablePairs.forEach(function (dockPair, type) {
|
|
1832
|
-
var targetPlannerElement =
|
|
3527
|
+
var targetPlannerElement = _this24.plannerElements.get(dockPair.targetDP.ElementId);
|
|
1833
3528
|
if (targetPlannerElement) {
|
|
1834
3529
|
dockingPointHandlerInst.tryDockElementDPToDP(plannerElement, targetPlannerElement, dockPair.sourceDP, dockPair.targetDP);
|
|
1835
3530
|
}
|
|
1836
3531
|
});
|
|
1837
3532
|
}
|
|
1838
3533
|
updateConfig = this.updateAllElementsWorldPos(elementId);
|
|
3534
|
+
if ((roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.elementId) == elementId) {
|
|
3535
|
+
// The group as released, docked or turned: a wall-bound one goes to its wall, any other inside the room; where a
|
|
3536
|
+
// slot snap put it, it stays.
|
|
3537
|
+
if (!roomDrag.slotSnapped) this.placeGroupInRoom(this.getDockingGroupOf(plannerElement), plannerElement);
|
|
3538
|
+
this.checkCollision(false, elementId);
|
|
3539
|
+
this.roomDrag = undefined;
|
|
3540
|
+
}
|
|
1839
3541
|
this.updatePlannerPosNr();
|
|
1840
3542
|
this.updatePlannerBoundingBox();
|
|
1841
3543
|
}
|
|
@@ -1861,7 +3563,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1861
3563
|
}, {
|
|
1862
3564
|
key: "saveSetPlanner",
|
|
1863
3565
|
value: function saveSetPlanner() {
|
|
1864
|
-
var
|
|
3566
|
+
var _this25 = this;
|
|
1865
3567
|
if (this.plannerElements.size == 0) return null;
|
|
1866
3568
|
var plannerElements = [];
|
|
1867
3569
|
this.plannerElements.forEach(function (elem, elemId) {
|
|
@@ -1876,13 +3578,18 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1876
3578
|
};
|
|
1877
3579
|
dpArr.push(saveDP);
|
|
1878
3580
|
}
|
|
1879
|
-
var plannerElement = {
|
|
3581
|
+
var plannerElement = _objectSpread(_objectSpread(_objectSpread({
|
|
1880
3582
|
elementID: elem.getElementId(),
|
|
1881
|
-
basketID:
|
|
1882
|
-
CatalogCodex:
|
|
1883
|
-
Codex:
|
|
3583
|
+
basketID: _this25.set.getBasketId(elem.getElementId()),
|
|
3584
|
+
CatalogCodex: _this25.set.getCatalogCodex(),
|
|
3585
|
+
Codex: _this25.set.getArticleCodex(elem.getElementId()),
|
|
1884
3586
|
posNr: elem.PosNr,
|
|
1885
|
-
accNr: elem.IsDockedAccessoire ? elem.AccessoirePosNr : undefined
|
|
3587
|
+
accNr: elem.IsDockedAccessoire ? elem.AccessoirePosNr : undefined
|
|
3588
|
+
}, elem.PosNrAtEnd ? {
|
|
3589
|
+
posNrAtEnd: true
|
|
3590
|
+
} : {}), elem.Placement ? {
|
|
3591
|
+
placement: elem.Placement
|
|
3592
|
+
} : {}), {}, {
|
|
1886
3593
|
x: elem.WorldPosCenter.x,
|
|
1887
3594
|
y: elem.WorldPosCenter.y,
|
|
1888
3595
|
z: elem.WorldPosCenter.z,
|
|
@@ -1891,9 +3598,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1891
3598
|
height: elem.Height ? elem.Height : -1,
|
|
1892
3599
|
depth: elem.Depth ? elem.Depth : -1,
|
|
1893
3600
|
DP: dpArr
|
|
1894
|
-
};
|
|
3601
|
+
});
|
|
1895
3602
|
if (elem.IsAccessoire) {
|
|
1896
|
-
var parentBasketId =
|
|
3603
|
+
var parentBasketId = _this25.set.getParentBasketIdOfElementId(elem.getElementId());
|
|
1897
3604
|
if (parentBasketId != undefined) {
|
|
1898
3605
|
plannerElement.AccessoireInitParams = {
|
|
1899
3606
|
RelatedToBasketID: parentBasketId
|
|
@@ -1927,7 +3634,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1927
3634
|
}, {
|
|
1928
3635
|
key: "getSetData",
|
|
1929
3636
|
value: function getSetData(only3DCompatible, useSetPlanner, doShow3DDimensionLines, alternateRenderInfo) {
|
|
1930
|
-
var
|
|
3637
|
+
var _this26 = this;
|
|
1931
3638
|
var setId = useSetPlanner ? this.set.getSetId() : 'S1';
|
|
1932
3639
|
var setData = {
|
|
1933
3640
|
//ID: "S" + this.plannerID,
|
|
@@ -1954,19 +3661,19 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1954
3661
|
setData.IDM3DEnvironment = this.IDM3DEnvironment;
|
|
1955
3662
|
}
|
|
1956
3663
|
this.plannerElements.forEach(function (elem, elemId) {
|
|
1957
|
-
var config =
|
|
3664
|
+
var config = _this26.set.getPlannerConfigData(elemId, alternateRenderInfo);
|
|
1958
3665
|
var elemCfg = config.config;
|
|
1959
3666
|
var accElements = [];
|
|
1960
3667
|
if (config.accs && config.accs.length > 0) {
|
|
1961
3668
|
for (var i = 0; i < config.accs.length; i++) {
|
|
1962
|
-
if (
|
|
3669
|
+
if (_this26.plannerElements.has(config.accs[i])) {
|
|
1963
3670
|
accElements.push('E' + config.accs[i]);
|
|
1964
3671
|
}
|
|
1965
3672
|
}
|
|
1966
3673
|
}
|
|
1967
3674
|
if (!only3DCompatible || elemCfg.Model != undefined) {
|
|
1968
3675
|
var _elemCfg$MOVE;
|
|
1969
|
-
var article =
|
|
3676
|
+
var article = _this26.set.getArticleByElementId(elemId);
|
|
1970
3677
|
var elemJson = {
|
|
1971
3678
|
ID: 'E' + elemId,
|
|
1972
3679
|
// N: elemCfg.N,
|
|
@@ -1996,15 +3703,15 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1996
3703
|
elemJson.H = hash;
|
|
1997
3704
|
setData.ELE.push(elemJson);
|
|
1998
3705
|
}
|
|
1999
|
-
var shelfPlannerElements =
|
|
3706
|
+
var shelfPlannerElements = _this26.set.getShelfPlannerData(elemId);
|
|
2000
3707
|
if (shelfPlannerElements) {
|
|
2001
3708
|
for (var _i5 = 0; _i5 < shelfPlannerElements.length; _i5++) {
|
|
2002
3709
|
var accessorire = shelfPlannerElements[_i5];
|
|
2003
|
-
var shelfConfig =
|
|
3710
|
+
var shelfConfig = _this26.set.getShelfPlannerConfigData(accessorire.basketId).config;
|
|
2004
3711
|
var _accElements2 = [];
|
|
2005
3712
|
if (shelfConfig.accs && shelfConfig.accs.length > 0) {
|
|
2006
3713
|
for (var j = 0; j < shelfConfig.accs.length; j++) {
|
|
2007
|
-
if (
|
|
3714
|
+
if (_this26.plannerElements.has(shelfConfig.accs[j])) {
|
|
2008
3715
|
_accElements2.push('E' + shelfConfig.accs[j]);
|
|
2009
3716
|
}
|
|
2010
3717
|
}
|
|
@@ -2067,12 +3774,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
2067
3774
|
}, {
|
|
2068
3775
|
key: "getPlanningIsComplete",
|
|
2069
3776
|
value: function getPlanningIsComplete(forceCheck) {
|
|
2070
|
-
var
|
|
3777
|
+
var _this27 = this;
|
|
2071
3778
|
var dontCheck = !forceCheck && (this.set.CatalogData.doHideCompletenessWarning || !this.set.CatalogData.doCheckConstructionWarnings);
|
|
2072
3779
|
var elemNotComplete = false;
|
|
2073
3780
|
this.plannerElements.forEach(function (plannerElement, key) {
|
|
2074
|
-
var
|
|
2075
|
-
if (dontCheck && !((
|
|
3781
|
+
var _this27$set$CatalogDa;
|
|
3782
|
+
if (dontCheck && !((_this27$set$CatalogDa = _this27.set.CatalogData.forceConstructionWarningForArticles) !== null && _this27$set$CatalogDa !== void 0 && _this27$set$CatalogDa.includes(plannerElement.ArticleCodex))) return;
|
|
2076
3783
|
if (!elemNotComplete && (plannerElement.getFreeDockingPointsByType('AVL').length > 0 || plannerElement.getFreeDockingPointsByType('AVR').length > 0)) {
|
|
2077
3784
|
elemNotComplete = true;
|
|
2078
3785
|
}
|