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 CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
  ## Dicom Image Toolkit for CornestoneJS
8
8
 
9
- ### Current version: 1.2.4
9
+ ### Current version: 1.2.7
10
10
 
11
- ### Latest Stable version: 1.2.4
11
+ ### Latest Stable version: 1.2.7
12
12
 
13
- ### Latest Published Release: 1.2.4
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.
@@ -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: navigator.hardwareConcurrency || 1,
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 index = imageIndex == 0 ? imageIndex : imageIndex - 1;
376
- if (cacheImage) {
377
- cornerstone
378
- .loadAndCacheImage(series.imageIds[index])
379
- .then(function (image) {
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
- cornerstone.loadImage(series.imageIds[index]).then(function (image) {
384
- cornerstone.displayImage(element, image);
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
- larvitar_store.set("minSliceId", [elementId, 1]);
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 = 1;
674
- data.imageId = series.imageIds[0];
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"] <= data.numberOfSlices
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
@@ -6,7 +6,7 @@
6
6
  "medical",
7
7
  "cornerstone"
8
8
  ],
9
- "version": "1.2.4",
9
+ "version": "1.2.7",
10
10
  "description": "javascript library for parsing, loading, rendering and interacting with DICOM images",
11
11
  "repository": {
12
12
  "url": "https://github.com/dvisionlab/Larvitar.git",