@crystaldesign/web-planner-logic 26.13.0-beta.9 → 26.14.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/{DivaBoxPlanner-006ec070.js → DivaBoxPlanner-7f6bd584.js} +5 -4
- package/build/cjs/{DivaStandardPlanner-a428fcb7.js → DivaStandardPlanner-77c603dc.js} +1921 -203
- package/build/cjs/{DoorPlanner-40b303c4.js → DoorPlanner-5de2bbf0.js} +4 -3
- package/build/cjs/{Host3DSignalR-55f69ca3.js → Host3DSignalR-26b95303.js} +64 -20
- package/build/cjs/{LiviqueWWSHandler-4c6f6071.js → LiviqueWWSHandler-1e419862.js} +4 -3
- package/build/cjs/{PfisterWWSHandler-55bdb575.js → PfisterWWSHandler-b2f7a5ec.js} +3 -2
- package/build/cjs/{PlannerHandler2D-314ce41d.js → PlannerHandler2D-ff734c3e.js} +10 -10
- package/build/cjs/{SeriousBasketHandler-1b365a2b.js → SeriousBasketHandler-e54bd31b.js} +4 -3
- package/build/cjs/{ShelfPlanner-8e91f830.js → ShelfPlanner-08e15d16.js} +600 -203
- package/build/cjs/{StandardWWSHandler-4a2442aa.js → StandardWWSHandler-0e7b20dc.js} +4 -3
- package/build/cjs/{index-e08a4789.js → index-5dd5fb4b.js} +9343 -3810
- package/build/cjs/index.js +11 -9
- package/build/esm/{DivaBoxPlanner-edb41fff.js → DivaBoxPlanner-6ac448b4.js} +5 -4
- package/build/esm/{DivaStandardPlanner-20fe9ebf.js → DivaStandardPlanner-abd9609d.js} +1911 -194
- package/build/esm/{DoorPlanner-0bf17f1f.js → DoorPlanner-fde32e61.js} +4 -3
- package/build/esm/{Host3DSignalR-263f6d3f.js → Host3DSignalR-0f97c7f3.js} +64 -20
- package/build/esm/{LiviqueWWSHandler-e80b574f.js → LiviqueWWSHandler-9ee5b7cb.js} +4 -3
- package/build/esm/{PfisterWWSHandler-508bb12f.js → PfisterWWSHandler-b9699549.js} +3 -2
- package/build/esm/{PlannerHandler2D-e4d80c41.js → PlannerHandler2D-8d963e77.js} +2 -2
- package/build/esm/{SeriousBasketHandler-e9ebb195.js → SeriousBasketHandler-40e7e46c.js} +4 -3
- package/build/esm/{ShelfPlanner-fbb7d7dd.js → ShelfPlanner-69cbb2c1.js} +600 -203
- package/build/esm/{StandardWWSHandler-88f4eb7d.js → StandardWWSHandler-dbf02663.js} +4 -3
- package/build/esm/{index-86463de2.js → index-88148ccc.js} +9297 -3798
- package/build/esm/index.js +4 -3
- package/build/types/web-planner-logic/src/index.d.ts +7 -8
- package/build/types/web-planner-logic/src/index.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/AdditionalModelInfos.d.ts +4 -2
- package/build/types/web-planner-logic/src/interface/AdditionalModelInfos.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/Articles/AccessoireItemType.d.ts +6 -2
- package/build/types/web-planner-logic/src/interface/Articles/AccessoireItemType.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts +14 -0
- package/build/types/web-planner-logic/src/interface/Articles/CatalogArticleDataType.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/Articles/PartListArticleToLoadType.d.ts +1 -0
- package/build/types/web-planner-logic/src/interface/Articles/PartListArticleToLoadType.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/DivaCatalogDataType.d.ts +7 -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 +16 -1
- package/build/types/web-planner-logic/src/interface/FunctionTypes/index.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.d.ts +2 -3
- package/build/types/web-planner-logic/src/interface/IDM/ArticleApi.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/IDM3DTranslation.d.ts +20 -0
- package/build/types/web-planner-logic/src/interface/Planner/IDM3DTranslation.d.ts.map +1 -0
- 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/ShelfPlanner/plannerData.d.ts +3 -0
- package/build/types/web-planner-logic/src/interface/ShelfPlanner/plannerData.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/Article/DivaArticle.d.ts +30 -0
- package/build/types/web-planner-logic/src/logic/Article/DivaArticle.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Article/DivaArticleHandler.d.ts +5 -0
- package/build/types/web-planner-logic/src/logic/Article/DivaArticleHandler.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts +8 -0
- package/build/types/web-planner-logic/src/logic/Article/Engine/IDMArticleEngine.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Article/mandatoryAccessories.d.ts +3 -1
- package/build/types/web-planner-logic/src/logic/Article/mandatoryAccessories.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Article/measureUnit.d.ts +2 -0
- package/build/types/web-planner-logic/src/logic/Article/measureUnit.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/Basket/DivaBasketHandler.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/logic/ConfigTree/DivaConfigTree.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 +77 -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 +112 -24
- 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 +32 -0
- package/build/types/web-planner-logic/src/logic/Planner/IDM3D/idm3dTranslation.d.ts.map +1 -0
- 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/Host3DSignalR.d.ts +1 -0
- package/build/types/web-planner-logic/src/logic/Planner/Rendering/Host3DSignalR.d.ts.map +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 +30 -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 +5 -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/Articles/Article/DivaCatalogArticle.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Articles/Article/IDMCatalogArticle.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Catalog/CatalogData.d.ts +28 -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 +3 -0
- 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 +4 -2
- 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 +6 -4
- package/build/types/web-planner-logic/src/model/Options/CatalogOptionData.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Options/CatalogOptionValueData.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 +41 -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 +23 -11
- package/build/types/web-planner-logic/src/model/Properties/propertySchemaRegistry.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Properties/propertyValueCodec.d.ts +1 -34
- package/build/types/web-planner-logic/src/model/Properties/propertyValueCodec.d.ts.map +1 -1
- package/build/types/web-planner-logic/src/model/Properties/propertyValues.d.ts +42 -0
- package/build/types/web-planner-logic/src/model/Properties/propertyValues.d.ts.map +1 -0
- 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/bundleRulesOwnPartlist.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/bundleRulesOwnPartlist.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/classificationRepairFreeText.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/classificationRepairFreeText.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/decisionFeatureRefOp.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/decisionFeatureRefOp.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/getConfigStepKeyOfAccessoire.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/getConfigStepKeyOfAccessoire.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/host3DSignalRReconnect.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/host3DSignalRReconnect.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/orderNumberTemplates.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/orderNumberTemplates.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/partlistChangeReevaluatesOptionTree.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/partlistChangeReevaluatesOptionTree.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/plannerElementHeightChange.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/plannerElementHeightChange.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/plannerHandler3DRoomListQueue.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/plannerHandler3DRoomListQueue.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/propertyParsers.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/propertyParsers.test.d.ts.map +1 -0
- package/build/types/web-planner-logic/src/test/propertyValues.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/propertyValues.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/shelfStashInheritedOptions.test.d.ts +2 -0
- package/build/types/web-planner-logic/src/test/shelfStashInheritedOptions.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,20 +1,21 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
|
|
4
3
|
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
|
|
4
|
+
var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
|
|
5
5
|
var _classCallCheck = require('@babel/runtime/helpers/classCallCheck');
|
|
6
6
|
var _createClass = require('@babel/runtime/helpers/createClass');
|
|
7
7
|
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
8
|
+
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
8
9
|
var _regeneratorRuntime = require('@babel/runtime/regenerator');
|
|
9
|
-
var index = require('./index-
|
|
10
|
+
var index = require('./index-5dd5fb4b.js');
|
|
10
11
|
var DivaUtils = require('@crystaldesign/diva-utils');
|
|
11
|
-
var
|
|
12
|
-
var PlannerHandler2D = require('./PlannerHandler2D-
|
|
13
|
-
require('@babel/runtime/helpers/slicedToArray');
|
|
12
|
+
var plannerCore = require('@crystaldesign/planner-core');
|
|
13
|
+
var PlannerHandler2D = require('./PlannerHandler2D-ff734c3e.js');
|
|
14
14
|
require('@babel/runtime/helpers/objectWithoutProperties');
|
|
15
15
|
require('axios');
|
|
16
|
-
require('@crystaldesign/basket-model');
|
|
17
16
|
require('@babel/runtime/helpers/typeof');
|
|
17
|
+
require('@babel/runtime/helpers/toArray');
|
|
18
|
+
require('@crystaldesign/basket-model');
|
|
18
19
|
require('fast-xml-parser');
|
|
19
20
|
require('@babel/runtime/helpers/possibleConstructorReturn');
|
|
20
21
|
require('@babel/runtime/helpers/getPrototypeOf');
|
|
@@ -26,36 +27,85 @@ require('@babel/runtime/helpers/get');
|
|
|
26
27
|
|
|
27
28
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
28
29
|
|
|
29
|
-
var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
|
|
30
30
|
var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator);
|
|
31
|
+
var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
|
|
31
32
|
var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck);
|
|
32
33
|
var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);
|
|
33
34
|
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
|
|
35
|
+
var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
|
|
34
36
|
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime);
|
|
35
37
|
var DivaUtils__default = /*#__PURE__*/_interopDefaultLegacy(DivaUtils);
|
|
36
38
|
|
|
37
|
-
/** Configurator 2.0 set planner payload (`SetPlanData` after base64 decode). */
|
|
38
|
-
|
|
39
|
-
/** Legacy planner 1.x payload (no `v: 2` wrapper). */
|
|
40
|
-
|
|
41
|
-
function parseSetPlanData(setPlanData) {
|
|
42
|
-
var planDataString = DivaUtils__default["default"].decodeBase64(setPlanData);
|
|
43
|
-
return JSON.parse(planDataString);
|
|
44
|
-
}
|
|
45
|
-
function isSavePlannerV2(planData) {
|
|
46
|
-
return planData.v === 2;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** Article codex from a V2 or legacy element record. */
|
|
50
|
-
function saveElementArticleCodex(element) {
|
|
51
|
-
return element.articleCodex || element.Codex;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
39
|
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; } } }; }
|
|
55
40
|
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; } }
|
|
56
41
|
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; }
|
|
42
|
+
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; }
|
|
43
|
+
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__default["default"](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; }
|
|
57
44
|
var LOG = DivaUtils__default["default"].initLog('Planner', 'WEB-PLANNER-LOGIC');
|
|
58
45
|
var ACC_DOCK_TYPES = ['AVO', 'AVU', 'AVC', 'AVS', 'AVN'];
|
|
46
|
+
|
|
47
|
+
/** An element of the set as a drag checks it: its shape, and its layer for the catalog's layer rule. */
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Something a dragged group may not run into: an element of another docking group of this set or of another set (its id,
|
|
51
|
+
* its layer where the catalog's layer rule applies; of another set its set and that set's rules), or a door's clearance,
|
|
52
|
+
* its swing or doorway (none).
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/** A pose on the floor moved rigidly from `from` to `to`, as the points it carries (see `movePoints`). */
|
|
56
|
+
function movePose(pose, from, to) {
|
|
57
|
+
var _movePoints = index.movePoints([new index.Vector2(pose.center.x, pose.center.z)], from, to),
|
|
58
|
+
_movePoints2 = _slicedToArray__default["default"](_movePoints, 1),
|
|
59
|
+
center = _movePoints2[0];
|
|
60
|
+
return {
|
|
61
|
+
center: {
|
|
62
|
+
x: center.x,
|
|
63
|
+
z: center.y
|
|
64
|
+
},
|
|
65
|
+
rotDeg: pose.rotDeg + to.rotDeg - from.rotDeg
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** How close (cm) a 'snap' group's wall pose has to be to the dragged position for it to dock to the wall. */
|
|
70
|
+
var WALL_SNAP_DISTANCE = 30;
|
|
71
|
+
/** The free-pose search around a group that landed on another: ring spacing (cm) and directions per ring. */
|
|
72
|
+
var CLEAR_SEARCH_STEP = 10;
|
|
73
|
+
var CLEAR_SEARCH_DIRECTIONS = 16;
|
|
74
|
+
/** cm a blocked turn's release looks around for a free place at least (farther where the group's longer side is longer). */
|
|
75
|
+
var TURN_PLACE_REACH = 100;
|
|
76
|
+
/** cm the room rule may move a suggested place before it no longer counts as that place. */
|
|
77
|
+
var PLACE_TOLERANCE = 1;
|
|
78
|
+
/** cm the room rule may move a pose a guest snaps to off its place (the float noise of moved outlines). */
|
|
79
|
+
var ROOM_RULE_NOISE = 0.01;
|
|
80
|
+
/** cm between the poses a drag checks on its way: less than the thinnest part (a table leg), so nothing is jumped. */
|
|
81
|
+
var PATH_STEP = 2;
|
|
82
|
+
/** cm a pair that overlapped at the start may vary in depth while it moves along (the float noise of moved outlines). */
|
|
83
|
+
var DEPTH_NOISE = 1e-6;
|
|
84
|
+
/** cm within which a dragged guest snaps into a free place of a slot that takes it. */
|
|
85
|
+
var SLOT_SNAP_DISTANCE = 20;
|
|
86
|
+
/** cm within which a drag counts as back at its start (the float noise of the summed moves). */
|
|
87
|
+
var START_NOISE = 1e-6;
|
|
88
|
+
var toFloorRect = function toFloorRect(block, pose) {
|
|
89
|
+
return {
|
|
90
|
+
center: pose.center,
|
|
91
|
+
halfWidth: block.halfWidth,
|
|
92
|
+
halfDepth: block.halfDepth,
|
|
93
|
+
rotDeg: pose.rotDeg
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** The article codex the room rules read: a main element's; none for an accessory. */
|
|
98
|
+
var mainCodex = function mainCodex(member) {
|
|
99
|
+
return member.IsAccessoire ? '' : member.ArticleCodex;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/** `pose` moved back inside the room, its rotation kept. */
|
|
103
|
+
var insidePose = function insidePose(block, pose, room) {
|
|
104
|
+
return {
|
|
105
|
+
center: index.keepInsideRoom(toFloorRect(block, pose), room),
|
|
106
|
+
rotDeg: pose.rotDeg
|
|
107
|
+
};
|
|
108
|
+
};
|
|
59
109
|
var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
60
110
|
/*
|
|
61
111
|
This function updates te planner data of all Elements if they changed.
|
|
@@ -67,7 +117,13 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
67
117
|
|
|
68
118
|
function DivaStandardPlanner(set, updatePlannerMsgContainer, plannerId, globalBoundingBox, doDisablePlanner2D, plannerHasStaticBackground) {
|
|
69
119
|
var _this = this;
|
|
120
|
+
var getOtherCollisionSets = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : function () {
|
|
121
|
+
return [];
|
|
122
|
+
};
|
|
123
|
+
var findCarrier = arguments.length > 7 ? arguments[7] : undefined;
|
|
70
124
|
_classCallCheck__default["default"](this, DivaStandardPlanner);
|
|
125
|
+
this.getOtherCollisionSets = getOtherCollisionSets;
|
|
126
|
+
this.findCarrier = findCarrier;
|
|
71
127
|
_defineProperty__default["default"](this, "plannerID", void 0);
|
|
72
128
|
_defineProperty__default["default"](this, "set", void 0);
|
|
73
129
|
_defineProperty__default["default"](this, "plannerBoundingBox", void 0);
|
|
@@ -81,6 +137,16 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
81
137
|
_defineProperty__default["default"](this, "IDM3DCatCodex", '');
|
|
82
138
|
_defineProperty__default["default"](this, "IDM3DEnvironment", 'diva.ro');
|
|
83
139
|
_defineProperty__default["default"](this, "nextElementId", 1);
|
|
140
|
+
_defineProperty__default["default"](this, "room", void 0);
|
|
141
|
+
_defineProperty__default["default"](this, "roomDrag", void 0);
|
|
142
|
+
/** Elements whose group a room rule placed (insert, resize, drag, scene switch, …): a measurement re-binds them. */
|
|
143
|
+
_defineProperty__default["default"](this, "roomPlaced", new WeakSet());
|
|
144
|
+
/** The elements the current drag moves (ids): the grabbed one, those the viewer moves with it, a room drag's group, their guests. */
|
|
145
|
+
_defineProperty__default["default"](this, "dragUnit", void 0);
|
|
146
|
+
/** Of the current drag's elements, the guests it carries along (ids, see `getFollowers`). */
|
|
147
|
+
_defineProperty__default["default"](this, "dragFollowers", new Set());
|
|
148
|
+
/** The free slot places the grabbed element may snap into (see `findSlotSnap`), found when the drag starts where it stood. */
|
|
149
|
+
_defineProperty__default["default"](this, "dragSlots", void 0);
|
|
84
150
|
_defineProperty__default["default"](this, "collisionHandler", void 0);
|
|
85
151
|
_defineProperty__default["default"](this, "dockToAVUorAVOororAVNorAVSorAVC", function (plannerElement, targetElements) {
|
|
86
152
|
// Capability comes from the SVG-parsed docking points, not the catalog metadata counts
|
|
@@ -178,6 +244,18 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
178
244
|
if (!this.getCatalogData().dontSetPosNrFromPlanner) startChainElements = startChainElements.sort(function (a, b) {
|
|
179
245
|
return a.WorldPosCenter.x - b.WorldPosCenter.x;
|
|
180
246
|
});
|
|
247
|
+
// Elements put into a carrier's slot come after the chains, by the numbers they have; a new one last.
|
|
248
|
+
var keptPosNr = function keptPosNr(element) {
|
|
249
|
+
return element.PosNr > 0 ? element.PosNr : Infinity;
|
|
250
|
+
};
|
|
251
|
+
var atEnd = startChainElements.filter(function (element) {
|
|
252
|
+
return element.PosNrAtEnd;
|
|
253
|
+
}).sort(function (a, b) {
|
|
254
|
+
return keptPosNr(a) - keptPosNr(b);
|
|
255
|
+
});
|
|
256
|
+
startChainElements = [].concat(_toConsumableArray__default["default"](startChainElements.filter(function (element) {
|
|
257
|
+
return !element.PosNrAtEnd;
|
|
258
|
+
})), _toConsumableArray__default["default"](atEnd));
|
|
181
259
|
var posNrAcc;
|
|
182
260
|
var _updateAccessoiresOfElement = function updateAccessoiresOfElement(curElement, posNrParent) {
|
|
183
261
|
//Nun habe ich ein Element und muss überprüfen, ob es Accessoires hat. Das sind Elemente, die über AVO, AVU oder AVC gedockt sind.
|
|
@@ -277,7 +355,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
277
355
|
}, {
|
|
278
356
|
key: "applyDockTransform",
|
|
279
357
|
value: function applyDockTransform(plannerElement, refElement, dockingPoint, refDockingPoint) {
|
|
280
|
-
var dockedTransform =
|
|
358
|
+
var dockedTransform = plannerCore.computeDockedTransform(refElement, refDockingPoint, plannerElement, dockingPoint);
|
|
281
359
|
plannerElement.RotDeg = dockedTransform.rotDeg;
|
|
282
360
|
plannerElement.WorldPosCorner = new index.Vector3(dockedTransform.worldPosCorner.x, dockedTransform.worldPosCorner.y, dockedTransform.worldPosCorner.z);
|
|
283
361
|
plannerElement.WorldPosCornerIgnoreOLF = new index.Vector3(dockedTransform.worldPosCornerIgnoreOLF.x, dockedTransform.worldPosCornerIgnoreOLF.y, dockedTransform.worldPosCornerIgnoreOLF.z);
|
|
@@ -289,16 +367,217 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
289
367
|
* {@link applyDockTransform} (apply → read → restore, no docking relations touched). Returns the
|
|
290
368
|
* delta from the element's current transform (cm / deg), or null if nothing is in snapping range.
|
|
291
369
|
* `excludeElementIds` skips the element's own move-group so it doesn't "snap" to siblings that
|
|
292
|
-
* are translating with it.
|
|
370
|
+
* are translating with it. In a room drag it is the room pose instead, with what blocks it at contact.
|
|
293
371
|
*/
|
|
294
372
|
}, {
|
|
295
373
|
key: "getDockSnapPreview",
|
|
296
374
|
value: function getDockSnapPreview(elementId, autoDockingDistance) {
|
|
375
|
+
var _this$roomDrag, _this$findDockSnap;
|
|
297
376
|
var excludeElementIds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
298
377
|
var element = this.plannerElements.get(elementId);
|
|
299
378
|
if (!element) return null;
|
|
379
|
+
// A room drag that turned into a rotation moves the normal way: its preview only names what the turned group runs into.
|
|
380
|
+
if (this.room && ((_this$roomDrag = this.roomDrag) === null || _this$roomDrag === void 0 ? void 0 : _this$roomDrag.elementId) === elementId) {
|
|
381
|
+
return this.roomDrag.rotating ? this.getRoomTurnPreview(element, this.roomDrag) : this.getRoomDragPreview(element, this.roomDrag);
|
|
382
|
+
}
|
|
383
|
+
return (_this$findDockSnap = this.findDockSnap(element, autoDockingDistance, [].concat(_toConsumableArray__default["default"](excludeElementIds), _toConsumableArray__default["default"](this.dragFollowers)))) !== null && _this$findDockSnap !== void 0 ? _this$findDockSnap : this.findSlotSnap(element);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* The move (cm / deg, about the element's centre) into the nearest free slot place found when its drag started (see
|
|
388
|
+
* `findDragSlotPlaces`), within SLOT_SNAP_DISTANCE: lined up and turned as the place says, at its own distance to the
|
|
389
|
+
* 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
|
|
390
|
+
* is back where the drag started (a cancel ends there exactly).
|
|
391
|
+
*/
|
|
392
|
+
}, {
|
|
393
|
+
key: "findSlotSnap",
|
|
394
|
+
value: function findSlotSnap(element) {
|
|
395
|
+
var _this$dragSlots;
|
|
396
|
+
var slots = ((_this$dragSlots = this.dragSlots) === null || _this$dragSlots === void 0 ? void 0 : _this$dragSlots.elementId) === element.ElementId ? this.dragSlots : undefined;
|
|
397
|
+
var _poseOf = index.poseOf(element),
|
|
398
|
+
center = _poseOf.center;
|
|
399
|
+
var places = slots && Math.hypot(center.x - slots.start.x, center.z - slots.start.z) > START_NOISE ? slots.places : [];
|
|
400
|
+
var nearest = index.getSnapPlace(places, center, SLOT_SNAP_DISTANCE);
|
|
401
|
+
if (!nearest) return null;
|
|
402
|
+
return {
|
|
403
|
+
dx: nearest.center.x - center.x,
|
|
404
|
+
dz: nearest.center.z - center.z,
|
|
405
|
+
dRotDeg: index.getTurnDeg(element.RotDeg, places[nearest.index].rotDeg)
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// The group's pose where the grabbed element snaps into a free slot place (see findSlotSnap) from where the pointer has
|
|
410
|
+
// it in a room drag; undefined when no place is near.
|
|
411
|
+
}, {
|
|
412
|
+
key: "getSlotSnapPose",
|
|
413
|
+
value: function getSlotSnapPose(drag) {
|
|
414
|
+
var _this$dragSlots2;
|
|
415
|
+
var places = ((_this$dragSlots2 = this.dragSlots) === null || _this$dragSlots2 === void 0 ? void 0 : _this$dragSlots2.elementId) === drag.elementId ? this.dragSlots.places : [];
|
|
416
|
+
if (places.length === 0) return undefined;
|
|
417
|
+
var raw = {
|
|
418
|
+
center: {
|
|
419
|
+
x: drag.grabbedStart.x + drag.dx,
|
|
420
|
+
z: drag.grabbedStart.z + drag.dz
|
|
421
|
+
},
|
|
422
|
+
rotDeg: drag.grabbedStartRotDeg
|
|
423
|
+
};
|
|
424
|
+
var nearest = index.getSnapPlace(places, raw.center, SLOT_SNAP_DISTANCE);
|
|
425
|
+
if (!nearest) return undefined;
|
|
426
|
+
var block = {
|
|
427
|
+
center: {
|
|
428
|
+
x: drag.start.center.x + drag.dx,
|
|
429
|
+
z: drag.start.center.z + drag.dz
|
|
430
|
+
},
|
|
431
|
+
rotDeg: drag.start.rotDeg
|
|
432
|
+
};
|
|
433
|
+
return movePose(block, raw, {
|
|
434
|
+
center: nearest.center,
|
|
435
|
+
rotDeg: places[nearest.index].rotDeg
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* The free places of the slots that take the grabbed element, at carriers outside the dragged unit in this and the
|
|
441
|
+
* other sets, for a unit of one main element; free where the element stands clear of every body and zone there (its
|
|
442
|
+
* carrier's zone and a slot's reach under its carrier allowed). Found once when the drag starts.
|
|
443
|
+
*/
|
|
444
|
+
}, {
|
|
445
|
+
key: "findDragSlotPlaces",
|
|
446
|
+
value: function findDragSlotPlaces(element, unit) {
|
|
447
|
+
var _this3 = this;
|
|
448
|
+
var _ref = element.IsAccessoire ? [] : this.getPlacementTypes(element),
|
|
449
|
+
_ref2 = _slicedToArray__default["default"](_ref, 1),
|
|
450
|
+
type = _ref2[0];
|
|
451
|
+
var group = this.getDockingGroupOf(element);
|
|
452
|
+
if (!type || group.filter(function (member) {
|
|
453
|
+
return !member.IsAccessoire;
|
|
454
|
+
}).length !== 1) return [];
|
|
455
|
+
var otherSets = this.getOtherCollisionSets(group.map(function (member) {
|
|
456
|
+
return member.ElementId;
|
|
457
|
+
}));
|
|
458
|
+
var own = index.getDockingGroups(this.getAllPlannerElements().filter(function (other) {
|
|
459
|
+
return !unit.includes(other);
|
|
460
|
+
})).filter(function (carrier) {
|
|
461
|
+
return carrier.some(function (member) {
|
|
462
|
+
return !member.IsAccessoire;
|
|
463
|
+
});
|
|
464
|
+
}).map(function (carrier) {
|
|
465
|
+
return {
|
|
466
|
+
rules: _this3.getCatalogData().placementOptions.rules,
|
|
467
|
+
members: _this3.getSlotMembers(carrier)
|
|
468
|
+
};
|
|
469
|
+
});
|
|
470
|
+
var others = otherSets.flatMap(function (set) {
|
|
471
|
+
return _toConsumableArray__default["default"](new Set(set.parts.map(function (part) {
|
|
472
|
+
return part.group;
|
|
473
|
+
}))).map(function (members) {
|
|
474
|
+
return {
|
|
475
|
+
rules: set.rules,
|
|
476
|
+
members: members
|
|
477
|
+
};
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
var body = index.getElementShape(element, false).body[0];
|
|
481
|
+
var pose = index.poseOf(element);
|
|
482
|
+
var outline = function outline(rotDeg) {
|
|
483
|
+
return index.movePoints(body, pose, {
|
|
484
|
+
center: {
|
|
485
|
+
x: 0,
|
|
486
|
+
z: 0
|
|
487
|
+
},
|
|
488
|
+
rotDeg: rotDeg
|
|
489
|
+
});
|
|
490
|
+
};
|
|
491
|
+
var drag = this.room ? this.createRoomDrag(element.ElementId, false, otherSets) : undefined;
|
|
492
|
+
return [].concat(_toConsumableArray__default["default"](own), _toConsumableArray__default["default"](others)).flatMap(function (_ref3) {
|
|
493
|
+
var rules = _ref3.rules,
|
|
494
|
+
members = _ref3.members;
|
|
495
|
+
return index.getCarrierSlots(rules, members, type);
|
|
496
|
+
}).flatMap(function (slot) {
|
|
497
|
+
return index.getSlotPlaces(slot, outline);
|
|
498
|
+
}).filter(function (place) {
|
|
499
|
+
return _this3.placeIsFree(element, group, place, otherSets);
|
|
500
|
+
}).map(function (place) {
|
|
501
|
+
return drag ? _this3.cutBandToRoom(drag, place) : place;
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// The free place with its band cut to the offsets at which the room rule leaves the dragged group where it is: a guest
|
|
506
|
+
// never snaps where the rule would move it.
|
|
507
|
+
}, {
|
|
508
|
+
key: "cutBandToRoom",
|
|
509
|
+
value: function cutBandToRoom(drag, place) {
|
|
510
|
+
var _this4 = this;
|
|
511
|
+
var grabbed = {
|
|
512
|
+
center: drag.grabbedStart,
|
|
513
|
+
rotDeg: drag.grabbedStartRotDeg
|
|
514
|
+
};
|
|
515
|
+
var kept = function kept(offset) {
|
|
516
|
+
var center = {
|
|
517
|
+
x: place.center.x + place.normal.x * offset,
|
|
518
|
+
z: place.center.z + place.normal.z * offset
|
|
519
|
+
};
|
|
520
|
+
return !!_this4.getKeptPose(drag, movePose(drag.start, grabbed, {
|
|
521
|
+
center: center,
|
|
522
|
+
rotDeg: place.rotDeg
|
|
523
|
+
}), ROOM_RULE_NOISE);
|
|
524
|
+
};
|
|
525
|
+
var cut = function cut(end) {
|
|
526
|
+
if (kept(end)) return end;
|
|
527
|
+
var free = 0;
|
|
528
|
+
var blocked = end;
|
|
529
|
+
for (var i = 0; i < 12; i++) {
|
|
530
|
+
var mid = (free + blocked) / 2;
|
|
531
|
+
if (kept(mid)) free = mid;else blocked = mid;
|
|
532
|
+
}
|
|
533
|
+
return free;
|
|
534
|
+
};
|
|
535
|
+
return _objectSpread(_objectSpread({}, place), {}, {
|
|
536
|
+
band: [cut(place.band[0]), cut(place.band[1])]
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// Whether the element's group, moved so the element stands at `place`, stands there by the room rule and collides with
|
|
541
|
+
// nothing (see fitsAt); it is put back where it stood.
|
|
542
|
+
}, {
|
|
543
|
+
key: "placeIsFree",
|
|
544
|
+
value: function placeIsFree(element, group, place, otherSets) {
|
|
545
|
+
var saved = group.map(function (member) {
|
|
546
|
+
return {
|
|
547
|
+
member: member,
|
|
548
|
+
center: member.WorldPosCenter,
|
|
549
|
+
rotDeg: member.RotDeg
|
|
550
|
+
};
|
|
551
|
+
});
|
|
552
|
+
index.moveGroupRigidly(group, index.poseOf(element), place);
|
|
553
|
+
var drag = this.createRoomDrag(element.ElementId, false, otherSets);
|
|
554
|
+
var free = !!drag && !!this.getKeptPose(drag) && !this.isBlocked(drag, drag.start);
|
|
555
|
+
var _iterator = _createForOfIteratorHelper(saved),
|
|
556
|
+
_step;
|
|
557
|
+
try {
|
|
558
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
559
|
+
var _step$value = _step.value,
|
|
560
|
+
member = _step$value.member,
|
|
561
|
+
center = _step$value.center,
|
|
562
|
+
rotDeg = _step$value.rotDeg;
|
|
563
|
+
member.WorldPosCenter = center;
|
|
564
|
+
member.RotDeg = rotDeg;
|
|
565
|
+
}
|
|
566
|
+
} catch (err) {
|
|
567
|
+
_iterator.e(err);
|
|
568
|
+
} finally {
|
|
569
|
+
_iterator.f();
|
|
570
|
+
}
|
|
571
|
+
return free;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// The move (cm / deg, about the element's centre) onto the element's nearest dock within `autoDockingDistance`, to an
|
|
575
|
+
// element not in `excludeElementIds`; null when none is in range. Nothing changes.
|
|
576
|
+
}, {
|
|
577
|
+
key: "findDockSnap",
|
|
578
|
+
value: function findDockSnap(element, autoDockingDistance, excludeElementIds) {
|
|
300
579
|
var targets = this.getAllPlannerElements().filter(function (e) {
|
|
301
|
-
return e
|
|
580
|
+
return e !== element && !excludeElementIds.includes(e.getElementId());
|
|
302
581
|
});
|
|
303
582
|
var pairs = PlannerHandler2D.dockingPointHandlerInst.searchDockableElementsInArea(element, targets, autoDockingDistance);
|
|
304
583
|
if (!pairs || pairs.size === 0) return null;
|
|
@@ -327,6 +606,1273 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
327
606
|
return result;
|
|
328
607
|
}
|
|
329
608
|
|
|
609
|
+
/**
|
|
610
|
+
* The rigid move from where the planner holds a dragged element's group to where a viewer shows it with `preview` (see
|
|
611
|
+
* {@link getDockSnapPreview}): none in a room drag, which holds the group where it shows; else the dock snap, turning
|
|
612
|
+
* about the element's centre.
|
|
613
|
+
*/
|
|
614
|
+
}, {
|
|
615
|
+
key: "getPreviewMove",
|
|
616
|
+
value: function getPreviewMove(elementId, preview) {
|
|
617
|
+
var _this$roomDrag2;
|
|
618
|
+
var element = this.plannerElements.get(elementId);
|
|
619
|
+
if (!element || !preview || this.room && ((_this$roomDrag2 = this.roomDrag) === null || _this$roomDrag2 === void 0 ? void 0 : _this$roomDrag2.elementId) === elementId) return undefined;
|
|
620
|
+
return this.snapMove(element, preview);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// The rigid move of a dock snap (see findDockSnap): shifted and turned about the element's centre.
|
|
624
|
+
}, {
|
|
625
|
+
key: "snapMove",
|
|
626
|
+
value: function snapMove(element, snap) {
|
|
627
|
+
var center = {
|
|
628
|
+
x: element.WorldPosCenter.x,
|
|
629
|
+
z: element.WorldPosCenter.z
|
|
630
|
+
};
|
|
631
|
+
return {
|
|
632
|
+
from: {
|
|
633
|
+
center: center,
|
|
634
|
+
rotDeg: 0
|
|
635
|
+
},
|
|
636
|
+
to: {
|
|
637
|
+
center: {
|
|
638
|
+
x: center.x + snap.dx,
|
|
639
|
+
z: center.z + snap.dz
|
|
640
|
+
},
|
|
641
|
+
rotDeg: snap.dRotDeg
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Activates (or clears) the room the elements are bound to. With `bindGroups` every docking group of main elements
|
|
648
|
+
* gets the room rule once: a forced group goes to its nearest wall pose, any other is pushed inside the room. A group
|
|
649
|
+
* the rules leave on other furniture or in a door's clearance (swing or doorway), where it did not stand so before, then
|
|
650
|
+
* goes to the nearest free pose (see {@link moveClearOfObstacles}). Returns false when a forced group fits on no wall
|
|
651
|
+
* (it stays where it is).
|
|
652
|
+
*/
|
|
653
|
+
}, {
|
|
654
|
+
key: "setRoom",
|
|
655
|
+
value: function setRoom(room, bindGroups) {
|
|
656
|
+
// Measured in the room the elements stood in so far.
|
|
657
|
+
var blockedBefore = room && bindGroups ? this.getBlockedGroupKeys() : new Set();
|
|
658
|
+
this.room = room;
|
|
659
|
+
this.roomDrag = undefined;
|
|
660
|
+
if (!room || !bindGroups) return true;
|
|
661
|
+
var allGroupsFit = this.placeGroupsInRoom();
|
|
662
|
+
this.clearNewlyBlockedGroups(room, blockedBefore);
|
|
663
|
+
this.updatePlannerPosNr();
|
|
664
|
+
this.checkCollision(false);
|
|
665
|
+
this.updatePlannerBoundingBox();
|
|
666
|
+
return allGroupsFit;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// Applies the room rules to every docking group of main elements, or only to the groups holding one of `elements`;
|
|
670
|
+
// false when a forced group fits on no wall. A group of guests goes with its carrier instead.
|
|
671
|
+
}, {
|
|
672
|
+
key: "placeGroupsInRoom",
|
|
673
|
+
value: function placeGroupsInRoom(elements) {
|
|
674
|
+
var allGroupsFit = true;
|
|
675
|
+
var _iterator2 = _createForOfIteratorHelper(index.getDockingGroups(this.getAllPlannerElements())),
|
|
676
|
+
_step2;
|
|
677
|
+
try {
|
|
678
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
679
|
+
var group = _step2.value;
|
|
680
|
+
if (elements && !group.some(function (member) {
|
|
681
|
+
return elements.includes(member);
|
|
682
|
+
})) continue;
|
|
683
|
+
if (this.followsCarrier(group)) continue;
|
|
684
|
+
if (!this.placeGroupInRoom(group)) allGroupsFit = false;
|
|
685
|
+
}
|
|
686
|
+
} catch (err) {
|
|
687
|
+
_iterator2.e(err);
|
|
688
|
+
} finally {
|
|
689
|
+
_iterator2.f();
|
|
690
|
+
}
|
|
691
|
+
return allGroupsFit;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// The first main element of each docking group (not a guest at its carrier) that stands on another group, of this set
|
|
695
|
+
// or of another set in the room, or in a door's clearance in the active room.
|
|
696
|
+
}, {
|
|
697
|
+
key: "getBlockedGroupKeys",
|
|
698
|
+
value: function getBlockedGroupKeys() {
|
|
699
|
+
var blocked = new Set();
|
|
700
|
+
var _iterator3 = _createForOfIteratorHelper(index.getDockingGroups(this.getAllPlannerElements())),
|
|
701
|
+
_step3;
|
|
702
|
+
try {
|
|
703
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
704
|
+
var group = _step3.value;
|
|
705
|
+
var main = group.find(function (member) {
|
|
706
|
+
return !member.IsAccessoire;
|
|
707
|
+
});
|
|
708
|
+
if (!main || this.followsCarrier(group)) continue;
|
|
709
|
+
var drag = this.createRoomDrag(main.ElementId);
|
|
710
|
+
if (drag && this.isBlocked(drag, drag.start)) blocked.add(main.ElementId);
|
|
711
|
+
}
|
|
712
|
+
} catch (err) {
|
|
713
|
+
_iterator3.e(err);
|
|
714
|
+
} finally {
|
|
715
|
+
_iterator3.f();
|
|
716
|
+
}
|
|
717
|
+
return blocked;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
// Every group (but a guest at its carrier) whose first main element is not in `blockedBefore` and that stands on
|
|
721
|
+
// another group or in a door's clearance goes to the nearest free pose (moveClearOfObstacles).
|
|
722
|
+
}, {
|
|
723
|
+
key: "clearNewlyBlockedGroups",
|
|
724
|
+
value: function clearNewlyBlockedGroups(room, blockedBefore) {
|
|
725
|
+
var _iterator4 = _createForOfIteratorHelper(index.getDockingGroups(this.getAllPlannerElements())),
|
|
726
|
+
_step4;
|
|
727
|
+
try {
|
|
728
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
729
|
+
var group = _step4.value;
|
|
730
|
+
var main = group.find(function (member) {
|
|
731
|
+
return !member.IsAccessoire;
|
|
732
|
+
});
|
|
733
|
+
if (main && !blockedBefore.has(main.ElementId) && !this.followsCarrier(group)) this.moveClearOfObstacles(main.ElementId, room);
|
|
734
|
+
}
|
|
735
|
+
} catch (err) {
|
|
736
|
+
_iterator4.e(err);
|
|
737
|
+
} finally {
|
|
738
|
+
_iterator4.f();
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Elements added in a room: their groups get the room rules, and with `clearOfObstacles` a group standing on another or
|
|
743
|
+
// in a door's clearance moves to the nearest free pose.
|
|
744
|
+
}, {
|
|
745
|
+
key: "placeAddedInRoom",
|
|
746
|
+
value: function placeAddedInRoom(added, clearOfObstacles) {
|
|
747
|
+
var room = this.room;
|
|
748
|
+
if (!room) return;
|
|
749
|
+
if (!this.placeGroupsInRoom(added)) {
|
|
750
|
+
this.updateRoomNoFitMsg(true);
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
753
|
+
if (!clearOfObstacles) return;
|
|
754
|
+
var _iterator5 = _createForOfIteratorHelper(index.getDockingGroups(this.getAllPlannerElements())),
|
|
755
|
+
_step5;
|
|
756
|
+
try {
|
|
757
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
758
|
+
var group = _step5.value;
|
|
759
|
+
var main = group.find(function (member) {
|
|
760
|
+
return !member.IsAccessoire && added.includes(member);
|
|
761
|
+
});
|
|
762
|
+
if (main && !this.followsCarrier(group)) this.moveClearOfObstacles(main.ElementId, room);
|
|
763
|
+
}
|
|
764
|
+
} catch (err) {
|
|
765
|
+
_iterator5.e(err);
|
|
766
|
+
} finally {
|
|
767
|
+
_iterator5.f();
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// Placing some groups can only show ROOM_NO_FIT_MSG: whether every set fits is DivaPlannerHandler's to say.
|
|
772
|
+
}, {
|
|
773
|
+
key: "updateRoomNoFitMsg",
|
|
774
|
+
value: function updateRoomNoFitMsg(show) {
|
|
775
|
+
var _this$collisionHandle, _this$collisionHandle2;
|
|
776
|
+
(_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);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/**
|
|
780
|
+
* Whether every docking group of the set has its place in the active room: a forced group stands on its wall pose, any other
|
|
781
|
+
* (but guests at their carrier) room within the footprint as it stands turned, with its followers (no room: true). Until the
|
|
782
|
+
* viewer measured its main elements a group that has a wall pose counts as standing on it: an opened one was saved
|
|
783
|
+
* with their measured extents, which reach at least as far as the outline, a placed one goes there once measured (see
|
|
784
|
+
* setElementFootprints).
|
|
785
|
+
*/
|
|
786
|
+
}, {
|
|
787
|
+
key: "groupsFitInRoom",
|
|
788
|
+
value: function groupsFitInRoom() {
|
|
789
|
+
var _this5 = this;
|
|
790
|
+
var room = this.room;
|
|
791
|
+
if (!room) return true;
|
|
792
|
+
return index.getDockingGroups(this.getAllPlannerElements()).every(function (group) {
|
|
793
|
+
if (group.every(function (member) {
|
|
794
|
+
return member.IsAccessoire;
|
|
795
|
+
})) return true;
|
|
796
|
+
if (!_this5.isWallBound(group)) return _this5.followsCarrier(group) || _this5.fitsInside(group, room);
|
|
797
|
+
var _this5$getWallBinding = _this5.getWallBinding(group, room),
|
|
798
|
+
groupBlock = _this5$getWallBinding.groupBlock,
|
|
799
|
+
pose = _this5$getWallBinding.pose;
|
|
800
|
+
if (!pose) return false;
|
|
801
|
+
return index.isSamePose(pose, groupBlock) || group.some(function (member) {
|
|
802
|
+
return !member.IsAccessoire && !member.GeoExtent;
|
|
803
|
+
});
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
// Whether the group with its followers, pushed inside the room (see insidePose), lies within it.
|
|
808
|
+
}, {
|
|
809
|
+
key: "fitsInside",
|
|
810
|
+
value: function fitsInside(group, room) {
|
|
811
|
+
var groupBlock = index.getGroupBlock([].concat(_toConsumableArray__default["default"](group), _toConsumableArray__default["default"](this.getFollowers(group))), this.getRoomFrame(group).RotDeg);
|
|
812
|
+
return index.fitsInsideRoom(toFloorRect(groupBlock.block, insidePose(groupBlock.block, groupBlock, room)), room);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
// A forced group goes to its nearest wall pose (false when it fits on none), any other group is pushed inside the room
|
|
816
|
+
// with its followers (their bodies too; false when it is wider or deeper than the room). The followers go along
|
|
817
|
+
// either way.
|
|
818
|
+
}, {
|
|
819
|
+
key: "placeGroupInRoom",
|
|
820
|
+
value: function placeGroupInRoom(group, frameElement) {
|
|
821
|
+
var _this6 = this;
|
|
822
|
+
var followers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getFollowers(group);
|
|
823
|
+
if (!this.room || group.every(function (member) {
|
|
824
|
+
return member.IsAccessoire;
|
|
825
|
+
})) return true;
|
|
826
|
+
group.forEach(function (member) {
|
|
827
|
+
return _this6.roomPlaced.add(member);
|
|
828
|
+
});
|
|
829
|
+
if (this.isWallBound(group)) return this.bindGroupToWalls(group, frameElement, followers);
|
|
830
|
+
var frame = this.getRoomFrame(group, frameElement);
|
|
831
|
+
var unit = [].concat(_toConsumableArray__default["default"](group), _toConsumableArray__default["default"](followers));
|
|
832
|
+
var groupBlock = index.getGroupBlock(unit, frame.RotDeg);
|
|
833
|
+
var pose = insidePose(groupBlock.block, groupBlock, this.room);
|
|
834
|
+
index.moveGroupRigidly(unit, groupBlock, pose);
|
|
835
|
+
return index.fitsInsideRoom(toFloorRect(groupBlock.block, pose), this.room);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// The element whose rotation frames the group: `preferred` unless it is an accessory, else the oldest main element.
|
|
839
|
+
}, {
|
|
840
|
+
key: "getRoomFrame",
|
|
841
|
+
value: function getRoomFrame(members, preferred) {
|
|
842
|
+
var _members$find;
|
|
843
|
+
if (preferred && !preferred.IsAccessoire) return preferred;
|
|
844
|
+
return (_members$find = members.find(function (member) {
|
|
845
|
+
return !member.IsAccessoire;
|
|
846
|
+
})) !== null && _members$find !== void 0 ? _members$find : members[0];
|
|
847
|
+
}
|
|
848
|
+
}, {
|
|
849
|
+
key: "bindGroupToWalls",
|
|
850
|
+
value: function bindGroupToWalls(members, frameElement) {
|
|
851
|
+
var followers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
852
|
+
if (!this.room || !members.length) return false;
|
|
853
|
+
var _this$getWallBinding = this.getWallBinding(members, this.room, frameElement),
|
|
854
|
+
groupBlock = _this$getWallBinding.groupBlock,
|
|
855
|
+
pose = _this$getWallBinding.pose;
|
|
856
|
+
if (!pose) return false;
|
|
857
|
+
index.moveGroupRigidly([].concat(_toConsumableArray__default["default"](members), _toConsumableArray__default["default"](followers)), groupBlock, pose);
|
|
858
|
+
return true;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/**
|
|
862
|
+
* The group as one block, and its wall pose (null: it fits on no wall), in the frame it is bound in: `preferred`'s,
|
|
863
|
+
* else the rotation of a main element in which it already stands on its wall pose (a group released by a turned
|
|
864
|
+
* element keeps that frame), else the oldest main element's (see getRoomFrame).
|
|
865
|
+
*/
|
|
866
|
+
}, {
|
|
867
|
+
key: "getWallBinding",
|
|
868
|
+
value: function getWallBinding(members, room, preferred) {
|
|
869
|
+
var _this7 = this;
|
|
870
|
+
var bindingIn = function bindingIn(frame) {
|
|
871
|
+
var groupBlock = _this7.getRoomBlock(members, frame);
|
|
872
|
+
return {
|
|
873
|
+
groupBlock: groupBlock,
|
|
874
|
+
pose: index.bindToWalls(groupBlock.center, groupBlock.block, room)
|
|
875
|
+
};
|
|
876
|
+
};
|
|
877
|
+
var first = bindingIn(this.getRoomFrame(members, preferred));
|
|
878
|
+
if (preferred && !preferred.IsAccessoire) return first;
|
|
879
|
+
var standsOn = function standsOn(_ref4) {
|
|
880
|
+
var groupBlock = _ref4.groupBlock,
|
|
881
|
+
pose = _ref4.pose;
|
|
882
|
+
return !!pose && index.isSamePose(pose, groupBlock);
|
|
883
|
+
};
|
|
884
|
+
if (standsOn(first)) return first;
|
|
885
|
+
var _iterator6 = _createForOfIteratorHelper(members),
|
|
886
|
+
_step6;
|
|
887
|
+
try {
|
|
888
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
889
|
+
var member = _step6.value;
|
|
890
|
+
if (member.IsAccessoire || member.RotDeg === first.groupBlock.rotDeg) continue;
|
|
891
|
+
var binding = bindingIn(member);
|
|
892
|
+
if (standsOn(binding)) return binding;
|
|
893
|
+
}
|
|
894
|
+
} catch (err) {
|
|
895
|
+
_iterator6.e(err);
|
|
896
|
+
} finally {
|
|
897
|
+
_iterator6.f();
|
|
898
|
+
}
|
|
899
|
+
return first;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/**
|
|
903
|
+
* Takes the 3D extents the viewer measured for this set's main elements, so a part reaching beyond the 2D outline
|
|
904
|
+
* stays out of the walls. A forced group a room rule placed goes to its wall pose with them (it was placed before its
|
|
905
|
+
* model was measured); a group as the planning was opened moves only with the next user action. Returns whether an
|
|
906
|
+
* element moved.
|
|
907
|
+
*/
|
|
908
|
+
}, {
|
|
909
|
+
key: "setElementFootprints",
|
|
910
|
+
value: function setElementFootprints(footprints) {
|
|
911
|
+
var _this8 = this;
|
|
912
|
+
var changed = [];
|
|
913
|
+
var _iterator7 = _createForOfIteratorHelper(footprints),
|
|
914
|
+
_step7;
|
|
915
|
+
try {
|
|
916
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
917
|
+
var _step7$value = _step7.value,
|
|
918
|
+
elementId = _step7$value.elementId,
|
|
919
|
+
minX = _step7$value.minX,
|
|
920
|
+
maxX = _step7$value.maxX,
|
|
921
|
+
minZ = _step7$value.minZ,
|
|
922
|
+
maxZ = _step7$value.maxZ,
|
|
923
|
+
top = _step7$value.top;
|
|
924
|
+
var element = this.plannerElements.get(elementId);
|
|
925
|
+
var extent = {
|
|
926
|
+
minX: minX,
|
|
927
|
+
maxX: maxX,
|
|
928
|
+
minZ: minZ,
|
|
929
|
+
maxZ: maxZ,
|
|
930
|
+
top: top
|
|
931
|
+
};
|
|
932
|
+
if (!element || element.IsAccessoire || index.sameGeoExtent(element.GeoExtent, extent)) continue;
|
|
933
|
+
element.GeoExtent = extent;
|
|
934
|
+
if (this.roomPlaced.has(element)) changed.push(element);
|
|
935
|
+
}
|
|
936
|
+
} catch (err) {
|
|
937
|
+
_iterator7.e(err);
|
|
938
|
+
} finally {
|
|
939
|
+
_iterator7.f();
|
|
940
|
+
}
|
|
941
|
+
if (!this.room || changed.length === 0) return false;
|
|
942
|
+
var groups = index.getDockingGroups(this.getAllPlannerElements()).filter(function (group) {
|
|
943
|
+
return group.some(function (member) {
|
|
944
|
+
return changed.includes(member);
|
|
945
|
+
}) && _this8.isWallBound(group) && !_this8.followsCarrier(group);
|
|
946
|
+
});
|
|
947
|
+
var members = groups.flat();
|
|
948
|
+
var before = members.map(function (member) {
|
|
949
|
+
return [member.WorldPosCenter.x, member.WorldPosCenter.z, member.RotDeg];
|
|
950
|
+
});
|
|
951
|
+
groups.forEach(function (group) {
|
|
952
|
+
return _this8.placeGroupInRoom(group);
|
|
953
|
+
});
|
|
954
|
+
var moved = members.some(function (member, i) {
|
|
955
|
+
var _before$i = _slicedToArray__default["default"](before[i], 3),
|
|
956
|
+
x = _before$i[0],
|
|
957
|
+
z = _before$i[1],
|
|
958
|
+
rotDeg = _before$i[2];
|
|
959
|
+
return member.WorldPosCenter.x !== x || member.WorldPosCenter.z !== z || member.RotDeg !== rotDeg;
|
|
960
|
+
});
|
|
961
|
+
if (!moved) return false;
|
|
962
|
+
this.updatePlannerPosNr();
|
|
963
|
+
this.checkCollision(false);
|
|
964
|
+
this.updatePlannerBoundingBox();
|
|
965
|
+
return true;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/** Whether the element's docking group is bound to the walls of the active room. */
|
|
969
|
+
}, {
|
|
970
|
+
key: "isElementWallBound",
|
|
971
|
+
value: function isElementWallBound(elementId) {
|
|
972
|
+
var element = this.plannerElements.get(elementId);
|
|
973
|
+
return !!this.room && !!element && this.isWallBound(this.getDockingGroupOf(element));
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* A group's wall mode: forced when a main element is forced or a corner element, else snap when one snaps, else free. A
|
|
978
|
+
* guest's own wall rule rests while it stands at its carrier.
|
|
979
|
+
*/
|
|
980
|
+
}, {
|
|
981
|
+
key: "getGroupWallMode",
|
|
982
|
+
value: function getGroupWallMode(members) {
|
|
983
|
+
var _this9 = this;
|
|
984
|
+
var catalogData = this.getCatalogData();
|
|
985
|
+
var modes = members.flatMap(function (member) {
|
|
986
|
+
var codex = _this9.getCarrierOf(member) ? '' : mainCodex(member);
|
|
987
|
+
if (!codex) return [];
|
|
988
|
+
return [catalogData.getCornerSide(codex) ? 'forced' : catalogData.getWallMode(codex)];
|
|
989
|
+
});
|
|
990
|
+
return modes.includes('forced') ? 'forced' : modes.includes('snap') ? 'snap' : 'free';
|
|
991
|
+
}
|
|
992
|
+
}, {
|
|
993
|
+
key: "isWallBound",
|
|
994
|
+
value: function isWallBound(members) {
|
|
995
|
+
return this.getGroupWallMode(members) === 'forced';
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
// The group as one block in `frame`'s rotation; a corner element at one of its ends pins that end into a corner.
|
|
999
|
+
}, {
|
|
1000
|
+
key: "getRoomBlock",
|
|
1001
|
+
value: function getRoomBlock(members, frame) {
|
|
1002
|
+
var groupBlock = index.getGroupBlock(members, frame.RotDeg);
|
|
1003
|
+
var catalogData = this.getCatalogData();
|
|
1004
|
+
var _iterator8 = _createForOfIteratorHelper(members),
|
|
1005
|
+
_step8;
|
|
1006
|
+
try {
|
|
1007
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
|
1008
|
+
var member = _step8.value;
|
|
1009
|
+
var codex = mainCodex(member);
|
|
1010
|
+
var side = codex ? catalogData.getCornerSide(codex) : undefined;
|
|
1011
|
+
if (!side) continue;
|
|
1012
|
+
var cornerEnd = index.getCornerEnd(members, frame.RotDeg, member, side);
|
|
1013
|
+
if (cornerEnd) return _objectSpread(_objectSpread({}, groupBlock), {}, {
|
|
1014
|
+
block: _objectSpread(_objectSpread({}, groupBlock.block), {}, {
|
|
1015
|
+
cornerEnd: cornerEnd
|
|
1016
|
+
})
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
} catch (err) {
|
|
1020
|
+
_iterator8.e(err);
|
|
1021
|
+
} finally {
|
|
1022
|
+
_iterator8.f();
|
|
1023
|
+
}
|
|
1024
|
+
return groupBlock;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/** A group collides unless all its main elements are NO_COLLISION (e.g. rugs). */
|
|
1028
|
+
}, {
|
|
1029
|
+
key: "collides",
|
|
1030
|
+
value: function collides(members) {
|
|
1031
|
+
var _this10 = this;
|
|
1032
|
+
return members.some(function (member) {
|
|
1033
|
+
var codex = mainCodex(member);
|
|
1034
|
+
return !!codex && !_this10.hasNoCollision(codex);
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
}, {
|
|
1038
|
+
key: "hasNoCollision",
|
|
1039
|
+
value: function hasNoCollision(codex) {
|
|
1040
|
+
return !!codex && this.getCatalogData().hasNoCollision(codex);
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
/** The article's placement types, primary first (PLACEMENT_TYPE, else palette group); empty without one. */
|
|
1044
|
+
}, {
|
|
1045
|
+
key: "getPlacementTypes",
|
|
1046
|
+
value: function getPlacementTypes(element) {
|
|
1047
|
+
var codex = element.ArticleCodex;
|
|
1048
|
+
return codex && this.getCatalogData().getPlacementType(codex) || [];
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
// The main elements of a group as carriers of placement slots, by their outlines (never the viewer's measures).
|
|
1052
|
+
}, {
|
|
1053
|
+
key: "getSlotMembers",
|
|
1054
|
+
value: function getSlotMembers(group) {
|
|
1055
|
+
var _this11 = this;
|
|
1056
|
+
return group.filter(function (member) {
|
|
1057
|
+
return !member.IsAccessoire;
|
|
1058
|
+
}).map(function (member) {
|
|
1059
|
+
return {
|
|
1060
|
+
types: _this11.getPlacementTypes(member),
|
|
1061
|
+
rotDeg: member.RotDeg,
|
|
1062
|
+
body: index.getElementShape(member, false).body[0],
|
|
1063
|
+
basketId: member.getBasketId()
|
|
1064
|
+
};
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
// The member with its shape where it stands (with the viewer's measures when `measured`) and its group as slot carrier.
|
|
1069
|
+
}, {
|
|
1070
|
+
key: "toCollisionShape",
|
|
1071
|
+
value: function toCollisionShape(member, slotMembers, measured) {
|
|
1072
|
+
return {
|
|
1073
|
+
elementId: member.ElementId,
|
|
1074
|
+
shape: index.getElementShape(member, measured),
|
|
1075
|
+
types: this.getPlacementTypes(member),
|
|
1076
|
+
group: slotMembers,
|
|
1077
|
+
layer: Number(member.Layer)
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
// The members of `group` that take part in collisions (see toCollisionShape).
|
|
1082
|
+
}, {
|
|
1083
|
+
key: "getCollidingShapes",
|
|
1084
|
+
value: function getCollidingShapes(group, measured) {
|
|
1085
|
+
var _this12 = this;
|
|
1086
|
+
var slotMembers = this.getSlotMembers(group);
|
|
1087
|
+
return group.filter(function (member) {
|
|
1088
|
+
return !_this12.hasNoCollision(member.ArticleCodex);
|
|
1089
|
+
}).map(function (member) {
|
|
1090
|
+
return _this12.toCollisionShape(member, slotMembers, measured);
|
|
1091
|
+
});
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
// Every element of the other colliding groups (not those of `unit`, the group with its followers), the elements of the
|
|
1095
|
+
// other sets (`otherSets`, else those without the guests going with `members`), and in a room the door clearances: the
|
|
1096
|
+
// swings and doorways (getDoorClearanceRects).
|
|
1097
|
+
}, {
|
|
1098
|
+
key: "getObstacles",
|
|
1099
|
+
value: function getObstacles(members, measured) {
|
|
1100
|
+
var _this13 = this;
|
|
1101
|
+
var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : members;
|
|
1102
|
+
var otherSets = arguments.length > 3 ? arguments[3] : undefined;
|
|
1103
|
+
if (!this.collides(members)) return [];
|
|
1104
|
+
var others = index.getDockingGroups(this.getAllPlannerElements()).filter(function (group) {
|
|
1105
|
+
return !group.some(function (member) {
|
|
1106
|
+
return unit.includes(member);
|
|
1107
|
+
}) && _this13.collides(group);
|
|
1108
|
+
});
|
|
1109
|
+
var _this$getCatalogData = this.getCatalogData(),
|
|
1110
|
+
catalogCodex = _this$getCatalogData.catalogCodex;
|
|
1111
|
+
// Two catalogs always collide; one catalog in two sets by its layer rule.
|
|
1112
|
+
var foreign = (otherSets !== null && otherSets !== void 0 ? otherSets : this.getOtherCollisionSets(members.map(function (member) {
|
|
1113
|
+
return member.ElementId;
|
|
1114
|
+
}))).flatMap(function (set) {
|
|
1115
|
+
return set.parts.map(function (_ref5) {
|
|
1116
|
+
var shape = _ref5.shape,
|
|
1117
|
+
types = _ref5.types,
|
|
1118
|
+
group = _ref5.group,
|
|
1119
|
+
elementId = _ref5.elementId,
|
|
1120
|
+
layer = _ref5.layer;
|
|
1121
|
+
var ownLayerRule = set.catalogCodex === catalogCodex;
|
|
1122
|
+
return {
|
|
1123
|
+
shape: shape,
|
|
1124
|
+
types: types,
|
|
1125
|
+
group: group,
|
|
1126
|
+
elementId: elementId,
|
|
1127
|
+
layer: ownLayerRule ? layer : undefined,
|
|
1128
|
+
setId: set.setId,
|
|
1129
|
+
rules: set.rules
|
|
1130
|
+
};
|
|
1131
|
+
});
|
|
1132
|
+
});
|
|
1133
|
+
var doors = (this.room ? index.getDoorClearanceRects(this.room) : []).map(function (swing) {
|
|
1134
|
+
var polygon = index.rectCorners(swing).map(function (corner) {
|
|
1135
|
+
return new index.Vector2(corner.x, corner.z);
|
|
1136
|
+
});
|
|
1137
|
+
return {
|
|
1138
|
+
shape: {
|
|
1139
|
+
body: [polygon],
|
|
1140
|
+
free: [polygon]
|
|
1141
|
+
},
|
|
1142
|
+
types: [],
|
|
1143
|
+
group: []
|
|
1144
|
+
};
|
|
1145
|
+
});
|
|
1146
|
+
return [].concat(_toConsumableArray__default["default"](others.flatMap(function (group) {
|
|
1147
|
+
return _this13.getCollidingShapes(group, measured);
|
|
1148
|
+
})), _toConsumableArray__default["default"](foreign), _toConsumableArray__default["default"](doors));
|
|
1149
|
+
}
|
|
1150
|
+
}, {
|
|
1151
|
+
key: "getDockingGroupOf",
|
|
1152
|
+
value: function getDockingGroupOf(element) {
|
|
1153
|
+
var _getDockingGroups$fin;
|
|
1154
|
+
return (_getDockingGroups$fin = index.getDockingGroups(this.getAllPlannerElements()).find(function (group) {
|
|
1155
|
+
return group.includes(element);
|
|
1156
|
+
})) !== null && _getDockingGroups$fin !== void 0 ? _getDockingGroups$fin : [element];
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
/** The element whose article has the basket id; undefined when the set has none. */
|
|
1160
|
+
}, {
|
|
1161
|
+
key: "getElementByBasketId",
|
|
1162
|
+
value: function getElementByBasketId(basketId) {
|
|
1163
|
+
return this.getAllPlannerElements().find(function (element) {
|
|
1164
|
+
return element.getBasketId() === basketId;
|
|
1165
|
+
});
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
// The carrier a guest stands at while its set is loaded; without a resolver only one of this set.
|
|
1169
|
+
}, {
|
|
1170
|
+
key: "getCarrierOf",
|
|
1171
|
+
value: function getCarrierOf(element) {
|
|
1172
|
+
var placement = element.Placement;
|
|
1173
|
+
if (!placement) return undefined;
|
|
1174
|
+
if (this.findCarrier) return this.findCarrier(placement);
|
|
1175
|
+
return this.getElementByBasketId(placement.carrierBasketId);
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
// Whether every main element of the group is a guest at a carrier outside it: the group goes with its carrier.
|
|
1179
|
+
}, {
|
|
1180
|
+
key: "followsCarrier",
|
|
1181
|
+
value: function followsCarrier(group) {
|
|
1182
|
+
var _this14 = this;
|
|
1183
|
+
var mains = group.filter(function (member) {
|
|
1184
|
+
return !member.IsAccessoire;
|
|
1185
|
+
});
|
|
1186
|
+
return mains.length > 0 && mains.every(function (member) {
|
|
1187
|
+
var carrier = _this14.getCarrierOf(member);
|
|
1188
|
+
return !!carrier && !group.includes(carrier);
|
|
1189
|
+
});
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
/**
|
|
1193
|
+
* The guests of this set that go with `members`: those standing at one of them, and the guests of those (at most
|
|
1194
|
+
* MAX_GUEST_DEPTH carriers deep), each with its docking group; never one of `members`.
|
|
1195
|
+
*/
|
|
1196
|
+
}, {
|
|
1197
|
+
key: "getFollowers",
|
|
1198
|
+
value: function getFollowers(members) {
|
|
1199
|
+
var _this15 = this;
|
|
1200
|
+
var unit = new Set(members);
|
|
1201
|
+
var followers = [];
|
|
1202
|
+
var carriers = members;
|
|
1203
|
+
for (var depth = 0; depth < index.MAX_GUEST_DEPTH && carriers.length > 0; depth++) {
|
|
1204
|
+
var guests = this.getAllPlannerElements().filter(function (element) {
|
|
1205
|
+
var carrier = !unit.has(element) && _this15.getCarrierOf(element);
|
|
1206
|
+
return !!carrier && carriers.includes(carrier);
|
|
1207
|
+
});
|
|
1208
|
+
var next = _toConsumableArray__default["default"](new Set(guests.flatMap(function (guest) {
|
|
1209
|
+
return _this15.getDockingGroupOf(guest);
|
|
1210
|
+
}))).filter(function (element) {
|
|
1211
|
+
return !unit.has(element);
|
|
1212
|
+
});
|
|
1213
|
+
next.forEach(function (element) {
|
|
1214
|
+
return unit.add(element);
|
|
1215
|
+
});
|
|
1216
|
+
followers.push.apply(followers, _toConsumableArray__default["default"](next));
|
|
1217
|
+
carriers = next;
|
|
1218
|
+
}
|
|
1219
|
+
return followers;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
/** The ids of the element's docking group, the element included. */
|
|
1223
|
+
}, {
|
|
1224
|
+
key: "getDockingGroupIds",
|
|
1225
|
+
value: function getDockingGroupIds(elementId) {
|
|
1226
|
+
var element = this.plannerElements.get(elementId);
|
|
1227
|
+
return element ? this.getDockingGroupOf(element).map(function (member) {
|
|
1228
|
+
return member.ElementId;
|
|
1229
|
+
}) : [];
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
/** The element's first placement type; undefined for an accessory or an article without one. */
|
|
1233
|
+
}, {
|
|
1234
|
+
key: "getGuestType",
|
|
1235
|
+
value: function getGuestType(elementId) {
|
|
1236
|
+
var element = this.plannerElements.get(elementId);
|
|
1237
|
+
return element && !element.IsAccessoire ? this.getPlacementTypes(element)[0] : undefined;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
/** The main elements of every docking group as slot carriers (see `getSlotMembers`), but groups holding one of `excludeIds`. */
|
|
1241
|
+
}, {
|
|
1242
|
+
key: "getSlotCarriers",
|
|
1243
|
+
value: function getSlotCarriers(excludeIds) {
|
|
1244
|
+
var _this16 = this;
|
|
1245
|
+
return index.getDockingGroups(this.getAllPlannerElements()).filter(function (group) {
|
|
1246
|
+
return !group.some(function (member) {
|
|
1247
|
+
return excludeIds.includes(member.ElementId);
|
|
1248
|
+
});
|
|
1249
|
+
}).map(function (group) {
|
|
1250
|
+
return _this16.getSlotMembers(group);
|
|
1251
|
+
}).filter(function (members) {
|
|
1252
|
+
return members.length > 0;
|
|
1253
|
+
});
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
/** Moves the element's docking group rigidly so the element stands at `pose` (a guest following its carrier). */
|
|
1257
|
+
}, {
|
|
1258
|
+
key: "moveGuest",
|
|
1259
|
+
value: function moveGuest(elementId, pose) {
|
|
1260
|
+
var element = this.plannerElements.get(elementId);
|
|
1261
|
+
if (element) index.moveGroupRigidly(this.getDockingGroupOf(element), index.poseOf(element), pose);
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
/** After guests moved: position numbers, the collision warning and the bounding box follow. */
|
|
1265
|
+
}, {
|
|
1266
|
+
key: "refreshAfterGuestMoves",
|
|
1267
|
+
value: function refreshAfterGuestMoves() {
|
|
1268
|
+
this.updatePlannerPosNr();
|
|
1269
|
+
this.checkCollision(false);
|
|
1270
|
+
this.updatePlannerBoundingBox();
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
/**
|
|
1274
|
+
* Whether the element's docking group, moved so the element stands at `pose`, runs a body into another body of this set
|
|
1275
|
+
* or of `otherSets` (a zone does not count, a slot guest at its carrier as everywhere); the group stays where it is.
|
|
1276
|
+
*/
|
|
1277
|
+
}, {
|
|
1278
|
+
key: "isBodyBlockedAt",
|
|
1279
|
+
value: function isBodyBlockedAt(elementId, pose, otherSets) {
|
|
1280
|
+
var element = this.plannerElements.get(elementId);
|
|
1281
|
+
if (!element) return true;
|
|
1282
|
+
var group = this.getDockingGroupOf(element);
|
|
1283
|
+
var saved = group.map(function (member) {
|
|
1284
|
+
return {
|
|
1285
|
+
member: member,
|
|
1286
|
+
center: member.WorldPosCenter,
|
|
1287
|
+
rotDeg: member.RotDeg
|
|
1288
|
+
};
|
|
1289
|
+
});
|
|
1290
|
+
index.moveGroupRigidly(group, index.poseOf(element), pose);
|
|
1291
|
+
var drag = this.createRoomDrag(elementId, false, otherSets);
|
|
1292
|
+
if (drag) drag.zonesBlock = false;
|
|
1293
|
+
var blocked = !!drag && this.isBlocked(drag, drag.start);
|
|
1294
|
+
var _iterator9 = _createForOfIteratorHelper(saved),
|
|
1295
|
+
_step9;
|
|
1296
|
+
try {
|
|
1297
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
|
1298
|
+
var _step9$value = _step9.value,
|
|
1299
|
+
member = _step9$value.member,
|
|
1300
|
+
center = _step9$value.center,
|
|
1301
|
+
rotDeg = _step9$value.rotDeg;
|
|
1302
|
+
member.WorldPosCenter = center;
|
|
1303
|
+
member.RotDeg = rotDeg;
|
|
1304
|
+
}
|
|
1305
|
+
} catch (err) {
|
|
1306
|
+
_iterator9.e(err);
|
|
1307
|
+
} finally {
|
|
1308
|
+
_iterator9.f();
|
|
1309
|
+
}
|
|
1310
|
+
return blocked;
|
|
1311
|
+
}
|
|
1312
|
+
}, {
|
|
1313
|
+
key: "startRoomDrag",
|
|
1314
|
+
value: function startRoomDrag(elementId) {
|
|
1315
|
+
this.roomDrag = undefined;
|
|
1316
|
+
var drag = this.createRoomDrag(elementId);
|
|
1317
|
+
if (!drag) return;
|
|
1318
|
+
drag.zonesBlock = false;
|
|
1319
|
+
var moved = this.movedShapes(drag, drag.start);
|
|
1320
|
+
var _iterator10 = _createForOfIteratorHelper(drag.obstacles),
|
|
1321
|
+
_step10;
|
|
1322
|
+
try {
|
|
1323
|
+
var _loop = function _loop() {
|
|
1324
|
+
var obstacle = _step10.value;
|
|
1325
|
+
// A guest standing in its slot as far under its carrier as the slot lets it (a chair at the table) overlaps by right.
|
|
1326
|
+
var depths = moved.map(function (member) {
|
|
1327
|
+
var _obstacle$rules;
|
|
1328
|
+
return index.slotExempt(drag.rules, member, (_obstacle$rules = obstacle.rules) !== null && _obstacle$rules !== void 0 ? _obstacle$rules : drag.rules, obstacle) ? 0 : index.bodiesOverlap(member.shape, obstacle.shape);
|
|
1329
|
+
});
|
|
1330
|
+
if (depths.some(function (depth) {
|
|
1331
|
+
return depth > 0;
|
|
1332
|
+
})) drag.startOverlaps.set(obstacle, depths);
|
|
1333
|
+
};
|
|
1334
|
+
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
|
|
1335
|
+
_loop();
|
|
1336
|
+
}
|
|
1337
|
+
} catch (err) {
|
|
1338
|
+
_iterator10.e(err);
|
|
1339
|
+
} finally {
|
|
1340
|
+
_iterator10.f();
|
|
1341
|
+
}
|
|
1342
|
+
this.roomDrag = drag;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
/**
|
|
1346
|
+
* The element's group as one block where it stands, with its followers (see `getFollowers`): the members' and the
|
|
1347
|
+
* followers' shapes and every obstacle but them; not started. A forced group's block is its own, any other group's
|
|
1348
|
+
* takes in the followers, so the room rule keeps them inside too.
|
|
1349
|
+
*/
|
|
1350
|
+
}, {
|
|
1351
|
+
key: "createRoomDrag",
|
|
1352
|
+
value: function createRoomDrag(elementId) {
|
|
1353
|
+
var _this17 = this;
|
|
1354
|
+
var measured = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
1355
|
+
var otherSets = arguments.length > 2 ? arguments[2] : undefined;
|
|
1356
|
+
var element = this.plannerElements.get(elementId);
|
|
1357
|
+
if (!element) return undefined;
|
|
1358
|
+
var members = this.getDockingGroupOf(element);
|
|
1359
|
+
if (members.every(function (member) {
|
|
1360
|
+
return member.IsAccessoire;
|
|
1361
|
+
})) return undefined;
|
|
1362
|
+
var followers = this.getFollowers(members);
|
|
1363
|
+
var wallMode = this.getGroupWallMode(members);
|
|
1364
|
+
var frame = this.getRoomFrame(members, element);
|
|
1365
|
+
var start = wallMode === 'forced' ? this.getRoomBlock(members, frame) : index.getGroupBlock([].concat(_toConsumableArray__default["default"](members), _toConsumableArray__default["default"](followers)), frame.RotDeg);
|
|
1366
|
+
var position = element.WorldPosCenter;
|
|
1367
|
+
var followerShapes = index.getDockingGroups(followers).filter(function (group) {
|
|
1368
|
+
return _this17.collides(group);
|
|
1369
|
+
}).flatMap(function (group) {
|
|
1370
|
+
return _this17.getCollidingShapes(group, measured);
|
|
1371
|
+
});
|
|
1372
|
+
var memberShapes = this.collides(members) ? this.getCollidingShapes(members, measured) : [];
|
|
1373
|
+
var drag = {
|
|
1374
|
+
elementId: elementId,
|
|
1375
|
+
members: members,
|
|
1376
|
+
followers: followers,
|
|
1377
|
+
start: start,
|
|
1378
|
+
current: start,
|
|
1379
|
+
grabbedStart: {
|
|
1380
|
+
x: position.x,
|
|
1381
|
+
z: position.z
|
|
1382
|
+
},
|
|
1383
|
+
grabbedStartRotDeg: element.RotDeg,
|
|
1384
|
+
dx: 0,
|
|
1385
|
+
dz: 0,
|
|
1386
|
+
wallMode: wallMode,
|
|
1387
|
+
shapes: this.collides(members) ? [].concat(_toConsumableArray__default["default"](memberShapes), _toConsumableArray__default["default"](followerShapes)) : [],
|
|
1388
|
+
memberShapes: memberShapes.length,
|
|
1389
|
+
obstacles: this.getObstacles(members, measured, [].concat(_toConsumableArray__default["default"](members), _toConsumableArray__default["default"](followers)), otherSets),
|
|
1390
|
+
blockedBy: [],
|
|
1391
|
+
startOverlaps: new Map(),
|
|
1392
|
+
rules: this.getCatalogData().placementOptions.rules,
|
|
1393
|
+
zonesBlock: true,
|
|
1394
|
+
rotating: false,
|
|
1395
|
+
slotSnapped: false
|
|
1396
|
+
};
|
|
1397
|
+
return drag;
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
/**
|
|
1401
|
+
* A group placed beside the planning, or by the room rules, that stands on another group (of this set or another set in
|
|
1402
|
+
* 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
|
|
1403
|
+
* until it touches what it was cleared of. It stays where it is when the room has no free pose for it.
|
|
1404
|
+
*/
|
|
1405
|
+
}, {
|
|
1406
|
+
key: "moveClearOfObstacles",
|
|
1407
|
+
value: function moveClearOfObstacles(elementId, room) {
|
|
1408
|
+
var drag = this.createRoomDrag(elementId);
|
|
1409
|
+
if (!drag || !this.isBlocked(drag, drag.start)) return;
|
|
1410
|
+
var _drag$start = drag.start,
|
|
1411
|
+
block = _drag$start.block,
|
|
1412
|
+
rotDeg = _drag$start.rotDeg;
|
|
1413
|
+
_drag$start.center;
|
|
1414
|
+
var poseAt = function poseAt(raw) {
|
|
1415
|
+
return drag.wallMode === 'forced' ? index.bindToWalls(raw, block, room) : insidePose(block, {
|
|
1416
|
+
center: raw,
|
|
1417
|
+
rotDeg: rotDeg
|
|
1418
|
+
}, room);
|
|
1419
|
+
};
|
|
1420
|
+
var xs = room.footprint.map(function (_ref6) {
|
|
1421
|
+
var _ref7 = _slicedToArray__default["default"](_ref6, 1),
|
|
1422
|
+
x = _ref7[0];
|
|
1423
|
+
return x;
|
|
1424
|
+
});
|
|
1425
|
+
var zs = room.footprint.map(function (_ref8) {
|
|
1426
|
+
var _ref9 = _slicedToArray__default["default"](_ref8, 2),
|
|
1427
|
+
z = _ref9[1];
|
|
1428
|
+
return z;
|
|
1429
|
+
});
|
|
1430
|
+
var reach = Math.hypot(Math.max.apply(Math, _toConsumableArray__default["default"](xs)) - Math.min.apply(Math, _toConsumableArray__default["default"](xs)), Math.max.apply(Math, _toConsumableArray__default["default"](zs)) - Math.min.apply(Math, _toConsumableArray__default["default"](zs)));
|
|
1431
|
+
var target = this.nearestFreePose(drag, drag.start, poseAt, reach);
|
|
1432
|
+
if (target) index.moveGroupRigidly([].concat(_toConsumableArray__default["default"](drag.members), _toConsumableArray__default["default"](drag.followers)), drag.start, target);
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
// Of the free poses on the first ring around `origin` that has one, slid back until they touch, the nearest one.
|
|
1436
|
+
}, {
|
|
1437
|
+
key: "nearestFreePose",
|
|
1438
|
+
value: function nearestFreePose(drag, origin, poseAt, reach) {
|
|
1439
|
+
var center = origin.center;
|
|
1440
|
+
for (var radius = CLEAR_SEARCH_STEP; radius <= reach; radius += CLEAR_SEARCH_STEP) {
|
|
1441
|
+
var nearest = void 0;
|
|
1442
|
+
for (var i = 0; i < CLEAR_SEARCH_DIRECTIONS; i++) {
|
|
1443
|
+
var _this$slideToContact;
|
|
1444
|
+
var angle = i / CLEAR_SEARCH_DIRECTIONS * 2 * Math.PI;
|
|
1445
|
+
var pose = poseAt({
|
|
1446
|
+
x: center.x + radius * Math.cos(angle),
|
|
1447
|
+
z: center.z + radius * Math.sin(angle)
|
|
1448
|
+
});
|
|
1449
|
+
if (!pose || this.isBlocked(drag, pose)) continue;
|
|
1450
|
+
drag.current = pose;
|
|
1451
|
+
var slid = (_this$slideToContact = this.slideToContact(drag, origin)) === null || _this$slideToContact === void 0 ? void 0 : _this$slideToContact.pose;
|
|
1452
|
+
// The way back may cross a notch of the room: the slid pose counts only where the room rule keeps it.
|
|
1453
|
+
var kept = slid && poseAt(slid.center);
|
|
1454
|
+
var target = slid && kept && Math.hypot(kept.center.x - slid.center.x, kept.center.z - slid.center.z) < 0.5 ? slid : pose;
|
|
1455
|
+
var distance = Math.hypot(target.center.x - center.x, target.center.z - center.z);
|
|
1456
|
+
if (!nearest || distance < nearest.distance - START_NOISE) nearest = {
|
|
1457
|
+
pose: target,
|
|
1458
|
+
distance: distance
|
|
1459
|
+
};
|
|
1460
|
+
}
|
|
1461
|
+
if (nearest) return nearest.pose;
|
|
1462
|
+
}
|
|
1463
|
+
return undefined;
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
/**
|
|
1467
|
+
* Puts a new element at the first free place a slot of the `isCarrier` groups suggests (lowest PosNr first, planner
|
|
1468
|
+
* data only), numbers it last (PosNrAtEnd) and makes it a guest of the carrier (see `attachToSlot`); false, the element
|
|
1469
|
+
* unmoved, when no place is free.
|
|
1470
|
+
*/
|
|
1471
|
+
}, {
|
|
1472
|
+
key: "placeAtSuggestedPlace",
|
|
1473
|
+
value: function placeAtSuggestedPlace(element, isCarrier) {
|
|
1474
|
+
var _this18 = this;
|
|
1475
|
+
var _ref10 = element.IsAccessoire ? [] : this.getPlacementTypes(element),
|
|
1476
|
+
_ref11 = _slicedToArray__default["default"](_ref10, 1),
|
|
1477
|
+
type = _ref11[0];
|
|
1478
|
+
if (!type) return false;
|
|
1479
|
+
var rules = this.getCatalogData().placementOptions.rules;
|
|
1480
|
+
var before = {
|
|
1481
|
+
center: {
|
|
1482
|
+
x: element.WorldPosCenter.x,
|
|
1483
|
+
z: element.WorldPosCenter.z
|
|
1484
|
+
},
|
|
1485
|
+
rotDeg: element.RotDeg
|
|
1486
|
+
};
|
|
1487
|
+
var body = index.getElementShape(element, false).body[0];
|
|
1488
|
+
var outline = function outline(rotDeg) {
|
|
1489
|
+
return index.movePoints(body, before, {
|
|
1490
|
+
center: {
|
|
1491
|
+
x: 0,
|
|
1492
|
+
z: 0
|
|
1493
|
+
},
|
|
1494
|
+
rotDeg: rotDeg
|
|
1495
|
+
});
|
|
1496
|
+
};
|
|
1497
|
+
var lowestPosNr = function lowestPosNr(group) {
|
|
1498
|
+
return Math.min.apply(Math, _toConsumableArray__default["default"](group.map(function (member) {
|
|
1499
|
+
return member.PosNr;
|
|
1500
|
+
})));
|
|
1501
|
+
};
|
|
1502
|
+
var carriers = index.getDockingGroups(this.getAllPlannerElements().filter(function (other) {
|
|
1503
|
+
return other !== element;
|
|
1504
|
+
})).filter(function (group) {
|
|
1505
|
+
return isCarrier(group) && group.some(function (member) {
|
|
1506
|
+
return !member.IsAccessoire;
|
|
1507
|
+
});
|
|
1508
|
+
}).sort(function (a, b) {
|
|
1509
|
+
return lowestPosNr(a) - lowestPosNr(b);
|
|
1510
|
+
});
|
|
1511
|
+
var otherSets = carriers.length > 0 ? this.getOtherCollisionSets() : [];
|
|
1512
|
+
var _iterator11 = _createForOfIteratorHelper(carriers),
|
|
1513
|
+
_step11;
|
|
1514
|
+
try {
|
|
1515
|
+
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
|
|
1516
|
+
var group = _step11.value;
|
|
1517
|
+
var _iterator12 = _createForOfIteratorHelper(index.getCarrierSlots(rules, this.getSlotMembers(group), type)),
|
|
1518
|
+
_step12;
|
|
1519
|
+
try {
|
|
1520
|
+
for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
|
|
1521
|
+
var slot = _step12.value;
|
|
1522
|
+
if (!index.getSlotPlaces(slot, outline).some(function (place) {
|
|
1523
|
+
return _this18.fitsAt(element, place, otherSets);
|
|
1524
|
+
})) continue;
|
|
1525
|
+
element.PosNrAtEnd = true;
|
|
1526
|
+
this.attachToSlot(element, slot);
|
|
1527
|
+
return true;
|
|
1528
|
+
}
|
|
1529
|
+
} catch (err) {
|
|
1530
|
+
_iterator12.e(err);
|
|
1531
|
+
} finally {
|
|
1532
|
+
_iterator12.f();
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
} catch (err) {
|
|
1536
|
+
_iterator11.e(err);
|
|
1537
|
+
} finally {
|
|
1538
|
+
_iterator11.f();
|
|
1539
|
+
}
|
|
1540
|
+
element.WorldPosCenter = new index.Vector3(before.center.x, element.WorldPosCenter.y, before.center.z);
|
|
1541
|
+
element.RotDeg = before.rotDeg;
|
|
1542
|
+
return false;
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
// Makes the element a guest of the member of `slot` nearest to it: it goes with that carrier from now on. Not when the
|
|
1546
|
+
// carrier is a guest MAX_GUEST_DEPTH deep itself.
|
|
1547
|
+
}, {
|
|
1548
|
+
key: "attachToSlot",
|
|
1549
|
+
value: function attachToSlot(element, slot) {
|
|
1550
|
+
var _getNearestMember;
|
|
1551
|
+
var basketId = (_getNearestMember = index.getNearestMember(slot, index.poseOf(element).center)) === null || _getNearestMember === void 0 ? void 0 : _getNearestMember.basketId;
|
|
1552
|
+
var carrier = basketId ? this.getElementByBasketId(basketId) : undefined;
|
|
1553
|
+
if (!basketId || !carrier || this.getGuestDepth(carrier) >= index.MAX_GUEST_DEPTH) return;
|
|
1554
|
+
var offset = index.toPlacementOffset(index.poseOf(carrier), index.poseOf(element));
|
|
1555
|
+
element.Placement = {
|
|
1556
|
+
carrierBasketId: basketId,
|
|
1557
|
+
slotId: slot.id,
|
|
1558
|
+
offset: offset
|
|
1559
|
+
};
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
// How many carriers stand above the element: 0 on its own, 1 at a carrier on its own, …
|
|
1563
|
+
}, {
|
|
1564
|
+
key: "getGuestDepth",
|
|
1565
|
+
value: function getGuestDepth(element) {
|
|
1566
|
+
var depth = 0;
|
|
1567
|
+
for (var carrier = this.getCarrierOf(element); carrier && depth <= index.MAX_GUEST_DEPTH; carrier = this.getCarrierOf(carrier)) depth++;
|
|
1568
|
+
return depth;
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
// Moves the element to `pose` as the room rule keeps it; whether it fits there: the rule moves it no further than the
|
|
1572
|
+
// tolerance and it collides with nothing of this set or of `otherSets`.
|
|
1573
|
+
}, {
|
|
1574
|
+
key: "fitsAt",
|
|
1575
|
+
value: function fitsAt(element, pose, otherSets) {
|
|
1576
|
+
element.WorldPosCenter = new index.Vector3(pose.center.x, this.plannerBoundingBox.WorldPos.y, pose.center.z);
|
|
1577
|
+
element.RotDeg = pose.rotDeg;
|
|
1578
|
+
var drag = this.createRoomDrag(element.ElementId, false, otherSets);
|
|
1579
|
+
var kept = drag && this.getKeptPose(drag);
|
|
1580
|
+
if (!drag || !kept) return false;
|
|
1581
|
+
index.moveGroupRigidly(drag.members, drag.start, kept);
|
|
1582
|
+
return !this.isBlocked(drag, kept);
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
// Where the room rule of its wall mode keeps the drag's group standing at `pose` (no room: the pose); undefined when it
|
|
1586
|
+
// would move the group further than `tolerance`, turn it, or fit it on no wall.
|
|
1587
|
+
}, {
|
|
1588
|
+
key: "getKeptPose",
|
|
1589
|
+
value: function getKeptPose(drag) {
|
|
1590
|
+
var pose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : drag.start;
|
|
1591
|
+
var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : PLACE_TOLERANCE;
|
|
1592
|
+
var room = this.room;
|
|
1593
|
+
if (!room) return pose;
|
|
1594
|
+
var block = drag.start.block;
|
|
1595
|
+
var center = pose.center,
|
|
1596
|
+
rotDeg = pose.rotDeg;
|
|
1597
|
+
var kept = drag.wallMode === 'forced' ? index.bindToWalls(center, block, room) : insidePose(block, pose, room);
|
|
1598
|
+
if (!kept || Math.hypot(kept.center.x - center.x, kept.center.z - center.z) > tolerance) return undefined;
|
|
1599
|
+
return Math.abs(index.getTurnDeg(rotDeg, kept.rotDeg)) > 0.01 ? undefined : kept;
|
|
1600
|
+
}
|
|
1601
|
+
|
|
1602
|
+
// The colliding members and followers of the dragged group, moved with it to `pose`, each group's carrier outlines too.
|
|
1603
|
+
}, {
|
|
1604
|
+
key: "movedShapes",
|
|
1605
|
+
value: function movedShapes(drag, pose) {
|
|
1606
|
+
var movedGroups = new Map();
|
|
1607
|
+
return drag.shapes.map(function (member) {
|
|
1608
|
+
var _movedGroups$get;
|
|
1609
|
+
var group = (_movedGroups$get = movedGroups.get(member.group)) !== null && _movedGroups$get !== void 0 ? _movedGroups$get : member.group.map(function (slotMember) {
|
|
1610
|
+
return index.moveSlotMember(slotMember, drag.start, pose);
|
|
1611
|
+
});
|
|
1612
|
+
movedGroups.set(member.group, group);
|
|
1613
|
+
return _objectSpread(_objectSpread({}, member), {}, {
|
|
1614
|
+
shape: index.moveShape(member.shape, drag.start, pose),
|
|
1615
|
+
group: group
|
|
1616
|
+
});
|
|
1617
|
+
});
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
// Whether a member collides with an obstacle: body against body (a pair that overlapped at the start once it gets
|
|
1621
|
+
// 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
|
|
1622
|
+
// 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
|
|
1623
|
+
// (a chair's seat under the table top). Two layers only as the catalog lets them collide, as in the collision warning.
|
|
1624
|
+
}, {
|
|
1625
|
+
key: "overlapsAny",
|
|
1626
|
+
value: function overlapsAny(moved, obstacle, drag) {
|
|
1627
|
+
var startDepths = drag.startOverlaps.get(obstacle);
|
|
1628
|
+
var collidingLayers = this.getCatalogData().checkCollisionForDifferentLayers;
|
|
1629
|
+
return moved.some(function (member, i) {
|
|
1630
|
+
var _obstacle$rules2;
|
|
1631
|
+
if (obstacle.layer !== undefined && !index.layersCollide(collidingLayers, member.layer, obstacle.layer)) return false;
|
|
1632
|
+
if (startDepths) return index.bodiesOverlap(member.shape, obstacle.shape) > startDepths[i] + DEPTH_NOISE;
|
|
1633
|
+
return index.shapesCollide(member.shape, obstacle.shape, !drag.zonesBlock) && !index.slotExempt(drag.rules, member, (_obstacle$rules2 = obstacle.rules) !== null && _obstacle$rules2 !== void 0 ? _obstacle$rules2 : drag.rules, obstacle);
|
|
1634
|
+
});
|
|
1635
|
+
}
|
|
1636
|
+
}, {
|
|
1637
|
+
key: "isBlocked",
|
|
1638
|
+
value: function isBlocked(drag, pose) {
|
|
1639
|
+
var _this19 = this;
|
|
1640
|
+
var moved = this.movedShapes(drag, pose);
|
|
1641
|
+
return drag.obstacles.some(function (obstacle) {
|
|
1642
|
+
return _this19.overlapsAny(moved, obstacle, drag);
|
|
1643
|
+
});
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
// The obstacles the group runs into at `pose`.
|
|
1647
|
+
}, {
|
|
1648
|
+
key: "blockersAt",
|
|
1649
|
+
value: function blockersAt(drag, pose) {
|
|
1650
|
+
var _this20 = this;
|
|
1651
|
+
var moved = this.movedShapes(drag, pose);
|
|
1652
|
+
return drag.obstacles.filter(function (obstacle) {
|
|
1653
|
+
return _this20.overlapsAny(moved, obstacle, drag);
|
|
1654
|
+
});
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
// The straight way from the current pose to `target`, checked every PATH_STEP and cut at the first contact: the
|
|
1658
|
+
// furthest free pose before it (none when the group cannot move at all), so a blocked group ends up touching, and the
|
|
1659
|
+
// obstacles it runs into just beyond; `target` and none when the whole way is free. Undefined when the way turns the group.
|
|
1660
|
+
}, {
|
|
1661
|
+
key: "slideToContact",
|
|
1662
|
+
value: function slideToContact(drag, target) {
|
|
1663
|
+
if (Math.abs(index.getTurnDeg(drag.current.rotDeg, target.rotDeg)) > 0.01) return undefined;
|
|
1664
|
+
var from = drag.current.center;
|
|
1665
|
+
var at = function at(s) {
|
|
1666
|
+
return {
|
|
1667
|
+
center: {
|
|
1668
|
+
x: from.x + (target.center.x - from.x) * s,
|
|
1669
|
+
z: from.z + (target.center.z - from.z) * s
|
|
1670
|
+
},
|
|
1671
|
+
rotDeg: target.rotDeg
|
|
1672
|
+
};
|
|
1673
|
+
};
|
|
1674
|
+
var steps = Math.max(1, Math.ceil(Math.hypot(target.center.x - from.x, target.center.z - from.z) / PATH_STEP));
|
|
1675
|
+
var free = 0;
|
|
1676
|
+
for (var step = 1; step <= steps; step++) {
|
|
1677
|
+
var blocked = step / steps;
|
|
1678
|
+
if (!this.isBlocked(drag, at(blocked))) {
|
|
1679
|
+
free = blocked;
|
|
1680
|
+
continue;
|
|
1681
|
+
}
|
|
1682
|
+
for (var i = 0; i < 12; i++) {
|
|
1683
|
+
var mid = (free + blocked) / 2;
|
|
1684
|
+
if (this.isBlocked(drag, at(mid))) blocked = mid;else free = mid;
|
|
1685
|
+
}
|
|
1686
|
+
return {
|
|
1687
|
+
pose: free > 0 ? at(free) : undefined,
|
|
1688
|
+
blockers: this.blockersAt(drag, at(blocked))
|
|
1689
|
+
};
|
|
1690
|
+
}
|
|
1691
|
+
return {
|
|
1692
|
+
pose: target,
|
|
1693
|
+
blockers: []
|
|
1694
|
+
};
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
// The group follows the grabbed element rigidly to the wall or inside-room pose of the raw centre, also where it runs
|
|
1698
|
+
// into an obstacle: what it runs into there is kept as `blockedBy` (the viewer shows the drag blocked, a release there
|
|
1699
|
+
// 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
|
|
1700
|
+
// start (a cancel, a blocked release) it stands exactly where it started, nothing snaps.
|
|
1701
|
+
}, {
|
|
1702
|
+
key: "updateRoomDrag",
|
|
1703
|
+
value: function updateRoomDrag(room, drag, deltaMove) {
|
|
1704
|
+
drag.dx += deltaMove.x;
|
|
1705
|
+
drag.dz += deltaMove.z;
|
|
1706
|
+
var _drag$start2 = drag.start,
|
|
1707
|
+
block = _drag$start2.block,
|
|
1708
|
+
rotDeg = _drag$start2.rotDeg;
|
|
1709
|
+
var rawCenter = {
|
|
1710
|
+
x: drag.start.center.x + drag.dx,
|
|
1711
|
+
z: drag.start.center.z + drag.dz
|
|
1712
|
+
};
|
|
1713
|
+
var atStart = Math.hypot(drag.dx, drag.dz) <= START_NOISE;
|
|
1714
|
+
// A free slot place near the pointer comes before the wall.
|
|
1715
|
+
var slotPose = atStart ? undefined : this.getSlotSnapPose(drag);
|
|
1716
|
+
var wallPose = atStart || slotPose || drag.wallMode === 'free' ? null : index.bindToWalls(rawCenter, block, room);
|
|
1717
|
+
var snapsToWall = !!wallPose && Math.hypot(wallPose.center.x - rawCenter.x, wallPose.center.z - rawCenter.z) <= WALL_SNAP_DISTANCE;
|
|
1718
|
+
var startPose = {
|
|
1719
|
+
center: drag.start.center,
|
|
1720
|
+
rotDeg: rotDeg
|
|
1721
|
+
};
|
|
1722
|
+
var wanted = atStart ? startPose : slotPose !== null && slotPose !== void 0 ? slotPose : wallPose && (drag.wallMode === 'forced' || snapsToWall) ? wallPose : insidePose(block, {
|
|
1723
|
+
center: rawCenter,
|
|
1724
|
+
rotDeg: rotDeg
|
|
1725
|
+
}, room);
|
|
1726
|
+
drag.blockedBy = this.blockersAt(drag, wanted);
|
|
1727
|
+
index.moveGroupRigidly([].concat(_toConsumableArray__default["default"](drag.members), _toConsumableArray__default["default"](drag.followers)), drag.current, wanted);
|
|
1728
|
+
drag.current = wanted;
|
|
1729
|
+
drag.slotSnapped = !!slotPose;
|
|
1730
|
+
// A pair that overlapped at the start may only come apart, never go back in.
|
|
1731
|
+
if (drag.startOverlaps.size === 0) return;
|
|
1732
|
+
var moved = this.movedShapes(drag, wanted);
|
|
1733
|
+
drag.startOverlaps.forEach(function (depths, obstacle) {
|
|
1734
|
+
return drag.startOverlaps.set(obstacle, depths.map(function (depth, i) {
|
|
1735
|
+
return Math.min(depth, index.bodiesOverlap(moved[i].shape, obstacle.shape));
|
|
1736
|
+
}));
|
|
1737
|
+
});
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
// The unit moved rigidly onto the nearest dock of `element` outside it (see findDockSnap), else with `slots` into the
|
|
1741
|
+
// nearest free slot place (see findSlotSnap).
|
|
1742
|
+
}, {
|
|
1743
|
+
key: "snapToDock",
|
|
1744
|
+
value: function snapToDock(element, unit, autoDockingDistance, slots) {
|
|
1745
|
+
var _this$findDockSnap2;
|
|
1746
|
+
var unitIds = unit.map(function (member) {
|
|
1747
|
+
return member.ElementId;
|
|
1748
|
+
});
|
|
1749
|
+
var snap = (_this$findDockSnap2 = this.findDockSnap(element, autoDockingDistance, unitIds)) !== null && _this$findDockSnap2 !== void 0 ? _this$findDockSnap2 : slots ? this.findSlotSnap(element) : null;
|
|
1750
|
+
if (!snap) return;
|
|
1751
|
+
var move = this.snapMove(element, snap);
|
|
1752
|
+
index.moveGroupRigidly(unit, move.from, move.to);
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
// 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
|
|
1756
|
+
// rest of its group), with the guests that go along; and the free slot places it may snap into.
|
|
1757
|
+
}, {
|
|
1758
|
+
key: "startDragUnit",
|
|
1759
|
+
value: function startDragUnit(elementId, roomDrag) {
|
|
1760
|
+
var _roomDrag$followers, _roomDrag$members$map;
|
|
1761
|
+
var element = this.plannerElements.get(elementId);
|
|
1762
|
+
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)) : [];
|
|
1763
|
+
this.dragFollowers = new Set(followers.map(function (follower) {
|
|
1764
|
+
return follower.ElementId;
|
|
1765
|
+
}));
|
|
1766
|
+
this.dragUnit = new Set([elementId].concat(_toConsumableArray__default["default"]((_roomDrag$members$map = roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.members.map(function (member) {
|
|
1767
|
+
return member.ElementId;
|
|
1768
|
+
})) !== null && _roomDrag$members$map !== void 0 ? _roomDrag$members$map : []), _toConsumableArray__default["default"](this.dragFollowers)));
|
|
1769
|
+
var unit = element ? [].concat(_toConsumableArray__default["default"](this.getDockingGroupOf(element)), _toConsumableArray__default["default"](followers)) : [];
|
|
1770
|
+
this.dragSlots = element ? {
|
|
1771
|
+
elementId: elementId,
|
|
1772
|
+
start: index.poseOf(element).center,
|
|
1773
|
+
places: this.findDragSlotPlaces(element, unit)
|
|
1774
|
+
} : undefined;
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
// Where the group shows against where the pointer put the grabbed element, and what it runs into there.
|
|
1778
|
+
}, {
|
|
1779
|
+
key: "getRoomDragPreview",
|
|
1780
|
+
value: function getRoomDragPreview(element, drag) {
|
|
1781
|
+
var position = element.WorldPosCenter;
|
|
1782
|
+
var preview = {
|
|
1783
|
+
dx: position.x - (drag.grabbedStart.x + drag.dx),
|
|
1784
|
+
dz: position.z - (drag.grabbedStart.z + drag.dz),
|
|
1785
|
+
dRotDeg: index.getTurnDeg(drag.start.rotDeg, element.RotDeg)
|
|
1786
|
+
};
|
|
1787
|
+
return this.withDragBlock(preview, drag);
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
// What a free group being turned runs into where it is turned now (it moves no further than the turn: no offset). Only
|
|
1791
|
+
// its members count: a guest swung into a body leaves its carrier on release instead (see DivaPlannerHandler).
|
|
1792
|
+
}, {
|
|
1793
|
+
key: "getRoomTurnPreview",
|
|
1794
|
+
value: function getRoomTurnPreview(element, drag) {
|
|
1795
|
+
var members = _objectSpread(_objectSpread({}, drag), {}, {
|
|
1796
|
+
shapes: drag.shapes.slice(0, drag.memberShapes)
|
|
1797
|
+
});
|
|
1798
|
+
drag.blockedBy = this.blockersAt(members, this.getTurnedPose(element, drag));
|
|
1799
|
+
return this.withDragBlock({
|
|
1800
|
+
dx: 0,
|
|
1801
|
+
dz: 0,
|
|
1802
|
+
dRotDeg: 0
|
|
1803
|
+
}, drag);
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
// A blocked turn's release: at its angle, the nearest free place inside the room within reach; undefined when none.
|
|
1807
|
+
}, {
|
|
1808
|
+
key: "findTurnPlace",
|
|
1809
|
+
value: function findTurnPlace(element, drag, room) {
|
|
1810
|
+
var turned = this.getTurnedPose(element, drag);
|
|
1811
|
+
var block = drag.start.block;
|
|
1812
|
+
var members = _objectSpread(_objectSpread({}, drag), {}, {
|
|
1813
|
+
shapes: drag.shapes.slice(0, drag.memberShapes),
|
|
1814
|
+
current: turned
|
|
1815
|
+
});
|
|
1816
|
+
if (!this.isBlocked(members, turned)) return turned;
|
|
1817
|
+
var poseAt = function poseAt(raw) {
|
|
1818
|
+
return insidePose(block, {
|
|
1819
|
+
center: raw,
|
|
1820
|
+
rotDeg: turned.rotDeg
|
|
1821
|
+
}, room);
|
|
1822
|
+
};
|
|
1823
|
+
return this.nearestFreePose(members, turned, poseAt, Math.max(TURN_PLACE_REACH, 2 * Math.max(block.halfWidth, block.halfDepth)));
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
// The pose of the group's block where the grabbed element stands now, moved with it rigidly from the start.
|
|
1827
|
+
}, {
|
|
1828
|
+
key: "getTurnedPose",
|
|
1829
|
+
value: function getTurnedPose(element, drag) {
|
|
1830
|
+
return movePose(drag.start, {
|
|
1831
|
+
center: drag.grabbedStart,
|
|
1832
|
+
rotDeg: drag.grabbedStartRotDeg
|
|
1833
|
+
}, index.poseOf(element));
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1836
|
+
// `preview` with what the group runs into (`blockedBy`): the elements, and whether a door's clearance; as it is while free.
|
|
1837
|
+
}, {
|
|
1838
|
+
key: "withDragBlock",
|
|
1839
|
+
value: function withDragBlock(preview, drag) {
|
|
1840
|
+
if (drag.blockedBy.length === 0) return preview;
|
|
1841
|
+
var ownSetId = this.set.getSetId();
|
|
1842
|
+
var elements = [];
|
|
1843
|
+
var _iterator13 = _createForOfIteratorHelper(drag.blockedBy),
|
|
1844
|
+
_step13;
|
|
1845
|
+
try {
|
|
1846
|
+
var _loop2 = function _loop2() {
|
|
1847
|
+
var _step13$value = _step13.value,
|
|
1848
|
+
_step13$value$setId = _step13$value.setId,
|
|
1849
|
+
setId = _step13$value$setId === void 0 ? ownSetId : _step13$value$setId,
|
|
1850
|
+
elementId = _step13$value.elementId;
|
|
1851
|
+
if (elementId !== undefined && !elements.some(function (element) {
|
|
1852
|
+
return element.setId === setId && element.elementId === elementId;
|
|
1853
|
+
})) elements.push({
|
|
1854
|
+
setId: setId,
|
|
1855
|
+
elementId: elementId
|
|
1856
|
+
});
|
|
1857
|
+
};
|
|
1858
|
+
for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
|
|
1859
|
+
_loop2();
|
|
1860
|
+
}
|
|
1861
|
+
} catch (err) {
|
|
1862
|
+
_iterator13.e(err);
|
|
1863
|
+
} finally {
|
|
1864
|
+
_iterator13.f();
|
|
1865
|
+
}
|
|
1866
|
+
return _objectSpread(_objectSpread({}, preview), {}, {
|
|
1867
|
+
blockedBy: {
|
|
1868
|
+
elements: elements,
|
|
1869
|
+
door: drag.blockedBy.some(function (obstacle) {
|
|
1870
|
+
return obstacle.elementId === undefined;
|
|
1871
|
+
})
|
|
1872
|
+
}
|
|
1873
|
+
});
|
|
1874
|
+
}
|
|
1875
|
+
|
|
330
1876
|
/**
|
|
331
1877
|
* This function updates the position information of all elements. It is called after updating the SVG of 1 element.
|
|
332
1878
|
* The position is updated based on the posNr.
|
|
@@ -384,11 +1930,11 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
384
1930
|
var progressed = true;
|
|
385
1931
|
while (progressed) {
|
|
386
1932
|
progressed = false;
|
|
387
|
-
var
|
|
388
|
-
|
|
1933
|
+
var _iterator14 = _createForOfIteratorHelper(sortedPlannerElementsbyPosNr),
|
|
1934
|
+
_step14;
|
|
389
1935
|
try {
|
|
390
|
-
for (
|
|
391
|
-
var _element =
|
|
1936
|
+
for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
|
|
1937
|
+
var _element = _step14.value;
|
|
392
1938
|
if (!_element || moved.has(_element.ElementId)) continue;
|
|
393
1939
|
var dpToMovedPartner = getDockedDPsInPriorityOrder(_element).find(function (dp) {
|
|
394
1940
|
return moved.has(dp.OnElementId);
|
|
@@ -400,9 +1946,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
400
1946
|
}
|
|
401
1947
|
}
|
|
402
1948
|
} catch (err) {
|
|
403
|
-
|
|
1949
|
+
_iterator14.e(err);
|
|
404
1950
|
} finally {
|
|
405
|
-
|
|
1951
|
+
_iterator14.f();
|
|
406
1952
|
}
|
|
407
1953
|
}
|
|
408
1954
|
}
|
|
@@ -423,8 +1969,14 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
423
1969
|
key: "addElementToWorld",
|
|
424
1970
|
value: (function () {
|
|
425
1971
|
var _addElementToWorld = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee(plannerElement, dockingPointInfos, suppressDock, globalBoundingBox) {
|
|
1972
|
+
var _this21 = this;
|
|
426
1973
|
var xOffset,
|
|
427
1974
|
setToTransform,
|
|
1975
|
+
placedBeside,
|
|
1976
|
+
_setToTransform$trans,
|
|
1977
|
+
worldPosCenter,
|
|
1978
|
+
height,
|
|
1979
|
+
stoodOnFloor,
|
|
428
1980
|
dockingFound,
|
|
429
1981
|
i,
|
|
430
1982
|
targetElemIdToDock,
|
|
@@ -433,78 +1985,89 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
433
1985
|
targetDP,
|
|
434
1986
|
successDP,
|
|
435
1987
|
success,
|
|
436
|
-
|
|
1988
|
+
selectedId,
|
|
1989
|
+
atSelected,
|
|
1990
|
+
mayPlace,
|
|
1991
|
+
placed,
|
|
437
1992
|
_success,
|
|
1993
|
+
allPlannerElements,
|
|
438
1994
|
_args = arguments;
|
|
439
1995
|
return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
|
|
440
1996
|
while (1) switch (_context.prev = _context.next) {
|
|
441
1997
|
case 0:
|
|
442
1998
|
xOffset = _args.length > 4 && _args[4] !== undefined ? _args[4] : 100;
|
|
443
1999
|
setToTransform = _args.length > 5 ? _args[5] : undefined;
|
|
2000
|
+
// Docked to nothing: put beside the planning, where it may land on another group in the room.
|
|
2001
|
+
placedBeside = false;
|
|
444
2002
|
if (!(setToTransform && setToTransform.forceSetToTrans)) {
|
|
445
|
-
_context.next =
|
|
2003
|
+
_context.next = 13;
|
|
446
2004
|
break;
|
|
447
2005
|
}
|
|
448
|
-
|
|
2006
|
+
// A switched element keeps the place of the old one; if that stood on the floor, the new one stands there too.
|
|
2007
|
+
_setToTransform$trans = setToTransform.transform, worldPosCenter = _setToTransform$trans.worldPosCenter, height = _setToTransform$trans.height;
|
|
2008
|
+
stoodOnFloor = index.PlannerElementData.standsOnFloor(worldPosCenter.y, height);
|
|
2009
|
+
plannerElement.WorldPosCenter = stoodOnFloor && Number.isFinite(plannerElement.Height) ? new index.Vector3(worldPosCenter.x, plannerElement.Height / 2, worldPosCenter.z) : worldPosCenter;
|
|
449
2010
|
plannerElement.RotDeg = setToTransform.transform.rotDeg;
|
|
2011
|
+
plannerElement.PosNrAtEnd = !!setToTransform.transform.posNrAtEnd;
|
|
2012
|
+
plannerElement.Placement = setToTransform.transform.placement;
|
|
450
2013
|
this.set.onDockingChanged(plannerElement.ElementId, -1, 'NOT_DOCKED');
|
|
451
|
-
_context.next =
|
|
2014
|
+
_context.next = 52;
|
|
452
2015
|
break;
|
|
453
|
-
case
|
|
2016
|
+
case 13:
|
|
454
2017
|
//Nun unterscheidet man, ob man das Element zu einem bestimmten vorselektierten Element Docken will , zu einem vorselektierten DockingPoint oder an eine Freie Planung.
|
|
455
2018
|
dockingFound = false;
|
|
456
2019
|
if (!dockingPointInfos) {
|
|
457
|
-
_context.next =
|
|
2020
|
+
_context.next = 51;
|
|
458
2021
|
break;
|
|
459
2022
|
}
|
|
460
2023
|
i = 0;
|
|
461
|
-
case
|
|
2024
|
+
case 16:
|
|
462
2025
|
if (!(i < dockingPointInfos.length)) {
|
|
463
|
-
_context.next =
|
|
2026
|
+
_context.next = 51;
|
|
464
2027
|
break;
|
|
465
2028
|
}
|
|
466
2029
|
targetElemIdToDock = dockingPointInfos[i].targetElemIdToDock;
|
|
467
2030
|
targetDockingPointId = dockingPointInfos[i].targetDockingPointId;
|
|
468
2031
|
if (!(targetElemIdToDock && targetElemIdToDock > -1 && this.plannerElements.has(targetElemIdToDock))) {
|
|
469
|
-
_context.next =
|
|
2032
|
+
_context.next = 48;
|
|
470
2033
|
break;
|
|
471
2034
|
}
|
|
472
2035
|
if (!(targetDockingPointId && targetDockingPointId != '')) {
|
|
473
|
-
_context.next =
|
|
2036
|
+
_context.next = 37;
|
|
474
2037
|
break;
|
|
475
2038
|
}
|
|
476
2039
|
targetElem = this.plannerElements.get(targetElemIdToDock);
|
|
477
2040
|
if (!targetElem) {
|
|
478
|
-
_context.next =
|
|
2041
|
+
_context.next = 35;
|
|
479
2042
|
break;
|
|
480
2043
|
}
|
|
481
2044
|
targetDP = targetElem.getDockingPointById(targetDockingPointId);
|
|
482
2045
|
if (!targetDP) {
|
|
483
|
-
_context.next =
|
|
2046
|
+
_context.next = 35;
|
|
484
2047
|
break;
|
|
485
2048
|
}
|
|
486
2049
|
successDP = PlannerHandler2D.dockingPointHandlerInst.tryDockElementToDP(plannerElement, targetElem, targetDP);
|
|
487
2050
|
if (!successDP) {
|
|
488
|
-
_context.next =
|
|
2051
|
+
_context.next = 31;
|
|
489
2052
|
break;
|
|
490
2053
|
}
|
|
491
2054
|
this.updateWorldPos(plannerElement, successDP);
|
|
492
2055
|
dockingFound = true;
|
|
493
|
-
_context.next =
|
|
2056
|
+
_context.next = 35;
|
|
494
2057
|
break;
|
|
495
|
-
case
|
|
496
|
-
_context.next =
|
|
2058
|
+
case 31:
|
|
2059
|
+
_context.next = 33;
|
|
497
2060
|
return this.tryToDockWithDifferentSVGWithFormula(plannerElement, targetElemIdToDock);
|
|
498
|
-
case
|
|
2061
|
+
case 33:
|
|
499
2062
|
if (!_context.sent) {
|
|
500
|
-
_context.next =
|
|
2063
|
+
_context.next = 35;
|
|
501
2064
|
break;
|
|
502
2065
|
}
|
|
503
2066
|
dockingFound = true;
|
|
504
|
-
case
|
|
505
|
-
_context.next =
|
|
2067
|
+
case 35:
|
|
2068
|
+
_context.next = 48;
|
|
506
2069
|
break;
|
|
507
|
-
case
|
|
2070
|
+
case 37:
|
|
508
2071
|
success = false;
|
|
509
2072
|
if (plannerElement.HasAVL || plannerElement.HasAVR) {
|
|
510
2073
|
success = this.dockToAVLorAVR(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
|
|
@@ -513,55 +2076,72 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
513
2076
|
success = this.dockToAVUorAVOororAVNorAVSorAVC(plannerElement, [this.plannerElements.get(targetElemIdToDock)]);
|
|
514
2077
|
}
|
|
515
2078
|
if (success) {
|
|
516
|
-
_context.next =
|
|
2079
|
+
_context.next = 47;
|
|
517
2080
|
break;
|
|
518
2081
|
}
|
|
519
|
-
_context.next =
|
|
2082
|
+
_context.next = 43;
|
|
520
2083
|
return this.tryToDockWithDifferentSVGWithFormula(plannerElement, targetElemIdToDock);
|
|
521
|
-
case
|
|
2084
|
+
case 43:
|
|
522
2085
|
success = _context.sent;
|
|
523
2086
|
if (success) {
|
|
524
|
-
_context.next =
|
|
2087
|
+
_context.next = 47;
|
|
525
2088
|
break;
|
|
526
2089
|
}
|
|
527
|
-
|
|
528
|
-
return
|
|
529
|
-
case
|
|
530
|
-
return _context.abrupt("return");
|
|
531
|
-
case 43:
|
|
2090
|
+
xOffset = 50;
|
|
2091
|
+
return _context.abrupt("break", 51);
|
|
2092
|
+
case 47:
|
|
532
2093
|
if (success) dockingFound = true;
|
|
533
|
-
case
|
|
2094
|
+
case 48:
|
|
534
2095
|
i++;
|
|
535
|
-
_context.next =
|
|
2096
|
+
_context.next = 16;
|
|
536
2097
|
break;
|
|
537
|
-
case
|
|
2098
|
+
case 51:
|
|
538
2099
|
if (!dockingFound) {
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
2100
|
+
selectedId = dockingPointInfos === null || dockingPointInfos === void 0 ? void 0 : dockingPointInfos.map(function (info) {
|
|
2101
|
+
return info.targetElemIdToDock;
|
|
2102
|
+
}).find(function (id) {
|
|
2103
|
+
return id != null && _this21.plannerElements.has(id);
|
|
2104
|
+
});
|
|
2105
|
+
atSelected = function atSelected(group) {
|
|
2106
|
+
return selectedId === undefined || group.some(function (member) {
|
|
2107
|
+
return member.ElementId === selectedId;
|
|
2108
|
+
});
|
|
2109
|
+
};
|
|
2110
|
+
mayPlace = globalBoundingBox == undefined; // The places the rules suggest at the selected group (without a selection: at any group) come before docking anywhere.
|
|
2111
|
+
placed = mayPlace && this.placeAtSuggestedPlace(plannerElement, atSelected);
|
|
2112
|
+
_success = false;
|
|
2113
|
+
if (!placed) {
|
|
2114
|
+
allPlannerElements = this.getAllPlannerElements();
|
|
2115
|
+
_success = this.dockToAVLorAVR(plannerElement, allPlannerElements);
|
|
545
2116
|
if (suppressDock) _success = false;
|
|
546
2117
|
if (!_success) {
|
|
547
|
-
//
|
|
548
|
-
|
|
549
|
-
if (
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
2118
|
+
//No free AVR or AVL Docking Point
|
|
2119
|
+
_success = this.dockToAVUorAVOororAVNorAVSorAVC(plannerElement, allPlannerElements);
|
|
2120
|
+
if (suppressDock) _success = false;
|
|
2121
|
+
}
|
|
2122
|
+
if (!_success && mayPlace && selectedId !== undefined) placed = this.placeAtSuggestedPlace(plannerElement, function (group) {
|
|
2123
|
+
return !atSelected(group);
|
|
2124
|
+
});
|
|
2125
|
+
}
|
|
2126
|
+
if (!_success) {
|
|
2127
|
+
//This is the center position of the element - This is needed in order to set the static room layout correctly
|
|
2128
|
+
if (mayPlace && !placed) {
|
|
2129
|
+
placedBeside = true;
|
|
2130
|
+
plannerElement.WorldPosCenter = new index.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);
|
|
555
2131
|
}
|
|
2132
|
+
|
|
2133
|
+
//Tell the set this the element was not docked
|
|
2134
|
+
this.set.onDockingChanged(plannerElement.ElementId, -1, 'NOT_DOCKED');
|
|
556
2135
|
}
|
|
557
2136
|
}
|
|
558
|
-
case
|
|
2137
|
+
case 52:
|
|
559
2138
|
this.updatePlannerPosNr();
|
|
560
2139
|
this.updateAllElementsWorldPos();
|
|
561
2140
|
this.updatePlannerPosNr();
|
|
2141
|
+
if (!plannerElement.IsAccessoire) this.placeAddedInRoom([plannerElement], placedBeside);
|
|
562
2142
|
this.checkCollision(false, plannerElement.getElementId());
|
|
563
2143
|
this.updatePlannerBoundingBox();
|
|
564
|
-
case
|
|
2144
|
+
case 58:
|
|
565
2145
|
case "end":
|
|
566
2146
|
return _context.stop();
|
|
567
2147
|
}
|
|
@@ -749,16 +2329,16 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
749
2329
|
var candidates = [];
|
|
750
2330
|
var seen = new Set();
|
|
751
2331
|
var collect = function collect(connectorFeature, targetFilters) {
|
|
752
|
-
var
|
|
753
|
-
|
|
2332
|
+
var _iterator15 = _createForOfIteratorHelper(targetFilters),
|
|
2333
|
+
_step15;
|
|
754
2334
|
try {
|
|
755
|
-
for (
|
|
756
|
-
var filter =
|
|
757
|
-
var
|
|
758
|
-
|
|
2335
|
+
for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
|
|
2336
|
+
var filter = _step15.value;
|
|
2337
|
+
var _iterator16 = _createForOfIteratorHelper(article.getVariantValuesInfluencingOptions([optPrefix + connectorFeature], opvPrefix + filter)),
|
|
2338
|
+
_step16;
|
|
759
2339
|
try {
|
|
760
|
-
for (
|
|
761
|
-
var vv =
|
|
2340
|
+
for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
|
|
2341
|
+
var vv = _step16.value;
|
|
762
2342
|
var key = JSON.stringify(vv);
|
|
763
2343
|
if (!seen.has(key)) {
|
|
764
2344
|
seen.add(key);
|
|
@@ -766,15 +2346,15 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
766
2346
|
}
|
|
767
2347
|
}
|
|
768
2348
|
} catch (err) {
|
|
769
|
-
|
|
2349
|
+
_iterator16.e(err);
|
|
770
2350
|
} finally {
|
|
771
|
-
|
|
2351
|
+
_iterator16.f();
|
|
772
2352
|
}
|
|
773
2353
|
}
|
|
774
2354
|
} catch (err) {
|
|
775
|
-
|
|
2355
|
+
_iterator15.e(err);
|
|
776
2356
|
} finally {
|
|
777
|
-
|
|
2357
|
+
_iterator15.f();
|
|
778
2358
|
}
|
|
779
2359
|
};
|
|
780
2360
|
//this article's AVL side (feature 89) docks against the target's AVR side and vice versa
|
|
@@ -973,23 +2553,24 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
973
2553
|
i = 0;
|
|
974
2554
|
case 3:
|
|
975
2555
|
if (!(i < allPlannerElements.length)) {
|
|
976
|
-
_context4.next =
|
|
2556
|
+
_context4.next = 14;
|
|
977
2557
|
break;
|
|
978
2558
|
}
|
|
979
2559
|
elem = allPlannerElements[i];
|
|
980
2560
|
doReload = elem.updatePlannerData(this.set.getPlannerData(elem.getElementId()));
|
|
981
2561
|
if (!doReload) {
|
|
982
|
-
_context4.next =
|
|
2562
|
+
_context4.next = 11;
|
|
983
2563
|
break;
|
|
984
2564
|
}
|
|
985
2565
|
elemtsWhereSomethingChanged.push(elem.ElementId);
|
|
986
|
-
|
|
2566
|
+
elem.keepOnFloorOnHeightChange();
|
|
2567
|
+
_context4.next = 11;
|
|
987
2568
|
return PlannerHandler2D.handler2D.loadSVG(elem, this.set);
|
|
988
|
-
case
|
|
2569
|
+
case 11:
|
|
989
2570
|
i++;
|
|
990
2571
|
_context4.next = 3;
|
|
991
2572
|
break;
|
|
992
|
-
case
|
|
2573
|
+
case 14:
|
|
993
2574
|
elementsToDelete = [];
|
|
994
2575
|
if (elemtsWhereSomethingChanged.length) {
|
|
995
2576
|
LOG.debug('Configuration changed one plannerElement. UpdateDockingRelations', 'DivaStandardPlanner - updatePlanner');
|
|
@@ -1001,6 +2582,11 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1001
2582
|
}
|
|
1002
2583
|
}
|
|
1003
2584
|
this.updateAllElementsWorldPos(undefined, elemtsWhereSomethingChanged);
|
|
2585
|
+
// A resized group must not reach through a wall; where the room moved it, its collisions are checked again.
|
|
2586
|
+
if (this.room) {
|
|
2587
|
+
this.placeGroupsInRoom();
|
|
2588
|
+
this.checkCollision(false);
|
|
2589
|
+
}
|
|
1004
2590
|
this.updatePlannerPosNr();
|
|
1005
2591
|
this.updatePlannerBoundingBox();
|
|
1006
2592
|
}
|
|
@@ -1010,7 +2596,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1010
2596
|
elementIdsToUpdateSelection: elemtsWhereSomethingChanged,
|
|
1011
2597
|
failed: false
|
|
1012
2598
|
});
|
|
1013
|
-
case
|
|
2599
|
+
case 17:
|
|
1014
2600
|
case "end":
|
|
1015
2601
|
return _context4.stop();
|
|
1016
2602
|
}
|
|
@@ -1034,9 +2620,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1034
2620
|
return _regeneratorRuntime__default["default"].wrap(function _callee5$(_context5) {
|
|
1035
2621
|
while (1) switch (_context5.prev = _context5.next) {
|
|
1036
2622
|
case 0:
|
|
1037
|
-
planData = parseSetPlanData(setPlanData);
|
|
1038
|
-
if (!isSavePlannerV2(planData)) {
|
|
1039
|
-
_context5.next =
|
|
2623
|
+
planData = index.parseSetPlanData(setPlanData);
|
|
2624
|
+
if (!index.isSavePlannerV2(planData)) {
|
|
2625
|
+
_context5.next = 42;
|
|
1040
2626
|
break;
|
|
1041
2627
|
}
|
|
1042
2628
|
jsonElements = planData.set.elements;
|
|
@@ -1046,12 +2632,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1046
2632
|
i = 0;
|
|
1047
2633
|
case 7:
|
|
1048
2634
|
if (!(i < jsonElements.length)) {
|
|
1049
|
-
_context5.next =
|
|
2635
|
+
_context5.next = 37;
|
|
1050
2636
|
break;
|
|
1051
2637
|
}
|
|
1052
2638
|
_context5.prev = 8;
|
|
1053
2639
|
jsonElement = jsonElements[i];
|
|
1054
|
-
catalogArticle = (_this$set$getArticleB = (_this$set$getArticleB2 = this.set.getArticleByBasketId(jsonElement.basketID)) === null || _this$set$getArticleB2 === void 0 ? void 0 : _this$set$getArticleB2.catalogArticle) !== null && _this$set$getArticleB !== void 0 ? _this$set$getArticleB : this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo = saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo !== void 0 ? _saveElementArticleCo : '');
|
|
2640
|
+
catalogArticle = (_this$set$getArticleB = (_this$set$getArticleB2 = this.set.getArticleByBasketId(jsonElement.basketID)) === null || _this$set$getArticleB2 === void 0 ? void 0 : _this$set$getArticleB2.catalogArticle) !== null && _this$set$getArticleB !== void 0 ? _this$set$getArticleB : this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo = index.saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo !== void 0 ? _saveElementArticleCo : '');
|
|
1055
2641
|
if (!(!catalogArticle && (_jsonElement$Accessoi = jsonElement.AccessoireInitParams) !== null && _jsonElement$Accessoi !== void 0 && _jsonElement$Accessoi.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
|
|
1056
2642
|
_context5.next = 14;
|
|
1057
2643
|
break;
|
|
@@ -1059,7 +2645,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1059
2645
|
LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1060
2646
|
code: 'WC_0012'
|
|
1061
2647
|
}));
|
|
1062
|
-
return _context5.abrupt("continue",
|
|
2648
|
+
return _context5.abrupt("continue", 34);
|
|
1063
2649
|
case 14:
|
|
1064
2650
|
plannerElement = new index.PlannerElementData(this.set.getSetId(), jsonElement.basketID, this.nextElementId, DivaStandardPlanner.plannerType);
|
|
1065
2651
|
oldElementidMapping.set(jsonElement.elementID, plannerElement);
|
|
@@ -1077,6 +2663,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1077
2663
|
case 24:
|
|
1078
2664
|
plannerElement.WorldPosCenter = new index.Vector3(globalBoundingBox.WorldPos.x + globalBoundingBox.Size.x + jsonElement.x + 100, globalBoundingBox.WorldPos.y + jsonElement.y, globalBoundingBox.WorldPos.z + jsonElement.z);
|
|
1079
2665
|
plannerElement.RotDeg = jsonElement.rot;
|
|
2666
|
+
plannerElement.PosNrAtEnd = !!jsonElement.posNrAtEnd;
|
|
2667
|
+
plannerElement.Placement = index.parseGuestPlacement(jsonElement.placement);
|
|
1080
2668
|
if (plannerElement.IsDockedAccessoire) {
|
|
1081
2669
|
accElements.push(jsonElement);
|
|
1082
2670
|
plannerElement.PosNr = jsonElement.posNr;
|
|
@@ -1085,20 +2673,20 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1085
2673
|
elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
|
|
1086
2674
|
plannerElement.PosNr = jsonElement.posNr;
|
|
1087
2675
|
}
|
|
1088
|
-
_context5.next =
|
|
2676
|
+
_context5.next = 34;
|
|
1089
2677
|
break;
|
|
1090
|
-
case
|
|
1091
|
-
_context5.prev =
|
|
2678
|
+
case 31:
|
|
2679
|
+
_context5.prev = 31;
|
|
1092
2680
|
_context5.t0 = _context5["catch"](8);
|
|
1093
2681
|
LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1094
2682
|
cause: _context5.t0,
|
|
1095
2683
|
code: 'WC_0012'
|
|
1096
2684
|
}));
|
|
1097
|
-
case
|
|
2685
|
+
case 34:
|
|
1098
2686
|
i++;
|
|
1099
2687
|
_context5.next = 7;
|
|
1100
2688
|
break;
|
|
1101
|
-
case
|
|
2689
|
+
case 37:
|
|
1102
2690
|
elementsForDockingExtend = [].concat(_toConsumableArray__default["default"](elementsSortedbyPosNr.filter(function (e) {
|
|
1103
2691
|
return e != null;
|
|
1104
2692
|
})), accElements);
|
|
@@ -1120,17 +2708,19 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1120
2708
|
}
|
|
1121
2709
|
}
|
|
1122
2710
|
}
|
|
1123
|
-
|
|
2711
|
+
// Added beside the planning, the new elements can stand outside the room: they get the room rules like an insert.
|
|
2712
|
+
this.placeAddedInRoom(_toConsumableArray__default["default"](oldElementidMapping.values()), true);
|
|
2713
|
+
_context5.next = 43;
|
|
1124
2714
|
break;
|
|
1125
|
-
case
|
|
2715
|
+
case 42:
|
|
1126
2716
|
LOG.error(new DivaUtils.DivaError('The function extend Planner works only with products that are saved in the configurator 2.0', {
|
|
1127
2717
|
code: 'WC_0012'
|
|
1128
2718
|
}));
|
|
1129
|
-
case
|
|
2719
|
+
case 43:
|
|
1130
2720
|
case "end":
|
|
1131
2721
|
return _context5.stop();
|
|
1132
2722
|
}
|
|
1133
|
-
}, _callee5, this, [[8,
|
|
2723
|
+
}, _callee5, this, [[8, 31]]);
|
|
1134
2724
|
}));
|
|
1135
2725
|
function extendPlanner(_x10, _x11) {
|
|
1136
2726
|
return _extendPlanner.apply(this, arguments);
|
|
@@ -1145,9 +2735,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1145
2735
|
return _regeneratorRuntime__default["default"].wrap(function _callee6$(_context6) {
|
|
1146
2736
|
while (1) switch (_context6.prev = _context6.next) {
|
|
1147
2737
|
case 0:
|
|
1148
|
-
planData = parseSetPlanData(setPlanData);
|
|
1149
|
-
if (!isSavePlannerV2(planData)) {
|
|
1150
|
-
_context6.next =
|
|
2738
|
+
planData = index.parseSetPlanData(setPlanData);
|
|
2739
|
+
if (!index.isSavePlannerV2(planData)) {
|
|
2740
|
+
_context6.next = 65;
|
|
1151
2741
|
break;
|
|
1152
2742
|
}
|
|
1153
2743
|
LOG.debug('Initialize set Plan Data - V2\n' + planData, 'DivaStandardPlanner initPlanner');
|
|
@@ -1163,12 +2753,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1163
2753
|
i = 0;
|
|
1164
2754
|
case 9:
|
|
1165
2755
|
if (!(i < jsonElements.length)) {
|
|
1166
|
-
_context6.next =
|
|
2756
|
+
_context6.next = 39;
|
|
1167
2757
|
break;
|
|
1168
2758
|
}
|
|
1169
2759
|
_context6.prev = 10;
|
|
1170
2760
|
jsonElement = jsonElements[i];
|
|
1171
|
-
catalogArticle = (_this$set$getArticleB3 = (_this$set$getArticleB4 = this.set.getArticleByBasketId(jsonElement.basketID)) === null || _this$set$getArticleB4 === void 0 ? void 0 : _this$set$getArticleB4.catalogArticle) !== null && _this$set$getArticleB3 !== void 0 ? _this$set$getArticleB3 : this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo2 = saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo2 !== void 0 ? _saveElementArticleCo2 : '');
|
|
2761
|
+
catalogArticle = (_this$set$getArticleB3 = (_this$set$getArticleB4 = this.set.getArticleByBasketId(jsonElement.basketID)) === null || _this$set$getArticleB4 === void 0 ? void 0 : _this$set$getArticleB4.catalogArticle) !== null && _this$set$getArticleB3 !== void 0 ? _this$set$getArticleB3 : this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo2 = index.saveElementArticleCodex(jsonElement)) !== null && _saveElementArticleCo2 !== void 0 ? _saveElementArticleCo2 : '');
|
|
1172
2762
|
if (!(!catalogArticle && (_jsonElement$Accessoi2 = jsonElement.AccessoireInitParams) !== null && _jsonElement$Accessoi2 !== void 0 && _jsonElement$Accessoi2.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
|
|
1173
2763
|
_context6.next = 16;
|
|
1174
2764
|
break;
|
|
@@ -1176,7 +2766,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1176
2766
|
LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1177
2767
|
code: 'WC_0012'
|
|
1178
2768
|
}));
|
|
1179
|
-
return _context6.abrupt("continue",
|
|
2769
|
+
return _context6.abrupt("continue", 36);
|
|
1180
2770
|
case 16:
|
|
1181
2771
|
elementID = jsonElement.elementID;
|
|
1182
2772
|
plannerElement = new index.PlannerElementData(this.set.getSetId(), jsonElement.basketID, elementID, DivaStandardPlanner.plannerType);
|
|
@@ -1196,6 +2786,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1196
2786
|
//plannerElement.WorldPosCenter = new Vector3(jsonElement.x, jsonElement.y, jsonElement.z);
|
|
1197
2787
|
plannerElement.WorldPosCenter = new index.Vector3(this.plannerBoundingBox.WorldPos.x + jsonElement.x, this.plannerBoundingBox.WorldPos.y + jsonElement.y, this.plannerBoundingBox.WorldPos.z + jsonElement.z);
|
|
1198
2788
|
plannerElement.RotDeg = jsonElement.rot;
|
|
2789
|
+
plannerElement.PosNrAtEnd = !!jsonElement.posNrAtEnd;
|
|
2790
|
+
plannerElement.Placement = index.parseGuestPlacement(jsonElement.placement);
|
|
1199
2791
|
if (plannerElement.IsDockedAccessoire) {
|
|
1200
2792
|
accElements.push(jsonElement);
|
|
1201
2793
|
plannerElement.PosNr = jsonElement.posNr;
|
|
@@ -1204,34 +2796,34 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1204
2796
|
elementsSortedbyPosNr[jsonElement.posNr - 1] = jsonElement;
|
|
1205
2797
|
plannerElement.PosNr = jsonElement.posNr;
|
|
1206
2798
|
}
|
|
1207
|
-
_context6.next =
|
|
2799
|
+
_context6.next = 36;
|
|
1208
2800
|
break;
|
|
1209
|
-
case
|
|
1210
|
-
_context6.prev =
|
|
2801
|
+
case 33:
|
|
2802
|
+
_context6.prev = 33;
|
|
1211
2803
|
_context6.t0 = _context6["catch"](10);
|
|
1212
2804
|
LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V2', {
|
|
1213
2805
|
cause: _context6.t0,
|
|
1214
2806
|
code: 'WC_0012'
|
|
1215
2807
|
}));
|
|
1216
|
-
case
|
|
2808
|
+
case 36:
|
|
1217
2809
|
i++;
|
|
1218
2810
|
_context6.next = 9;
|
|
1219
2811
|
break;
|
|
1220
|
-
case
|
|
2812
|
+
case 39:
|
|
1221
2813
|
onlyOneBaseElement = elementsSortedbyPosNr.filter(Boolean).length == 1; //Saves if only one base element is in the planning. All the others are only accessoires
|
|
1222
2814
|
elementsForDocking = [].concat(_toConsumableArray__default["default"](elementsSortedbyPosNr.filter(function (e) {
|
|
1223
2815
|
return e != null;
|
|
1224
2816
|
})), accElements);
|
|
1225
2817
|
i = 0;
|
|
1226
|
-
case
|
|
2818
|
+
case 42:
|
|
1227
2819
|
if (!(i < elementsForDocking.length)) {
|
|
1228
|
-
_context6.next =
|
|
2820
|
+
_context6.next = 63;
|
|
1229
2821
|
break;
|
|
1230
2822
|
}
|
|
1231
|
-
_context6.prev =
|
|
2823
|
+
_context6.prev = 43;
|
|
1232
2824
|
row = elementsForDocking[i];
|
|
1233
2825
|
if (!(i == 0 && onlyOneBaseElement && this.plannerHasStaticBackground)) {
|
|
1234
|
-
_context6.next =
|
|
2826
|
+
_context6.next = 50;
|
|
1235
2827
|
break;
|
|
1236
2828
|
}
|
|
1237
2829
|
//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.
|
|
@@ -1243,14 +2835,14 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1243
2835
|
element = this.plannerElements.get(row.elementID);
|
|
1244
2836
|
if (element) element.WorldPosCenter = new index.Vector3(0, element.Height / 2, element.Depth / 2);
|
|
1245
2837
|
}
|
|
1246
|
-
return _context6.abrupt("continue",
|
|
1247
|
-
case
|
|
2838
|
+
return _context6.abrupt("continue", 60);
|
|
2839
|
+
case 50:
|
|
1248
2840
|
if (!(row.DP == null || row.DP.length == 0)) {
|
|
1249
|
-
_context6.next =
|
|
2841
|
+
_context6.next = 52;
|
|
1250
2842
|
break;
|
|
1251
2843
|
}
|
|
1252
|
-
return _context6.abrupt("continue",
|
|
1253
|
-
case
|
|
2844
|
+
return _context6.abrupt("continue", 60);
|
|
2845
|
+
case 52:
|
|
1254
2846
|
DPsInfo = row.DP;
|
|
1255
2847
|
for (j = 0; j < DPsInfo.length; j++) {
|
|
1256
2848
|
dpInfo = DPsInfo[j];
|
|
@@ -1271,79 +2863,79 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1271
2863
|
}
|
|
1272
2864
|
}
|
|
1273
2865
|
}
|
|
1274
|
-
_context6.next =
|
|
2866
|
+
_context6.next = 60;
|
|
1275
2867
|
break;
|
|
1276
|
-
case
|
|
1277
|
-
_context6.prev =
|
|
1278
|
-
_context6.t1 = _context6["catch"](
|
|
2868
|
+
case 56:
|
|
2869
|
+
_context6.prev = 56;
|
|
2870
|
+
_context6.t1 = _context6["catch"](43);
|
|
1279
2871
|
elementId = (_elementsForDocking$i = elementsForDocking[i]) === null || _elementsForDocking$i === void 0 ? void 0 : _elementsForDocking$i.elementID;
|
|
1280
2872
|
LOG.error(new DivaUtils.DivaError('Error initializing dockingPoints of element with elementID ' + elementId, {
|
|
1281
2873
|
cause: _context6.t1,
|
|
1282
2874
|
code: 'WC_0012'
|
|
1283
2875
|
}));
|
|
1284
|
-
case
|
|
2876
|
+
case 60:
|
|
1285
2877
|
i++;
|
|
1286
|
-
_context6.next =
|
|
1287
|
-
break;
|
|
1288
|
-
case 61:
|
|
1289
|
-
_context6.next = 116;
|
|
2878
|
+
_context6.next = 42;
|
|
1290
2879
|
break;
|
|
1291
2880
|
case 63:
|
|
2881
|
+
_context6.next = 118;
|
|
2882
|
+
break;
|
|
2883
|
+
case 65:
|
|
1292
2884
|
LOG.debug('Initialize set Plan Data - old V1\n' + planData, 'DivaStandardPlanner initPlanner');
|
|
1293
2885
|
legacySet = (_planData$Sets = planData.Sets) === null || _planData$Sets === void 0 ? void 0 : _planData$Sets[0];
|
|
1294
2886
|
if (legacySet !== null && legacySet !== void 0 && (_legacySet$Elements = legacySet.Elements) !== null && _legacySet$Elements !== void 0 && _legacySet$Elements.length) {
|
|
1295
|
-
_context6.next =
|
|
2887
|
+
_context6.next = 69;
|
|
1296
2888
|
break;
|
|
1297
2889
|
}
|
|
1298
2890
|
return _context6.abrupt("return");
|
|
1299
|
-
case
|
|
2891
|
+
case 69:
|
|
1300
2892
|
_jsonElements = legacySet.Elements;
|
|
1301
2893
|
_elementsSortedbyPosNr = [];
|
|
1302
2894
|
_accElements = []; //Zuerst initialisiere alle Elemente
|
|
1303
2895
|
//Dann positioniere sie richtig
|
|
1304
2896
|
i = 0;
|
|
1305
|
-
case
|
|
2897
|
+
case 73:
|
|
1306
2898
|
if (!(i < _jsonElements.length)) {
|
|
1307
|
-
_context6.next =
|
|
2899
|
+
_context6.next = 107;
|
|
1308
2900
|
break;
|
|
1309
2901
|
}
|
|
1310
|
-
_context6.prev =
|
|
2902
|
+
_context6.prev = 74;
|
|
1311
2903
|
_jsonElement2 = _jsonElements[i];
|
|
1312
|
-
_catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo3 = saveElementArticleCodex(_jsonElement2)) !== null && _saveElementArticleCo3 !== void 0 ? _saveElementArticleCo3 : '');
|
|
2904
|
+
_catalogArticle = this.set.CatalogData.getCatalogArticleByArticleCodex((_saveElementArticleCo3 = index.saveElementArticleCodex(_jsonElement2)) !== null && _saveElementArticleCo3 !== void 0 ? _saveElementArticleCo3 : '');
|
|
1313
2905
|
if (!(!_catalogArticle && (_jsonElement2$Accesso = _jsonElement2.AccessoireInitParams) !== null && _jsonElement2$Accesso !== void 0 && _jsonElement2$Accesso.RelatedToBasketID && !this.set.getSetState.onlyRunLogic)) {
|
|
1314
|
-
_context6.next =
|
|
2906
|
+
_context6.next = 80;
|
|
1315
2907
|
break;
|
|
1316
2908
|
}
|
|
1317
2909
|
LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner. PlanData V1', {
|
|
1318
2910
|
code: 'WC_0012'
|
|
1319
2911
|
}));
|
|
1320
|
-
return _context6.abrupt("continue",
|
|
1321
|
-
case
|
|
2912
|
+
return _context6.abrupt("continue", 104);
|
|
2913
|
+
case 80:
|
|
1322
2914
|
basketID = _jsonElement2.BasketID;
|
|
1323
2915
|
if (this.set.getElementId(basketID) == -1) this.set.setElementId(basketID, Number(_jsonElement2.ID));
|
|
1324
2916
|
_elementId = this.set.getElementId(basketID);
|
|
1325
2917
|
_jsonElement2.elementId = _elementId;
|
|
1326
2918
|
if (!(_elementId == -1)) {
|
|
1327
|
-
_context6.next =
|
|
2919
|
+
_context6.next = 87;
|
|
1328
2920
|
break;
|
|
1329
2921
|
}
|
|
1330
2922
|
LOG.error(new DivaUtils.DivaError('Error when initializing planner. The elementID Was not saved in the article. ', {
|
|
1331
2923
|
code: 'WC_0012'
|
|
1332
2924
|
}));
|
|
1333
|
-
return _context6.abrupt("continue",
|
|
1334
|
-
case
|
|
2925
|
+
return _context6.abrupt("continue", 104);
|
|
2926
|
+
case 87:
|
|
1335
2927
|
_plannerElement = new index.PlannerElementData(this.set.getSetId(), basketID, _elementId, DivaStandardPlanner.plannerType);
|
|
1336
2928
|
this.nextElementId = _elementId + 1;
|
|
1337
2929
|
this.plannerElements.set(_plannerElement.ElementId, _plannerElement);
|
|
1338
2930
|
_data = this.set.getPlannerData(_plannerElement.ElementId);
|
|
1339
2931
|
_plannerElement.updatePlannerData(_data);
|
|
1340
2932
|
if (this.doDisablePlanner2D) {
|
|
1341
|
-
_context6.next =
|
|
2933
|
+
_context6.next = 95;
|
|
1342
2934
|
break;
|
|
1343
2935
|
}
|
|
1344
|
-
_context6.next =
|
|
2936
|
+
_context6.next = 95;
|
|
1345
2937
|
return PlannerHandler2D.handler2D.loadSVG(_plannerElement, this.set);
|
|
1346
|
-
case
|
|
2938
|
+
case 95:
|
|
1347
2939
|
//Achtung die Pos Infos im alten Planer waren Zentrumskoordinaten!!! Nicht hinten oben.
|
|
1348
2940
|
centerWorldPos = new index.Vector3(_jsonElement2.PosX, _jsonElement2.PosZ, _jsonElement2.PosY);
|
|
1349
2941
|
_plannerElement.WorldPosCenter = new index.Vector3(this.plannerBoundingBox.WorldPos.x + centerWorldPos.x, this.plannerBoundingBox.WorldPos.y + centerWorldPos.y, this.plannerBoundingBox.WorldPos.z + centerWorldPos.z);
|
|
@@ -1360,36 +2952,36 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1360
2952
|
_elementsSortedbyPosNr[_jsonElement2.PosNum - 1] = _jsonElement2;
|
|
1361
2953
|
_plannerElement.PosNr = _jsonElement2.PosNum;
|
|
1362
2954
|
}
|
|
1363
|
-
_context6.next =
|
|
2955
|
+
_context6.next = 104;
|
|
1364
2956
|
break;
|
|
1365
|
-
case
|
|
1366
|
-
_context6.prev =
|
|
1367
|
-
_context6.t2 = _context6["catch"](
|
|
2957
|
+
case 101:
|
|
2958
|
+
_context6.prev = 101;
|
|
2959
|
+
_context6.t2 = _context6["catch"](74);
|
|
1368
2960
|
LOG.error(new DivaUtils.DivaError('Error initializing element nr ' + i + ' in the Standard Web Planner - Plan Data old Planner', {
|
|
1369
2961
|
cause: _context6.t2,
|
|
1370
2962
|
code: 'WC_0012'
|
|
1371
2963
|
}));
|
|
1372
|
-
case
|
|
2964
|
+
case 104:
|
|
1373
2965
|
i++;
|
|
1374
|
-
_context6.next =
|
|
2966
|
+
_context6.next = 73;
|
|
1375
2967
|
break;
|
|
1376
|
-
case
|
|
2968
|
+
case 107:
|
|
1377
2969
|
elementsForDockingV1 = [].concat(_toConsumableArray__default["default"](_elementsSortedbyPosNr.filter(function (e) {
|
|
1378
2970
|
return e != null;
|
|
1379
2971
|
})), _accElements);
|
|
1380
2972
|
i = 0;
|
|
1381
|
-
case
|
|
2973
|
+
case 109:
|
|
1382
2974
|
if (!(i < elementsForDockingV1.length)) {
|
|
1383
|
-
_context6.next =
|
|
2975
|
+
_context6.next = 118;
|
|
1384
2976
|
break;
|
|
1385
2977
|
}
|
|
1386
2978
|
_row = elementsForDockingV1[i];
|
|
1387
2979
|
if (!(_row.DP == null || _row.DP.length == 0)) {
|
|
1388
|
-
_context6.next =
|
|
2980
|
+
_context6.next = 113;
|
|
1389
2981
|
break;
|
|
1390
2982
|
}
|
|
1391
|
-
return _context6.abrupt("continue",
|
|
1392
|
-
case
|
|
2983
|
+
return _context6.abrupt("continue", 115);
|
|
2984
|
+
case 113:
|
|
1393
2985
|
_DPsInfo = _row.DP;
|
|
1394
2986
|
for (j = 0; j < _DPsInfo.length; j++) {
|
|
1395
2987
|
_dpInfo = _DPsInfo[j];
|
|
@@ -1407,21 +2999,21 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1407
2999
|
}
|
|
1408
3000
|
}
|
|
1409
3001
|
}
|
|
1410
|
-
case
|
|
3002
|
+
case 115:
|
|
1411
3003
|
i++;
|
|
1412
|
-
_context6.next =
|
|
3004
|
+
_context6.next = 109;
|
|
1413
3005
|
break;
|
|
1414
|
-
case
|
|
3006
|
+
case 118:
|
|
1415
3007
|
this.plannerElements.forEach(function (el) {
|
|
1416
3008
|
if (!el.IsDockedAccessoire && (anchorElement == undefined || el.PosNr < anchorElement.PosNr)) anchorElement = el;
|
|
1417
3009
|
});
|
|
1418
3010
|
this.updateAllElementsWorldPos(undefined, anchorElement ? [anchorElement.ElementId] : undefined);
|
|
1419
3011
|
this.updatePlannerPosNr();
|
|
1420
|
-
case
|
|
3012
|
+
case 121:
|
|
1421
3013
|
case "end":
|
|
1422
3014
|
return _context6.stop();
|
|
1423
3015
|
}
|
|
1424
|
-
}, _callee6, this, [[10,
|
|
3016
|
+
}, _callee6, this, [[10, 33], [43, 56], [74, 101]]);
|
|
1425
3017
|
}));
|
|
1426
3018
|
function initPlanner(_x12) {
|
|
1427
3019
|
return _initPlanner.apply(this, arguments);
|
|
@@ -1680,7 +3272,10 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1680
3272
|
}
|
|
1681
3273
|
transform = {
|
|
1682
3274
|
rotDeg: plannerElement.getRotDeg(),
|
|
1683
|
-
worldPosCenter: plannerElement.WorldPosCenter
|
|
3275
|
+
worldPosCenter: plannerElement.WorldPosCenter,
|
|
3276
|
+
height: plannerElement.Height,
|
|
3277
|
+
posNrAtEnd: plannerElement.PosNrAtEnd,
|
|
3278
|
+
placement: plannerElement.Placement
|
|
1684
3279
|
};
|
|
1685
3280
|
if (!removeDockingRelation) {
|
|
1686
3281
|
PlannerHandler2D.dockingPointHandlerInst.removeDockingPointRelations(plannerElement);
|
|
@@ -1689,6 +3284,8 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1689
3284
|
this.tryToDockForNotDockedAccessoire(parent);
|
|
1690
3285
|
this.updatePlannerPosNr();
|
|
1691
3286
|
this.updateAllElementsWorldPos();
|
|
3287
|
+
// A group the deletion lets fit, or splits, takes its place in the room.
|
|
3288
|
+
if (this.room) this.placeGroupsInRoom();
|
|
1692
3289
|
this.updatePlannerPosNr();
|
|
1693
3290
|
this.checkCollision(false, plannerElement.getElementId());
|
|
1694
3291
|
this.updatePlannerBoundingBox();
|
|
@@ -1696,7 +3293,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1696
3293
|
newElementToSelect: newSelElemIdPrev >= 0 ? newSelElemIdPrev : newSelElemIdNext >= 0 ? newSelElemIdNext : undefined,
|
|
1697
3294
|
transform: transform
|
|
1698
3295
|
});
|
|
1699
|
-
case
|
|
3296
|
+
case 25:
|
|
1700
3297
|
case "end":
|
|
1701
3298
|
return _context9.stop();
|
|
1702
3299
|
}
|
|
@@ -1739,8 +3336,33 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1739
3336
|
}, {
|
|
1740
3337
|
key: "checkCollision",
|
|
1741
3338
|
value: function checkCollision(calcCollisionPairs, checkSingleElementId) {
|
|
3339
|
+
var _this22 = this;
|
|
1742
3340
|
if (this.doDisablePlanner2D) return;
|
|
1743
3341
|
var allElements = this.getAllPlannerElements();
|
|
3342
|
+
// A NO_COLLISION article (e.g. a rug) neither collides with anything nor is collided with.
|
|
3343
|
+
var noCollisionIds = new Set(allElements.filter(function (element) {
|
|
3344
|
+
return _this22.hasNoCollision(element.ArticleCodex);
|
|
3345
|
+
}).map(function (element) {
|
|
3346
|
+
return element.ElementId;
|
|
3347
|
+
}));
|
|
3348
|
+
// Each colliding element with its outline and its group as slot carrier, built when a pair collides.
|
|
3349
|
+
var slotted;
|
|
3350
|
+
var slottedOf = function slottedOf(element) {
|
|
3351
|
+
var _slotted;
|
|
3352
|
+
(_slotted = slotted) !== null && _slotted !== void 0 ? _slotted : slotted = new Map(index.getDockingGroups(allElements).flatMap(function (group) {
|
|
3353
|
+
return _this22.getCollidingShapes(group, false);
|
|
3354
|
+
}).map(function (shape) {
|
|
3355
|
+
return [shape.elementId, shape];
|
|
3356
|
+
}));
|
|
3357
|
+
return slotted.get(element.ElementId);
|
|
3358
|
+
};
|
|
3359
|
+
// A guest in its carrier's slot only warns when the bodies overlap.
|
|
3360
|
+
var inSlotClear = function inSlotClear(a, b) {
|
|
3361
|
+
var shapeA = slottedOf(a);
|
|
3362
|
+
var shapeB = slottedOf(b);
|
|
3363
|
+
var rules = _this22.getCatalogData().placementOptions.rules;
|
|
3364
|
+
return !!shapeA && !!shapeB && index.slotExempt(rules, shapeA, rules, shapeB);
|
|
3365
|
+
};
|
|
1744
3366
|
var collisionDetected = false;
|
|
1745
3367
|
var collisionPairs = [];
|
|
1746
3368
|
for (var i = 0; i < allElements.length; i++) {
|
|
@@ -1751,10 +3373,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1751
3373
|
var _this$set$CatalogData, _this$set$CatalogData2;
|
|
1752
3374
|
var element2 = allElements[j];
|
|
1753
3375
|
if (element1.getElementId() == element2.getElementId()) continue;
|
|
3376
|
+
if (noCollisionIds.has(element1.ElementId) || noCollisionIds.has(element2.ElementId)) continue;
|
|
1754
3377
|
if (PlannerHandler2D.dockingPointHandlerInst.checkElementsAreDocking(element1, element2)) continue;
|
|
1755
3378
|
var collision = false;
|
|
1756
3379
|
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)) {
|
|
1757
3380
|
collision = PlannerHandler2D.handler2D.checkCollision(element1, element2, this.set.CatalogData.checkCollisionForDifferentLayers);
|
|
3381
|
+
if (collision && inSlotClear(element1, element2)) collision = false;
|
|
1758
3382
|
}
|
|
1759
3383
|
if (collision) {
|
|
1760
3384
|
collisionDetected = true;
|
|
@@ -1769,17 +3393,56 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1769
3393
|
}
|
|
1770
3394
|
}
|
|
1771
3395
|
if (this.collisionHandler.collisionDetected && !collisionDetected) {
|
|
1772
|
-
var _this$
|
|
3396
|
+
var _this$collisionHandle3, _this$collisionHandle4;
|
|
1773
3397
|
//Collision has changed
|
|
1774
|
-
(_this$
|
|
3398
|
+
(_this$collisionHandle3 = (_this$collisionHandle4 = this.collisionHandler).updatePlannerMsgContainer) === null || _this$collisionHandle3 === void 0 || _this$collisionHandle3.call(_this$collisionHandle4, 'COLLISION_MSG', false, 'WARNING', 'COLLISION_MSG', false);
|
|
1775
3399
|
} else if (!this.collisionHandler.collisionDetected && collisionDetected) {
|
|
1776
|
-
var _this$
|
|
1777
|
-
(_this$
|
|
3400
|
+
var _this$collisionHandle5, _this$collisionHandle6;
|
|
3401
|
+
(_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*/);
|
|
1778
3402
|
}
|
|
1779
3403
|
this.collisionHandler.collisionPairs = collisionPairs;
|
|
1780
3404
|
this.collisionHandler.collisionDetected = collisionDetected;
|
|
1781
3405
|
}
|
|
1782
3406
|
|
|
3407
|
+
/**
|
|
3408
|
+
* The set's elements for the planning's collision warning (`ROOM_COLLISION_MSG`): every element of a colliding docking
|
|
3409
|
+
* group but the NO_COLLISION ones, with its outline (never the viewer's measures). None while the 2D planner is off.
|
|
3410
|
+
*/
|
|
3411
|
+
}, {
|
|
3412
|
+
key: "getCollisionSet",
|
|
3413
|
+
value: function getCollisionSet() {
|
|
3414
|
+
return this.toCollisionSet(this.doDisablePlanner2D ? [] : index.getDockingGroups(this.getAllPlannerElements()));
|
|
3415
|
+
}
|
|
3416
|
+
|
|
3417
|
+
// The colliding ones of the docking groups `groups` as the planning's collision warning checks them.
|
|
3418
|
+
}, {
|
|
3419
|
+
key: "toCollisionSet",
|
|
3420
|
+
value: function toCollisionSet(groups) {
|
|
3421
|
+
var _this23 = this;
|
|
3422
|
+
var catalogData = this.getCatalogData();
|
|
3423
|
+
var parts = groups.filter(function (group) {
|
|
3424
|
+
return _this23.collides(group);
|
|
3425
|
+
}).flatMap(function (group, groupIndex) {
|
|
3426
|
+
var slotMembers = _this23.getSlotMembers(group);
|
|
3427
|
+
return group.filter(function (member) {
|
|
3428
|
+
return !_this23.hasNoCollision(member.ArticleCodex);
|
|
3429
|
+
}).map(function (member) {
|
|
3430
|
+
var _catalogData$forceCon;
|
|
3431
|
+
return _objectSpread(_objectSpread({}, _this23.toCollisionShape(member, slotMembers, false)), {}, {
|
|
3432
|
+
groupIndex: groupIndex,
|
|
3433
|
+
constructionChecked: catalogData.doCheckConstructionWarnings || !!((_catalogData$forceCon = catalogData.forceConstructionWarningForArticles) !== null && _catalogData$forceCon !== void 0 && _catalogData$forceCon.includes(member.ArticleCodex))
|
|
3434
|
+
});
|
|
3435
|
+
});
|
|
3436
|
+
});
|
|
3437
|
+
return {
|
|
3438
|
+
setId: this.set.getSetId(),
|
|
3439
|
+
catalogCodex: catalogData.catalogCodex,
|
|
3440
|
+
rules: catalogData.placementOptions.rules,
|
|
3441
|
+
collidingLayers: catalogData.checkCollisionForDifferentLayers,
|
|
3442
|
+
parts: parts
|
|
3443
|
+
};
|
|
3444
|
+
}
|
|
3445
|
+
|
|
1783
3446
|
/**
|
|
1784
3447
|
* Updates the overall set posNr
|
|
1785
3448
|
* @param startSetPosNr Indicates the start PosNr for the planner
|
|
@@ -1813,8 +3476,24 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1813
3476
|
}, {
|
|
1814
3477
|
key: "updatePlannerTrans",
|
|
1815
3478
|
value: function updatePlannerTrans(elementId, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint) {
|
|
1816
|
-
var
|
|
3479
|
+
var _this$dragUnit,
|
|
3480
|
+
_this24 = this;
|
|
1817
3481
|
var updateConfig = false;
|
|
3482
|
+
var room = this.room;
|
|
3483
|
+
if (room && transState == 'START') this.startRoomDrag(elementId);
|
|
3484
|
+
var roomDrag = room ? this.roomDrag : undefined;
|
|
3485
|
+
if (transState == 'START') this.startDragUnit(elementId, roomDrag);else if (transState == 'UPDATE') (_this$dragUnit = this.dragUnit) === null || _this$dragUnit === void 0 || _this$dragUnit.add(elementId);
|
|
3486
|
+
// A turn keeps its direction: only a move snaps into a slot place.
|
|
3487
|
+
if (transState == 'UPDATE' && deltaAngleDeg !== 0) this.dragSlots = undefined;
|
|
3488
|
+
// Group members follow the grabbed element rigidly, so their own UPDATE deltas are dropped.
|
|
3489
|
+
// A free group's rotation goes the normal way; only wall-bound groups take their rotation from the wall.
|
|
3490
|
+
if (roomDrag && roomDrag.wallMode !== 'forced' && transState == 'UPDATE' && deltaAngleDeg !== 0) roomDrag.rotating = true;
|
|
3491
|
+
if (room && roomDrag && !roomDrag.rotating && transState == 'UPDATE' && roomDrag.members.some(function (member) {
|
|
3492
|
+
return member.ElementId == elementId;
|
|
3493
|
+
})) {
|
|
3494
|
+
if (elementId == roomDrag.elementId) this.updateRoomDrag(room, roomDrag, deltaMove);
|
|
3495
|
+
return false;
|
|
3496
|
+
}
|
|
1818
3497
|
if (this.plannerElements.has(elementId)) {
|
|
1819
3498
|
var plannerElement = this.plannerElements.get(elementId);
|
|
1820
3499
|
plannerElement === null || plannerElement === void 0 || plannerElement.updateDeltaTrans(deltaMove, deltaAngleDeg, rotCorrection, transState == 'END', turningPoint);
|
|
@@ -1827,17 +3506,51 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1827
3506
|
updateConfig = this.set.onDockingChanged(plannerElement.ElementId, undockedElements[i], 'UNDOCK');
|
|
1828
3507
|
}
|
|
1829
3508
|
}
|
|
1830
|
-
} else if (transState == 'END') {
|
|
3509
|
+
} else if (transState == 'END' && plannerElement) {
|
|
3510
|
+
// A drag released where its group runs into something goes back to where it started, a turn only where findTurnPlace finds none.
|
|
3511
|
+
if ((roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.elementId) == elementId && roomDrag.blockedBy.length > 0) {
|
|
3512
|
+
var current = roomDrag.rotating ? this.getTurnedPose(plannerElement, roomDrag) : roomDrag.current;
|
|
3513
|
+
var target = roomDrag.rotating && room && this.findTurnPlace(plannerElement, roomDrag, room) || roomDrag.start;
|
|
3514
|
+
index.moveGroupRigidly([].concat(_toConsumableArray__default["default"](roomDrag.members), _toConsumableArray__default["default"](roomDrag.followers)), current, target);
|
|
3515
|
+
roomDrag.current = target;
|
|
3516
|
+
roomDrag.blockedBy = [];
|
|
3517
|
+
roomDrag.slotSnapped = false;
|
|
3518
|
+
}
|
|
3519
|
+
// Only the dragged unit moves: it is put back into the room and goes onto what it docks to (else into the free slot
|
|
3520
|
+
// place it snapped to), as the drag preview shows it, so docking it re-anchors nothing else. Its guests go with it.
|
|
3521
|
+
var unit = this.getAllPlannerElements().filter(function (element) {
|
|
3522
|
+
var _this24$dragUnit;
|
|
3523
|
+
return element === plannerElement || ((_this24$dragUnit = _this24.dragUnit) === null || _this24$dragUnit === void 0 ? void 0 : _this24$dragUnit.has(element.ElementId));
|
|
3524
|
+
});
|
|
3525
|
+
var followers = unit.filter(function (element) {
|
|
3526
|
+
return _this24.dragFollowers.has(element.ElementId);
|
|
3527
|
+
});
|
|
3528
|
+
var group = unit.filter(function (element) {
|
|
3529
|
+
return !_this24.dragFollowers.has(element.ElementId);
|
|
3530
|
+
});
|
|
3531
|
+
this.dragUnit = undefined;
|
|
3532
|
+
this.dragFollowers = new Set();
|
|
3533
|
+
var roomRule = (roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.elementId) == elementId && !roomDrag.slotSnapped && (roomDrag.wallMode === 'forced' || roomDrag.rotating);
|
|
3534
|
+
if (roomRule) this.placeGroupInRoom(group, plannerElement, followers);
|
|
3535
|
+
this.snapToDock(plannerElement, unit, autoDockingDistance, !roomDrag);
|
|
3536
|
+
this.dragSlots = undefined;
|
|
1831
3537
|
var dockablePairs = PlannerHandler2D.dockingPointHandlerInst.searchDockableElementsInArea(plannerElement, this.getAllPlannerElements(), autoDockingDistance); //hier kann jetzt ein DP drinnen stehen - docke alle
|
|
1832
3538
|
if (dockablePairs != null && dockablePairs.size > 0) {
|
|
1833
3539
|
dockablePairs.forEach(function (dockPair, type) {
|
|
1834
|
-
var targetPlannerElement =
|
|
3540
|
+
var targetPlannerElement = _this24.plannerElements.get(dockPair.targetDP.ElementId);
|
|
1835
3541
|
if (targetPlannerElement) {
|
|
1836
3542
|
PlannerHandler2D.dockingPointHandlerInst.tryDockElementDPToDP(plannerElement, targetPlannerElement, dockPair.sourceDP, dockPair.targetDP);
|
|
1837
3543
|
}
|
|
1838
3544
|
});
|
|
1839
3545
|
}
|
|
1840
3546
|
updateConfig = this.updateAllElementsWorldPos(elementId);
|
|
3547
|
+
if ((roomDrag === null || roomDrag === void 0 ? void 0 : roomDrag.elementId) == elementId) {
|
|
3548
|
+
// The group as released, docked or turned: a wall-bound one goes to its wall, any other inside the room; where a
|
|
3549
|
+
// slot snap put it, it stays.
|
|
3550
|
+
if (!roomDrag.slotSnapped) this.placeGroupInRoom(this.getDockingGroupOf(plannerElement), plannerElement);
|
|
3551
|
+
this.checkCollision(false, elementId);
|
|
3552
|
+
this.roomDrag = undefined;
|
|
3553
|
+
}
|
|
1841
3554
|
this.updatePlannerPosNr();
|
|
1842
3555
|
this.updatePlannerBoundingBox();
|
|
1843
3556
|
}
|
|
@@ -1863,7 +3576,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1863
3576
|
}, {
|
|
1864
3577
|
key: "saveSetPlanner",
|
|
1865
3578
|
value: function saveSetPlanner() {
|
|
1866
|
-
var
|
|
3579
|
+
var _this25 = this;
|
|
1867
3580
|
if (this.plannerElements.size == 0) return null;
|
|
1868
3581
|
var plannerElements = [];
|
|
1869
3582
|
this.plannerElements.forEach(function (elem, elemId) {
|
|
@@ -1878,13 +3591,18 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1878
3591
|
};
|
|
1879
3592
|
dpArr.push(saveDP);
|
|
1880
3593
|
}
|
|
1881
|
-
var plannerElement = {
|
|
3594
|
+
var plannerElement = _objectSpread(_objectSpread(_objectSpread({
|
|
1882
3595
|
elementID: elem.getElementId(),
|
|
1883
|
-
basketID:
|
|
1884
|
-
CatalogCodex:
|
|
1885
|
-
Codex:
|
|
3596
|
+
basketID: _this25.set.getBasketId(elem.getElementId()),
|
|
3597
|
+
CatalogCodex: _this25.set.getCatalogCodex(),
|
|
3598
|
+
Codex: _this25.set.getArticleCodex(elem.getElementId()),
|
|
1886
3599
|
posNr: elem.PosNr,
|
|
1887
|
-
accNr: elem.IsDockedAccessoire ? elem.AccessoirePosNr : undefined
|
|
3600
|
+
accNr: elem.IsDockedAccessoire ? elem.AccessoirePosNr : undefined
|
|
3601
|
+
}, elem.PosNrAtEnd ? {
|
|
3602
|
+
posNrAtEnd: true
|
|
3603
|
+
} : {}), elem.Placement ? {
|
|
3604
|
+
placement: elem.Placement
|
|
3605
|
+
} : {}), {}, {
|
|
1888
3606
|
x: elem.WorldPosCenter.x,
|
|
1889
3607
|
y: elem.WorldPosCenter.y,
|
|
1890
3608
|
z: elem.WorldPosCenter.z,
|
|
@@ -1893,9 +3611,9 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1893
3611
|
height: elem.Height ? elem.Height : -1,
|
|
1894
3612
|
depth: elem.Depth ? elem.Depth : -1,
|
|
1895
3613
|
DP: dpArr
|
|
1896
|
-
};
|
|
3614
|
+
});
|
|
1897
3615
|
if (elem.IsAccessoire) {
|
|
1898
|
-
var parentBasketId =
|
|
3616
|
+
var parentBasketId = _this25.set.getParentBasketIdOfElementId(elem.getElementId());
|
|
1899
3617
|
if (parentBasketId != undefined) {
|
|
1900
3618
|
plannerElement.AccessoireInitParams = {
|
|
1901
3619
|
RelatedToBasketID: parentBasketId
|
|
@@ -1929,7 +3647,7 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1929
3647
|
}, {
|
|
1930
3648
|
key: "getSetData",
|
|
1931
3649
|
value: function getSetData(only3DCompatible, useSetPlanner, doShow3DDimensionLines, alternateRenderInfo) {
|
|
1932
|
-
var
|
|
3650
|
+
var _this26 = this;
|
|
1933
3651
|
var setId = useSetPlanner ? this.set.getSetId() : 'S1';
|
|
1934
3652
|
var setData = {
|
|
1935
3653
|
//ID: "S" + this.plannerID,
|
|
@@ -1956,19 +3674,19 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1956
3674
|
setData.IDM3DEnvironment = this.IDM3DEnvironment;
|
|
1957
3675
|
}
|
|
1958
3676
|
this.plannerElements.forEach(function (elem, elemId) {
|
|
1959
|
-
var config =
|
|
3677
|
+
var config = _this26.set.getPlannerConfigData(elemId, alternateRenderInfo);
|
|
1960
3678
|
var elemCfg = config.config;
|
|
1961
3679
|
var accElements = [];
|
|
1962
3680
|
if (config.accs && config.accs.length > 0) {
|
|
1963
3681
|
for (var i = 0; i < config.accs.length; i++) {
|
|
1964
|
-
if (
|
|
3682
|
+
if (_this26.plannerElements.has(config.accs[i])) {
|
|
1965
3683
|
accElements.push('E' + config.accs[i]);
|
|
1966
3684
|
}
|
|
1967
3685
|
}
|
|
1968
3686
|
}
|
|
1969
3687
|
if (!only3DCompatible || elemCfg.Model != undefined) {
|
|
1970
3688
|
var _elemCfg$MOVE;
|
|
1971
|
-
var article =
|
|
3689
|
+
var article = _this26.set.getArticleByElementId(elemId);
|
|
1972
3690
|
var elemJson = {
|
|
1973
3691
|
ID: 'E' + elemId,
|
|
1974
3692
|
// N: elemCfg.N,
|
|
@@ -1998,15 +3716,15 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
1998
3716
|
elemJson.H = hash;
|
|
1999
3717
|
setData.ELE.push(elemJson);
|
|
2000
3718
|
}
|
|
2001
|
-
var shelfPlannerElements =
|
|
3719
|
+
var shelfPlannerElements = _this26.set.getShelfPlannerData(elemId);
|
|
2002
3720
|
if (shelfPlannerElements) {
|
|
2003
3721
|
for (var _i5 = 0; _i5 < shelfPlannerElements.length; _i5++) {
|
|
2004
3722
|
var accessorire = shelfPlannerElements[_i5];
|
|
2005
|
-
var shelfConfig =
|
|
3723
|
+
var shelfConfig = _this26.set.getShelfPlannerConfigData(accessorire.basketId).config;
|
|
2006
3724
|
var _accElements2 = [];
|
|
2007
3725
|
if (shelfConfig.accs && shelfConfig.accs.length > 0) {
|
|
2008
3726
|
for (var j = 0; j < shelfConfig.accs.length; j++) {
|
|
2009
|
-
if (
|
|
3727
|
+
if (_this26.plannerElements.has(shelfConfig.accs[j])) {
|
|
2010
3728
|
_accElements2.push('E' + shelfConfig.accs[j]);
|
|
2011
3729
|
}
|
|
2012
3730
|
}
|
|
@@ -2069,12 +3787,12 @@ var DivaStandardPlanner = /*#__PURE__*/function () {
|
|
|
2069
3787
|
}, {
|
|
2070
3788
|
key: "getPlanningIsComplete",
|
|
2071
3789
|
value: function getPlanningIsComplete(forceCheck) {
|
|
2072
|
-
var
|
|
3790
|
+
var _this27 = this;
|
|
2073
3791
|
var dontCheck = !forceCheck && (this.set.CatalogData.doHideCompletenessWarning || !this.set.CatalogData.doCheckConstructionWarnings);
|
|
2074
3792
|
var elemNotComplete = false;
|
|
2075
3793
|
this.plannerElements.forEach(function (plannerElement, key) {
|
|
2076
|
-
var
|
|
2077
|
-
if (dontCheck && !((
|
|
3794
|
+
var _this27$set$CatalogDa;
|
|
3795
|
+
if (dontCheck && !((_this27$set$CatalogDa = _this27.set.CatalogData.forceConstructionWarningForArticles) !== null && _this27$set$CatalogDa !== void 0 && _this27$set$CatalogDa.includes(plannerElement.ArticleCodex))) return;
|
|
2078
3796
|
if (!elemNotComplete && (plannerElement.getFreeDockingPointsByType('AVL').length > 0 || plannerElement.getFreeDockingPointsByType('AVR').length > 0)) {
|
|
2079
3797
|
elemNotComplete = true;
|
|
2080
3798
|
}
|