fix(viewport-sync): Enable re-sync image slices in a different position when needed (#3984)
This commit is contained in:
parent
25c01fc66c
commit
6ebd2cc7cb
@ -1,5 +1,5 @@
|
|||||||
import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools';
|
import { synchronizers, SynchronizerManager, Synchronizer } from '@cornerstonejs/tools';
|
||||||
import { getRenderingEngines } from '@cornerstonejs/core';
|
import { getRenderingEngines, utilities } from '@cornerstonejs/core';
|
||||||
|
|
||||||
import { pubSubServiceInterface, Types, ServicesManager } from '@ohif/core';
|
import { pubSubServiceInterface, Types, ServicesManager } from '@ohif/core';
|
||||||
|
|
||||||
@ -184,6 +184,11 @@ export default class SyncGroupService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only image slice synchronizer register spatial registration
|
||||||
|
if (this.isImageSliceSyncronizer(synchronizer)) {
|
||||||
|
this.unRegisterSpatialRegistration(synchronizer);
|
||||||
|
}
|
||||||
|
|
||||||
synchronizer.remove({
|
synchronizer.remove({
|
||||||
viewportId,
|
viewportId,
|
||||||
renderingEngineId,
|
renderingEngineId,
|
||||||
@ -198,4 +203,45 @@ export default class SyncGroupService {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Clean up the spatial registration metadata created by synchronizer
|
||||||
|
* This is needed to be able to re-sync images slices if needed
|
||||||
|
* @param synchronizer
|
||||||
|
*/
|
||||||
|
unRegisterSpatialRegistration(synchronizer: Synchronizer) {
|
||||||
|
const sourceViewports = synchronizer.getSourceViewports().map(vp => vp.viewportId);
|
||||||
|
const targetViewports = synchronizer.getTargetViewports().map(vp => vp.viewportId);
|
||||||
|
|
||||||
|
// Create an array of pair of viewports to remove from spatialRegistrationMetadataProvider
|
||||||
|
// All sourceViewports combined with all targetViewports
|
||||||
|
const toUnregister = sourceViewports
|
||||||
|
.map((sourceViewportId: string) => {
|
||||||
|
return targetViewports.map(targetViewportId => [targetViewportId, sourceViewportId]);
|
||||||
|
})
|
||||||
|
.reduce((acc, c) => acc.concat(c), []);
|
||||||
|
|
||||||
|
toUnregister.forEach(viewportIdPair => {
|
||||||
|
utilities.spatialRegistrationMetadataProvider.add(viewportIdPair, undefined);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Check if the synchronizer type is IMAGE_SLICE
|
||||||
|
* Need to convert to lowercase here because the types are lowercase
|
||||||
|
* e.g: synchronizerCreators
|
||||||
|
* @param synchronizer
|
||||||
|
*/
|
||||||
|
isImageSliceSyncronizer(synchronizer: Synchronizer) {
|
||||||
|
return this.getSynchronizerType(synchronizer).toLowerCase() === IMAGE_SLICE;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the syncronizer type
|
||||||
|
* @param synchronizer
|
||||||
|
*/
|
||||||
|
getSynchronizerType(synchronizer: Synchronizer): string {
|
||||||
|
const synchronizerTypes = Object.keys(this.synchronizersByType);
|
||||||
|
const syncType = synchronizerTypes.find(syncType =>
|
||||||
|
this.getSynchronizersOfType(syncType).includes(synchronizer)
|
||||||
|
);
|
||||||
|
return syncType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user