larvitar 1.2.4 → 1.2.7
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.
- package/README.md +3 -3
- package/imaging/imageLoading.js +5 -1
- package/imaging/imageRendering.js +22 -22
- package/imaging/tools/segmentation.js +15 -0
- package/index.js +6 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
## Dicom Image Toolkit for CornestoneJS
|
|
8
8
|
|
|
9
|
-
### Current version: 1.2.
|
|
9
|
+
### Current version: 1.2.7
|
|
10
10
|
|
|
11
|
-
### Latest Stable version: 1.2.
|
|
11
|
+
### Latest Stable version: 1.2.7
|
|
12
12
|
|
|
13
|
-
### Latest Published Release: 1.2.
|
|
13
|
+
### Latest Published Release: 1.2.7
|
|
14
14
|
|
|
15
15
|
This library provides common DICOM functionalities to be used in web-applications: it's wrapper that simplifies the use of cornestone-js environment.
|
|
16
16
|
Orthogonal multiplanar reformat is included as well as custom loader/exporter for nrrd files and [Vuex](https://vuex.vuejs.org/) custom integration.
|
package/imaging/imageLoading.js
CHANGED
|
@@ -27,8 +27,12 @@ import { loadMultiFrameImage } from "./loaders/multiframeLoader";
|
|
|
27
27
|
* @property {} - see https://github.com/cornerstonejs/cornerstoneWADOImageLoader/blob/master/docs/WebWorkers.md
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
const MAX_CONCURRENCY = 6;
|
|
30
31
|
const globalConfig = {
|
|
31
|
-
maxWebWorkers:
|
|
32
|
+
maxWebWorkers: Math.max(
|
|
33
|
+
Math.min(navigator.hardwareConcurrency - 1, MAX_CONCURRENCY),
|
|
34
|
+
1
|
|
35
|
+
),
|
|
32
36
|
startWebWorkersOnDemand: true,
|
|
33
37
|
webWorkerTaskPaths: [
|
|
34
38
|
"https://unpkg.com/cornerstone-wado-image-loader@4.1.0/dist/610.bundle.min.worker.js",
|
|
@@ -253,7 +253,6 @@ export const resizeViewport = function (elementId) {
|
|
|
253
253
|
*/
|
|
254
254
|
export const renderImage = function (seriesStack, elementId, defaultProps) {
|
|
255
255
|
let t0 = performance.now();
|
|
256
|
-
|
|
257
256
|
// get element and enable it
|
|
258
257
|
let element = isElement(elementId)
|
|
259
258
|
? elementId
|
|
@@ -266,9 +265,6 @@ export const renderImage = function (seriesStack, elementId, defaultProps) {
|
|
|
266
265
|
|
|
267
266
|
let series = { ...seriesStack };
|
|
268
267
|
|
|
269
|
-
// default to 0 if multiframe and frameId is null
|
|
270
|
-
// let frameId = series.isMultiframe ? 1 : null;
|
|
271
|
-
|
|
272
268
|
larvitar_store.set("renderingStatus", [elementId, false]);
|
|
273
269
|
let data = getSeriesData(series, defaultProps);
|
|
274
270
|
if (!data.imageId) {
|
|
@@ -372,17 +368,23 @@ export const updateImage = function (
|
|
|
372
368
|
console.log("not element");
|
|
373
369
|
return;
|
|
374
370
|
}
|
|
375
|
-
let
|
|
376
|
-
if (
|
|
377
|
-
|
|
378
|
-
.loadAndCacheImage(
|
|
379
|
-
|
|
371
|
+
let imageId = series.imageIds[imageIndex];
|
|
372
|
+
if (imageId) {
|
|
373
|
+
if (cacheImage) {
|
|
374
|
+
cornerstone.loadAndCacheImage(imageId).then(function (image) {
|
|
375
|
+
cornerstone.displayImage(element, image);
|
|
376
|
+
larvitar_store.set("sliceId", [elementId, imageIndex]);
|
|
377
|
+
});
|
|
378
|
+
} else {
|
|
379
|
+
cornerstone.loadImage(imageId).then(function (image) {
|
|
380
380
|
cornerstone.displayImage(element, image);
|
|
381
|
+
larvitar_store.set("sliceId", [elementId, imageIndex]);
|
|
381
382
|
});
|
|
383
|
+
}
|
|
382
384
|
} else {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
385
|
+
console.warn(
|
|
386
|
+
`Error: wrong image index ${imageIndex}, no imageId available`
|
|
387
|
+
);
|
|
386
388
|
}
|
|
387
389
|
};
|
|
388
390
|
|
|
@@ -530,9 +532,10 @@ export const storeViewportData = function (image, elementId, viewport, data) {
|
|
|
530
532
|
larvitar_store.set("thickness", [elementId, data.thickness]);
|
|
531
533
|
larvitar_store.set("minPixelValue", [elementId, image.minPixelValue]);
|
|
532
534
|
larvitar_store.set("maxPixelValue", [elementId, image.maxPixelValue]);
|
|
533
|
-
|
|
535
|
+
// slice id from 0 to n - 1
|
|
536
|
+
larvitar_store.set("minSliceId", [elementId, 0]);
|
|
534
537
|
larvitar_store.set("sliceId", [elementId, data.imageIndex]);
|
|
535
|
-
larvitar_store.set("maxSliceId", [elementId, data.numberOfSlices]);
|
|
538
|
+
larvitar_store.set("maxSliceId", [elementId, data.numberOfSlices - 1]);
|
|
536
539
|
larvitar_store.set("defaultViewport", [
|
|
537
540
|
elementId,
|
|
538
541
|
viewport.scale,
|
|
@@ -666,12 +669,11 @@ export const rotateImageRight = function (elementId) {
|
|
|
666
669
|
*/
|
|
667
670
|
let getSeriesData = function (series, defaultProps) {
|
|
668
671
|
let data = {};
|
|
669
|
-
// image index
|
|
670
672
|
if (series.isMultiframe) {
|
|
671
673
|
data.isMultiframe = true;
|
|
672
674
|
data.numberOfSlices = series.imageIds.length;
|
|
673
|
-
data.imageIndex =
|
|
674
|
-
data.imageId = series.imageIds[
|
|
675
|
+
data.imageIndex = 0;
|
|
676
|
+
data.imageId = series.imageIds[data.imageIndex];
|
|
675
677
|
} else {
|
|
676
678
|
data.isMultiframe = false;
|
|
677
679
|
data.numberOfSlices =
|
|
@@ -682,14 +684,12 @@ let getSeriesData = function (series, defaultProps) {
|
|
|
682
684
|
data.imageIndex =
|
|
683
685
|
defaultProps &&
|
|
684
686
|
has(defaultProps, "sliceNumber") &&
|
|
685
|
-
defaultProps["sliceNumber"]
|
|
687
|
+
defaultProps["sliceNumber"] >= 0 && // slice number between 0 and n-1
|
|
688
|
+
defaultProps["sliceNumber"] < data.numberOfSlices
|
|
686
689
|
? defaultProps["sliceNumber"]
|
|
687
690
|
: Math.floor(data.numberOfSlices / 2);
|
|
688
691
|
|
|
689
|
-
data.imageId =
|
|
690
|
-
data.imageIndex > 0
|
|
691
|
-
? series.imageIds[data.imageIndex - 1]
|
|
692
|
-
: series.imageIds[0];
|
|
692
|
+
data.imageId = series.imageIds[data.imageIndex];
|
|
693
693
|
}
|
|
694
694
|
data.isColor = series.color;
|
|
695
695
|
data.isTimeserie = false; // TODO 4D
|
|
@@ -13,6 +13,8 @@ const { getters, setters } = segModule;
|
|
|
13
13
|
// internal libraries
|
|
14
14
|
import { setToolActive, setToolDisabled } from "./main";
|
|
15
15
|
import { isElement } from "../imageUtils";
|
|
16
|
+
import { larvitar_store } from "../imageStore";
|
|
17
|
+
import { updateStackToolState } from "../imageTools";
|
|
16
18
|
|
|
17
19
|
// custom code
|
|
18
20
|
import { setLabelmap3DForElement } from "./setLabelMap3D";
|
|
@@ -199,6 +201,19 @@ export function addSegmentationMask(props, data, elementId) {
|
|
|
199
201
|
// bind labelmap to colorLUT
|
|
200
202
|
let labelmap3d = getters.labelmap3D(element, props.labelId);
|
|
201
203
|
setters.colorLUTIndexForLabelmap3D(labelmap3d, props.labelId);
|
|
204
|
+
|
|
205
|
+
// set current imageIdIndex in tool state
|
|
206
|
+
let currentImageIdIndex = larvitar_store.get(
|
|
207
|
+
"viewports",
|
|
208
|
+
elementId,
|
|
209
|
+
"sliceId"
|
|
210
|
+
);
|
|
211
|
+
if (currentImageIdIndex !== "error" && currentImageIdIndex >= 0) {
|
|
212
|
+
updateStackToolState(elementId, currentImageIdIndex);
|
|
213
|
+
} else {
|
|
214
|
+
console.error("Cannot get currentImageIdIndex");
|
|
215
|
+
}
|
|
216
|
+
|
|
202
217
|
resolve();
|
|
203
218
|
});
|
|
204
219
|
return promise;
|
package/index.js
CHANGED
|
@@ -142,7 +142,9 @@ import {
|
|
|
142
142
|
setActiveSegment,
|
|
143
143
|
undoLastStroke,
|
|
144
144
|
redoLastStroke,
|
|
145
|
-
setBrushProps
|
|
145
|
+
setBrushProps,
|
|
146
|
+
hexToRgb,
|
|
147
|
+
rgbToHex
|
|
146
148
|
} from "./imaging/tools/segmentation";
|
|
147
149
|
|
|
148
150
|
import {
|
|
@@ -365,5 +367,7 @@ export {
|
|
|
365
367
|
setActiveSegment,
|
|
366
368
|
undoLastStroke,
|
|
367
369
|
redoLastStroke,
|
|
368
|
-
setBrushProps
|
|
370
|
+
setBrushProps,
|
|
371
|
+
hexToRgb,
|
|
372
|
+
rgbToHex
|
|
369
373
|
};
|
package/package.json
CHANGED