@cornerstonejs/adapters 3.7.15 → 3.7.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,7 +51,7 @@ const generateSegmentationDefaultOptions = {
51
51
  */
52
52
  function generateSegmentation(images, inputLabelmaps3D) {
53
53
  let userOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
54
- const isMultiframe = images[0].imageId.includes("?frame");
54
+ const isMultiframe = isMultiframeImage(images[0]);
55
55
  const segmentation = _createSegFromImages(images, isMultiframe, userOptions);
56
56
  return fillSegmentation(segmentation, inputLabelmaps3D, userOptions);
57
57
  }
@@ -893,14 +893,36 @@ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUI
893
893
  ReferencedSOPInstanceUID,
894
894
  ReferencedFrameNumber
895
895
  } = SourceImageSequence;
896
- const imageId = sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
897
- if (imageId) {
898
- return imageId;
896
+ const baseImageId = sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
897
+ if (!baseImageId) {
898
+ console.warn(`No imageId found for SOPInstanceUID: ${ReferencedSOPInstanceUID}`);
899
+ return undefined;
899
900
  }
900
- if (ReferencedFrameNumber) {
901
- return getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap);
901
+ if (ReferencedFrameNumber !== undefined) {
902
+ if (baseImageId.includes("frames/")) {
903
+ return baseImageId.replace(/frames\/\d+/, `frames/${ReferencedFrameNumber}`);
904
+ } else if (baseImageId.includes("frame=")) {
905
+ return baseImageId.replace(/frame=\d+/, `frame=${ReferencedFrameNumber - 1}`);
906
+ } else {
907
+ if (baseImageId.includes("wadors:")) {
908
+ return `${baseImageId}/frames/${ReferencedFrameNumber}`;
909
+ } else {
910
+ return `${baseImageId}?frame=${ReferencedFrameNumber - 1}`;
911
+ }
912
+ }
902
913
  }
903
- return undefined;
914
+ return baseImageId;
915
+ }
916
+
917
+ /**
918
+ * Determines if an image is a multiframe image based on its metadata.
919
+ *
920
+ * @param {Object} imageMetadata - The metadata object for the image
921
+ * @param {number} [imageMetadata.NumberOfFrames] - The number of frames in the image
922
+ * @returns {boolean} True if the image is a multiframe image (NumberOfFrames > 1)
923
+ */
924
+ function isMultiframeImage(imageMetadata) {
925
+ return imageMetadata && imageMetadata.NumberOfFrames > 1;
904
926
  }
905
927
 
906
928
  /**
@@ -916,37 +938,31 @@ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUI
916
938
  * @return {String} The corresponding imageId.
917
939
  */
918
940
  function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
919
- if (ReferencedSeriesInstanceUID === undefined || PerFrameFunctionalGroup.PlanePositionSequence === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined || PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient === undefined) {
941
+ if (!ReferencedSeriesInstanceUID || !PerFrameFunctionalGroup.PlanePositionSequence?.[0]?.ImagePositionPatient) {
920
942
  return undefined;
921
943
  }
922
- for (let imageIdsIndexc = 0; imageIdsIndexc < imageIds.length; ++imageIdsIndexc) {
923
- const sourceImageMetadata = metadataProvider.get("instance", imageIds[imageIdsIndexc]);
924
- if (sourceImageMetadata === undefined || sourceImageMetadata.ImagePositionPatient === undefined || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
944
+ const segFramePosition = PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient;
945
+ for (let imageId of imageIds) {
946
+ const sourceImageMetadata = metadataProvider.get("instance", imageId);
947
+ if (!sourceImageMetadata) {
925
948
  continue;
926
949
  }
927
- if (compareArrays(PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient, sourceImageMetadata.ImagePositionPatient, tolerance)) {
928
- return imageIds[imageIdsIndexc];
950
+ const isMultiframe = isMultiframeImage(sourceImageMetadata);
951
+ if (!sourceImageMetadata.ImagePositionPatient || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
952
+ continue;
929
953
  }
930
- }
931
- }
932
954
 
933
- /**
934
- * getImageIdOfReferencedFrame - Returns the imageId corresponding to the
935
- * specified sopInstanceUid and frameNumber for multi-frame images.
936
- *
937
- * @param {String} sopInstanceUid The sopInstanceUid of the desired image.
938
- * @param {Number} frameNumber The frame number.
939
- * @param {String} imageIds The list of imageIds.
940
- * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
941
- * @return {String} The imageId that corresponds to the sopInstanceUid.
942
- */
943
- function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
944
- const imageId = sopUIDImageIdIndexMap[sopInstanceUid];
945
- if (!imageId) {
946
- return;
955
+ // For multiframe images, check each frame's position
956
+ if (isMultiframe) {
957
+ const framePosition = metadataProvider.get("imagePlaneModule", imageId)?.imagePositionPatient;
958
+ if (framePosition && compareArrays(segFramePosition, framePosition, tolerance)) {
959
+ return imageId;
960
+ }
961
+ } else if (compareArrays(segFramePosition, sourceImageMetadata.ImagePositionPatient, tolerance)) {
962
+ return imageId;
963
+ }
947
964
  }
948
- const imageIdFrameNumber = Number(imageId.split("frame=")[1]);
949
- return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
965
+ return undefined;
950
966
  }
951
967
 
952
968
  /**
@@ -1161,4 +1177,4 @@ const Segmentation = {
1161
1177
  fillSegmentation
1162
1178
  };
1163
1179
 
1164
- export { _createSegFromImages, _getLabelmapsFromReferencedFrameIndicies, alignPixelDataWithSourceData, calculateCentroid, checkSEGsOverlapping, Segmentation as default, fillSegmentation, findReferenceSourceImageId, generateSegmentation, generateToolState, getImageIdOfReferencedFrame, getImageIdOfSourceImageBySourceImageSequence, getImageIdOfSourceImagebyGeometry, getSegmentIndex, getSegmentMetadata, getUnpackedChunks, getUnpackedOffsetAndLength, getValidOrientations, insertOverlappingPixelDataPlanar, insertPixelDataPlanar, readFromUnpackedChunks, unpackPixelData };
1180
+ export { _createSegFromImages, _getLabelmapsFromReferencedFrameIndicies, alignPixelDataWithSourceData, calculateCentroid, checkSEGsOverlapping, Segmentation as default, fillSegmentation, findReferenceSourceImageId, generateSegmentation, generateToolState, getImageIdOfSourceImageBySourceImageSequence, getImageIdOfSourceImagebyGeometry, getSegmentIndex, getSegmentMetadata, getUnpackedChunks, getUnpackedOffsetAndLength, getValidOrientations, insertOverlappingPixelDataPlanar, insertPixelDataPlanar, readFromUnpackedChunks, unpackPixelData };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/adapters",
3
- "version": "3.7.15",
3
+ "version": "3.7.16",
4
4
  "description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -84,8 +84,8 @@
84
84
  "ndarray": "^1.0.19"
85
85
  },
86
86
  "peerDependencies": {
87
- "@cornerstonejs/core": "^3.7.15",
88
- "@cornerstonejs/tools": "^3.7.15"
87
+ "@cornerstonejs/core": "^3.7.16",
88
+ "@cornerstonejs/tools": "^3.7.16"
89
89
  },
90
- "gitHead": "a6e359bc6638a20d95fd8059de2c83c0d8f9ea65"
90
+ "gitHead": "d1bf75eda8724e8213c0cf9f555b7d6a58504f29"
91
91
  }