@cornerstonejs/tools 0.34.1 → 0.35.0

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.
Files changed (27) hide show
  1. package/dist/cjs/tools/segmentation/BrushTool.d.ts +3 -2
  2. package/dist/cjs/tools/segmentation/BrushTool.js +1 -1
  3. package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
  4. package/dist/cjs/tools/segmentation/PaintFillTool.d.ts +3 -2
  5. package/dist/cjs/tools/segmentation/PaintFillTool.js +1 -1
  6. package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
  7. package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.d.ts +6 -2
  8. package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.js +9 -13
  9. package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.js.map +1 -1
  10. package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.d.ts +9 -5
  11. package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js +96 -8
  12. package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
  13. package/dist/esm/tools/segmentation/BrushTool.d.ts +3 -2
  14. package/dist/esm/tools/segmentation/BrushTool.js +3 -2
  15. package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
  16. package/dist/esm/tools/segmentation/PaintFillTool.d.ts +3 -2
  17. package/dist/esm/tools/segmentation/PaintFillTool.js +3 -2
  18. package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
  19. package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.d.ts +6 -2
  20. package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.js +9 -13
  21. package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.js.map +1 -1
  22. package/dist/esm/utilities/segmentation/thresholdVolumeByRange.d.ts +9 -5
  23. package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js +93 -8
  24. package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
  25. package/dist/umd/index.js +1 -1
  26. package/dist/umd/index.js.map +1 -1
  27. package/package.json +2 -2
@@ -1,10 +1,14 @@
1
- import type { Types } from '@cornerstonejs/core';
1
+ import { Types } from '@cornerstonejs/core';
2
2
  import { BoundsIJK } from '../../types';
3
3
  export declare type ThresholdRangeOptions = {
4
- upper: number;
5
- lower: number;
6
- boundsIJK: BoundsIJK;
7
4
  overwrite: boolean;
5
+ boundsIJK: BoundsIJK;
6
+ overlapType?: number;
7
+ };
8
+ export declare type ThresholdInformation = {
9
+ volume: Types.IImageVolume;
10
+ lower: number;
11
+ upper: number;
8
12
  };
9
- declare function thresholdVolumeByRange(segmentationVolume: Types.IImageVolume, referenceVolume: Types.IImageVolume, options: ThresholdRangeOptions): Types.IImageVolume;
13
+ declare function thresholdVolumeByRange(segmentationVolume: Types.IImageVolume, thresholdVolumeInformation: ThresholdInformation[], options: ThresholdRangeOptions): Types.IImageVolume;
10
14
  export default thresholdVolumeByRange;
@@ -1,22 +1,107 @@
1
+ import { utilities as csUtils } from '@cornerstonejs/core';
1
2
  import { pointInShapeCallback } from '../../utilities';
2
3
  import { triggerSegmentationDataModified } from '../../stateManagement/segmentation/triggerSegmentationEvents';
3
- function thresholdVolumeByRange(segmentationVolume, referenceVolume, options) {
4
- const { scalarData, imageData: segmentationImageData } = segmentationVolume;
5
- const { overwrite, boundsIJK, upper, lower } = options;
6
- const { imageData } = referenceVolume;
7
- const referenceValues = imageData.getPointData().getScalars().getData();
4
+ import getBoundingBoxAroundShape from '../boundingBox/getBoundingBoxAroundShape';
5
+ const equalsCheck = (a, b) => {
6
+ return JSON.stringify(a) === JSON.stringify(b);
7
+ };
8
+ function thresholdVolumeByRange(segmentationVolume, thresholdVolumeInformation, options) {
9
+ const { scalarData, spacing: segmentationSpacing, imageData: segmentationImageData, } = segmentationVolume;
10
+ const { overwrite, boundsIJK } = options;
11
+ const overlapType = options?.overlapType || 0;
8
12
  if (overwrite) {
9
13
  for (let i = 0; i < scalarData.length; i++) {
10
14
  scalarData[i] = 0;
11
15
  }
12
16
  }
13
- const callback = ({ index, pointIJK }) => {
17
+ const volumeInfoList = [];
18
+ let baseVolumeIdx = 0;
19
+ for (let i = 0; i < thresholdVolumeInformation.length; i++) {
20
+ const { imageData, spacing, dimensions } = thresholdVolumeInformation[i].volume;
21
+ const volumeSize = thresholdVolumeInformation[i].volume.scalarData.length;
22
+ if (volumeSize === scalarData.length &&
23
+ equalsCheck(spacing, segmentationSpacing)) {
24
+ baseVolumeIdx = i;
25
+ }
26
+ const referenceValues = imageData.getPointData().getScalars().getData();
27
+ const lower = thresholdVolumeInformation[i].lower;
28
+ const upper = thresholdVolumeInformation[i].upper;
29
+ volumeInfoList.push({
30
+ imageData,
31
+ referenceValues,
32
+ lower,
33
+ upper,
34
+ spacing,
35
+ dimensions,
36
+ volumeSize,
37
+ });
38
+ }
39
+ let overlaps, total, range;
40
+ const testOverlapRange = (volumeInfo, voxelSpacing, voxelCenter) => {
41
+ const callbackOverlap = ({ value }) => {
42
+ total = total + 1;
43
+ if (value >= range.lower && value <= range.upper) {
44
+ overlaps = overlaps + 1;
45
+ }
46
+ };
47
+ const { imageData, dimensions, lower, upper } = volumeInfo;
48
+ const overlapBounds = getVoxelOverlap(imageData, dimensions, voxelSpacing, voxelCenter);
49
+ total = 0;
50
+ overlaps = 0;
51
+ range = { lower, upper };
52
+ let overlapTest = false;
53
+ pointInShapeCallback(imageData, () => true, callbackOverlap, overlapBounds);
54
+ if (overlapType === 0) {
55
+ overlapTest = overlaps > 0;
56
+ }
57
+ else if (overlapType == 1) {
58
+ overlapTest = overlaps === total;
59
+ }
60
+ return overlapTest;
61
+ };
62
+ const testRange = (volumeInfo, pointIJK) => {
63
+ const { imageData, referenceValues, lower, upper } = volumeInfo;
14
64
  const offset = imageData.computeOffsetIndex(pointIJK);
15
65
  const value = referenceValues[offset];
16
66
  if (value <= lower || value >= upper) {
17
- return;
67
+ return false;
68
+ }
69
+ else {
70
+ return true;
71
+ }
72
+ };
73
+ const getVoxelOverlap = (imageData, dimensions, voxelSpacing, voxelCenter) => {
74
+ const voxelCornersWorld = [];
75
+ for (let i = 0; i < 2; i++) {
76
+ for (let j = 0; j < 2; j++) {
77
+ for (let k = 0; k < 2; k++) {
78
+ const point = voxelCenter;
79
+ point[0] = point[0] + ((i * 2 - 1) * voxelSpacing[0]) / 2;
80
+ point[1] = point[1] + ((j * 2 - 1) * voxelSpacing[1]) / 2;
81
+ point[2] = point[2] + ((k * 2 - 1) * voxelSpacing[2]) / 2;
82
+ voxelCornersWorld.push(point);
83
+ }
84
+ }
85
+ }
86
+ const voxelCornersIJK = voxelCornersWorld.map((world) => csUtils.transformWorldToIndex(imageData, world));
87
+ const overlapBounds = getBoundingBoxAroundShape(voxelCornersIJK, dimensions);
88
+ return overlapBounds;
89
+ };
90
+ const callback = ({ index, pointIJK, pointLPS }) => {
91
+ let insert = volumeInfoList.length > 0;
92
+ for (let i = 0; i < volumeInfoList.length; i++) {
93
+ if (volumeInfoList[i].volumeSize === scalarData.length) {
94
+ insert = testRange(volumeInfoList[i], pointIJK);
95
+ }
96
+ else {
97
+ insert = testOverlapRange(volumeInfoList[i], volumeInfoList[baseVolumeIdx].spacing, pointLPS);
98
+ }
99
+ if (!insert) {
100
+ break;
101
+ }
18
102
  }
19
- scalarData[index] = 1;
103
+ if (insert)
104
+ scalarData[index] = 1;
20
105
  };
21
106
  pointInShapeCallback(segmentationImageData, () => true, callback, boundsIJK);
22
107
  triggerSegmentationDataModified(segmentationVolume.volumeId);
@@ -1 +1 @@
1
- {"version":3,"file":"thresholdVolumeByRange.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/thresholdVolumeByRange.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,8DAA8D,CAAC;AAkB/G,SAAS,sBAAsB,CAC7B,kBAAsC,EACtC,eAAmC,EACnC,OAA8B;IAE9B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,kBAAkB,CAAC;IAC5E,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEvD,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;IACtC,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC;IAGxE,IAAI,SAAS,EAAE;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACnB;KACF;IAED,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;YACpC,OAAO;SACR;QAGD,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,oBAAoB,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7E,+BAA+B,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE7D,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"thresholdVolumeByRange.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/thresholdVolumeByRange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,8DAA8D,CAAC;AAE/G,OAAO,yBAAyB,MAAM,0CAA0C,CAAC;AAejF,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC;AAqBF,SAAS,sBAAsB,CAC7B,kBAAsC,EACtC,0BAAkD,EAClD,OAA8B;IAE9B,MAAM,EACJ,UAAU,EACV,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,qBAAqB,GACjC,GAAG,kBAAkB,CAAC;IAEvB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IAG9C,IAAI,SAAS,EAAE;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACnB;KACF;IAGD,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,0BAA0B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,GACtC,0BAA0B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvC,MAAM,UAAU,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAE1E,IACE,UAAU,KAAK,UAAU,CAAC,MAAM;YAChC,WAAW,CAAC,OAAO,EAAE,mBAAmB,CAAC,EACzC;YACA,aAAa,GAAG,CAAC,CAAC;SACnB;QAGD,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClD,MAAM,KAAK,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAElD,cAAc,CAAC,IAAI,CAAC;YAClB,SAAS;YACT,eAAe;YACf,KAAK;YACL,KAAK;YACL,OAAO;YACP,UAAU;YACV,UAAU;SACX,CAAC,CAAC;KACJ;IAGD,IAAI,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;IAE3B,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE;QAMjE,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACpC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YAClB,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAChD,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;aACzB;QACH,CAAC,CAAC;QAEF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;QAE3D,MAAM,aAAa,GAAG,eAAe,CACnC,SAAS,EACT,UAAU,EACV,YAAY,EACZ,WAAW,CACZ,CAAC;QAGF,KAAK,GAAG,CAAC,CAAC;QACV,QAAQ,GAAG,CAAC,CAAC;QACb,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAEzB,IAAI,WAAW,GAAG,KAAK,CAAC;QAGxB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;QAE5E,IAAI,WAAW,KAAK,CAAC,EAAE;YACrB,WAAW,GAAG,QAAQ,GAAG,CAAC,CAAC;SAC5B;aAAM,IAAI,WAAW,IAAI,CAAC,EAAE;YAC3B,WAAW,GAAG,QAAQ,KAAK,KAAK,CAAC;SAClC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAGF,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;QAChE,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;YACpC,OAAO,KAAK,CAAC;SACd;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC,CAAC;IAMF,MAAM,eAAe,GAAG,CACtB,SAAS,EACT,UAAU,EACV,YAAY,EACZ,WAAW,EACX,EAAE;QACF,MAAM,iBAAiB,GAAG,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC1B,MAAM,KAAK,GAAG,WAAW,CAAC;oBAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC1D,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC1D,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC1D,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBAC/B;aACF;SACF;QACD,MAAM,eAAe,GAAG,iBAAiB,CAAC,GAAG,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAiB,CAC3E,CAAC;QACF,MAAM,aAAa,GAAG,yBAAyB,CAC7C,eAAe,EACf,UAAU,CACX,CAAC;QAEF,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAOF,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjD,IAAI,MAAM,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAE9C,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,MAAM,EAAE;gBACtD,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;aACjD;iBAAM;gBAEL,MAAM,GAAG,gBAAgB,CACvB,cAAc,CAAC,CAAC,CAAC,EACjB,cAAc,CAAC,aAAa,CAAC,CAAC,OAAO,EACrC,QAAQ,CACT,CAAC;aACH;YACD,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM;aACP;SACF;QAGD,IAAI,MAAM;YAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,oBAAoB,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7E,+BAA+B,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE7D,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,eAAe,sBAAsB,CAAC"}