diff --git a/viewer/package.json b/viewer/package.json index ada003f0ea5..8f943114d00 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -1,6 +1,6 @@ { "name": "@cognite/reveal", - "version": "4.21.3", + "version": "4.22.0", "description": "WebGL based 3D viewer for CAD and point clouds processed in Cognite Data Fusion.", "homepage": "https://github.com/cognitedata/reveal/tree/master/viewer", "repository": { diff --git a/viewer/packages/api/src/api-helpers/Image360ApiHelper.ts b/viewer/packages/api/src/api-helpers/Image360ApiHelper.ts index 0491958da86..20445cd6ddc 100644 --- a/viewer/packages/api/src/api-helpers/Image360ApiHelper.ts +++ b/viewer/packages/api/src/api-helpers/Image360ApiHelper.ts @@ -47,6 +47,7 @@ import { DEFAULT_IMAGE_360_OPACITY } from '@reveal/360-images/src/entity/Image36 import { Image360History } from '@reveal/360-images/src/Image360History'; import { Image360Action } from '@reveal/360-images/src/Image360Action'; import { Image360IconIntersectionData } from '@reveal/360-images/src/types'; +import { Cdf360CdmDescriptorProvider } from '@reveal/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptorProvider'; export class Image360ApiHelper { private readonly _image360Facade: Image360Facade; @@ -110,9 +111,11 @@ export class Image360ApiHelper { this._hasEventListeners = hasEventListeners ?? true; const image360EventDescriptorProvider = new Cdf360EventDescriptorProvider(cogniteClient); const image360DataModelsDescriptorProvider = new Cdf360DataModelsDescriptorProvider(cogniteClient); + const image360CdmDescriptorProvider = new Cdf360CdmDescriptorProvider(cogniteClient); const combinedDescriptorProvider = new Cdf360CombinedDescriptorProvider( image360DataModelsDescriptorProvider, - image360EventDescriptorProvider + image360EventDescriptorProvider, + image360CdmDescriptorProvider ); const setNeedsRedraw: () => void = () => (this._needsRedraw = true); diff --git a/viewer/packages/data-providers/index.ts b/viewer/packages/data-providers/index.ts index 213a431e07f..6a6b588b352 100644 --- a/viewer/packages/data-providers/index.ts +++ b/viewer/packages/data-providers/index.ts @@ -9,7 +9,7 @@ export { Cdf360EventDescriptorProvider } from './src/image-360-data-providers/de export { Cdf360DataModelsDescriptorProvider, Image360DataModelIdentifier -} from './src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptorProvider'; +} from './src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptorProvider'; export { Cdf360CombinedDescriptorProvider } from './src/image-360-data-providers/descriptor-providers/Cdf360CombinedDescriptorProvider'; export { LocalModelDataProvider } from './src/model-data-providers/LocalModelDataProvider'; export { LocalModelIdentifier } from './src/model-identifiers/LocalModelIdentifier'; diff --git a/viewer/packages/data-providers/src/DataSourceType.ts b/viewer/packages/data-providers/src/DataSourceType.ts index 09c4303eb09..55d7098bc4b 100644 --- a/viewer/packages/data-providers/src/DataSourceType.ts +++ b/viewer/packages/data-providers/src/DataSourceType.ts @@ -2,7 +2,7 @@ * Copyright 2024 Cognite AS */ import { AnnotationModel, AnnotationsAssetRef } from '@cognite/sdk'; -import { Image360DataModelIdentifier } from './image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptorProvider'; +import { Image360DataModelIdentifier } from './image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptorProvider'; import { DMInstanceRef } from './pointcloud-stylable-object-providers/types'; import { PointCloudAnnotationVolumeCollection, PointCloudDMVolumeCollection } from '@reveal/pointcloud-styling'; diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/Cdf360CombinedDescriptorProvider.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/Cdf360CombinedDescriptorProvider.ts index 952700517b7..bb470dfd0bd 100644 --- a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/Cdf360CombinedDescriptorProvider.ts +++ b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/Cdf360CombinedDescriptorProvider.ts @@ -7,14 +7,16 @@ import { Historical360ImageSet, Image360DescriptorProvider } from '../../types'; import { Cdf360DataModelsDescriptorProvider, Image360DataModelIdentifier -} from './datamodels/Cdf360DataModelsDescriptorProvider'; +} from './datamodels/system-space/Cdf360DataModelsDescriptorProvider'; import { Cdf360EventDescriptorProvider } from './events/Cdf360EventDescriptorProvider'; +import { Cdf360CdmDescriptorProvider } from './datamodels/cdm/Cdf360CdmDescriptorProvider'; export class Cdf360CombinedDescriptorProvider implements Image360DescriptorProvider { private readonly _eventProvider: Cdf360EventDescriptorProvider; private readonly _fdmProvider: Cdf360DataModelsDescriptorProvider; + private readonly _cdmProvider: Cdf360CdmDescriptorProvider; public static isFdmIdentifier( metadataFilter: Metadata | Image360DataModelIdentifier @@ -25,9 +27,14 @@ export class Cdf360CombinedDescriptorProvider ); } - constructor(fdmProvider: Cdf360DataModelsDescriptorProvider, eventProvider: Cdf360EventDescriptorProvider) { + constructor( + fdmProvider: Cdf360DataModelsDescriptorProvider, + eventProvider: Cdf360EventDescriptorProvider, + cdmProvider: Cdf360CdmDescriptorProvider + ) { this._fdmProvider = fdmProvider; this._eventProvider = eventProvider; + this._cdmProvider = cdmProvider; } public get360ImageDescriptors( @@ -35,7 +42,11 @@ export class Cdf360CombinedDescriptorProvider preMultipliedRotation: boolean ): Promise { if (Cdf360CombinedDescriptorProvider.isFdmIdentifier(metadataFilter)) { - return this._fdmProvider.get360ImageDescriptors(metadataFilter, preMultipliedRotation); + if (metadataFilter.source === 'cdm') { + return this._cdmProvider.get360ImageDescriptors(metadataFilter, preMultipliedRotation); + } else { + return this._fdmProvider.get360ImageDescriptors(metadataFilter, preMultipliedRotation); + } } else { return this._eventProvider.get360ImageDescriptors(metadataFilter, preMultipliedRotation); } diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptor.test.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptor.test.ts new file mode 100644 index 00000000000..d7dc650d0a2 --- /dev/null +++ b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptor.test.ts @@ -0,0 +1,252 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import { CogniteClient, FileInfo } from '@cognite/sdk'; +import { Cdf360CdmDescriptorProvider } from './Cdf360CdmDescriptorProvider'; +import { It, Mock } from 'moq.ts'; + +const mock = { + headers: { + 'access-control-allow-credentials': 'false', + 'access-control-allow-headers': + 'accept,accept-language,content-type,content-language,content-range,origin,authorization,api-key,auth-ticket,cdf-version,cdf-experiments,env,x-cdp-app,x-cdp-clienttag,x-cdp-sdk,x-ms-blob-content-type,x-upload-content-type,x-user-agent', + 'access-control-allow-methods': 'GET,POST,PUT,PATCH,DELETE,OPTIONS,HEAD', + 'access-control-allow-origin': '*', + 'access-control-expose-headers': 'x-request-id', + 'access-control-max-age': '7200', + connection: 'close', + 'content-encoding': 'gzip', + 'content-length': '6542', + 'content-type': 'application/json', + date: 'Thu, 16 Nov 2023 14:46:45 GMT', + server: 'envoy', + 'strict-transport-security': 'max-age=31536000', + vary: 'Accept-Encoding', + 'x-envoy-upstream-service-time': '143', + 'x-request-id': '87518dc6-0c61-9ef0-9588-94f61ab5a450' + }, + status: 200, + data: { + items: { + image_collection: [ + { + instanceType: 'node', + version: 1, + space: 'test_space', + externalId: 'test_collection', + createdTime: 0, + lastUpdatedTime: 0, + properties: { + cdf_cdm: { + 'Cognite360ImageCollection/v1': { + name: 'Test Collection' + } + } + } + } + ], + images: [ + { + instanceType: 'node', + version: 1, + space: 'test_space', + externalId: 'test_image_1', + createdTime: 0, + lastUpdatedTime: 0, + properties: { + cdf_cdm: { + 'Cognite360Image/v1': { + top: { + externalId: 'test_image_3_Top', + space: 'test_space' + }, + back: { + externalId: 'test_image_3_Back', + space: 'test_space' + }, + left: { + externalId: 'test_image_3_Left', + space: 'test_space' + }, + front: { + externalId: 'test_image_3_Front', + space: 'test_space' + }, + right: { + externalId: 'test_image_3_Right', + space: 'test_space' + }, + bottom: { + externalId: 'test_image_3_Bottom', + space: 'test_space' + }, + collection360: { + space: 'test_space', + externalId: 'test_collection' + }, + scaleX: 1, + scaleY: 1, + scaleZ: 1, + translationX: 0, + translationY: 0, + translationZ: 0, + eulerRotationX: 0, + eulerRotationY: 0, + eulerRotationZ: 0 + } + } + } + }, + { + instanceType: 'node', + version: 1, + space: 'test_space', + externalId: 'test_image_2', + createdTime: 0, + lastUpdatedTime: 0, + properties: { + cdf_cdm: { + 'Cognite360Image/v1': { + top: { + externalId: 'test_image_3_Top', + space: 'test_space' + }, + back: { + externalId: 'test_image_3_Back', + space: 'test_space' + }, + left: { + externalId: 'test_image_3_Left', + space: 'test_space' + }, + front: { + externalId: 'test_image_3_Front', + space: 'test_space' + }, + right: { + externalId: 'test_image_3_Right', + space: 'test_space' + }, + bottom: { + externalId: 'test_image_3_Bottom', + space: 'test_space' + }, + collection360: { + space: 'test_space', + externalId: 'test_collection' + }, + scaleX: 1, + scaleY: 1, + scaleZ: 1, + translationX: 1, + translationY: 1, + translationZ: 1, + eulerRotationX: 1, + eulerRotationY: 1, + eulerRotationZ: 1 + } + } + } + }, + { + instanceType: 'node', + version: 1, + space: 'test_space', + externalId: 'test_image_3', + createdTime: 0, + lastUpdatedTime: 0, + properties: { + cdf_cdm: { + 'Cognite360Image/v1': { + top: { + externalId: 'test_image_3_Top', + space: 'test_space' + }, + back: { + externalId: 'test_image_3_Back', + space: 'test_space' + }, + left: { + externalId: 'test_image_3_Left', + space: 'test_space' + }, + front: { + externalId: 'test_image_3_Front', + space: 'test_space' + }, + right: { + externalId: 'test_image_3_Right', + space: 'test_space' + }, + bottom: { + externalId: 'test_image_3_Bottom', + space: 'test_space' + }, + collection360: { + space: 'test_space', + externalId: 'test_collection' + }, + scaleX: 1, + scaleY: 1, + scaleZ: 1, + translationX: 3, + translationY: 3, + translationZ: 3, + eulerRotationX: 3, + eulerRotationY: 3, + eulerRotationZ: 3 + } + } + } + } + ], + stations: [] + } + } +}; + +describe(Cdf360CdmDescriptorProvider.name, () => { + test('MyTest', async () => { + const sdkMock = new Mock() + .setup(instance => + instance.post( + It.Is((path: string) => path.includes('query')), + It.IsAny() + ) + ) + .returns(Promise.resolve(mock)) + .setup(instance => + instance.post( + It.Is((path: string) => path.includes('files')), + It.IsAny() + ) + ) + .returns( + Promise.resolve({ + data: { + items: mock.data.items.images + .map((_, n) => Array.from(Array(6).keys()).map(_ => ({ id: n, mimeType: 'image/jpeg' }) as FileInfo)) + .flatMap(p => p) + }, + headers: {}, + status: 200 + }) + ) + .setup(instance => instance.getBaseUrl()) + .returns('https://example.com'); + + const provider = new Cdf360CdmDescriptorProvider(sdkMock.object()); + + const descriptors = await provider.get360ImageDescriptors( + { + source: 'cdm', + space: 'christjt-test-system-360', + image360CollectionExternalId: 'c_RC_2' + }, + true + ); + + expect(descriptors.length).toBe(3); + }); +}); diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptorProvider.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptorProvider.ts new file mode 100644 index 00000000000..575429bd229 --- /dev/null +++ b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/Cdf360CdmDescriptorProvider.ts @@ -0,0 +1,257 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import { CogniteClient, DirectRelationReference, FileInfo } from '@cognite/sdk'; +import { + Historical360ImageSet, + Image360Descriptor, + Image360DescriptorProvider, + Image360FileDescriptor, + InstanceIdentifier, + QueryNextCursors +} from '../../../../types'; +import { Cdf360FdmQuery, get360CollectionQuery } from './get360CdmCollectionQuery'; +import assert from 'assert'; +import { Euler, Matrix4 } from 'three'; +import { DataModelsSdk } from '../../../../DataModelsSdk'; +import chunk from 'lodash/chunk'; +import zip from 'lodash/zip'; +import groupBy from 'lodash/groupBy'; +import partition from 'lodash/partition'; +import { Image360DataModelIdentifier } from '../system-space/Cdf360DataModelsDescriptorProvider'; + +type QueryResult = Awaited>>; + +type ImageResult = QueryResult['images']; +type ImageInstanceResult = QueryResult['images'][number]; +type ImageResultProperties = ImageInstanceResult['properties']['cdf_cdm']['Cognite360Image/v1']; + +type ExhaustedQueryResult = { + image_collection: QueryResult['image_collection']; + images: QueryResult['images']; + stations: QueryResult['stations']; +}; + +type CoreDmFileResponse = { + data: { + items: FileInfo[]; + }; +}; + +export class Cdf360CdmDescriptorProvider implements Image360DescriptorProvider { + private readonly _dmsSdk: DataModelsSdk; + private readonly _cogniteSdk: CogniteClient; + + constructor(sdk: CogniteClient) { + this._cogniteSdk = sdk; + this._dmsSdk = new DataModelsSdk(sdk); + } + + public async get360ImageDescriptors( + collectionIdentifier: Image360DataModelIdentifier, + _: boolean + ): Promise { + const { image_collection, images } = await this.queryCollection(collectionIdentifier); + + if (image_collection.length === 0) { + return []; + } + + assert(image_collection.length === 1, 'Expected exactly one image collection'); + + const collection = image_collection[0]; + const collectionId = collection.externalId; + const collectionLabel = collection.properties.cdf_cdm['Cognite360ImageCollection/v1'].name as string; + const fileDescriptors = await this.getFileDescriptors(images); + + assert(images.length === fileDescriptors.length, 'Expected each 360 image to have 6 faces'); + + const imagesGroupedWithFileDescriptors = zip(images, fileDescriptors) + .filter( + (imageWithFileInfo): imageWithFileInfo is [ImageInstanceResult, FileInfo[]] => + imageWithFileInfo[0] !== undefined && imageWithFileInfo[1] !== undefined + ) + .map(([image, fileDescriptors]) => ({ image, fileDescriptors })); + + const [imagesWithoutStation, imagesWithStation] = partition(imagesGroupedWithFileDescriptors, image => { + return image.image.properties.cdf_cdm['Cognite360Image/v1'].station360 === undefined; + }); + + const groups = groupBy(imagesWithStation, imageResult => { + const station = imageResult.image.properties.cdf_cdm['Cognite360Image/v1'].station360 as InstanceIdentifier; + return `${station.externalId}-${station.space}`; + }); + + const ret = Object.values(groups) + .concat(imagesWithoutStation.map(p => [p])) + .map(imageWithFileDescriptors => { + return this.getHistorical360ImageSet(collectionId, collectionLabel, imageWithFileDescriptors); + }); + + return ret; + } + + private async queryCollection({ + image360CollectionExternalId, + space + }: Image360DataModelIdentifier): Promise { + const result: ExhaustedQueryResult = { + image_collection: [], + images: [], + stations: [] + }; + + const query = get360CollectionQuery(image360CollectionExternalId, space); + + const imageLimit = query.with.images.limit; + + let nextCursor: QueryNextCursors | undefined = undefined; + let hasNext = true; + + while (hasNext) { + const { + image_collection, + images, + stations, + nextCursor: currentCursor + }: QueryResult = await this._dmsSdk.queryNodesAndEdges(query, nextCursor); + if (result.image_collection.length === 0) { + result.image_collection.push(...image_collection); + } + result.images.push(...images); + result.stations.push(...stations); + + hasNext = + images.length === imageLimit && currentCursor?.images !== undefined && currentCursor?.stations !== undefined; + nextCursor = { + images: currentCursor?.images, + stations: currentCursor?.stations + }; + } + + return result; + } + + private async getFileDescriptors(images: ImageResult) { + const imageProps = images.map(image => image.properties.cdf_cdm['Cognite360Image/v1']); + const cubeMapFileIds = imageProps.flatMap(imageProp => [ + imageProp.front as DirectRelationReference, + imageProp.back as DirectRelationReference, + imageProp.left as DirectRelationReference, + imageProp.right as DirectRelationReference, + imageProp.top as DirectRelationReference, + imageProp.bottom as DirectRelationReference + ]); + + const externalIdBatches = chunk(chunk(cubeMapFileIds, 1000), 15); + + const fileInfos: FileInfo[] = []; + for (const parallelBatches of externalIdBatches) { + const batchFileInfos = ( + await Promise.all(parallelBatches.map(batch => getCdmFiles(this._cogniteSdk, batch))) + ).flatMap(p => p); + fileInfos.push(...batchFileInfos); + } + + const numImagesInCubemap = 6; + return chunk(fileInfos, numImagesInCubemap); + } + + private getHistorical360ImageSet( + collectionId: string, + collectionLabel: string, + imageFileDescriptors: { image: ImageInstanceResult; fileDescriptors: FileInfo[] }[] + ): Historical360ImageSet { + const mainImagePropsArray = imageFileDescriptors.map( + descriptor => descriptor.image.properties.cdf_cdm['Cognite360Image/v1'] + ); + + const id = imageFileDescriptors[0].image.externalId; + return { + collectionId, + collectionLabel, + id, + imageRevisions: imageFileDescriptors.map((p, index) => + this.getImageRevision(mainImagePropsArray[index], p.fileDescriptors) + ), + label: '', + transform: this.getRevisionTransform(mainImagePropsArray[0] as any) + }; + } + + private getImageRevision(imageProps: ImageResultProperties, fileInfos: FileInfo[]): Image360Descriptor { + return { + faceDescriptors: getFaceDescriptors(), + timestamp: imageProps.takenAt as string + }; + + function getFaceDescriptors(): Image360FileDescriptor[] { + return [ + { + fileId: fileInfos[0].id, + face: 'front', + mimeType: fileInfos[0].mimeType! + }, + { + fileId: fileInfos[1].id, + face: 'back', + mimeType: fileInfos[1].mimeType! + }, + { + fileId: fileInfos[2].id, + face: 'left', + mimeType: fileInfos[2].mimeType! + }, + { + fileId: fileInfos[3].id, + face: 'right', + mimeType: fileInfos[3].mimeType! + }, + { + fileId: fileInfos[4].id, + face: 'top', + mimeType: fileInfos[5].mimeType! + }, + { + fileId: fileInfos[5].id, + face: 'bottom', + mimeType: fileInfos[5].mimeType! + } + ] as Image360FileDescriptor[]; + } + } + + private getRevisionTransform(revision: { + translationX: number; + translationY: number; + translationZ: number; + eulerRotationX: number; + eulerRotationY: number; + eulerRotationZ: number; + }): Matrix4 { + const transform = getTranslation(); + transform.multiply(getEulerRotation()); + return transform; + + function getEulerRotation(): Matrix4 { + const [x, y, z] = [revision.eulerRotationX, revision.eulerRotationY, revision.eulerRotationZ]; + const eulerRotation = new Euler(x, z, -y, 'XYZ'); + return new Matrix4().makeRotationFromEuler(eulerRotation); + } + + function getTranslation(): Matrix4 { + const [x, y, z] = [revision.translationX, revision.translationY, revision.translationZ]; + return new Matrix4().makeTranslation(x, z, -y); + } + } +} + +async function getCdmFiles(sdk: CogniteClient, identifiers: DirectRelationReference[]) { + const url = `${sdk.getBaseUrl()}/api/v1/projects/${sdk.project}/files/byids`; + const res = (await sdk.post(url, { + data: { items: identifiers.map(id => ({ instanceId: id })) } + })) as CoreDmFileResponse; + + return res.data.items; +} diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/get360CdmCollectionQuery.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/get360CdmCollectionQuery.ts new file mode 100644 index 00000000000..85f2869709f --- /dev/null +++ b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/cdm/get360CdmCollectionQuery.ts @@ -0,0 +1,131 @@ +/*! + * Copyright 2023 Cognite AS + */ + +const coreDmSpace = 'cdf_cdm'; + +const Image360CollectionQuery = { + with: { + image_collection: { + nodes: { + filter: { + and: [ + { + equals: { + property: ['node', 'externalId'], + value: { parameter: 'collectionExternalId' } + } + }, + { + equals: { + property: ['node', 'space'], + value: { parameter: 'collectionSpace' } + } + } + ] + } + }, + limit: 1 + }, + images: { + nodes: { + from: 'image_collection', + through: { + view: { + type: 'view', + space: coreDmSpace, + externalId: 'Cognite360Image', + version: 'v1' + }, + identifier: 'collection360' + } + }, + limit: 10000 + }, + stations: { + nodes: { + from: 'images', + through: { + view: { + type: 'view', + space: coreDmSpace, + externalId: 'Cognite360Image', + version: 'v1' + }, + identifier: 'station360' + }, + direction: 'outwards' + }, + limit: 10000 + } + }, + select: { + image_collection: { + sources: [ + { + source: { + type: 'view', + space: coreDmSpace, + externalId: 'Cognite360ImageCollection', + version: 'v1' + }, + properties: ['name'] + } + ] + }, + images: { + sources: [ + { + source: { + type: 'view', + space: coreDmSpace, + externalId: 'Cognite360Image', + version: 'v1' + }, + properties: [ + 'translationX', + 'translationY', + 'translationZ', + 'eulerRotationX', + 'eulerRotationY', + 'eulerRotationZ', + 'scaleX', + 'scaleY', + 'scaleZ', + 'front', + 'back', + 'left', + 'right', + 'top', + 'bottom', + 'collection360', + 'station360', + 'takenAt' + ] + } + ] + }, + stations: { + sources: [ + { + source: { + type: 'view', + space: coreDmSpace, + externalId: 'Cognite360ImageStation', + version: 'v1' + }, + properties: ['name'] + } + ] + } + } +} as const; + +export type Cdf360FdmQuery = typeof Image360CollectionQuery; + +export function get360CollectionQuery( + externalId: string, + space: string +): Cdf360FdmQuery & { parameters: { collectionExternalId: string; collectionSpace: string } } { + return { ...Image360CollectionQuery, parameters: { collectionExternalId: externalId, collectionSpace: space } }; +} diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptor.test.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptor.test.ts similarity index 99% rename from viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptor.test.ts rename to viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptor.test.ts index 2425f7b91c3..a0f384c44e1 100644 --- a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptor.test.ts +++ b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptor.test.ts @@ -175,6 +175,7 @@ describe(Cdf360DataModelsDescriptorProvider.name, () => { const descriptors = await provider.get360ImageDescriptors( { + source: 'dm', space: 'christjt-test-system-360', image360CollectionExternalId: 'c_RC_2' }, diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptorProvider.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptorProvider.ts similarity index 98% rename from viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptorProvider.ts rename to viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptorProvider.ts index 9026b540089..86536d6c96a 100644 --- a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/Cdf360DataModelsDescriptorProvider.ts +++ b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/Cdf360DataModelsDescriptorProvider.ts @@ -10,11 +10,11 @@ import { Image360FileDescriptor, InstanceIdentifier, QueryNextCursors -} from '../../../types'; +} from '../../../../types'; import { Cdf360FdmQuery, get360CollectionQuery } from './get360CollectionQuery'; import assert from 'assert'; import { Euler, Matrix4 } from 'three'; -import { DataModelsSdk } from '../../../DataModelsSdk'; +import { DataModelsSdk } from '../../../../DataModelsSdk'; import chunk from 'lodash/chunk'; import zip from 'lodash/zip'; import groupBy from 'lodash/groupBy'; @@ -24,6 +24,7 @@ import partition from 'lodash/partition'; * An identifier uniquely determining an instance of a Cognite Data Model */ export type Image360DataModelIdentifier = { + source?: 'dm' | 'cdm'; // If nothing is specified, it is assumed to be 'dm' space: string; image360CollectionExternalId: string; }; diff --git a/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/get360CollectionQuery.ts b/viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/get360CollectionQuery.ts similarity index 100% rename from viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/get360CollectionQuery.ts rename to viewer/packages/data-providers/src/image-360-data-providers/descriptor-providers/datamodels/system-space/get360CollectionQuery.ts diff --git a/viewer/reveal.api.md b/viewer/reveal.api.md index b3c2b235b51..c53488ff06e 100644 --- a/viewer/reveal.api.md +++ b/viewer/reveal.api.md @@ -1297,6 +1297,7 @@ export interface Image360Collection