diff --git a/src/adapters/Cornerstone/Segmentation.js b/src/adapters/Cornerstone/Segmentation.js index 9ed1ec82..32153e15 100644 --- a/src/adapters/Cornerstone/Segmentation.js +++ b/src/adapters/Cornerstone/Segmentation.js @@ -4,7 +4,8 @@ import Segmentation_4X from "./Segmentation_4X"; const Segmentation = { generateSegmentation, generateToolState, - fillSegmentation + fillSegmentation, + generateSegmentationFromDatasets }; export default Segmentation; @@ -111,3 +112,30 @@ function fillSegmentation( `No generateSegmentation adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.` ); } + +/** + * generateSegmentationFromDatasets - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data from Dataset instead of images + * + * @param {object[]} dataset An empty segmentation derived dataset. + * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects. + * @param {Object} userOptions Options object to override default options. + * @returns {Blob} description + */ +function generateSegmentationFromDatasets( + datasets, + inputLabelmaps3D, + options = { includeSliceSpacing: true }, + cornerstoneToolsVersion = 4 +) { + if (cornerstoneToolsVersion === 4) { + return Segmentation_4X.generateSegmentationFromDatasets( + datasets, + inputLabelmaps3D, + options + ); + } + + console.warn( + `No generateSegmentationFromDatasets adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.` + ); +} diff --git a/src/adapters/Cornerstone/Segmentation_4X.js b/src/adapters/Cornerstone/Segmentation_4X.js index ce34e1e1..2524e209 100644 --- a/src/adapters/Cornerstone/Segmentation_4X.js +++ b/src/adapters/Cornerstone/Segmentation_4X.js @@ -23,7 +23,8 @@ import cloneDeep from "lodash.clonedeep"; const Segmentation = { generateSegmentation, generateToolState, - fillSegmentation + fillSegmentation, + generateSegmentationFromDatasets }; export default Segmentation; @@ -41,6 +42,27 @@ const generateSegmentationDefaultOptions = { rleEncode: true }; +/** + * generateSegmentationFromDatasets - Generates cornerstoneTools brush data, given a stack of + * imageIds, images and the cornerstoneTools brushData. + * + * @param {object[]} datasets An array of cornerstone image datasets that contain the metadata for each instance + * and a property _meta with empty array (required for compatibility with other dcmjs functions) + * The dataset for each instance of image can be generated with `cornerstone.metaData.get('instance', imageId)` + * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects. + * @param {Object} userOptions Options to pass to the segmentation derivation and `fillSegmentation`. + * @returns {Blob} + */ +function generateSegmentationFromDatasets( + datasets, + inputLabelmaps3D, + userOptions = {} +) { + const multiframe = Normalizer.normalizeToDataset(datasets); + const segmentation = new SegmentationDerivation([multiframe], userOptions); + return fillSegmentation(segmentation, inputLabelmaps3D, userOptions); +} + /** * generateSegmentation - Generates cornerstoneTools brush data, given a stack of * imageIds, images and the cornerstoneTools brushData. diff --git a/src/derivations/DerivedDataset.js b/src/derivations/DerivedDataset.js index c7caa77d..991ed288 100644 --- a/src/derivations/DerivedDataset.js +++ b/src/derivations/DerivedDataset.js @@ -38,7 +38,7 @@ export default class DerivedDataset { this.referencedDataset = this.referencedDatasets[0]; this.dataset = { _vrMap: this.referencedDataset._vrMap, - _meta: this.referencedDataset._meta + _meta: this.referencedDataset._meta || [] }; this.derive();