@collabdt/core 0.0.42 → 0.0.44
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/dist/core/components/Toolbar.d.ts.map +1 -1
- package/dist/core/components/Toolbar.js.map +1 -1
- package/dist/core/components/ToolbarBody.js.map +1 -1
- package/dist/core/components/TopNavigationBar.js.map +1 -1
- package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
- package/dist/core/components/authentication/Signin.js.map +1 -1
- package/dist/core/components/authentication/Signup.js.map +1 -1
- package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
- package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
- package/dist/core/components/ui/DataTable.d.ts.map +1 -1
- package/dist/core/components/ui/DataTable.js +7 -0
- package/dist/core/components/ui/DataTable.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts +5 -2
- package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/FileMarker.js +84 -21
- package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
- package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
- package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
- package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
- package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
- package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
- package/dist/core/components/ui/Navbar.d.ts.map +1 -1
- package/dist/core/components/ui/Navbar.js.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
- package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
- package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
- package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +2 -2
- package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.d.ts.map +1 -1
- package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js.map +1 -1
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +2 -2
- package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
- package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
- package/dist/core/components/viewers/Viewer.js +5 -1
- package/dist/core/components/viewers/Viewer.js.map +1 -1
- package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
- package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/BimViewer.js +14 -5
- package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimLoadingState/index.js +6 -0
- package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +168 -39
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js +1 -1
- package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
- package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts +14 -37
- package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/DXFLoader/index.js +31 -318
- package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts +66 -7
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.js +253 -21
- package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/ModelManager/index.js +9 -0
- package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts +3 -2
- package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js +3 -4
- package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +40 -18
- package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts +2 -5
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js +45 -59
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +1 -0
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts +10 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js +25 -73
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts +7 -3
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js +42 -78
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js +52 -75
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts +15 -3
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js +165 -105
- package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
- package/dist/core/components/viewers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/index.js.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/MapViewer.js +32 -8
- package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/DatasetManager/index.js +4 -3
- package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/RowActions.js +148 -0
- package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/index.js +32 -15
- package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts +4 -0
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js +43 -0
- package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/localDatasets.js +39 -3
- package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +2 -1
- package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts +47 -0
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.js +114 -0
- package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +49 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.js +100 -0
- package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -0
- package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/Geocoder.js +9 -9
- package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +25 -43
- package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js +19 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts +9 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js +28 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +1 -16
- package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js +31 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts +21 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js +111 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -0
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js +77 -2
- package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js +19 -9
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +10 -3
- package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoder.d.ts +6 -2
- package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoder.js +10 -62
- package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
- package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts +5 -0
- package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/adapters.js +192 -0
- package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +6 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.js +14 -0
- package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.d.ts +8 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.js +44 -0
- package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts +6 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.js +39 -0
- package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts +8 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js +35 -0
- package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -0
- package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +1 -3
- package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -3
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js +8 -2
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js +9 -9
- package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
- package/dist/core/hooks/provider.js.map +1 -1
- package/dist/core/plugins/host/provider.d.ts.map +1 -1
- package/dist/core/plugins/host/provider.js.map +1 -1
- package/dist/core/store/AppConfig/context.d.ts.map +1 -1
- package/dist/core/store/AppConfig/context.js.map +1 -1
- package/dist/core/store/BIM/context.d.ts.map +1 -1
- package/dist/core/store/BIM/context.js.map +1 -1
- package/dist/core/store/BIM/reducer.d.ts +0 -1
- package/dist/core/store/BIM/reducer.d.ts.map +1 -1
- package/dist/core/store/BIM/reducer.js +0 -4
- package/dist/core/store/BIM/reducer.js.map +1 -1
- package/dist/core/store/Buildings/context.d.ts.map +1 -1
- package/dist/core/store/Buildings/context.js.map +1 -1
- package/dist/core/store/Content/context.d.ts.map +1 -1
- package/dist/core/store/Content/context.js.map +1 -1
- package/dist/core/store/Datasets/context.d.ts.map +1 -1
- package/dist/core/store/Datasets/context.js +2 -1
- package/dist/core/store/Datasets/context.js.map +1 -1
- package/dist/core/store/Datasets/reducer.d.ts +2 -0
- package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
- package/dist/core/store/Datasets/reducer.js +9 -4
- package/dist/core/store/Datasets/reducer.js.map +1 -1
- package/dist/core/store/Files/context.d.ts.map +1 -1
- package/dist/core/store/Files/context.js.map +1 -1
- package/dist/core/store/Map/context.d.ts.map +1 -1
- package/dist/core/store/Map/context.js.map +1 -1
- package/dist/core/store/Menus/context.d.ts.map +1 -1
- package/dist/core/store/Menus/context.js.map +1 -1
- package/dist/core/store/Permissions/context.d.ts.map +1 -1
- package/dist/core/store/Permissions/context.js.map +1 -1
- package/dist/core/store/PointCloud/context.d.ts.map +1 -1
- package/dist/core/store/PointCloud/context.js.map +1 -1
- package/dist/core/store/Tools/context.d.ts.map +1 -1
- package/dist/core/store/Tools/context.js.map +1 -1
- package/dist/core/types/datasetTypes.d.ts +8 -1
- package/dist/core/types/datasetTypes.d.ts.map +1 -1
- package/dist/core/types/dbTypes.d.ts +13 -13
- package/dist/core/types/dbTypes.d.ts.map +1 -1
- package/dist/core/types/dbTypes.js +13 -13
- package/dist/core/types/dbTypes.js.map +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js.map +1 -1
- package/dist/core/utils/imageUtils.js +1 -1
- package/dist/core/utils/imageUtils.js.map +1 -1
- package/package.json +4 -3
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts +0 -3
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts.map +0 -1
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js +0 -173
- package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js.map +0 -1
package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { BimContext } from '../../../../../../../../store'\r\nimport { CollapsibleSection } from '../../../../../../../ui/CollapsibleSection'\r\nimport { FloorplanIcon } from '../../../../../../../ui/Icons/FloorPlanIcon'\r\nimport {\r\n FloorplanTool,\r\n FloorplanEntry,\r\n FloorplanLoadingStage,\r\n FloorplanLoadingState,\r\n getFloorplanStagePercent,\r\n} from '../../../../FloorplanTool'\r\nimport { exportDrawingToDxf } from '../../../../lib/exportDrawingToDxf'\r\nimport { TrueNorthPopover } from '../../../../lib/TrueNorthPopover'\r\nimport { useBuildingName } from '../../../../lib/useBuildingName'\r\nimport { useFriendlyIfcClassName } from '../../../../lib/useFriendlyIfcClassName'\r\nimport { ViewSectionList } from '../../../../lib/ViewSectionList'\r\nimport { ViewListEntry } from '../../../../lib/viewSection'\r\n\r\ninterface FloorplanSectionProps {\r\n query?: string\r\n}\r\n\r\nconst IDLE_LOADING: FloorplanLoadingState = { isLoading: false }\r\n\r\nexport function FloorplanSection({ query = '' }: FloorplanSectionProps) {\r\n const t = useTranslations('ViewSection')\r\n const friendlyClassName = useFriendlyIfcClassName()\r\n const buildingName = useBuildingName()\r\n\r\n const { state: bimState } = React.useContext(BimContext)\r\n const { bimComponents } = bimState.bim\r\n\r\n const [entries, setEntries] = React.useState<FloorplanEntry[]>([])\r\n const [activeId, setActiveId] = React.useState<string | null>(null)\r\n const [loading, setLoading] =\r\n React.useState<FloorplanLoadingState>(IDLE_LOADING)\r\n const [pendingId, setPendingId] = React.useState<string | null>(null)\r\n const [northAngle, setNorthAngle] = React.useState(0)\r\n const [pickingNorth, setPickingNorth] = React.useState(false)\r\n /** Bump on every layers-changed event to re-read the active entry's\r\n * layer metadata (the entry mutates in place inside the tool). */\r\n const [, setLayersTick] = React.useState(0)\r\n\r\n React.useEffect(() => {\r\n if (!bimComponents) return\r\n const tool = bimComponents.get(FloorplanTool)\r\n\r\n setEntries(tool.drawings)\r\n setActiveId(tool.activeDrawingId)\r\n setNorthAngle(tool.northAngle)\r\n setPickingNorth(tool.isPickingNorth)\r\n\r\n const onDrawings = (next: FloorplanEntry[]) => setEntries([...next])\r\n const onActive = (entry: FloorplanEntry | null) =>\r\n setActiveId(entry?.id ?? null)\r\n const onLoading = (state: FloorplanLoadingState) => {\r\n setLoading(state)\r\n if (!state.isLoading) setPendingId(null)\r\n }\r\n const onLayers = () => setLayersTick((v) => v + 1)\r\n const onNorth = (angle: number) => setNorthAngle(angle)\r\n const onPicking = (picking: boolean) => setPickingNorth(picking)\r\n\r\n tool.onDrawingsChanged.add(onDrawings)\r\n tool.onActiveDrawingChanged.add(onActive)\r\n tool.onGenerationStateChanged.add(onLoading)\r\n tool.onLayersChanged.add(onLayers)\r\n tool.onNorthAngleChanged.add(onNorth)\r\n tool.onPickingNorthChanged.add(onPicking)\r\n\r\n return () => {\r\n tool.onDrawingsChanged.remove(onDrawings)\r\n tool.onActiveDrawingChanged.remove(onActive)\r\n tool.onGenerationStateChanged.remove(onLoading)\r\n tool.onLayersChanged.remove(onLayers)\r\n tool.onNorthAngleChanged.remove(onNorth)\r\n tool.onPickingNorthChanged.remove(onPicking)\r\n }\r\n }, [bimComponents])\r\n\r\n const filteredEntries: ViewListEntry[] = React.useMemo(() => {\r\n const q = query.trim().toLowerCase()\r\n return entries\r\n .filter((entry) => !q || entry.name.toLowerCase().includes(q))\r\n .map((entry) => ({ id: entry.id, label: entry.name }))\r\n }, [entries, query])\r\n\r\n const activeEntry = React.useMemo(\r\n () => entries.find((entry) => entry.id === activeId) ?? null,\r\n [entries, activeId],\r\n )\r\n\r\n const handleSelect = (entry: ViewListEntry) => {\r\n if (!bimComponents) return\r\n const tool = bimComponents.get(FloorplanTool)\r\n if (activeId === entry.id) {\r\n setPendingId(null)\r\n void tool.deactivate()\r\n } else {\r\n setPendingId(entry.id)\r\n void tool.activate(entry.id)\r\n }\r\n }\r\n\r\n const handleExit = () => {\r\n if (!bimComponents) return\r\n setPendingId(null)\r\n void bimComponents.get(FloorplanTool).deactivate()\r\n }\r\n\r\n const handleDownload = (entry: ViewListEntry, event: React.MouseEvent) => {\r\n event.stopPropagation()\r\n if (!bimComponents) return\r\n const fpEntry = entries.find((e) => e.id === entry.id)\r\n if (!fpEntry?.drawing) return\r\n const fileName = `${buildingName(fpEntry.modelId)}-${fpEntry.name}`\r\n // Bake the building's true-north rotation into the exported geometry\r\n // so the DXF matches the on-screen orientation.\r\n exportDrawingToDxf(bimComponents, fpEntry.drawing, fileName, northAngle)\r\n }\r\n\r\n const handleToggleLayer = (className: string, visible: boolean) => {\r\n if (!bimComponents || !activeId) return\r\n // Group-level entries (Fill / Cut) are 3D model highlights, not drawing\r\n // layers — their toggle has no per-layer effect so we skip it here.\r\n if (className.startsWith('DrawingLayers.')) return\r\n bimComponents.get(FloorplanTool).setLayerVisible(activeId, className, visible)\r\n }\r\n\r\n const handleChangeLayerColor = (className: string, color: number) => {\r\n if (!bimComponents || !activeId) return\r\n const tool = bimComponents.get(FloorplanTool)\r\n if (className === 'DrawingLayers.fill') {\r\n void tool.setFillGroupColor(activeId, color)\r\n } else if (className === 'DrawingLayers.cut') {\r\n void tool.setCutGroupColor(activeId, color)\r\n } else {\r\n void tool.setLayerColor(activeId, className, color)\r\n }\r\n }\r\n\r\n const handleChangeNorthAngle = (degrees: number) => {\r\n if (!bimComponents) return\r\n bimComponents.get(FloorplanTool).setNorthAngle(degrees)\r\n }\r\n\r\n const handleStartPickNorth = () => {\r\n if (!bimComponents) return\r\n bimComponents.get(FloorplanTool).startPickNorth()\r\n }\r\n\r\n const handleCancelPickNorth = () => {\r\n if (!bimComponents) return\r\n bimComponents.get(FloorplanTool).cancelPickNorth()\r\n }\r\n\r\n const stageMessage = (stage: FloorplanLoadingStage | undefined): string =>\r\n stage && stage !== 'done' ? t(`stage.${stage}`) : t('loading')\r\n\r\n return (\r\n <CollapsibleSection\r\n title={t('floorplanTitle')}\r\n icon={FloorplanIcon}\r\n className=\"overflow-y-auto\"\r\n style={{ height: '100%', minHeight: 0 }}\r\n itemCount={filteredEntries.length}\r\n headerActions={\r\n <TrueNorthPopover\r\n northAngle={northAngle}\r\n pickingNorth={pickingNorth}\r\n disabled={!activeId}\r\n onChangeAngle={handleChangeNorthAngle}\r\n onStartPick={handleStartPickNorth}\r\n onCancelPick={handleCancelPickNorth}\r\n />\r\n }\r\n >\r\n <ViewSectionList\r\n entries={filteredEntries}\r\n activeId={activeId}\r\n pendingId={pendingId}\r\n loading={loading}\r\n loadingPercent={getFloorplanStagePercent(loading.stage)}\r\n activeLayers={activeEntry?.layers ?? null}\r\n loadingMessage={stageMessage(loading.stage)}\r\n viewingPrefix={t('viewing')}\r\n exitLabel={t('exit')}\r\n goToLabel={t('goToLevel')}\r\n downloadLabel={t('downloadTitle')}\r\n layersLabel={t('layers')}\r\n toggleVisibilityLabel={t('toggleVisibility')}\r\n chooseColorLabel={t('chooseColor')}\r\n friendlyClassName={friendlyClassName}\r\n onSelect={handleSelect}\r\n onExit={handleExit}\r\n onDownload={handleDownload}\r\n onToggleLayer={handleToggleLayer}\r\n onChangeLayerColor={handleChangeLayerColor}\r\n />\r\n </CollapsibleSection>\r\n )\r\n}\r\n"],"mappings":";AA0KQ;AAxKR,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;AACnC,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EAIA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,uBAAuB;AAOhC,MAAM,eAAsC,EAAE,WAAW,MAAM;AAExD,SAAS,iBAAiB,EAAE,QAAQ,GAAG,GAA0B;AA3BxE;AA4BE,QAAM,IAAI,gBAAgB,aAAa;AACvC,QAAM,oBAAoB,wBAAwB;AAClD,QAAM,eAAe,gBAAgB;AAErC,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,cAAc,IAAI,SAAS;AAEnC,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA2B,CAAC,CAAC;AACjE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAwB,IAAI;AAClE,QAAM,CAAC,SAAS,UAAU,IACxB,MAAM,SAAgC,YAAY;AACpD,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAG5D,QAAM,CAAC,EAAE,aAAa,IAAI,MAAM,SAAS,CAAC;AAE1C,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,cAAe;AACpB,UAAM,OAAO,cAAc,IAAI,aAAa;AAE5C,eAAW,KAAK,QAAQ;AACxB,gBAAY,KAAK,eAAe;AAChC,kBAAc,KAAK,UAAU;AAC7B,oBAAgB,KAAK,cAAc;AAEnC,UAAM,aAAa,CAAC,SAA2B,WAAW,CAAC,GAAG,IAAI,CAAC;AACnE,UAAM,WAAW,CAAC,UAA8B;AAxDpD,UAAAA;AAyDM,0BAAYA,MAAA,+BAAO,OAAP,OAAAA,MAAa,IAAI;AAAA;AAC/B,UAAM,YAAY,CAAC,UAAiC;AAClD,iBAAW,KAAK;AAChB,UAAI,CAAC,MAAM,UAAW,cAAa,IAAI;AAAA,IACzC;AACA,UAAM,WAAW,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC;AACjD,UAAM,UAAU,CAAC,UAAkB,cAAc,KAAK;AACtD,UAAM,YAAY,CAAC,YAAqB,gBAAgB,OAAO;AAE/D,SAAK,kBAAkB,IAAI,UAAU;AACrC,SAAK,uBAAuB,IAAI,QAAQ;AACxC,SAAK,yBAAyB,IAAI,SAAS;AAC3C,SAAK,gBAAgB,IAAI,QAAQ;AACjC,SAAK,oBAAoB,IAAI,OAAO;AACpC,SAAK,sBAAsB,IAAI,SAAS;AAExC,WAAO,MAAM;AACX,WAAK,kBAAkB,OAAO,UAAU;AACxC,WAAK,uBAAuB,OAAO,QAAQ;AAC3C,WAAK,yBAAyB,OAAO,SAAS;AAC9C,WAAK,gBAAgB,OAAO,QAAQ;AACpC,WAAK,oBAAoB,OAAO,OAAO;AACvC,WAAK,sBAAsB,OAAO,SAAS;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,kBAAmC,MAAM,QAAQ,MAAM;AAC3D,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,WAAO,QACJ,OAAO,CAAC,UAAU,CAAC,KAAK,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC,CAAC,EAC5D,IAAI,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,EAAE;AAAA,EACzD,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,cAAc,MAAM;AAAA,IACxB,MAAG;AA3FP,UAAAA;AA2FU,cAAAA,MAAA,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,MAA7C,OAAAA,MAAkD;AAAA;AAAA,IACxD,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,QAAM,eAAe,CAAC,UAAyB;AAC7C,QAAI,CAAC,cAAe;AACpB,UAAM,OAAO,cAAc,IAAI,aAAa;AAC5C,QAAI,aAAa,MAAM,IAAI;AACzB,mBAAa,IAAI;AACjB,WAAK,KAAK,WAAW;AAAA,IACvB,OAAO;AACL,mBAAa,MAAM,EAAE;AACrB,WAAK,KAAK,SAAS,MAAM,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,cAAe;AACpB,iBAAa,IAAI;AACjB,SAAK,cAAc,IAAI,aAAa,EAAE,WAAW;AAAA,EACnD;AAEA,QAAM,iBAAiB,CAAC,OAAsB,UAA4B;AACxE,UAAM,gBAAgB;AACtB,QAAI,CAAC,cAAe;AACpB,UAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE;AACrD,QAAI,EAAC,mCAAS,SAAS;AACvB,UAAM,WAAW,GAAG,aAAa,QAAQ,OAAO,CAAC,IAAI,QAAQ,IAAI;AAGjE,uBAAmB,eAAe,QAAQ,SAAS,UAAU,UAAU;AAAA,EACzE;AAEA,QAAM,oBAAoB,CAAC,WAAmB,YAAqB;AACjE,QAAI,CAAC,iBAAiB,CAAC,SAAU;AAGjC,QAAI,UAAU,WAAW,gBAAgB,EAAG;AAC5C,kBAAc,IAAI,aAAa,EAAE,gBAAgB,UAAU,WAAW,OAAO;AAAA,EAC/E;AAEA,QAAM,yBAAyB,CAAC,WAAmB,UAAkB;AACnE,QAAI,CAAC,iBAAiB,CAAC,SAAU;AACjC,UAAM,OAAO,cAAc,IAAI,aAAa;AAC5C,QAAI,cAAc,sBAAsB;AACtC,WAAK,KAAK,kBAAkB,UAAU,KAAK;AAAA,IAC7C,WAAW,cAAc,qBAAqB;AAC5C,WAAK,KAAK,iBAAiB,UAAU,KAAK;AAAA,IAC5C,OAAO;AACL,WAAK,KAAK,cAAc,UAAU,WAAW,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,yBAAyB,CAAC,YAAoB;AAClD,QAAI,CAAC,cAAe;AACpB,kBAAc,IAAI,aAAa,EAAE,cAAc,OAAO;AAAA,EACxD;AAEA,QAAM,uBAAuB,MAAM;AACjC,QAAI,CAAC,cAAe;AACpB,kBAAc,IAAI,aAAa,EAAE,eAAe;AAAA,EAClD;AAEA,QAAM,wBAAwB,MAAM;AAClC,QAAI,CAAC,cAAe;AACpB,kBAAc,IAAI,aAAa,EAAE,gBAAgB;AAAA,EACnD;AAEA,QAAM,eAAe,CAAC,UACpB,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,EAAE,IAAI,EAAE,SAAS;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,gBAAgB;AAAA,MACzB,MAAM;AAAA,MACN,WAAU;AAAA,MACV,OAAO,EAAE,QAAQ,QAAQ,WAAW,EAAE;AAAA,MACtC,WAAW,gBAAgB;AAAA,MAC3B,eACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAU,CAAC;AAAA,UACX,eAAe;AAAA,UACf,aAAa;AAAA,UACb,cAAc;AAAA;AAAA,MAChB;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB,yBAAyB,QAAQ,KAAK;AAAA,UACtD,eAAc,gDAAa,WAAb,YAAuB;AAAA,UACrC,gBAAgB,aAAa,QAAQ,KAAK;AAAA,UAC1C,eAAe,EAAE,SAAS;AAAA,UAC1B,WAAW,EAAE,MAAM;AAAA,UACnB,WAAW,EAAE,WAAW;AAAA,UACxB,eAAe,EAAE,eAAe;AAAA,UAChC,aAAa,EAAE,QAAQ;AAAA,UACvB,uBAAuB,EAAE,kBAAkB;AAAA,UAC3C,kBAAkB,EAAE,aAAa;AAAA,UACjC;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,oBAAoB;AAAA;AAAA,MACtB;AAAA;AAAA,EACF;AAEJ;","names":["_a"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { BimContext } from '../../../../../../../../store'\r\nimport { CollapsibleSection } from '../../../../../../../ui/CollapsibleSection'\r\nimport { FloorplanIcon } from '../../../../../../../ui/Icons/FloorPlanIcon'\r\nimport {\r\n FloorplanTool,\r\n FloorplanEntry,\r\n FloorplanLoadingStage,\r\n FloorplanLoadingState,\r\n getFloorplanStagePercent,\r\n} from '../../../../FloorplanTool'\r\nimport { exportDrawingToDxf } from '../../../../lib/exportDrawingToDxf'\r\nimport { TrueNorthPopover } from '../../../../lib/TrueNorthPopover'\r\nimport { useBuildingName } from '../../../../lib/useBuildingName'\r\nimport { useFriendlyIfcClassName } from '../../../../lib/useFriendlyIfcClassName'\r\nimport { ViewSectionList } from '../../../../lib/ViewSectionList'\r\nimport { ViewListEntry } from '../../../../lib/viewSection'\r\n\r\ninterface FloorplanSectionProps {\r\n query?: string\r\n}\r\n\r\nconst IDLE_LOADING: FloorplanLoadingState = { isLoading: false }\r\n\r\nexport function FloorplanSection({ query = '' }: FloorplanSectionProps) {\r\n const t = useTranslations('ViewSection')\r\n const friendlyClassName = useFriendlyIfcClassName()\r\n const buildingName = useBuildingName()\r\n\r\n const { state: bimState } = React.useContext(BimContext)\r\n const { bimComponents } = bimState.bim\r\n\r\n const [entries, setEntries] = React.useState<FloorplanEntry[]>([])\r\n const [activeId, setActiveId] = React.useState<string | null>(null)\r\n const [loading, setLoading] =\r\n React.useState<FloorplanLoadingState>(IDLE_LOADING)\r\n const [pendingId, setPendingId] = React.useState<string | null>(null)\r\n const [northAngle, setNorthAngle] = React.useState(0)\r\n const [pickingNorth, setPickingNorth] = React.useState(false)\r\n /** Bump on every layers-changed event to re-read the active entry's\r\n * layer metadata (the entry mutates in place inside the tool). */\r\n const [, setLayersTick] = React.useState(0)\r\n\r\n React.useEffect(() => {\r\n if (!bimComponents) return\r\n const tool = bimComponents.get(FloorplanTool)\r\n\r\n setEntries(tool.drawings)\r\n setActiveId(tool.activeDrawingId)\r\n setNorthAngle(tool.northAngle)\r\n setPickingNorth(tool.isPickingNorth)\r\n\r\n const onDrawings = (next: FloorplanEntry[]) => setEntries([...next])\r\n const onActive = (entry: FloorplanEntry | null) =>\r\n setActiveId(entry?.id ?? null)\r\n const onLoading = (state: FloorplanLoadingState) => {\r\n setLoading(state)\r\n if (!state.isLoading) setPendingId(null)\r\n }\r\n const onLayers = () => setLayersTick((v) => v + 1)\r\n const onNorth = (angle: number) => setNorthAngle(angle)\r\n const onPicking = (picking: boolean) => setPickingNorth(picking)\r\n\r\n tool.onDrawingsChanged.add(onDrawings)\r\n tool.onActiveDrawingChanged.add(onActive)\r\n tool.onGenerationStateChanged.add(onLoading)\r\n tool.onLayersChanged.add(onLayers)\r\n tool.onNorthAngleChanged.add(onNorth)\r\n tool.onPickingNorthChanged.add(onPicking)\r\n\r\n return () => {\r\n tool.onDrawingsChanged.remove(onDrawings)\r\n tool.onActiveDrawingChanged.remove(onActive)\r\n tool.onGenerationStateChanged.remove(onLoading)\r\n tool.onLayersChanged.remove(onLayers)\r\n tool.onNorthAngleChanged.remove(onNorth)\r\n tool.onPickingNorthChanged.remove(onPicking)\r\n }\r\n }, [bimComponents])\r\n\r\n const filteredEntries: ViewListEntry[] = React.useMemo(() => {\r\n const q = query.trim().toLowerCase()\r\n return entries\r\n .filter((entry) => !q || entry.name.toLowerCase().includes(q))\r\n .map((entry) => ({ id: entry.id, label: entry.name }))\r\n }, [entries, query])\r\n\r\n const activeEntry = React.useMemo(\r\n () => entries.find((entry) => entry.id === activeId) ?? null,\r\n [entries, activeId],\r\n )\r\n\r\n const handleSelect = (entry: ViewListEntry) => {\r\n if (!bimComponents) return\r\n const tool = bimComponents.get(FloorplanTool)\r\n if (activeId === entry.id) {\r\n setPendingId(null)\r\n void tool.deactivate()\r\n } else {\r\n setPendingId(entry.id)\r\n void tool.activate(entry.id)\r\n }\r\n }\r\n\r\n const handleExit = () => {\r\n if (!bimComponents) return\r\n setPendingId(null)\r\n void bimComponents.get(FloorplanTool).deactivate()\r\n }\r\n\r\n const handleDownload = (entry: ViewListEntry, event: React.MouseEvent) => {\r\n event.stopPropagation()\r\n if (!bimComponents) return\r\n const fpEntry = entries.find((e) => e.id === entry.id)\r\n if (!fpEntry?.drawing) return\r\n const fileName = `${buildingName(fpEntry.modelId)}-${fpEntry.name}`\r\n // Bake the on-screen orientation into the exported geometry. `northAngle`\r\n // is the camera azimuth, which rotates the floorplan clockwise on screen;\r\n // the DXF exporter rotates its image counter-clockwise, so we negate to\r\n // make the DXF land in the same orientation the user sees.\r\n exportDrawingToDxf(bimComponents, fpEntry.drawing, fileName, -northAngle)\r\n }\r\n\r\n const handleToggleLayer = (className: string, visible: boolean) => {\r\n if (!bimComponents || !activeId) return\r\n // Group-level entries (Fill / Cut) are 3D model highlights, not drawing\r\n // layers — their toggle has no per-layer effect so we skip it here.\r\n if (className.startsWith('DrawingLayers.')) return\r\n bimComponents.get(FloorplanTool).setLayerVisible(activeId, className, visible)\r\n }\r\n\r\n const handleChangeLayerColor = (className: string, color: number) => {\r\n if (!bimComponents || !activeId) return\r\n const tool = bimComponents.get(FloorplanTool)\r\n if (className === 'DrawingLayers.fill') {\r\n void tool.setFillGroupColor(activeId, color)\r\n } else if (className === 'DrawingLayers.cut') {\r\n void tool.setCutGroupColor(activeId, color)\r\n } else {\r\n void tool.setLayerColor(activeId, className, color)\r\n }\r\n }\r\n\r\n const handleChangeNorthAngle = (degrees: number) => {\r\n if (!bimComponents) return\r\n bimComponents.get(FloorplanTool).setNorthAngle(degrees)\r\n }\r\n\r\n const handleStartPickNorth = () => {\r\n if (!bimComponents) return\r\n bimComponents.get(FloorplanTool).startPickNorth()\r\n }\r\n\r\n const handleCancelPickNorth = () => {\r\n if (!bimComponents) return\r\n bimComponents.get(FloorplanTool).cancelPickNorth()\r\n }\r\n\r\n const stageMessage = (stage: FloorplanLoadingStage | undefined): string =>\r\n stage && stage !== 'done' ? t(`stage.${stage}`) : t('loading')\r\n\r\n return (\r\n <CollapsibleSection\r\n title={t('floorplanTitle')}\r\n icon={FloorplanIcon}\r\n className=\"overflow-y-auto\"\r\n style={{ height: '100%', minHeight: 0 }}\r\n itemCount={filteredEntries.length}\r\n headerActions={\r\n <TrueNorthPopover\r\n northAngle={northAngle}\r\n pickingNorth={pickingNorth}\r\n disabled={!activeId}\r\n onChangeAngle={handleChangeNorthAngle}\r\n onStartPick={handleStartPickNorth}\r\n onCancelPick={handleCancelPickNorth}\r\n />\r\n }\r\n >\r\n <ViewSectionList\r\n entries={filteredEntries}\r\n activeId={activeId}\r\n pendingId={pendingId}\r\n loading={loading}\r\n loadingPercent={getFloorplanStagePercent(loading.stage)}\r\n activeLayers={activeEntry?.layers ?? null}\r\n loadingMessage={stageMessage(loading.stage)}\r\n viewingPrefix={t('viewing')}\r\n exitLabel={t('exit')}\r\n goToLabel={t('goToLevel')}\r\n downloadLabel={t('downloadTitle')}\r\n layersLabel={t('layers')}\r\n toggleVisibilityLabel={t('toggleVisibility')}\r\n chooseColorLabel={t('chooseColor')}\r\n friendlyClassName={friendlyClassName}\r\n onSelect={handleSelect}\r\n onExit={handleExit}\r\n onDownload={handleDownload}\r\n onToggleLayer={handleToggleLayer}\r\n onChangeLayerColor={handleChangeLayerColor}\r\n />\r\n </CollapsibleSection>\r\n )\r\n}\r\n"],"mappings":";AA4KQ;AA1KR,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;AACnC,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EAIA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,uBAAuB;AAOhC,MAAM,eAAsC,EAAE,WAAW,MAAM;AAExD,SAAS,iBAAiB,EAAE,QAAQ,GAAG,GAA0B;AA3BxE;AA4BE,QAAM,IAAI,gBAAgB,aAAa;AACvC,QAAM,oBAAoB,wBAAwB;AAClD,QAAM,eAAe,gBAAgB;AAErC,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,cAAc,IAAI,SAAS;AAEnC,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAA2B,CAAC,CAAC;AACjE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAwB,IAAI;AAClE,QAAM,CAAC,SAAS,UAAU,IACxB,MAAM,SAAgC,YAAY;AACpD,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAAS,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAG5D,QAAM,CAAC,EAAE,aAAa,IAAI,MAAM,SAAS,CAAC;AAE1C,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,cAAe;AACpB,UAAM,OAAO,cAAc,IAAI,aAAa;AAE5C,eAAW,KAAK,QAAQ;AACxB,gBAAY,KAAK,eAAe;AAChC,kBAAc,KAAK,UAAU;AAC7B,oBAAgB,KAAK,cAAc;AAEnC,UAAM,aAAa,CAAC,SAA2B,WAAW,CAAC,GAAG,IAAI,CAAC;AACnE,UAAM,WAAW,CAAC,UAA8B;AAxDpD,UAAAA;AAyDM,0BAAYA,MAAA,+BAAO,OAAP,OAAAA,MAAa,IAAI;AAAA;AAC/B,UAAM,YAAY,CAAC,UAAiC;AAClD,iBAAW,KAAK;AAChB,UAAI,CAAC,MAAM,UAAW,cAAa,IAAI;AAAA,IACzC;AACA,UAAM,WAAW,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC;AACjD,UAAM,UAAU,CAAC,UAAkB,cAAc,KAAK;AACtD,UAAM,YAAY,CAAC,YAAqB,gBAAgB,OAAO;AAE/D,SAAK,kBAAkB,IAAI,UAAU;AACrC,SAAK,uBAAuB,IAAI,QAAQ;AACxC,SAAK,yBAAyB,IAAI,SAAS;AAC3C,SAAK,gBAAgB,IAAI,QAAQ;AACjC,SAAK,oBAAoB,IAAI,OAAO;AACpC,SAAK,sBAAsB,IAAI,SAAS;AAExC,WAAO,MAAM;AACX,WAAK,kBAAkB,OAAO,UAAU;AACxC,WAAK,uBAAuB,OAAO,QAAQ;AAC3C,WAAK,yBAAyB,OAAO,SAAS;AAC9C,WAAK,gBAAgB,OAAO,QAAQ;AACpC,WAAK,oBAAoB,OAAO,OAAO;AACvC,WAAK,sBAAsB,OAAO,SAAS;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,kBAAmC,MAAM,QAAQ,MAAM;AAC3D,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,WAAO,QACJ,OAAO,CAAC,UAAU,CAAC,KAAK,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC,CAAC,EAC5D,IAAI,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,EAAE;AAAA,EACzD,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,cAAc,MAAM;AAAA,IACxB,MAAG;AA3FP,UAAAA;AA2FU,cAAAA,MAAA,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,MAA7C,OAAAA,MAAkD;AAAA;AAAA,IACxD,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,QAAM,eAAe,CAAC,UAAyB;AAC7C,QAAI,CAAC,cAAe;AACpB,UAAM,OAAO,cAAc,IAAI,aAAa;AAC5C,QAAI,aAAa,MAAM,IAAI;AACzB,mBAAa,IAAI;AACjB,WAAK,KAAK,WAAW;AAAA,IACvB,OAAO;AACL,mBAAa,MAAM,EAAE;AACrB,WAAK,KAAK,SAAS,MAAM,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,cAAe;AACpB,iBAAa,IAAI;AACjB,SAAK,cAAc,IAAI,aAAa,EAAE,WAAW;AAAA,EACnD;AAEA,QAAM,iBAAiB,CAAC,OAAsB,UAA4B;AACxE,UAAM,gBAAgB;AACtB,QAAI,CAAC,cAAe;AACpB,UAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE;AACrD,QAAI,EAAC,mCAAS,SAAS;AACvB,UAAM,WAAW,GAAG,aAAa,QAAQ,OAAO,CAAC,IAAI,QAAQ,IAAI;AAKjE,uBAAmB,eAAe,QAAQ,SAAS,UAAU,CAAC,UAAU;AAAA,EAC1E;AAEA,QAAM,oBAAoB,CAAC,WAAmB,YAAqB;AACjE,QAAI,CAAC,iBAAiB,CAAC,SAAU;AAGjC,QAAI,UAAU,WAAW,gBAAgB,EAAG;AAC5C,kBAAc,IAAI,aAAa,EAAE,gBAAgB,UAAU,WAAW,OAAO;AAAA,EAC/E;AAEA,QAAM,yBAAyB,CAAC,WAAmB,UAAkB;AACnE,QAAI,CAAC,iBAAiB,CAAC,SAAU;AACjC,UAAM,OAAO,cAAc,IAAI,aAAa;AAC5C,QAAI,cAAc,sBAAsB;AACtC,WAAK,KAAK,kBAAkB,UAAU,KAAK;AAAA,IAC7C,WAAW,cAAc,qBAAqB;AAC5C,WAAK,KAAK,iBAAiB,UAAU,KAAK;AAAA,IAC5C,OAAO;AACL,WAAK,KAAK,cAAc,UAAU,WAAW,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,yBAAyB,CAAC,YAAoB;AAClD,QAAI,CAAC,cAAe;AACpB,kBAAc,IAAI,aAAa,EAAE,cAAc,OAAO;AAAA,EACxD;AAEA,QAAM,uBAAuB,MAAM;AACjC,QAAI,CAAC,cAAe;AACpB,kBAAc,IAAI,aAAa,EAAE,eAAe;AAAA,EAClD;AAEA,QAAM,wBAAwB,MAAM;AAClC,QAAI,CAAC,cAAe;AACpB,kBAAc,IAAI,aAAa,EAAE,gBAAgB;AAAA,EACnD;AAEA,QAAM,eAAe,CAAC,UACpB,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,EAAE,IAAI,EAAE,SAAS;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,gBAAgB;AAAA,MACzB,MAAM;AAAA,MACN,WAAU;AAAA,MACV,OAAO,EAAE,QAAQ,QAAQ,WAAW,EAAE;AAAA,MACtC,WAAW,gBAAgB;AAAA,MAC3B,eACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAU,CAAC;AAAA,UACX,eAAe;AAAA,UACf,aAAa;AAAA,UACb,cAAc;AAAA;AAAA,MAChB;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB,yBAAyB,QAAQ,KAAK;AAAA,UACtD,eAAc,gDAAa,WAAb,YAAuB;AAAA,UACrC,gBAAgB,aAAa,QAAQ,KAAK;AAAA,UAC1C,eAAe,EAAE,SAAS;AAAA,UAC1B,WAAW,EAAE,MAAM;AAAA,UACnB,WAAW,EAAE,WAAW;AAAA,UACxB,eAAe,EAAE,eAAe;AAAA,UAChC,aAAa,EAAE,QAAQ;AAAA,UACvB,uBAAuB,EAAE,kBAAkB;AAAA,UAC3C,kBAAkB,EAAE,aAAa;AAAA,UACjC;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,oBAAoB;AAAA;AAAA,MACtB;AAAA;AAAA,EACF;AAEJ;","names":["_a"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClippingPlane.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/bim/src/ClippingPlane.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"ClippingPlane.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/bim/src/ClippingPlane.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C,qBAAa,aAAc,SAAQ,GAAG,CAAC,SAAS;IAE5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,SAAS,CAA2B;IAE5C,IAAI,OAAO,IAIQ,OAAO,CAFzB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EASzB;gBAEW,UAAU,EAAE,GAAG,CAAC,UAAU;IAoBtC,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,aAAa,CAUpB;IAED,YAAY;IAMZ,YAAY;IAMZ,OAAO;CAMV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/ClippingPlane.ts"],"sourcesContent":["import { CurrentWorld } from './CurrentWorld';\r\nimport * as OBC from '@thatopen/components'\r\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/ClippingPlane.ts"],"sourcesContent":["import { CurrentWorld } from './CurrentWorld';\r\nimport * as OBC from '@thatopen/components'\r\n\r\nexport class ClippingPlane extends OBC.Component {\r\n\r\n static readonly uuid = '29b2eabd-36cd-4b42-a62c-d0509bd67d60' as const\r\n\r\n private _enabled = false\r\n private clipper: OBC.Clipper\r\n private casters: OBC.Raycasters\r\n private world: OBC.World | null = null\r\n private container: HTMLElement | null = null\r\n\r\n get enabled() {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n this.clipper.enabled = value\r\n \r\n if (value) {\r\n this.setupClippingPlane()\r\n } else {\r\n this.removeEventListeners()\r\n }\r\n }\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ClippingPlane.uuid, this)\r\n \r\n // Initialize clipper and raycasters\r\n this.clipper = components.get(OBC.Clipper)\r\n this.casters = components.get(OBC.Raycasters)\r\n this.world = components.get(CurrentWorld).world\r\n \r\n // Initialize the raycaster for the world\r\n if (this.world) {\r\n this.casters.get(this.world)\r\n }\r\n \r\n // Get the container from the world's renderer\r\n if (this.world?.renderer?.three.domElement.parentElement) {\r\n this.container = this.world.renderer.three.domElement.parentElement\r\n }\r\n }\r\n\r\n private setupClippingPlane() {\r\n if (!this.world || !this.container) {\r\n console.warn('World and container must be set before enabling clipping plane')\r\n return\r\n }\r\n\r\n // Add double-click event listener to create clipping planes\r\n this.container.ondblclick = () => {\r\n if (this.enabled && this.world) {\r\n this.clipper.create(this.world)\r\n }\r\n }\r\n\r\n // Make container focusable and focused for keyboard events\r\n this.container.tabIndex = -1\r\n this.container.focus()\r\n\r\n // Add keyboard event listener for deleting clipping planes\r\n this.container.addEventListener('keydown', this.handleKeyDown)\r\n // Also add to window as fallback\r\n window.addEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n private removeEventListeners() {\r\n if (this.container) {\r\n this.container.ondblclick = null\r\n this.container.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n window.removeEventListener('keydown', this.handleKeyDown)\r\n }\r\n\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n console.log('Key pressed:', event.code, 'Enabled:', this.enabled); // Debug log\r\n \r\n if (event.code === \"Delete\" || event.code === \"Backspace\" || event.code === \"Escape\") {\r\n if (this.enabled && this.world) {\r\n event.preventDefault(); \r\n event.stopPropagation(); \r\n this.deletePlanes()\r\n }\r\n }\r\n }\r\n\r\n createPlanes() {\r\n if (this.enabled && this.world) {\r\n this.clipper.create(this.world)\r\n }\r\n }\r\n\r\n deletePlanes() {\r\n if (this.world) {\r\n this.clipper.deleteAll()\r\n }\r\n }\r\n\r\n dispose() {\r\n this.enabled = false\r\n this.removeEventListeners()\r\n this.world = null\r\n this.container = null\r\n }\r\n}"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,YAAY,SAAS;AAEd,MAAM,iBAAN,MAAM,uBAAsB,IAAI,UAAU;AAAA,EAyB7C,YAAY,YAA4B;AA5B5C;AA6BQ,UAAM,UAAU;AAtBpB,SAAQ,WAAW;AAGnB,SAAQ,QAA0B;AAClC,SAAQ,YAAgC;AAoExC,SAAQ,gBAAgB,CAAC,UAAyB;AAC9C,cAAQ,IAAI,gBAAgB,MAAM,MAAM,YAAY,KAAK,OAAO;AAEhE,UAAI,MAAM,SAAS,YAAY,MAAM,SAAS,eAAe,MAAM,SAAS,UAAU;AAClF,YAAI,KAAK,WAAW,KAAK,OAAO;AAC5B,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,eAAK,aAAa;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AA3DI,eAAW,IAAI,eAAc,MAAM,IAAI;AAGvC,SAAK,UAAU,WAAW,IAAI,IAAI,OAAO;AACzC,SAAK,UAAU,WAAW,IAAI,IAAI,UAAU;AAC5C,SAAK,QAAQ,WAAW,IAAI,YAAY,EAAE;AAG1C,QAAI,KAAK,OAAO;AACZ,WAAK,QAAQ,IAAI,KAAK,KAAK;AAAA,IAC/B;AAGA,SAAI,gBAAK,UAAL,mBAAY,aAAZ,mBAAsB,MAAM,WAAW,eAAe;AACtD,WAAK,YAAY,KAAK,MAAM,SAAS,MAAM,WAAW;AAAA,IAC1D;AAAA,EACJ;AAAA,EAjCA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,QAAQ,OAAgB;AACxB,SAAK,WAAW;AAChB,SAAK,QAAQ,UAAU;AAEvB,QAAI,OAAO;AACP,WAAK,mBAAmB;AAAA,IAC5B,OAAO;AACH,WAAK,qBAAqB;AAAA,IAC9B;AAAA,EACJ;AAAA,EAsBQ,qBAAqB;AACzB,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,WAAW;AAChC,cAAQ,KAAK,gEAAgE;AAC7E;AAAA,IACJ;AAGA,SAAK,UAAU,aAAa,MAAM;AAC9B,UAAI,KAAK,WAAW,KAAK,OAAO;AAC5B,aAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,MAClC;AAAA,IACJ;AAGA,SAAK,UAAU,WAAW;AAC1B,SAAK,UAAU,MAAM;AAGrB,SAAK,UAAU,iBAAiB,WAAW,KAAK,aAAa;AAE7D,WAAO,iBAAiB,WAAW,KAAK,aAAa;AAAA,EACzD;AAAA,EAEQ,uBAAuB;AAC3B,QAAI,KAAK,WAAW;AAChB,WAAK,UAAU,aAAa;AAC5B,WAAK,UAAU,oBAAoB,WAAW,KAAK,aAAa;AAAA,IACpE;AACA,WAAO,oBAAoB,WAAW,KAAK,aAAa;AAAA,EAC5D;AAAA,EAcA,eAAe;AACX,QAAI,KAAK,WAAW,KAAK,OAAO;AAC5B,WAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,eAAe;AACX,QAAI,KAAK,OAAO;AACZ,WAAK,QAAQ,UAAU;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,UAAU;AACN,SAAK,UAAU;AACf,SAAK,qBAAqB;AAC1B,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACrB;AACJ;AA1Ga,eAEO,OAAO;AAFpB,IAAM,gBAAN;","names":[]}
|
|
@@ -1,47 +1,24 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
import * as OBC from '@thatopen/components';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Parses DXF files into THREE.Groups for the BIM world. This is a pure parser:
|
|
5
|
+
* it owns no scene placement, transforms or gizmos — the caller (AddDxf) decides
|
|
6
|
+
* where the drawing goes. A single off-screen DxfViewer is reused as the parser.
|
|
7
|
+
*/
|
|
8
8
|
export declare class DXFManager extends OBC.Component {
|
|
9
9
|
static uuid: "2cf1b746-3b3d-4988-960b-ea640e0e8925";
|
|
10
10
|
enabled: boolean;
|
|
11
|
-
|
|
12
|
-
onDXFTransformed: OBC.Event<unknown>;
|
|
13
|
-
private _world;
|
|
14
|
-
private _scale;
|
|
15
|
-
private _id;
|
|
16
|
-
get scale(): number;
|
|
17
|
-
set scale(scale: number);
|
|
18
|
-
private _rotation;
|
|
19
|
-
get rotation(): number;
|
|
20
|
-
set rotation(rotation: number);
|
|
21
|
-
private _origin;
|
|
22
|
-
get origin(): THREE.Vector3;
|
|
23
|
-
set origin(value: THREE.Vector3);
|
|
11
|
+
private readonly _container;
|
|
24
12
|
private _dxfViewer;
|
|
25
|
-
private _rotationMatrix;
|
|
26
|
-
private _list;
|
|
27
|
-
readonly container: HTMLElement;
|
|
28
13
|
constructor(components: OBC.Components);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Load and parse a DXF into a THREE.Group centered on its own origin and laid
|
|
16
|
+
* flat on the world ground (XZ) plane. DXF coordinates can carry huge offsets,
|
|
17
|
+
* so recentering keeps the drawing co-located with whatever point it is placed at.
|
|
18
|
+
*/
|
|
19
|
+
parse(url: string): Promise<THREE.Group>;
|
|
20
|
+
/** DxfViewer line geometry is 2D (x, y); promote it to 3D (x, y, 0) for the world scene. */
|
|
21
|
+
private flattenTo3D;
|
|
35
22
|
dispose(): void;
|
|
36
|
-
removeTransformControls(name: string): void;
|
|
37
|
-
enableEditMode(name: string): boolean;
|
|
38
|
-
isInEditMode(name: string): boolean;
|
|
39
|
-
getDxfList(): string[];
|
|
40
|
-
getDxfInfo(name: string): {
|
|
41
|
-
name: string;
|
|
42
|
-
hasControls: boolean;
|
|
43
|
-
drawing: THREE.Group;
|
|
44
|
-
matrix: THREE.Matrix4;
|
|
45
|
-
};
|
|
46
23
|
}
|
|
47
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/DXFLoader/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/DXFLoader/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,GAAG,CAAC,SAAS;IAC3C,MAAM,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAE7D,OAAO,UAAO;IAEd,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,UAAU,CAAW;gBAEjB,UAAU,EAAE,GAAG,CAAC,UAAU;IAMtC;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IA+B9C,4FAA4F;IAC5F,OAAO,CAAC,WAAW;IAgBnB,OAAO;CAGR"}
|
|
@@ -1,348 +1,61 @@
|
|
|
1
1
|
import * as THREE from "three";
|
|
2
2
|
import * as OBC from "@thatopen/components";
|
|
3
3
|
import { DxfViewer } from "dxf-viewer";
|
|
4
|
-
import { TransformControls } from "three/examples/jsm/Addons.js";
|
|
5
|
-
import { CurrentWorld } from "../CurrentWorld";
|
|
6
4
|
const _DXFManager = class _DXFManager extends OBC.Component {
|
|
7
5
|
constructor(components) {
|
|
8
6
|
super(components);
|
|
9
7
|
this.enabled = true;
|
|
10
|
-
this.
|
|
11
|
-
this.onDXFTransformed = new OBC.Event();
|
|
12
|
-
this._world = null;
|
|
13
|
-
this._scale = 1;
|
|
14
|
-
this._id = null;
|
|
15
|
-
this._rotation = 0;
|
|
16
|
-
this._origin = new THREE.Vector3();
|
|
17
|
-
this._rotationMatrix = new THREE.Matrix4().makeRotationX(
|
|
18
|
-
THREE.MathUtils.degToRad(-90)
|
|
19
|
-
);
|
|
20
|
-
this._list = {};
|
|
21
|
-
this.container = document.createElement("bim-viewport");
|
|
8
|
+
this._container = document.createElement("bim-viewport");
|
|
22
9
|
components.add(_DXFManager.uuid, this);
|
|
23
|
-
this._dxfViewer = new DxfViewer(this.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
get scale() {
|
|
32
|
-
return this._scale;
|
|
33
|
-
}
|
|
34
|
-
set scale(scale) {
|
|
35
|
-
this._scale = scale;
|
|
36
|
-
}
|
|
37
|
-
get rotation() {
|
|
38
|
-
return this._rotation;
|
|
39
|
-
}
|
|
40
|
-
set rotation(rotation) {
|
|
41
|
-
this._rotation = rotation;
|
|
42
|
-
}
|
|
43
|
-
get origin() {
|
|
44
|
-
return this._origin;
|
|
45
|
-
}
|
|
46
|
-
set origin(value) {
|
|
47
|
-
this._origin = value;
|
|
48
|
-
}
|
|
49
|
-
setupDxfViewer() {
|
|
50
|
-
const scene = this._dxfViewer.GetScene();
|
|
51
|
-
const camera = this._dxfViewer.GetCamera();
|
|
52
|
-
const canvas = this._dxfViewer.GetCanvas();
|
|
53
|
-
const mouse = new OBC.Mouse(canvas);
|
|
54
|
-
const raycaster = new THREE.Raycaster();
|
|
55
|
-
raycaster.params.Line.threshold = 3;
|
|
56
|
-
const geometry = new THREE.SphereGeometry(5);
|
|
57
|
-
const material = new THREE.MeshBasicMaterial({ color: 16711680 });
|
|
58
|
-
const sphere = new THREE.Mesh(geometry, material);
|
|
59
|
-
sphere.visible = false;
|
|
60
|
-
scene.add(sphere);
|
|
61
|
-
document.addEventListener("mousemove", () => {
|
|
62
|
-
if (scene.children.length === 0) return;
|
|
63
|
-
raycaster.setFromCamera(mouse.position, camera);
|
|
64
|
-
const result = raycaster.intersectObjects(scene.children, true);
|
|
65
|
-
if (result.length > 0) {
|
|
66
|
-
const element = result[0];
|
|
67
|
-
sphere.position.copy(element.point);
|
|
68
|
-
if (element instanceof THREE.Line) console.log(element);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
async load(url, id, name, origin) {
|
|
73
|
-
var _a;
|
|
74
|
-
const existingDrawing = this._list[name];
|
|
75
|
-
this._id = id;
|
|
10
|
+
this._dxfViewer = new DxfViewer(this._container, null);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Load and parse a DXF into a THREE.Group centered on its own origin and laid
|
|
14
|
+
* flat on the world ground (XZ) plane. DXF coordinates can carry huge offsets,
|
|
15
|
+
* so recentering keeps the drawing co-located with whatever point it is placed at.
|
|
16
|
+
*/
|
|
17
|
+
async parse(url) {
|
|
76
18
|
await this._dxfViewer.Load({
|
|
77
19
|
url,
|
|
78
20
|
fonts: ["/fonts/Roboto-LightItalic.ttf"],
|
|
79
21
|
progressCbk: null,
|
|
80
22
|
workerFactory: null
|
|
81
23
|
});
|
|
82
|
-
const
|
|
83
|
-
if (existingDrawing) {
|
|
84
|
-
if ((_a = this._world) == null ? void 0 : _a.scene.three.children.includes(existingDrawing.drawing)) {
|
|
85
|
-
this._world.scene.three.remove(existingDrawing.drawing);
|
|
86
|
-
}
|
|
87
|
-
} else {
|
|
88
|
-
dxfGroup.name = name;
|
|
89
|
-
this._list[name] = {
|
|
90
|
-
drawing: dxfGroup,
|
|
91
|
-
matrix: new THREE.Matrix4().set(
|
|
92
|
-
1,
|
|
93
|
-
0,
|
|
94
|
-
0,
|
|
95
|
-
0,
|
|
96
|
-
0,
|
|
97
|
-
1,
|
|
98
|
-
0,
|
|
99
|
-
0,
|
|
100
|
-
0,
|
|
101
|
-
0,
|
|
102
|
-
1,
|
|
103
|
-
0,
|
|
104
|
-
0,
|
|
105
|
-
0,
|
|
106
|
-
0,
|
|
107
|
-
1
|
|
108
|
-
)
|
|
109
|
-
};
|
|
110
|
-
}
|
|
24
|
+
const inner = new THREE.Group();
|
|
111
25
|
const dxfScene = this._dxfViewer.GetScene();
|
|
112
|
-
for (const child of dxfScene.children) {
|
|
113
|
-
this.
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
const clone = dxfGroup.clone();
|
|
117
|
-
clone.scale.set(this._scale, this._scale, this._scale);
|
|
118
|
-
if (origin) {
|
|
119
|
-
clone.position.x = origin.x;
|
|
120
|
-
clone.position.z = origin.y;
|
|
121
|
-
clone.position.y = -origin.z;
|
|
122
|
-
}
|
|
123
|
-
clone.rotateZ(THREE.MathUtils.degToRad(this._rotation));
|
|
124
|
-
if (!this._world) return;
|
|
125
|
-
clone.name = this._id;
|
|
126
|
-
this._world.scene.three.add(clone);
|
|
127
|
-
const rotationMatrix = new THREE.Matrix4().makeRotationX(
|
|
128
|
-
THREE.MathUtils.degToRad(-90)
|
|
129
|
-
);
|
|
130
|
-
clone.applyMatrix4(rotationMatrix);
|
|
131
|
-
for (const child of clone.children) {
|
|
132
|
-
this._world.meshes.add(child);
|
|
26
|
+
for (const child of [...dxfScene.children]) {
|
|
27
|
+
this.flattenTo3D(child);
|
|
28
|
+
inner.add(child);
|
|
133
29
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
setupTransformControls(dxfGroup, name) {
|
|
139
|
-
var _a, _b;
|
|
140
|
-
if (!((_a = this._world) == null ? void 0 : _a.camera) || !((_b = this._world) == null ? void 0 : _b.renderer)) return;
|
|
141
|
-
const controls = new TransformControls(
|
|
142
|
-
this._world.camera.three,
|
|
143
|
-
// Use .three to get the actual THREE.Camera
|
|
144
|
-
this._world.renderer.three.domElement
|
|
145
|
-
);
|
|
146
|
-
controls.setMode("translate");
|
|
147
|
-
controls.addEventListener("dragging-changed", (event) => {
|
|
148
|
-
var _a2, _b2;
|
|
149
|
-
if ((_b2 = (_a2 = this._world) == null ? void 0 : _a2.camera) == null ? void 0 : _b2.controls) {
|
|
150
|
-
this._world.camera.controls.enabled = !event.value;
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
controls.addEventListener("change", () => {
|
|
154
|
-
dxfGroup.updateMatrixWorld(true);
|
|
155
|
-
this.onDXFTransformed.trigger();
|
|
156
|
-
});
|
|
157
|
-
const handleKeyDown = (event) => {
|
|
158
|
-
switch (event.key.toLowerCase()) {
|
|
159
|
-
case "g":
|
|
160
|
-
controls.setMode("translate");
|
|
161
|
-
break;
|
|
162
|
-
case "r":
|
|
163
|
-
controls.setMode("rotate");
|
|
164
|
-
break;
|
|
165
|
-
case "s":
|
|
166
|
-
controls.setMode("scale");
|
|
167
|
-
break;
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
document.addEventListener("keydown", handleKeyDown);
|
|
171
|
-
controls.attach(dxfGroup);
|
|
172
|
-
const gizmo = controls.getHelper();
|
|
173
|
-
this._world.scene.three.add(controls);
|
|
174
|
-
this._world.scene.three.add(gizmo);
|
|
175
|
-
if (this._list[name]) {
|
|
176
|
-
this._list[name].controls = controls;
|
|
177
|
-
this._list[name].gizmo = gizmo;
|
|
178
|
-
this._list[name].keydownHandler = handleKeyDown;
|
|
30
|
+
const box = new THREE.Box3().setFromObject(inner);
|
|
31
|
+
if (!box.isEmpty()) {
|
|
32
|
+
const center = box.getCenter(new THREE.Vector3());
|
|
33
|
+
for (const child of inner.children) child.position.sub(center);
|
|
179
34
|
}
|
|
35
|
+
inner.rotateX(THREE.MathUtils.degToRad(-90));
|
|
36
|
+
const group = new THREE.Group();
|
|
37
|
+
group.add(inner);
|
|
38
|
+
return group;
|
|
180
39
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const existingDrawing = (_a = this._list[dxfName]) == null ? void 0 : _a.drawing;
|
|
184
|
-
if (!existingDrawing) {
|
|
185
|
-
console.warn(`There is no dxf drawing called ${dxfName}`);
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
const matrix = this.getTransformMatrix(
|
|
189
|
-
baseA,
|
|
190
|
-
baseB,
|
|
191
|
-
targetA,
|
|
192
|
-
targetB,
|
|
193
|
-
targetPlaneNormal
|
|
194
|
-
);
|
|
195
|
-
this._list[dxfName].matrix = matrix;
|
|
196
|
-
for (const child of existingDrawing.children) {
|
|
197
|
-
child.geometry.getAttribute("position").applyMatrix4(matrix);
|
|
198
|
-
}
|
|
199
|
-
this.onDXFTransformed.trigger(matrix);
|
|
200
|
-
}
|
|
201
|
-
setPosition(object) {
|
|
40
|
+
/** DxfViewer line geometry is 2D (x, y); promote it to 3D (x, y, 0) for the world scene. */
|
|
41
|
+
flattenTo3D(object) {
|
|
202
42
|
if (!("geometry" in object)) return;
|
|
203
43
|
const geometry = object.geometry;
|
|
204
44
|
const position = geometry.getAttribute("position");
|
|
205
|
-
|
|
45
|
+
if (!position || position.itemSize === 3) return;
|
|
46
|
+
const flattened = [];
|
|
206
47
|
for (let i = 0; i < position.array.length; i += position.itemSize) {
|
|
207
|
-
|
|
48
|
+
flattened.push(position.array[i], position.array[i + 1], 0);
|
|
208
49
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
getTransformMatrix(baseA, baseB, targetA, targetB, targetPlaneNormal) {
|
|
213
|
-
const matrix = new THREE.Matrix4();
|
|
214
|
-
baseB.sub(baseA);
|
|
215
|
-
targetB.sub(targetA);
|
|
216
|
-
const scaleFactor = targetB.length() / baseB.length();
|
|
217
|
-
const scaleVector = new THREE.Vector3(1, 1, 1).multiplyScalar(scaleFactor);
|
|
218
|
-
const angle = targetB.angleTo(baseB);
|
|
219
|
-
const axis = baseB.clone().cross(targetB).normalize();
|
|
220
|
-
const rotationMatrix = new THREE.Matrix4().makeRotationAxis(axis, angle);
|
|
221
|
-
const upDirection = new THREE.Vector3(0, 1, 0);
|
|
222
|
-
const upAngle = upDirection.angleTo(targetPlaneNormal);
|
|
223
|
-
const upAxis = upDirection.clone().cross(targetPlaneNormal).normalize();
|
|
224
|
-
const upRotationMatrix = new THREE.Matrix4().makeRotationAxis(
|
|
225
|
-
upAxis,
|
|
226
|
-
upAngle
|
|
50
|
+
geometry.setAttribute(
|
|
51
|
+
"position",
|
|
52
|
+
new THREE.BufferAttribute(new Float32Array(flattened), 3)
|
|
227
53
|
);
|
|
228
|
-
const finalRotation = upRotationMatrix.multiply(rotationMatrix);
|
|
229
|
-
matrix.multiply(finalRotation);
|
|
230
|
-
matrix.scale(scaleVector);
|
|
231
|
-
const finalPosition = baseA.multiplyScalar(scaleFactor * -1).applyMatrix4(finalRotation.clone().setPosition(targetA));
|
|
232
|
-
matrix.setPosition(
|
|
233
|
-
finalPosition.add(
|
|
234
|
-
new THREE.Vector3().addScalar(this._scale).multiply(targetPlaneNormal)
|
|
235
|
-
)
|
|
236
|
-
);
|
|
237
|
-
return matrix;
|
|
238
54
|
}
|
|
239
55
|
dispose() {
|
|
240
56
|
var _a, _b;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
this._world.scene.three.remove(controls);
|
|
244
|
-
const gizmo = controls.gizmo;
|
|
245
|
-
if (gizmo) {
|
|
246
|
-
this._world.scene.three.remove(gizmo);
|
|
247
|
-
}
|
|
248
|
-
controls.dispose();
|
|
249
|
-
}
|
|
250
|
-
if (drawing && ((_b = this._world) == null ? void 0 : _b.scene.three)) {
|
|
251
|
-
this._world.scene.three.remove(drawing);
|
|
252
|
-
}
|
|
253
|
-
const keydownHandler = this._list.keydownHandler;
|
|
254
|
-
if (keydownHandler) {
|
|
255
|
-
document.removeEventListener("keydown", keydownHandler);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
this._list = {};
|
|
259
|
-
}
|
|
260
|
-
removeTransformControls(name) {
|
|
261
|
-
var _a;
|
|
262
|
-
const dxfData = this._list[name];
|
|
263
|
-
if ((dxfData == null ? void 0 : dxfData.controls) && ((_a = this._world) == null ? void 0 : _a.scene.three)) {
|
|
264
|
-
this._world.scene.three.remove(dxfData.controls);
|
|
265
|
-
const gizmo = dxfData.gizmo;
|
|
266
|
-
if (gizmo) {
|
|
267
|
-
this._world.scene.three.remove(gizmo);
|
|
268
|
-
}
|
|
269
|
-
dxfData.controls.dispose();
|
|
270
|
-
const keydownHandler = dxfData.keydownHandler;
|
|
271
|
-
if (keydownHandler) {
|
|
272
|
-
document.removeEventListener("keydown", keydownHandler);
|
|
273
|
-
}
|
|
274
|
-
delete dxfData.controls;
|
|
275
|
-
delete dxfData.gizmo;
|
|
276
|
-
delete dxfData.keydownHandler;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
enableEditMode(name) {
|
|
280
|
-
var _a, _b;
|
|
281
|
-
const dxfData = this._list[name];
|
|
282
|
-
if (!(dxfData == null ? void 0 : dxfData.drawing) || !((_a = this._world) == null ? void 0 : _a.camera) || !((_b = this._world) == null ? void 0 : _b.renderer)) {
|
|
283
|
-
console.warn(`Cannot enable edit mode: DXF "${name}" not found or world not available`);
|
|
284
|
-
return false;
|
|
285
|
-
}
|
|
286
|
-
if (dxfData.controls) {
|
|
287
|
-
console.log(`Edit mode already enabled for DXF "${name}"`);
|
|
288
|
-
return true;
|
|
289
|
-
}
|
|
290
|
-
console.log(`Enabling edit mode for DXF "${name}"`);
|
|
291
|
-
const controls = new TransformControls(
|
|
292
|
-
this._world.camera.three,
|
|
293
|
-
this._world.renderer.three.domElement
|
|
294
|
-
);
|
|
295
|
-
controls.setMode("translate");
|
|
296
|
-
controls.addEventListener("dragging-changed", (event) => {
|
|
297
|
-
var _a2, _b2;
|
|
298
|
-
if ((_b2 = (_a2 = this._world) == null ? void 0 : _a2.camera) == null ? void 0 : _b2.controls) {
|
|
299
|
-
this._world.camera.controls.enabled = !event.value;
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
controls.addEventListener("change", () => {
|
|
303
|
-
dxfData.drawing.updateMatrixWorld(true);
|
|
304
|
-
this.onDXFTransformed.trigger();
|
|
305
|
-
});
|
|
306
|
-
const handleKeyDown = (event) => {
|
|
307
|
-
switch (event.key.toLowerCase()) {
|
|
308
|
-
case "g":
|
|
309
|
-
controls.setMode("translate");
|
|
310
|
-
break;
|
|
311
|
-
case "r":
|
|
312
|
-
controls.setMode("rotate");
|
|
313
|
-
break;
|
|
314
|
-
case "s":
|
|
315
|
-
controls.setMode("scale");
|
|
316
|
-
break;
|
|
317
|
-
}
|
|
318
|
-
};
|
|
319
|
-
document.addEventListener("keydown", handleKeyDown);
|
|
320
|
-
controls.attach(dxfData.drawing);
|
|
321
|
-
const gizmo = controls.getHelper();
|
|
322
|
-
this._world.scene.three.add(controls);
|
|
323
|
-
this._world.scene.three.add(gizmo);
|
|
324
|
-
dxfData.controls = controls;
|
|
325
|
-
dxfData.gizmo = gizmo;
|
|
326
|
-
dxfData.keydownHandler = handleKeyDown;
|
|
327
|
-
console.log(`Edit mode enabled for DXF "${name}"`);
|
|
328
|
-
return true;
|
|
329
|
-
}
|
|
330
|
-
isInEditMode(name) {
|
|
331
|
-
const dxfData = this._list[name];
|
|
332
|
-
return Boolean(dxfData == null ? void 0 : dxfData.controls);
|
|
333
|
-
}
|
|
334
|
-
getDxfList() {
|
|
335
|
-
return Object.keys(this._list);
|
|
336
|
-
}
|
|
337
|
-
getDxfInfo(name) {
|
|
338
|
-
const dxfData = this._list[name];
|
|
339
|
-
if (!dxfData) return null;
|
|
340
|
-
return {
|
|
341
|
-
name,
|
|
342
|
-
hasControls: Boolean(dxfData.controls),
|
|
343
|
-
drawing: dxfData.drawing,
|
|
344
|
-
matrix: dxfData.matrix
|
|
345
|
-
};
|
|
57
|
+
;
|
|
58
|
+
(_b = (_a = this._dxfViewer).Destroy) == null ? void 0 : _b.call(_a);
|
|
346
59
|
}
|
|
347
60
|
};
|
|
348
61
|
_DXFManager.uuid = "2cf1b746-3b3d-4988-960b-ea640e0e8925";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/DXFLoader/index.ts"],"sourcesContent":["import * as THREE from 'three'\r\nimport * as OBC from '@thatopen/components'\r\nimport { DxfViewer } from 'dxf-viewer'\r\nimport { TransformControls } from 'three/examples/jsm/Addons.js'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\n\r\nexport interface Position {\r\n x: number\r\n y: number\r\n z: number\r\n}\r\n\r\nexport class DXFManager extends OBC.Component {\r\n static uuid = '2cf1b746-3b3d-4988-960b-ea640e0e8925' as const\r\n\r\n enabled = true\r\n\r\n onDXFImported = new OBC.Event<THREE.Group>()\r\n\r\n onDXFTransformed = new OBC.Event()\r\n\r\n private _world: OBC.World | null = null\r\n\r\n private _scale: number = 1\r\n\r\n private _id: string | null = null\r\n\r\n get scale() {\r\n return this._scale\r\n }\r\n\r\n set scale(scale: number) {\r\n this._scale = scale\r\n }\r\n\r\n private _rotation: number = 0\r\n\r\n get rotation() {\r\n return this._rotation\r\n }\r\n\r\n set rotation(rotation: number) {\r\n this._rotation = rotation\r\n }\r\n\r\n private _origin: THREE.Vector3 = new THREE.Vector3()\r\n\r\n get origin() {\r\n return this._origin\r\n }\r\n\r\n set origin(value: THREE.Vector3) {\r\n this._origin = value\r\n }\r\n\r\n private _dxfViewer: DxfViewer\r\n\r\n private _rotationMatrix = new THREE.Matrix4().makeRotationX(\r\n THREE.MathUtils.degToRad(-90),\r\n )\r\n\r\n private _list: {\r\n [id: string]: {\r\n drawing: THREE.Group\r\n matrix: THREE.Matrix4\r\n controls?: TransformControls\r\n }\r\n } = {}\r\n\r\n readonly container = document.createElement('bim-viewport')\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(DXFManager.uuid, this)\r\n this._dxfViewer = new DxfViewer(this.container, null)\r\n this.container.addEventListener('resize', () => {\r\n const { width, height } = this.container.getBoundingClientRect()\r\n this._dxfViewer.SetSize(width, height)\r\n })\r\n\r\n this.setupDxfViewer()\r\n this._world = components.get(CurrentWorld).world\r\n }\r\n\r\n private setupDxfViewer() {\r\n const scene = this._dxfViewer.GetScene()\r\n const camera = this._dxfViewer.GetCamera()\r\n const canvas = this._dxfViewer.GetCanvas()\r\n const mouse = new OBC.Mouse(canvas)\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.params.Line.threshold = 3\r\n\r\n const geometry = new THREE.SphereGeometry(5)\r\n const material = new THREE.MeshBasicMaterial({ color: 0xFF_00_00 })\r\n\r\n const sphere = new THREE.Mesh(geometry, material)\r\n sphere.visible = false\r\n scene.add(sphere)\r\n\r\n document.addEventListener('mousemove', () => {\r\n if (scene.children.length === 0) return\r\n raycaster.setFromCamera(mouse.position, camera)\r\n const result = raycaster.intersectObjects(scene.children, true)\r\n if (result.length > 0) {\r\n const element = result[0]\r\n sphere.position.copy(element.point)\r\n if (element instanceof THREE.Line) console.log(element)\r\n }\r\n })\r\n }\r\n\r\n async load(url: string, id: string, name: string, origin?: Position) {\r\n const existingDrawing = this._list[name]\r\n this._id = id\r\n\r\n await this._dxfViewer.Load({\r\n url,\r\n fonts: ['/fonts/Roboto-LightItalic.ttf'],\r\n progressCbk: null,\r\n workerFactory: null,\r\n })\r\n\r\n const dxfGroup = existingDrawing\r\n ? existingDrawing.drawing\r\n : new THREE.Group()\r\n\r\n if (existingDrawing) {\r\n // Remove existing from scene if present\r\n if (this._world?.scene.three.children.includes(existingDrawing.drawing)) {\r\n this._world.scene.three.remove(existingDrawing.drawing)\r\n }\r\n }\r\n else {\r\n dxfGroup.name = name\r\n this._list[name] = {\r\n drawing: dxfGroup,\r\n matrix: new THREE.Matrix4().set(\r\n 1, 0, 0, 0,\r\n 0, 1, 0, 0,\r\n 0, 0, 1, 0,\r\n 0, 0, 0, 1,\r\n ),\r\n }\r\n }\r\n\r\n const dxfScene = this._dxfViewer.GetScene()\r\n for (const child of dxfScene.children) {\r\n this.setPosition(child)\r\n dxfGroup.add(child)\r\n }\r\n\r\n // Apply transformations\r\n const clone = dxfGroup.clone()\r\n clone.scale.set(this._scale, this._scale, this._scale)\r\n\r\n if (origin) {\r\n clone.position.x = origin.x\r\n clone.position.z = origin.y\r\n clone.position.y = -origin.z\r\n }\r\n\r\n clone.rotateZ(THREE.MathUtils.degToRad(this._rotation))\r\n\r\n if (!this._world) return\r\n\r\n clone.name = this._id\r\n\r\n // Add to world scene\r\n this._world.scene.three.add(clone)\r\n\r\n const rotationMatrix = new THREE.Matrix4().makeRotationX(\r\n THREE.MathUtils.degToRad(-90),\r\n )\r\n clone.applyMatrix4(rotationMatrix)\r\n\r\n for (const child of clone.children) {\r\n // @ts-ignore\r\n this._world.meshes.add(child)\r\n }\r\n\r\n // Setup transform controls (gizmo)\r\n this.setupTransformControls(clone, name)\r\n\r\n this.onDXFImported.trigger(clone)\r\n\r\n return clone\r\n }\r\n\r\n private setupTransformControls(dxfGroup: THREE.Group, name: string) {\r\n if (!this._world?.camera || !this._world?.renderer) return\r\n\r\n const controls = new TransformControls(\r\n this._world.camera.three, // Use .three to get the actual THREE.Camera\r\n this._world.renderer.three.domElement,\r\n )\r\n\r\n // Set the initial mode to translate (move)\r\n controls.setMode('translate') // This allows X, Y, Z movement\r\n\r\n // You can also switch modes programmatically:\r\n // controls.setMode('rotate'); // For rotation\r\n // controls.setMode('scale'); // For scaling\r\n\r\n controls.addEventListener('dragging-changed', (event: any) => {\r\n if (this._world?.camera?.controls) {\r\n this._world.camera.controls.enabled = !event.value\r\n }\r\n })\r\n\r\n controls.addEventListener('change', () => {\r\n dxfGroup.updateMatrixWorld(true)\r\n this.onDXFTransformed.trigger()\r\n })\r\n\r\n // Add keyboard shortcuts for switching modes\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n switch (event.key.toLowerCase()) {\r\n case 'g': // G for grab/translate\r\n controls.setMode('translate')\r\n break\r\n case 'r': // R for rotate\r\n controls.setMode('rotate')\r\n break\r\n case 's': // S for scale\r\n controls.setMode('scale')\r\n break\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', handleKeyDown)\r\n\r\n controls.attach(dxfGroup)\r\n\r\n // Get the gizmo helper and add it to the scene\r\n const gizmo = controls.getHelper()\r\n this._world.scene.three.add(controls)\r\n this._world.scene.three.add(gizmo)\r\n\r\n // Store controls reference\r\n if (this._list[name]) {\r\n this._list[name].controls = controls;\r\n // Store the gizmo helper reference for cleanup\r\n (this._list[name] as any).gizmo = gizmo;\r\n // Store the cleanup function for the keyboard listener\r\n (this._list[name] as any).keydownHandler = handleKeyDown\r\n }\r\n }\r\n\r\n transform(\r\n dxfName: string,\r\n baseA: THREE.Vector3,\r\n baseB: THREE.Vector3,\r\n targetA: THREE.Vector3,\r\n targetB: THREE.Vector3,\r\n targetPlaneNormal: THREE.Vector3,\r\n ) {\r\n const existingDrawing = this._list[dxfName]?.drawing\r\n if (!existingDrawing) {\r\n console.warn(`There is no dxf drawing called ${dxfName}`)\r\n return\r\n }\r\n const matrix = this.getTransformMatrix(\r\n baseA,\r\n baseB,\r\n targetA,\r\n targetB,\r\n targetPlaneNormal,\r\n )\r\n this._list[dxfName].matrix = matrix\r\n for (const child of existingDrawing.children) {\r\n // @ts-ignore\r\n child.geometry.getAttribute('position').applyMatrix4(matrix)\r\n }\r\n this.onDXFTransformed.trigger(matrix)\r\n }\r\n\r\n private setPosition(object: THREE.Object3D) {\r\n if (!('geometry' in object)) return\r\n const geometry = object.geometry as THREE.BufferGeometry\r\n const position = geometry.getAttribute('position')\r\n const array: number[] = []\r\n for (let i = 0; i < position.array.length; i += position.itemSize) {\r\n array.push(position.array[i], position.array[i + 1], 0)\r\n }\r\n const newPosition = new THREE.BufferAttribute(new Float32Array(array), 3)\r\n geometry.setAttribute('position', newPosition)\r\n }\r\n\r\n private getTransformMatrix(\r\n baseA: THREE.Vector3,\r\n baseB: THREE.Vector3,\r\n targetA: THREE.Vector3,\r\n targetB: THREE.Vector3,\r\n targetPlaneNormal: THREE.Vector3,\r\n ) {\r\n const matrix = new THREE.Matrix4()\r\n\r\n baseB.sub(baseA)\r\n targetB.sub(targetA)\r\n\r\n // Scale\r\n const scaleFactor = targetB.length() / baseB.length()\r\n const scaleVector = new THREE.Vector3(1, 1, 1).multiplyScalar(scaleFactor)\r\n\r\n // Rotation\r\n const angle = targetB.angleTo(baseB)\r\n const axis = baseB.clone().cross(targetB).normalize()\r\n const rotationMatrix = new THREE.Matrix4().makeRotationAxis(axis, angle)\r\n\r\n // Additional rotation to align object's up direction with target plane normal\r\n const upDirection = new THREE.Vector3(0, 1, 0)\r\n const upAngle = upDirection.angleTo(targetPlaneNormal)\r\n const upAxis = upDirection.clone().cross(targetPlaneNormal).normalize()\r\n const upRotationMatrix = new THREE.Matrix4().makeRotationAxis(\r\n upAxis,\r\n upAngle,\r\n )\r\n\r\n const finalRotation = upRotationMatrix.multiply(rotationMatrix)\r\n\r\n // Transform matrix\r\n matrix.multiply(finalRotation)\r\n matrix.scale(scaleVector)\r\n const finalPosition = baseA\r\n .multiplyScalar(scaleFactor * -1)\r\n .applyMatrix4(finalRotation.clone().setPosition(targetA))\r\n matrix.setPosition(\r\n finalPosition.add(\r\n new THREE.Vector3().addScalar(this._scale).multiply(targetPlaneNormal),\r\n ),\r\n )\r\n\r\n return matrix\r\n }\r\n\r\n dispose() {\r\n // Clean up transform controls and keyboard listeners\r\n for (const { controls, drawing } of Object.values(this._list)) {\r\n if (controls && this._world?.scene.three) {\r\n this._world.scene.three.remove(controls)\r\n\r\n // Remove gizmo helper\r\n const gizmo = (controls as any).gizmo\r\n if (gizmo) {\r\n this._world.scene.three.remove(gizmo)\r\n }\r\n\r\n controls.dispose()\r\n }\r\n if (drawing && this._world?.scene.three) {\r\n this._world.scene.three.remove(drawing)\r\n }\r\n // Clean up keyboard event listener\r\n const keydownHandler = (this._list as any).keydownHandler\r\n if (keydownHandler) {\r\n document.removeEventListener('keydown', keydownHandler)\r\n }\r\n }\r\n this._list = {}\r\n }\r\n\r\n removeTransformControls(name: string) {\r\n const dxfData = this._list[name]\r\n if (dxfData?.controls && this._world?.scene.three) {\r\n // Remove the controls from the scene\r\n this._world.scene.three.remove(dxfData.controls)\r\n\r\n // Remove the gizmo helper from the scene\r\n const gizmo = (dxfData as any).gizmo\r\n if (gizmo) {\r\n this._world.scene.three.remove(gizmo)\r\n }\r\n\r\n // Dispose of the controls\r\n dxfData.controls.dispose()\r\n\r\n // Remove keyboard event listener\r\n const keydownHandler = (dxfData as any).keydownHandler\r\n if (keydownHandler) {\r\n document.removeEventListener('keydown', keydownHandler)\r\n }\r\n\r\n // Clear the controls and gizmo references\r\n delete dxfData.controls\r\n delete (dxfData as any).gizmo\r\n delete (dxfData as any).keydownHandler\r\n }\r\n }\r\n\r\n enableEditMode(name: string) {\r\n const dxfData = this._list[name]\r\n if (!dxfData?.drawing || !this._world?.camera || !this._world?.renderer) {\r\n console.warn(`Cannot enable edit mode: DXF \"${name}\" not found or world not available`)\r\n return false\r\n }\r\n\r\n // If controls already exist, don't recreate them\r\n if (dxfData.controls) {\r\n console.log(`Edit mode already enabled for DXF \"${name}\"`)\r\n return true\r\n }\r\n\r\n console.log(`Enabling edit mode for DXF \"${name}\"`)\r\n\r\n // Create new transform controls\r\n const controls = new TransformControls(\r\n this._world.camera.three,\r\n this._world.renderer.three.domElement,\r\n )\r\n\r\n // Set the initial mode to translate\r\n controls.setMode('translate')\r\n\r\n controls.addEventListener('dragging-changed', (event: any) => {\r\n if (this._world?.camera?.controls) {\r\n this._world.camera.controls.enabled = !event.value\r\n }\r\n })\r\n\r\n controls.addEventListener('change', () => {\r\n dxfData.drawing.updateMatrixWorld(true)\r\n this.onDXFTransformed.trigger()\r\n })\r\n\r\n // Add keyboard shortcuts for switching modes\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n switch (event.key.toLowerCase()) {\r\n case 'g': // G for grab/translate\r\n controls.setMode('translate')\r\n break\r\n case 'r': // R for rotate\r\n controls.setMode('rotate')\r\n break\r\n case 's': // S for scale\r\n controls.setMode('scale')\r\n break\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', handleKeyDown)\r\n\r\n // Attach controls to the DXF group\r\n controls.attach(dxfData.drawing)\r\n\r\n // Get the gizmo helper and add both to the scene\r\n const gizmo = controls.getHelper()\r\n this._world.scene.three.add(controls)\r\n this._world.scene.three.add(gizmo)\r\n\r\n // Store references for cleanup\r\n dxfData.controls = controls;\r\n (dxfData as any).gizmo = gizmo;\r\n (dxfData as any).keydownHandler = handleKeyDown\r\n\r\n console.log(`Edit mode enabled for DXF \"${name}\"`)\r\n return true\r\n }\r\n\r\n isInEditMode(name: string): boolean {\r\n const dxfData = this._list[name]\r\n return Boolean(dxfData?.controls)\r\n }\r\n\r\n getDxfList(): string[] {\r\n return Object.keys(this._list)\r\n }\r\n\r\n getDxfInfo(name: string) {\r\n const dxfData = this._list[name]\r\n if (!dxfData) return null\r\n\r\n return {\r\n name,\r\n hasControls: Boolean(dxfData.controls),\r\n drawing: dxfData.drawing,\r\n matrix: dxfData.matrix,\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/DXFLoader/index.ts"],"sourcesContent":["import * as THREE from 'three'\r\nimport * as OBC from '@thatopen/components'\r\nimport { DxfViewer } from 'dxf-viewer'\r\n\r\n/**\r\n * Parses DXF files into THREE.Groups for the BIM world. This is a pure parser:\r\n * it owns no scene placement, transforms or gizmos — the caller (AddDxf) decides\r\n * where the drawing goes. A single off-screen DxfViewer is reused as the parser.\r\n */\r\nexport class DXFManager extends OBC.Component {\r\n static uuid = '2cf1b746-3b3d-4988-960b-ea640e0e8925' as const\r\n\r\n enabled = true\r\n\r\n private readonly _container = document.createElement('bim-viewport')\r\n private _dxfViewer: DxfViewer\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(DXFManager.uuid, this)\r\n this._dxfViewer = new DxfViewer(this._container, null)\r\n }\r\n\r\n /**\r\n * Load and parse a DXF into a THREE.Group centered on its own origin and laid\r\n * flat on the world ground (XZ) plane. DXF coordinates can carry huge offsets,\r\n * so recentering keeps the drawing co-located with whatever point it is placed at.\r\n */\r\n async parse(url: string): Promise<THREE.Group> {\r\n await this._dxfViewer.Load({\r\n url,\r\n fonts: ['/fonts/Roboto-LightItalic.ttf'],\r\n progressCbk: null,\r\n workerFactory: null,\r\n })\r\n\r\n const inner = new THREE.Group()\r\n const dxfScene = this._dxfViewer.GetScene()\r\n for (const child of [...dxfScene.children]) {\r\n this.flattenTo3D(child)\r\n inner.add(child)\r\n }\r\n\r\n // Recenter geometry on the group origin so placement lands the drawing's\r\n // center at the chosen point regardless of the DXF's authored coordinates.\r\n const box = new THREE.Box3().setFromObject(inner)\r\n if (!box.isEmpty()) {\r\n const center = box.getCenter(new THREE.Vector3())\r\n for (const child of inner.children) child.position.sub(center)\r\n }\r\n\r\n // DXF is authored in the XY plane; tip it onto the world XZ ground plane (Y up).\r\n inner.rotateX(THREE.MathUtils.degToRad(-90))\r\n\r\n const group = new THREE.Group()\r\n group.add(inner)\r\n return group\r\n }\r\n\r\n /** DxfViewer line geometry is 2D (x, y); promote it to 3D (x, y, 0) for the world scene. */\r\n private flattenTo3D(object: THREE.Object3D) {\r\n if (!('geometry' in object)) return\r\n const geometry = object.geometry as THREE.BufferGeometry\r\n const position = geometry.getAttribute('position')\r\n if (!position || position.itemSize === 3) return\r\n\r\n const flattened: number[] = []\r\n for (let i = 0; i < position.array.length; i += position.itemSize) {\r\n flattened.push(position.array[i], position.array[i + 1], 0)\r\n }\r\n geometry.setAttribute(\r\n 'position',\r\n new THREE.BufferAttribute(new Float32Array(flattened), 3),\r\n )\r\n }\r\n\r\n dispose() {\r\n ;(this._dxfViewer as unknown as { Destroy?: () => void }).Destroy?.()\r\n }\r\n}\r\n"],"mappings":"AAAA,YAAY,WAAW;AACvB,YAAY,SAAS;AACrB,SAAS,iBAAiB;AAOnB,MAAM,cAAN,MAAM,oBAAmB,IAAI,UAAU;AAAA,EAQ5C,YAAY,YAA4B;AACtC,UAAM,UAAU;AANlB,mBAAU;AAEV,SAAiB,aAAa,SAAS,cAAc,cAAc;AAKjE,eAAW,IAAI,YAAW,MAAM,IAAI;AACpC,SAAK,aAAa,IAAI,UAAU,KAAK,YAAY,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,KAAmC;AAC7C,UAAM,KAAK,WAAW,KAAK;AAAA,MACzB;AAAA,MACA,OAAO,CAAC,+BAA+B;AAAA,MACvC,aAAa;AAAA,MACb,eAAe;AAAA,IACjB,CAAC;AAED,UAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,UAAM,WAAW,KAAK,WAAW,SAAS;AAC1C,eAAW,SAAS,CAAC,GAAG,SAAS,QAAQ,GAAG;AAC1C,WAAK,YAAY,KAAK;AACtB,YAAM,IAAI,KAAK;AAAA,IACjB;AAIA,UAAM,MAAM,IAAI,MAAM,KAAK,EAAE,cAAc,KAAK;AAChD,QAAI,CAAC,IAAI,QAAQ,GAAG;AAClB,YAAM,SAAS,IAAI,UAAU,IAAI,MAAM,QAAQ,CAAC;AAChD,iBAAW,SAAS,MAAM,SAAU,OAAM,SAAS,IAAI,MAAM;AAAA,IAC/D;AAGA,UAAM,QAAQ,MAAM,UAAU,SAAS,GAAG,CAAC;AAE3C,UAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,UAAM,IAAI,KAAK;AACf,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,YAAY,QAAwB;AAC1C,QAAI,EAAE,cAAc,QAAS;AAC7B,UAAM,WAAW,OAAO;AACxB,UAAM,WAAW,SAAS,aAAa,UAAU;AACjD,QAAI,CAAC,YAAY,SAAS,aAAa,EAAG;AAE1C,UAAM,YAAsB,CAAC;AAC7B,aAAS,IAAI,GAAG,IAAI,SAAS,MAAM,QAAQ,KAAK,SAAS,UAAU;AACjE,gBAAU,KAAK,SAAS,MAAM,CAAC,GAAG,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC;AAAA,IAC5D;AACA,aAAS;AAAA,MACP;AAAA,MACA,IAAI,MAAM,gBAAgB,IAAI,aAAa,SAAS,GAAG,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,UAAU;AA5EZ;AA6EI;AAAC,KAAC,gBAAK,YAAmD,YAAxD;AAAA,EACJ;AACF;AAtEa,YACJ,OAAO;AADT,IAAM,aAAN;","names":[]}
|