larvitar 1.2.1 → 1.2.4
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/imageParsing.js +1 -0
- package/imaging/imageRendering.js +17 -44
- package/imaging/imageStore.js +25 -3
- package/imaging/loaders/commonLoader.js +6 -2
- package/modules/vuex/larvitar.js +9 -2
- package/package.json +3 -3
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.4
|
|
10
10
|
|
|
11
|
-
### Latest Stable version: 1.2.
|
|
11
|
+
### Latest Stable version: 1.2.4
|
|
12
12
|
|
|
13
|
-
### Latest Published Release: 1.2.
|
|
13
|
+
### Latest Published Release: 1.2.4
|
|
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/imageParsing.js
CHANGED
|
@@ -278,6 +278,7 @@ let parseFile = function (file) {
|
|
|
278
278
|
imageObject.metadata.frameTime = metadata["x00181063"];
|
|
279
279
|
imageObject.metadata.frameDelay = metadata["x00181066"];
|
|
280
280
|
}
|
|
281
|
+
imageObject.metadata.isMultiframe = isMultiframe;
|
|
281
282
|
imageObject.metadata.windowCenter = metadata["x00281050"];
|
|
282
283
|
imageObject.metadata.windowWidth = metadata["x00281051"];
|
|
283
284
|
imageObject.metadata.minPixelValue = metadata["x00280106"];
|
|
@@ -328,20 +328,7 @@ export const renderImage = function (seriesStack, elementId, defaultProps) {
|
|
|
328
328
|
}
|
|
329
329
|
|
|
330
330
|
let storedViewport = cornerstone.getViewport(element);
|
|
331
|
-
storeViewportData(
|
|
332
|
-
image,
|
|
333
|
-
elementId,
|
|
334
|
-
data.imageIndex,
|
|
335
|
-
data.numberOfSlices,
|
|
336
|
-
data.rows,
|
|
337
|
-
data.cols,
|
|
338
|
-
data.spacing_x,
|
|
339
|
-
data.spacing_y,
|
|
340
|
-
data.thickness,
|
|
341
|
-
storedViewport,
|
|
342
|
-
data.defaultWW,
|
|
343
|
-
data.defaultWC
|
|
344
|
-
);
|
|
331
|
+
storeViewportData(image, elementId, storedViewport, data);
|
|
345
332
|
larvitar_store.set("renderingStatus", [elementId, true]);
|
|
346
333
|
let t1 = performance.now();
|
|
347
334
|
console.log(`Call to renderImage took ${t1 - t0} milliseconds.`);
|
|
@@ -534,47 +521,26 @@ export const updateViewportData = function (
|
|
|
534
521
|
* @function storeViewportData
|
|
535
522
|
* @param {Object} image - The cornerstone image frame
|
|
536
523
|
* @param {String} elementId - The html div id used for rendering
|
|
537
|
-
* @param {Number} imageIndex - The index of the image
|
|
538
|
-
* @param {Number} numberOfSlices - The number of slices of the series
|
|
539
|
-
* @param {Number} rows - The number of rows of the image
|
|
540
|
-
* @param {Number} cols - The number of columns of the image
|
|
541
|
-
* @param {Number} spacing_x - The spacing value for x axis
|
|
542
|
-
* @param {Number} spacing_y - The spacing value for y direction
|
|
543
|
-
* @param {Number} thickness - The thickness value between slices
|
|
544
524
|
* @param {String} viewport - The viewport tag name
|
|
545
|
-
* @param {
|
|
546
|
-
* @param {Number} defaultWC - The default WC value
|
|
525
|
+
* @param {Object} data - The viewport data object
|
|
547
526
|
*/
|
|
548
|
-
export const storeViewportData = function (
|
|
549
|
-
|
|
550
|
-
elementId,
|
|
551
|
-
|
|
552
|
-
numberOfSlices,
|
|
553
|
-
rows,
|
|
554
|
-
cols,
|
|
555
|
-
spacing_x,
|
|
556
|
-
spacing_y,
|
|
557
|
-
thickness,
|
|
558
|
-
viewport,
|
|
559
|
-
defaultWW,
|
|
560
|
-
defaultWC
|
|
561
|
-
) {
|
|
562
|
-
larvitar_store.set("dimensions", [elementId, rows, cols]);
|
|
563
|
-
larvitar_store.set("spacing", [elementId, spacing_x, spacing_y]);
|
|
564
|
-
larvitar_store.set("thickness", [elementId, thickness]);
|
|
527
|
+
export const storeViewportData = function (image, elementId, viewport, data) {
|
|
528
|
+
larvitar_store.set("dimensions", [elementId, data.rows, data.cols]);
|
|
529
|
+
larvitar_store.set("spacing", [elementId, data.spacing_x, data.spacing_y]);
|
|
530
|
+
larvitar_store.set("thickness", [elementId, data.thickness]);
|
|
565
531
|
larvitar_store.set("minPixelValue", [elementId, image.minPixelValue]);
|
|
566
532
|
larvitar_store.set("maxPixelValue", [elementId, image.maxPixelValue]);
|
|
567
533
|
larvitar_store.set("minSliceId", [elementId, 1]);
|
|
568
|
-
larvitar_store.set("sliceId", [elementId, imageIndex]);
|
|
569
|
-
larvitar_store.set("maxSliceId", [elementId, numberOfSlices]);
|
|
534
|
+
larvitar_store.set("sliceId", [elementId, data.imageIndex]);
|
|
535
|
+
larvitar_store.set("maxSliceId", [elementId, data.numberOfSlices]);
|
|
570
536
|
larvitar_store.set("defaultViewport", [
|
|
571
537
|
elementId,
|
|
572
538
|
viewport.scale,
|
|
573
539
|
viewport.rotation,
|
|
574
540
|
viewport.translation.x,
|
|
575
541
|
viewport.translation.y,
|
|
576
|
-
defaultWW,
|
|
577
|
-
defaultWC
|
|
542
|
+
data.defaultWW,
|
|
543
|
+
data.defaultWC
|
|
578
544
|
]);
|
|
579
545
|
larvitar_store.set("scale", [elementId, viewport.scale]);
|
|
580
546
|
larvitar_store.set("rotation", [elementId, viewport.rotation]);
|
|
@@ -588,6 +554,9 @@ export const storeViewportData = function (
|
|
|
588
554
|
viewport.voi.windowWidth,
|
|
589
555
|
viewport.voi.windowCenter
|
|
590
556
|
]);
|
|
557
|
+
larvitar_store.set("isColor", [elementId, data.isColor]);
|
|
558
|
+
larvitar_store.set("isMultiframe", [elementId, data.isMultiframe]);
|
|
559
|
+
larvitar_store.set("isTimeserie", [elementId, data.isTimeserie]);
|
|
591
560
|
};
|
|
592
561
|
|
|
593
562
|
/**
|
|
@@ -699,10 +668,12 @@ let getSeriesData = function (series, defaultProps) {
|
|
|
699
668
|
let data = {};
|
|
700
669
|
// image index
|
|
701
670
|
if (series.isMultiframe) {
|
|
671
|
+
data.isMultiframe = true;
|
|
702
672
|
data.numberOfSlices = series.imageIds.length;
|
|
703
673
|
data.imageIndex = 1;
|
|
704
674
|
data.imageId = series.imageIds[0];
|
|
705
675
|
} else {
|
|
676
|
+
data.isMultiframe = false;
|
|
706
677
|
data.numberOfSlices =
|
|
707
678
|
defaultProps && has(defaultProps, "numberOfSlices")
|
|
708
679
|
? defaultProps["numberOfSlices"]
|
|
@@ -720,6 +691,8 @@ let getSeriesData = function (series, defaultProps) {
|
|
|
720
691
|
? series.imageIds[data.imageIndex - 1]
|
|
721
692
|
: series.imageIds[0];
|
|
722
693
|
}
|
|
694
|
+
data.isColor = series.color;
|
|
695
|
+
data.isTimeserie = false; // TODO 4D
|
|
723
696
|
|
|
724
697
|
// rows, cols and x y z spacing
|
|
725
698
|
data.rows = series.instances[series.imageIds[0]].metadata["x00280010"];
|
package/imaging/imageStore.js
CHANGED
|
@@ -22,6 +22,9 @@ const DEFAULT_VIEWPORT = {
|
|
|
22
22
|
thickness: 0.0,
|
|
23
23
|
minPixelValue: 0,
|
|
24
24
|
maxPixelValue: 0,
|
|
25
|
+
isColor: false,
|
|
26
|
+
isMultiframe: false,
|
|
27
|
+
isTimeserie: false,
|
|
25
28
|
viewport: {
|
|
26
29
|
scale: 0.0,
|
|
27
30
|
rotation: 0.0,
|
|
@@ -66,7 +69,6 @@ class Larvitar_Store {
|
|
|
66
69
|
this.vuex_store = vuex_store;
|
|
67
70
|
this.vuex_module = vuex_module;
|
|
68
71
|
this.state = {
|
|
69
|
-
manager: null,
|
|
70
72
|
series: {}, // seriesUID: {imageIds:[], progress:value}
|
|
71
73
|
leftActiveTool: "Wwwc",
|
|
72
74
|
rightActiveTool: "Zoom",
|
|
@@ -171,6 +173,22 @@ class Larvitar_Store {
|
|
|
171
173
|
}
|
|
172
174
|
}
|
|
173
175
|
|
|
176
|
+
/**
|
|
177
|
+
* Removes all the series from the store
|
|
178
|
+
* @function resetSeriesIds
|
|
179
|
+
*/
|
|
180
|
+
resetSeriesIds(seriesId) {
|
|
181
|
+
if (this.VUEX_STORE) {
|
|
182
|
+
let dispatch = "resetSeriesIds";
|
|
183
|
+
let route = this.vuex_module
|
|
184
|
+
? this.vuex_module + "/" + dispatch
|
|
185
|
+
: dispatch;
|
|
186
|
+
this.vuex_store.dispatch(route, seriesId);
|
|
187
|
+
} else {
|
|
188
|
+
delete this.state.series[seriesId];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
174
192
|
/**
|
|
175
193
|
* Set a value into store
|
|
176
194
|
* @function set
|
|
@@ -214,6 +232,12 @@ class Larvitar_Store {
|
|
|
214
232
|
this.state["viewports"][data[0]]["maxSliceId"] = data[1];
|
|
215
233
|
} else if (field == "sliceId") {
|
|
216
234
|
this.state["viewports"][data[0]]["sliceId"] = data[1];
|
|
235
|
+
} else if (field == "isColor") {
|
|
236
|
+
this.state["viewports"][data[0]]["isColor"] = data[1];
|
|
237
|
+
} else if (field == "isMultiframe") {
|
|
238
|
+
this.state["viewports"][data[0]]["isMultiframe"] = data[1];
|
|
239
|
+
} else if (field == "isTimeserie") {
|
|
240
|
+
this.state["viewports"][data[0]]["isTimeserie"] = data[1];
|
|
217
241
|
} else if (field == "defaultViewport") {
|
|
218
242
|
this.state["viewports"][data[0]]["default"]["scale"] = data[1];
|
|
219
243
|
this.state["viewports"][data[0]]["default"]["rotation"] = data[2];
|
|
@@ -227,8 +251,6 @@ class Larvitar_Store {
|
|
|
227
251
|
data[6];
|
|
228
252
|
} else if (field == "progress") {
|
|
229
253
|
this.state.series[data[0]]["progress"] = data[1];
|
|
230
|
-
} else if (field == "manager") {
|
|
231
|
-
this.state.manager = data;
|
|
232
254
|
} else {
|
|
233
255
|
if (Array.isArray(data)) {
|
|
234
256
|
this.state[field][data[0]] = data[1];
|
|
@@ -38,10 +38,14 @@ export const updateLarvitarManager = function (imageObject, customId) {
|
|
|
38
38
|
if (larvitarManager === null) {
|
|
39
39
|
larvitarManager = {};
|
|
40
40
|
}
|
|
41
|
+
|
|
41
42
|
let seriesId = customId || imageObject.seriesUID;
|
|
42
43
|
let data = { ...imageObject };
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
|
|
45
|
+
if (data.metadata.isMultiframe) {
|
|
46
|
+
seriesId = customId || imageObject.metadata.seriesUID;
|
|
47
|
+
updateLoadedStack(data, larvitarManager, customId);
|
|
48
|
+
buildMultiFrameImage(seriesId, larvitarManager[seriesId]);
|
|
45
49
|
} else {
|
|
46
50
|
updateLoadedStack(data, larvitarManager, customId);
|
|
47
51
|
}
|
package/modules/vuex/larvitar.js
CHANGED
|
@@ -15,6 +15,9 @@ const DEFAULT_VIEWPORT = {
|
|
|
15
15
|
thickness: 0.0,
|
|
16
16
|
minPixelValue: 0,
|
|
17
17
|
maxPixelValue: 0,
|
|
18
|
+
isColor: false,
|
|
19
|
+
isMultiframe: false,
|
|
20
|
+
isTimeserie: false,
|
|
18
21
|
viewport: {
|
|
19
22
|
scale: 0.0,
|
|
20
23
|
rotation: 0.0,
|
|
@@ -46,7 +49,6 @@ export default {
|
|
|
46
49
|
colormapId: "gray",
|
|
47
50
|
leftActiveTool: "Wwwc",
|
|
48
51
|
rightActiveTool: "Wwwc",
|
|
49
|
-
manager: null,
|
|
50
52
|
series: {}, // seriesUID: {imageIds:[], progress:value}
|
|
51
53
|
viewports: {}
|
|
52
54
|
},
|
|
@@ -90,7 +92,6 @@ export default {
|
|
|
90
92
|
},
|
|
91
93
|
deleteViewport: ({ state }, viewportId) =>
|
|
92
94
|
Vue.delete(state.viewports, viewportId),
|
|
93
|
-
setManager: ({ state }, value) => (state.manager = value),
|
|
94
95
|
setLeftActiveTool: ({ commit }, value) => {
|
|
95
96
|
commit("leftActiveTool", { d: { value } });
|
|
96
97
|
},
|
|
@@ -127,6 +128,12 @@ export default {
|
|
|
127
128
|
commit("viewport", { id, d: { maxSliceId } }),
|
|
128
129
|
setSliceId: ({ commit }, [id, sliceId]) =>
|
|
129
130
|
commit("viewport", { id, d: { sliceId } }),
|
|
131
|
+
setIsColor: ({ commit }, [id, isColor]) =>
|
|
132
|
+
commit("viewport", { id, d: { isColor } }),
|
|
133
|
+
setIsMultiframe: ({ commit }, [id, isMultiframe]) =>
|
|
134
|
+
commit("viewport", { id, d: { isMultiframe } }),
|
|
135
|
+
setIsTimeserie: ({ commit }, [id, isTimeserie]) =>
|
|
136
|
+
commit("viewport", { id, d: { isTimeserie } }),
|
|
130
137
|
setDefaultViewport: (
|
|
131
138
|
{ commit },
|
|
132
139
|
[id, scale, rotation, x, y, windowWidth, windowCenter]
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"medical",
|
|
7
7
|
"cornerstone"
|
|
8
8
|
],
|
|
9
|
-
"version": "1.2.
|
|
9
|
+
"version": "1.2.4",
|
|
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",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"cornerstone-core": "^2.6.1",
|
|
30
30
|
"cornerstone-file-image-loader": "^0.3.0",
|
|
31
31
|
"cornerstone-tools": "^6.0.6",
|
|
32
|
-
"cornerstone-wado-image-loader": "^4.
|
|
32
|
+
"cornerstone-wado-image-loader": "^4.1.2",
|
|
33
33
|
"cornerstone-web-image-loader": "^2.1.1",
|
|
34
34
|
"crypto-js": "^4.1.1",
|
|
35
35
|
"dicom-character-set": "^1.0.3",
|
|
36
|
-
"dicom-parser": "^1.8.
|
|
36
|
+
"dicom-parser": "^1.8.13",
|
|
37
37
|
"docdash": "^1.2.0",
|
|
38
38
|
"hammerjs": "^2.0.8",
|
|
39
39
|
"keycode-js": "^3.1.0",
|