Skip to content

Commit

Permalink
Merge branch 'master' into pramodcog/BND3D-3695
Browse files Browse the repository at this point in the history
  • Loading branch information
pramodcog committed Sep 14, 2024
2 parents a3a63f3 + 59ff0d6 commit cc39e83
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 21 deletions.
2 changes: 1 addition & 1 deletion react-components/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cognite/reveal-react-components",
"version": "0.58.0",
"version": "0.58.3",
"exports": {
".": {
"import": "./dist/index.js",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export class UndoCommand extends RenderTargetCommand {
// ==================================================

public override get icon(): string {
return 'Refresh'; // Should be 'Restore' but it doesn't exist
return 'Restore';
}

public override get tooltip(): TranslateKey {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export function equalsIgnoreCaseAndSpace(value1: string, value2: string): boolea
}
const lowerChar2 = char2.toLowerCase();
if (lowerChar2 === lowerChar1) {
j++;
break;
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@
* Copyright 2023 Cognite AS
*/
import { type ReactElement, useEffect, useState, useRef } from 'react';
import { type AddModelOptions, type CogniteCadModel } from '@cognite/reveal';
import { type GeometryFilter, type AddModelOptions, type CogniteCadModel } from '@cognite/reveal';
import { useReveal } from '../RevealCanvas/ViewerContext';
import { Matrix4 } from 'three';
import { type Matrix4 } from 'three';
import { useRevealKeepAlive } from '../RevealKeepAlive/RevealKeepAliveContext';
import { useReveal3DResourcesCount } from '../Reveal3DResources/Reveal3DResourcesInfoContext';
import { isEqual } from 'lodash';
import { modelExists } from '../../utilities/modelExists';
import { getViewerResourceCount } from '../../utilities/getViewerResourceCount';
import { type CadModelStyling } from './types';
import { useApplyCadModelStyling } from './useApplyCadModelStyling';
import { isSameGeometryFilter, isSameModel } from '../../utilities/isSameModel';

export type CogniteCadModelProps = {
addModelOptions: AddModelOptions;
Expand All @@ -32,6 +33,7 @@ export function CadModelContainer({
const viewer = useReveal();
const { setRevealResourcesCount } = useReveal3DResourcesCount();
const initializingModel = useRef<AddModelOptions | undefined>(undefined);
const initializingModelsGeometryFilter = useRef<GeometryFilter | undefined>(undefined);

const [model, setModel] = useState<CogniteCadModel | undefined>(undefined);

Expand Down Expand Up @@ -62,7 +64,12 @@ export function CadModelContainer({

useApplyCadModelStyling(model, styling);

useEffect(() => removeModel, [model]);
useEffect(
() => () => {
removeModel(model);
},
[model]
);

return <></>;

Expand All @@ -82,26 +89,26 @@ export function CadModelContainer({
async function getOrAddModel(): Promise<CogniteCadModel> {
const viewerModel = viewer.models.find(
(model) =>
model.modelId === modelId &&
model.revisionId === revisionId &&
model.getModelTransformation().equals(transform ?? new Matrix4())
isSameModel(model, addModelOptions) &&
isSameGeometryFilter(geometryFilter, initializingModelsGeometryFilter.current)
);

if (viewerModel !== undefined) {
return await Promise.resolve(viewerModel as CogniteCadModel);
}
initializingModelsGeometryFilter.current = geometryFilter;
return await viewer.addCadModel(addModelOptions);
}
}

function removeModel(): void {
function removeModel(model: CogniteCadModel | undefined): void {
if (!modelExists(model, viewer)) return;

if (cachedViewerRef !== undefined && !cachedViewerRef.isRevealContainerMountedRef.current)
return;

viewer.removeModel(model);
setRevealResourcesCount(getViewerResourceCount(viewer));
setModel(undefined);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@ import {
} from './typeGuards';
import { useEffect } from 'react';
import { isSameModel } from '../../utilities/isSameModel';
import { useReveal3DResourcesCount } from './Reveal3DResourcesInfoContext';
import { getViewerResourceCount } from '../../utilities/getViewerResourceCount';

export function useRemoveNonReferencedModels(
addOptions: AddResourceOptions[],
viewer: Cognite3DViewer
): void {
const { setRevealResourcesCount } = useReveal3DResourcesCount();
useEffect(() => {
const nonReferencedModels = findNonReferencedModels(addOptions, viewer);

Expand All @@ -27,6 +30,7 @@ export function useRemoveNonReferencedModels(
nonReferencedCollections.forEach((collection) => {
viewer.remove360ImageSet(collection);
});
setRevealResourcesCount(getViewerResourceCount(viewer));
}, [addOptions]);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ export async function getCadConnectionsForRevisions(
modelRevisions: Array<[DmsUniqueIdentifier, DmsUniqueIdentifier]>,
fdmSdk: FdmSDK
): Promise<FdmCadConnection[]> {
if (modelRevisions.length === 0) {
return [];
}
const results = await getModelConnectionResults(modelRevisions, fdmSdk);
const object3dToAssetMap = createObject3dToAssetMap(results.items.assets);
const cadNodeToModelMap = createCadNodeToObject3dMap(results.items.cad_nodes);
Expand Down
2 changes: 1 addition & 1 deletion react-components/src/utilities/isSameModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export function isSameCadModel(model0: CadModelOptions, model1: CadModelOptions)
);
}

function isSameGeometryFilter(
export function isSameGeometryFilter(
filter0: GeometryFilter | undefined,
filter1: GeometryFilter | undefined
): boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { describe, expect, test, vi, beforeEach } from 'vitest';

import { Mock } from 'moq.ts';
import React, { type JSX } from 'react';

import { renderHook } from '@testing-library/react';

Expand All @@ -12,44 +11,68 @@ import {
viewerModelsMock,
viewerRemoveModelsMock
} from '../../fixtures/viewer';
import { Reveal3DResourcesInfoContextProvider } from '../../../../src/components/Reveal3DResources/Reveal3DResourcesInfoContext';
import { cadMock, cadModelOptions } from '../../fixtures/cadModel';
import { pointCloudMock, pointCloudModelOptions } from '../../fixtures/pointCloud';
import { image360Mock, image360Options } from '../../fixtures/image360';
import { EMPTY_ARRAY } from '../../../../src/utilities/constants';

describe(useRemoveNonReferencedModels.name, () => {
beforeEach(() => {
vi.resetAllMocks();
});

const wrapper = ({ children }: { children: React.ReactNode }): JSX.Element => (
<Reveal3DResourcesInfoContextProvider>{children}</Reveal3DResourcesInfoContextProvider>
);
test('does not crash when no models are added', () => {
viewerModelsMock.mockReturnValue([]);
viewerImage360CollectionsMock.mockReturnValue([]);
expect(() => renderHook(() => useRemoveNonReferencedModels([], viewerMock))).not.toThrow();
expect(() =>
renderHook(
() => {
useRemoveNonReferencedModels(EMPTY_ARRAY, viewerMock);
},
{ wrapper }
)
).not.toThrow();
});

test('removes models when empty ', () => {
viewerModelsMock.mockReturnValue([cadMock]);
viewerImage360CollectionsMock.mockReturnValue([]);
renderHook(() => useRemoveNonReferencedModels([], viewerMock));
renderHook(
() => {
useRemoveNonReferencedModels(EMPTY_ARRAY, viewerMock);
},
{ wrapper }
);
expect(viewerRemoveModelsMock).toHaveBeenCalledOnce();
});

test('does not remove models when in addOptions', () => {
viewerModelsMock.mockReturnValue([pointCloudMock, cadMock]);
viewerImage360CollectionsMock.mockReturnValue([image360Mock]);
renderHook(() =>
useRemoveNonReferencedModels(
[cadModelOptions, pointCloudModelOptions, image360Options],
viewerMock
)
const mockAddOptions = [pointCloudModelOptions, cadModelOptions, image360Options];
renderHook(
() => {
useRemoveNonReferencedModels(mockAddOptions, viewerMock);
},
{ wrapper }
);
expect(viewerRemoveModelsMock).not.toHaveBeenCalled();
});

test('removes only relevant model', () => {
viewerModelsMock.mockReturnValue([pointCloudMock, cadMock]);
viewerImage360CollectionsMock.mockReturnValue([image360Mock]);
renderHook(() => useRemoveNonReferencedModels([cadModelOptions, image360Options], viewerMock));
const mockAddOptions = [cadModelOptions, image360Options];
renderHook(
() => {
useRemoveNonReferencedModels(mockAddOptions, viewerMock);
},
{ wrapper }
);
expect(viewerRemoveModelsMock).toHaveBeenCalledWith(pointCloudMock);
});
});

0 comments on commit cc39e83

Please sign in to comment.