From a326ffea79df84fcb26520243722c28b6f16fea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= <70905152+haakonflatval-cognite@users.noreply.github.com> Date: Fri, 13 Sep 2024 08:51:10 +0200 Subject: [PATCH] fix(react-components): update model when geometry filter changed (#4753) * fix(react-components): update model when geometry filter changed * Revert "fix(react-components): update model when geometry filter changed" This reverts commit 5466ca5566d02f9047c15d2e05a766c39a58cfe5. * fix: do the check otherwise, to avoid too much add/remove * chore: be more strict in the add/remove-logic It's a miracle this worked before * chore: lint fix --- .../CadModelContainer/CadModelContainer.tsx | 23 ++++++++++++------- react-components/src/utilities/isSameModel.ts | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/react-components/src/components/CadModelContainer/CadModelContainer.tsx b/react-components/src/components/CadModelContainer/CadModelContainer.tsx index d36323f2fd8..154f54b812b 100644 --- a/react-components/src/components/CadModelContainer/CadModelContainer.tsx +++ b/react-components/src/components/CadModelContainer/CadModelContainer.tsx @@ -2,9 +2,9 @@ * 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'; @@ -12,6 +12,7 @@ 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; @@ -32,6 +33,7 @@ export function CadModelContainer({ const viewer = useReveal(); const { setRevealResourcesCount } = useReveal3DResourcesCount(); const initializingModel = useRef(undefined); + const initializingModelsGeometryFilter = useRef(undefined); const [model, setModel] = useState(undefined); @@ -62,7 +64,12 @@ export function CadModelContainer({ useApplyCadModelStyling(model, styling); - useEffect(() => removeModel, [model]); + useEffect( + () => () => { + removeModel(model); + }, + [model] + ); return <>; @@ -82,18 +89,19 @@ export function CadModelContainer({ async function getOrAddModel(): Promise { 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) @@ -101,7 +109,6 @@ export function CadModelContainer({ viewer.removeModel(model); setRevealResourcesCount(getViewerResourceCount(viewer)); - setModel(undefined); } } diff --git a/react-components/src/utilities/isSameModel.ts b/react-components/src/utilities/isSameModel.ts index b260d218141..895436ee665 100644 --- a/react-components/src/utilities/isSameModel.ts +++ b/react-components/src/utilities/isSameModel.ts @@ -22,7 +22,7 @@ export function isSameCadModel(model0: CadModelOptions, model1: CadModelOptions) ); } -function isSameGeometryFilter( +export function isSameGeometryFilter( filter0: GeometryFilter | undefined, filter1: GeometryFilter | undefined ): boolean {