@@ -24,10 +24,12 @@ import {
2424 StateFile ,
2525 Manifest ,
2626 SegmentGroupMetadata ,
27+ LabelMap ,
2728} from '../io/state-file/schema' ;
2829import { FileEntry } from '../io/types' ;
2930import { ensureSameSpace } from '../io/resample/resample' ;
3031import { untilLoaded } from '../composables/untilLoaded' ;
32+ import { useDatasetStore } from './datasets' ;
3133
3234const LabelmapArrayType = Uint8Array ;
3335export type LabelmapArrayType = Uint8Array ;
@@ -498,6 +500,7 @@ export const useSegmentGroupStore = defineStore('segmentGroup', () => {
498500 dataIDMap : Record < string , string >
499501 ) {
500502 const { labelMaps } = manifest ;
503+ const datasetStore = useDatasetStore ( ) ;
501504
502505 const segmentGroupIDMap : Record < string , string > = { } ;
503506
@@ -508,33 +511,48 @@ export const useSegmentGroupStore = defineStore('segmentGroup', () => {
508511 // First restore the data, then restore the store.
509512 // This preserves ordering from orderByParent.
510513
511- const newLabelmapIDs = await Promise . all (
512- labelMaps . map ( async ( labelMap ) => {
513- const [ file ] = stateFiles
514- . filter ( ( entry ) => entry . archivePath === normalize ( labelMap . path ) )
515- . map ( ( entry ) => entry . file ) ;
514+ async function loadLabelMapImage ( labelMap : LabelMap ) {
515+ if ( labelMap . dataSourceId !== undefined ) {
516+ const storeId = dataIDMap [ String ( labelMap . dataSourceId ) ] ;
517+ await untilLoaded ( storeId ) ;
518+ const image = imageCacheStore . getVtkImageData ( storeId ) ;
519+ if ( ! image ) {
520+ throw new Error (
521+ `Could not get image data for dataSourceId ${ labelMap . dataSourceId } `
522+ ) ;
523+ }
524+ return { image, storeIdToRemove : storeId } ;
525+ }
526+
527+ const file = stateFiles . find (
528+ ( entry ) => entry . archivePath === normalize ( labelMap . path ! )
529+ ) ?. file ;
530+ return { image : await readImage ( file ! ) } ;
531+ }
516532
517- const vtkImage = await readImage ( file ) ;
518- const labelmapImage = toLabelMap ( vtkImage ) ;
533+ const labelmapResults = await Promise . all (
534+ labelMaps . map ( async ( labelMap ) => {
535+ const { image, storeIdToRemove } = await loadLabelMapImage ( labelMap ) ;
536+ const labelmapImage = toLabelMap ( image ) ;
519537
520538 const id = useIdStore ( ) . nextId ( ) ;
521539 dataIndex [ id ] = labelmapImage ;
522- return id ;
540+ return { id , storeIdToRemove } ;
523541 } )
524542 ) ;
525543
526544 labelMaps . forEach ( ( labelMap , index ) => {
527- const { metadata } = labelMap ;
528- // map parent id to new id
529- const parentImage = dataIDMap [ metadata . parentImage ] ;
530- metadata . parentImage = parentImage ;
531-
532- const newID = newLabelmapIDs [ index ] ;
545+ const { id : newID , storeIdToRemove } = labelmapResults [ index ] ;
533546 segmentGroupIDMap [ labelMap . id ] = newID ;
534547
535- metadataByID [ newID ] = metadata ;
548+ const parentImage = dataIDMap [ labelMap . metadata . parentImage ] ;
549+ metadataByID [ newID ] = { ...labelMap . metadata , parentImage } ;
536550 orderByParent . value [ parentImage ] ??= [ ] ;
537551 orderByParent . value [ parentImage ] . push ( newID ) ;
552+
553+ if ( storeIdToRemove ) {
554+ datasetStore . remove ( storeIdToRemove ) ;
555+ }
538556 } ) ;
539557
540558 return segmentGroupIDMap ;
0 commit comments