@ohif/app 3.7.0-beta.8 → 3.7.0-beta.80
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/dist/{917.bundle.d238efac58b7fe8fd1a3.js → 12.bundle.4a052141b46dec16862d.js} +6 -6
- package/dist/{295.bundle.957b1159fec14b9199a1.js → 125.bundle.253395f320b72180da63.js} +6 -6
- package/dist/{208.bundle.37c2a73b3387e657568c.js → 128.bundle.5198a2266456afecd420.js} +41 -59
- package/dist/{351.bundle.0742237651aef9694a65.js → 181.bundle.fa57199595cf28f44c7b.js} +226 -204
- package/dist/{351.css → 181.css} +1 -1
- package/dist/{744.bundle.23011553706b687f67e4.js → 19.bundle.75ec1ec14786e136b7b3.js} +240 -375
- package/dist/{606.bundle.5d876f5f3dd8287f0a28.js → 202.bundle.96bbb4547a346fe3921f.js} +1420 -750
- package/dist/{926.bundle.dbc9d0e591cb9217fda2.js → 220.bundle.f7e1c96c94245e70f2be.js} +990 -400
- package/dist/221.bundle.8a81cea315fa7697c0e0.js +1722 -0
- package/dist/221.css +2 -0
- package/dist/{664.bundle.09abae984223969d1bde.js → 23.bundle.e008ad788170f2ed5569.js} +5 -6
- package/dist/{976.bundle.dcbddf56a7d8f388bb8a.js → 236.bundle.d2da6d1991e1229bf913.js} +87 -103
- package/dist/{55.bundle.550a823e75eb608e8d5e.js → 250.bundle.36909d7bc681d66087d1.js} +52 -36
- package/dist/{973.bundle.03b016e6095622adf12f.js → 281.bundle.21a9e3178ddebe01b958.js} +18 -14
- package/dist/{82.bundle.10c2133333748ec6fba0.js → 342.bundle.70da5239bd664aa5d41a.js} +1768 -475
- package/dist/{192.bundle.2dc14a6e3c4c6be913b0.js → 348.bundle.8c5b950d30e5aa992290.js} +86 -73
- package/dist/{404.bundle.5d57295bc05206092d42.js → 359.bundle.d2a3abe1a5cd3ca3cd8e.js} +46 -131
- package/dist/{790.bundle.cedf27deeed29266a92b.js → 410.bundle.be538faa9c7fad92189b.js} +11 -9
- package/dist/{151.bundle.31ea35044218837bf73f.js → 417.bundle.af0a207c29b109f84159.js} +49 -17
- package/dist/{569.bundle.c8e771a8d28e237b32be.js → 451.bundle.dc0d14c3724464cca2bf.js} +86 -106
- package/dist/{581.bundle.dc6197189f7c88c27d4c.js → 471.bundle.2206d4c0ac2ad0df2362.js} +78 -99
- package/dist/{199.bundle.e4ac6606dd62e42e9da4.js → 506.bundle.97e53732423192fee818.js} +11 -9
- package/dist/{531.bundle.2a82fb1d69e5b57cc72b.js → 530.bundle.a03b6f942ace3e1baa1e.js} +726 -447
- package/dist/579.css +1 -0
- package/dist/{935.bundle.deeffff0e4f7b528e3c3.js → 604.bundle.a51f83e64004bca5f497.js} +2 -3
- package/dist/613.bundle.549d71231abfed24a2dc.js +532 -0
- package/dist/{984.bundle.e7dcbd3b8992748823fb.js → 663.bundle.b0f98b6e7221b1b9cf6a.js} +68 -38
- package/dist/{205.bundle.b5a473c200dcf2bbcdb4.js → 686.bundle.dccef1f36e4bc79bcc48.js} +6 -6
- package/dist/{50.bundle.424f8d05f1bebaafcf2c.js → 687.bundle.ab0ffdccae4610b00224.js} +218 -9
- package/dist/{331.bundle.bd0c13931a21d53086c9.js → 754.bundle.e3ce6855d8d4d187f224.js} +12423 -7549
- package/dist/{728.bundle.d13856835357400fef82.js → 774.bundle.d365320749c4f67cda70.js} +93 -64
- package/dist/{381.bundle.0905e683605fcbc0895f.js → 775.bundle.2285e7e0e67878948c0d.js} +16 -16
- package/dist/{270.bundle.4564621556b0f963a004.js → 777.bundle.ae3fdb8a470caecc0c6a.js} +1330 -929
- package/dist/{283.bundle.085cddb2f16e430677b0.js → 782.bundle.ee8dba2e8582b55cb38d.js} +117 -67
- package/dist/{642.bundle.25e56df5f0bcd2c729b4.js → 814.bundle.eec4458e893e6055f0fc.js} +6 -6
- package/dist/{799.bundle.758558e64147e5aad612.js → 822.bundle.5fca45a4f40f5259aec5.js} +81 -34
- package/dist/831.bundle.83658f62fcc769043605.js +16700 -0
- package/dist/{953.bundle.3b0189ebc11cf0946f18.js → 886.bundle.a9de117c3a42b7907cf6.js} +34 -29
- package/dist/945.min.worker.js +1 -1
- package/dist/945.min.worker.js.map +1 -1
- package/dist/{707.bundle.17a9d7352409b6269596.js → 967.bundle.cce1d004b2ff178b1a8e.js} +895 -572
- package/dist/_redirects +1 -1
- package/dist/app-config.js +35 -17
- package/dist/{app.bundle.837996a8f7dd2aaac338.js → app.bundle.681f66ab37cef811e68b.js} +73339 -68140
- package/dist/app.bundle.css +13 -12
- package/dist/assets/yandex-browser-manifest.json +1 -1
- package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
- package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
- package/dist/{dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js → dicom-microscopy-viewer.bundle.2c146384eb9466d02ff8.js} +5 -4
- package/dist/es6-shim.min.js +3569 -2
- package/dist/google.js +8 -7
- package/dist/index.html +1 -1
- package/dist/{index.worker.1c69152d710fa7b84bce.worker.js → index.worker.e62ecca63f1a2e124230.worker.js} +2 -2
- package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +1 -0
- package/dist/init-service-worker.js +3 -5
- package/dist/oidc-client.min.js +10857 -39
- package/dist/polyfill.min.js +184 -1
- package/dist/silent-refresh.html +18 -9
- package/dist/sw.js +1 -1
- package/package.json +20 -21
- package/dist/616.bundle.eb4887184da6c57bf7a3.js +0 -685
- package/dist/780.bundle.fd0f13dc92e9caa0581e.js +0 -4769
- package/dist/index.worker.1c69152d710fa7b84bce.worker.js.map +0 -1
- /package/dist/{806.css → 19.css} +0 -0
- /package/dist/{55.css → 250.css} +0 -0
- /package/dist/{707.css → 967.css} +0 -0
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
(
|
|
1
|
+
(self["webpackChunk"] = self["webpackChunk"] || []).push([[202],{
|
|
2
2
|
|
|
3
|
-
/***/
|
|
3
|
+
/***/ 91202:
|
|
4
4
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
8
|
-
/* harmony export */
|
|
8
|
+
/* harmony export */ Y: () => (/* binding */ index),
|
|
9
|
+
/* harmony export */ adaptersSEG: () => (/* binding */ adaptersSEG),
|
|
10
|
+
/* harmony export */ adaptersSR: () => (/* binding */ adaptersSR),
|
|
11
|
+
/* harmony export */ helpers: () => (/* binding */ index$1)
|
|
9
12
|
/* harmony export */ });
|
|
10
|
-
/*
|
|
11
|
-
/* harmony import */ var
|
|
12
|
-
/* harmony import */ var
|
|
13
|
-
/* harmony import */ var
|
|
14
|
-
/* harmony import */ var
|
|
15
|
-
/* harmony import */ var
|
|
16
|
-
/* harmony import */ var
|
|
13
|
+
/* harmony import */ var dcmjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(67540);
|
|
14
|
+
/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(58955);
|
|
15
|
+
/* harmony import */ var ndarray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(87513);
|
|
16
|
+
/* harmony import */ var ndarray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ndarray__WEBPACK_IMPORTED_MODULE_2__);
|
|
17
|
+
/* harmony import */ var lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11677);
|
|
18
|
+
/* harmony import */ var lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3__);
|
|
19
|
+
/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(45451);
|
|
20
|
+
|
|
17
21
|
|
|
18
22
|
|
|
19
23
|
|
|
@@ -67,6 +71,337 @@ function _objectSpread2(target) {
|
|
|
67
71
|
}
|
|
68
72
|
return target;
|
|
69
73
|
}
|
|
74
|
+
function _regeneratorRuntime() {
|
|
75
|
+
_regeneratorRuntime = function () {
|
|
76
|
+
return exports;
|
|
77
|
+
};
|
|
78
|
+
var exports = {},
|
|
79
|
+
Op = Object.prototype,
|
|
80
|
+
hasOwn = Op.hasOwnProperty,
|
|
81
|
+
defineProperty = Object.defineProperty || function (obj, key, desc) {
|
|
82
|
+
obj[key] = desc.value;
|
|
83
|
+
},
|
|
84
|
+
$Symbol = "function" == typeof Symbol ? Symbol : {},
|
|
85
|
+
iteratorSymbol = $Symbol.iterator || "@@iterator",
|
|
86
|
+
asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
|
|
87
|
+
toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
|
|
88
|
+
function define(obj, key, value) {
|
|
89
|
+
return Object.defineProperty(obj, key, {
|
|
90
|
+
value: value,
|
|
91
|
+
enumerable: !0,
|
|
92
|
+
configurable: !0,
|
|
93
|
+
writable: !0
|
|
94
|
+
}), obj[key];
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
define({}, "");
|
|
98
|
+
} catch (err) {
|
|
99
|
+
define = function (obj, key, value) {
|
|
100
|
+
return obj[key] = value;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function wrap(innerFn, outerFn, self, tryLocsList) {
|
|
104
|
+
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
|
|
105
|
+
generator = Object.create(protoGenerator.prototype),
|
|
106
|
+
context = new Context(tryLocsList || []);
|
|
107
|
+
return defineProperty(generator, "_invoke", {
|
|
108
|
+
value: makeInvokeMethod(innerFn, self, context)
|
|
109
|
+
}), generator;
|
|
110
|
+
}
|
|
111
|
+
function tryCatch(fn, obj, arg) {
|
|
112
|
+
try {
|
|
113
|
+
return {
|
|
114
|
+
type: "normal",
|
|
115
|
+
arg: fn.call(obj, arg)
|
|
116
|
+
};
|
|
117
|
+
} catch (err) {
|
|
118
|
+
return {
|
|
119
|
+
type: "throw",
|
|
120
|
+
arg: err
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.wrap = wrap;
|
|
125
|
+
var ContinueSentinel = {};
|
|
126
|
+
function Generator() {}
|
|
127
|
+
function GeneratorFunction() {}
|
|
128
|
+
function GeneratorFunctionPrototype() {}
|
|
129
|
+
var IteratorPrototype = {};
|
|
130
|
+
define(IteratorPrototype, iteratorSymbol, function () {
|
|
131
|
+
return this;
|
|
132
|
+
});
|
|
133
|
+
var getProto = Object.getPrototypeOf,
|
|
134
|
+
NativeIteratorPrototype = getProto && getProto(getProto(values([])));
|
|
135
|
+
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
|
|
136
|
+
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
|
|
137
|
+
function defineIteratorMethods(prototype) {
|
|
138
|
+
["next", "throw", "return"].forEach(function (method) {
|
|
139
|
+
define(prototype, method, function (arg) {
|
|
140
|
+
return this._invoke(method, arg);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function AsyncIterator(generator, PromiseImpl) {
|
|
145
|
+
function invoke(method, arg, resolve, reject) {
|
|
146
|
+
var record = tryCatch(generator[method], generator, arg);
|
|
147
|
+
if ("throw" !== record.type) {
|
|
148
|
+
var result = record.arg,
|
|
149
|
+
value = result.value;
|
|
150
|
+
return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
|
|
151
|
+
invoke("next", value, resolve, reject);
|
|
152
|
+
}, function (err) {
|
|
153
|
+
invoke("throw", err, resolve, reject);
|
|
154
|
+
}) : PromiseImpl.resolve(value).then(function (unwrapped) {
|
|
155
|
+
result.value = unwrapped, resolve(result);
|
|
156
|
+
}, function (error) {
|
|
157
|
+
return invoke("throw", error, resolve, reject);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
reject(record.arg);
|
|
161
|
+
}
|
|
162
|
+
var previousPromise;
|
|
163
|
+
defineProperty(this, "_invoke", {
|
|
164
|
+
value: function (method, arg) {
|
|
165
|
+
function callInvokeWithMethodAndArg() {
|
|
166
|
+
return new PromiseImpl(function (resolve, reject) {
|
|
167
|
+
invoke(method, arg, resolve, reject);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function makeInvokeMethod(innerFn, self, context) {
|
|
175
|
+
var state = "suspendedStart";
|
|
176
|
+
return function (method, arg) {
|
|
177
|
+
if ("executing" === state) throw new Error("Generator is already running");
|
|
178
|
+
if ("completed" === state) {
|
|
179
|
+
if ("throw" === method) throw arg;
|
|
180
|
+
return doneResult();
|
|
181
|
+
}
|
|
182
|
+
for (context.method = method, context.arg = arg;;) {
|
|
183
|
+
var delegate = context.delegate;
|
|
184
|
+
if (delegate) {
|
|
185
|
+
var delegateResult = maybeInvokeDelegate(delegate, context);
|
|
186
|
+
if (delegateResult) {
|
|
187
|
+
if (delegateResult === ContinueSentinel) continue;
|
|
188
|
+
return delegateResult;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
|
|
192
|
+
if ("suspendedStart" === state) throw state = "completed", context.arg;
|
|
193
|
+
context.dispatchException(context.arg);
|
|
194
|
+
} else "return" === context.method && context.abrupt("return", context.arg);
|
|
195
|
+
state = "executing";
|
|
196
|
+
var record = tryCatch(innerFn, self, context);
|
|
197
|
+
if ("normal" === record.type) {
|
|
198
|
+
if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
|
|
199
|
+
return {
|
|
200
|
+
value: record.arg,
|
|
201
|
+
done: context.done
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
"throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function maybeInvokeDelegate(delegate, context) {
|
|
209
|
+
var methodName = context.method,
|
|
210
|
+
method = delegate.iterator[methodName];
|
|
211
|
+
if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
|
|
212
|
+
var record = tryCatch(method, delegate.iterator, context.arg);
|
|
213
|
+
if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
|
|
214
|
+
var info = record.arg;
|
|
215
|
+
return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
|
|
216
|
+
}
|
|
217
|
+
function pushTryEntry(locs) {
|
|
218
|
+
var entry = {
|
|
219
|
+
tryLoc: locs[0]
|
|
220
|
+
};
|
|
221
|
+
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
|
|
222
|
+
}
|
|
223
|
+
function resetTryEntry(entry) {
|
|
224
|
+
var record = entry.completion || {};
|
|
225
|
+
record.type = "normal", delete record.arg, entry.completion = record;
|
|
226
|
+
}
|
|
227
|
+
function Context(tryLocsList) {
|
|
228
|
+
this.tryEntries = [{
|
|
229
|
+
tryLoc: "root"
|
|
230
|
+
}], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
|
|
231
|
+
}
|
|
232
|
+
function values(iterable) {
|
|
233
|
+
if (iterable) {
|
|
234
|
+
var iteratorMethod = iterable[iteratorSymbol];
|
|
235
|
+
if (iteratorMethod) return iteratorMethod.call(iterable);
|
|
236
|
+
if ("function" == typeof iterable.next) return iterable;
|
|
237
|
+
if (!isNaN(iterable.length)) {
|
|
238
|
+
var i = -1,
|
|
239
|
+
next = function next() {
|
|
240
|
+
for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
|
|
241
|
+
return next.value = undefined, next.done = !0, next;
|
|
242
|
+
};
|
|
243
|
+
return next.next = next;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
next: doneResult
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function doneResult() {
|
|
251
|
+
return {
|
|
252
|
+
value: undefined,
|
|
253
|
+
done: !0
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
|
|
257
|
+
value: GeneratorFunctionPrototype,
|
|
258
|
+
configurable: !0
|
|
259
|
+
}), defineProperty(GeneratorFunctionPrototype, "constructor", {
|
|
260
|
+
value: GeneratorFunction,
|
|
261
|
+
configurable: !0
|
|
262
|
+
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
|
|
263
|
+
var ctor = "function" == typeof genFun && genFun.constructor;
|
|
264
|
+
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
|
|
265
|
+
}, exports.mark = function (genFun) {
|
|
266
|
+
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
|
|
267
|
+
}, exports.awrap = function (arg) {
|
|
268
|
+
return {
|
|
269
|
+
__await: arg
|
|
270
|
+
};
|
|
271
|
+
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
|
|
272
|
+
return this;
|
|
273
|
+
}), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
|
|
274
|
+
void 0 === PromiseImpl && (PromiseImpl = Promise);
|
|
275
|
+
var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
|
|
276
|
+
return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
|
|
277
|
+
return result.done ? result.value : iter.next();
|
|
278
|
+
});
|
|
279
|
+
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
|
|
280
|
+
return this;
|
|
281
|
+
}), define(Gp, "toString", function () {
|
|
282
|
+
return "[object Generator]";
|
|
283
|
+
}), exports.keys = function (val) {
|
|
284
|
+
var object = Object(val),
|
|
285
|
+
keys = [];
|
|
286
|
+
for (var key in object) keys.push(key);
|
|
287
|
+
return keys.reverse(), function next() {
|
|
288
|
+
for (; keys.length;) {
|
|
289
|
+
var key = keys.pop();
|
|
290
|
+
if (key in object) return next.value = key, next.done = !1, next;
|
|
291
|
+
}
|
|
292
|
+
return next.done = !0, next;
|
|
293
|
+
};
|
|
294
|
+
}, exports.values = values, Context.prototype = {
|
|
295
|
+
constructor: Context,
|
|
296
|
+
reset: function (skipTempReset) {
|
|
297
|
+
if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
|
|
298
|
+
},
|
|
299
|
+
stop: function () {
|
|
300
|
+
this.done = !0;
|
|
301
|
+
var rootRecord = this.tryEntries[0].completion;
|
|
302
|
+
if ("throw" === rootRecord.type) throw rootRecord.arg;
|
|
303
|
+
return this.rval;
|
|
304
|
+
},
|
|
305
|
+
dispatchException: function (exception) {
|
|
306
|
+
if (this.done) throw exception;
|
|
307
|
+
var context = this;
|
|
308
|
+
function handle(loc, caught) {
|
|
309
|
+
return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
|
|
310
|
+
}
|
|
311
|
+
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
|
|
312
|
+
var entry = this.tryEntries[i],
|
|
313
|
+
record = entry.completion;
|
|
314
|
+
if ("root" === entry.tryLoc) return handle("end");
|
|
315
|
+
if (entry.tryLoc <= this.prev) {
|
|
316
|
+
var hasCatch = hasOwn.call(entry, "catchLoc"),
|
|
317
|
+
hasFinally = hasOwn.call(entry, "finallyLoc");
|
|
318
|
+
if (hasCatch && hasFinally) {
|
|
319
|
+
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
|
|
320
|
+
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
|
|
321
|
+
} else if (hasCatch) {
|
|
322
|
+
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
|
|
323
|
+
} else {
|
|
324
|
+
if (!hasFinally) throw new Error("try statement without catch or finally");
|
|
325
|
+
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
abrupt: function (type, arg) {
|
|
331
|
+
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
|
|
332
|
+
var entry = this.tryEntries[i];
|
|
333
|
+
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
|
|
334
|
+
var finallyEntry = entry;
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
|
|
339
|
+
var record = finallyEntry ? finallyEntry.completion : {};
|
|
340
|
+
return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
|
|
341
|
+
},
|
|
342
|
+
complete: function (record, afterLoc) {
|
|
343
|
+
if ("throw" === record.type) throw record.arg;
|
|
344
|
+
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
|
|
345
|
+
},
|
|
346
|
+
finish: function (finallyLoc) {
|
|
347
|
+
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
|
|
348
|
+
var entry = this.tryEntries[i];
|
|
349
|
+
if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
catch: function (tryLoc) {
|
|
353
|
+
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
|
|
354
|
+
var entry = this.tryEntries[i];
|
|
355
|
+
if (entry.tryLoc === tryLoc) {
|
|
356
|
+
var record = entry.completion;
|
|
357
|
+
if ("throw" === record.type) {
|
|
358
|
+
var thrown = record.arg;
|
|
359
|
+
resetTryEntry(entry);
|
|
360
|
+
}
|
|
361
|
+
return thrown;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
throw new Error("illegal catch attempt");
|
|
365
|
+
},
|
|
366
|
+
delegateYield: function (iterable, resultName, nextLoc) {
|
|
367
|
+
return this.delegate = {
|
|
368
|
+
iterator: values(iterable),
|
|
369
|
+
resultName: resultName,
|
|
370
|
+
nextLoc: nextLoc
|
|
371
|
+
}, "next" === this.method && (this.arg = undefined), ContinueSentinel;
|
|
372
|
+
}
|
|
373
|
+
}, exports;
|
|
374
|
+
}
|
|
375
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
376
|
+
try {
|
|
377
|
+
var info = gen[key](arg);
|
|
378
|
+
var value = info.value;
|
|
379
|
+
} catch (error) {
|
|
380
|
+
reject(error);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (info.done) {
|
|
384
|
+
resolve(value);
|
|
385
|
+
} else {
|
|
386
|
+
Promise.resolve(value).then(_next, _throw);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function _asyncToGenerator(fn) {
|
|
390
|
+
return function () {
|
|
391
|
+
var self = this,
|
|
392
|
+
args = arguments;
|
|
393
|
+
return new Promise(function (resolve, reject) {
|
|
394
|
+
var gen = fn.apply(self, args);
|
|
395
|
+
function _next(value) {
|
|
396
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
397
|
+
}
|
|
398
|
+
function _throw(err) {
|
|
399
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
400
|
+
}
|
|
401
|
+
_next(undefined);
|
|
402
|
+
});
|
|
403
|
+
};
|
|
404
|
+
}
|
|
70
405
|
function _classCallCheck(instance, Constructor) {
|
|
71
406
|
if (!(instance instanceof Constructor)) {
|
|
72
407
|
throw new TypeError("Cannot call a class as a function");
|
|
@@ -203,19 +538,68 @@ function _toPropertyKey(arg) {
|
|
|
203
538
|
return typeof key === "symbol" ? key : String(key);
|
|
204
539
|
}
|
|
205
540
|
|
|
206
|
-
var toArray = function
|
|
207
|
-
|
|
541
|
+
var toArray = function (x) { return (Array.isArray(x) ? x : [x]); };
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Returns a function that checks if a given content item's ConceptNameCodeSequence.CodeMeaning
|
|
545
|
+
* matches the provided codeMeaningName.
|
|
546
|
+
* @param codeMeaningName - The CodeMeaning to match against.
|
|
547
|
+
* @returns A function that takes a content item and returns a boolean indicating whether the
|
|
548
|
+
* content item's CodeMeaning matches the provided codeMeaningName.
|
|
549
|
+
*/
|
|
550
|
+
var codeMeaningEquals = function (codeMeaningName) {
|
|
551
|
+
return function (contentItem) {
|
|
552
|
+
return (contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName);
|
|
553
|
+
};
|
|
208
554
|
};
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Checks if a given content item's GraphicType property matches a specified value.
|
|
558
|
+
* @param {string} graphicType - The value to compare the content item's GraphicType property to.
|
|
559
|
+
* @returns {function} A function that takes a content item and returns a boolean indicating whether its GraphicType property matches the specified value.
|
|
560
|
+
*/
|
|
561
|
+
var graphicTypeEquals = function (graphicType) {
|
|
562
|
+
return function (contentItem) {
|
|
563
|
+
return contentItem && contentItem.GraphicType === graphicType;
|
|
564
|
+
};
|
|
213
565
|
};
|
|
214
566
|
|
|
567
|
+
var datasetToDict = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.datasetToDict;
|
|
568
|
+
/**
|
|
569
|
+
* Trigger file download from an array buffer
|
|
570
|
+
* @param bufferOrDataset - ArrayBuffer or DicomDataset
|
|
571
|
+
* @param filename - name of the file to download
|
|
572
|
+
*/
|
|
573
|
+
function downloadDICOMData(bufferOrDataset, filename) {
|
|
574
|
+
var blob;
|
|
575
|
+
if (bufferOrDataset instanceof ArrayBuffer) {
|
|
576
|
+
blob = new Blob([bufferOrDataset], { type: "application/dicom" });
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
if (!bufferOrDataset._meta) {
|
|
580
|
+
throw new Error("Dataset must have a _meta property");
|
|
581
|
+
}
|
|
582
|
+
var buffer = buffer__WEBPACK_IMPORTED_MODULE_1__/* .Buffer */ .lW.from(datasetToDict(bufferOrDataset).write());
|
|
583
|
+
blob = new Blob([buffer], { type: "application/dicom" });
|
|
584
|
+
}
|
|
585
|
+
var link = document.createElement("a");
|
|
586
|
+
link.href = window.URL.createObjectURL(blob);
|
|
587
|
+
link.download = filename;
|
|
588
|
+
link.click();
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
var index$1 = /*#__PURE__*/Object.freeze({
|
|
592
|
+
__proto__: null,
|
|
593
|
+
codeMeaningEquals: codeMeaningEquals,
|
|
594
|
+
downloadDICOMData: downloadDICOMData,
|
|
595
|
+
graphicTypeEquals: graphicTypeEquals,
|
|
596
|
+
toArray: toArray
|
|
597
|
+
});
|
|
598
|
+
|
|
215
599
|
var TID1500$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID1500,
|
|
216
600
|
addAccessors$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.addAccessors;
|
|
217
601
|
var StructuredReport$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.StructuredReport;
|
|
218
|
-
var Normalizer$
|
|
602
|
+
var Normalizer$4 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
219
603
|
var TID1500MeasurementReport$1 = TID1500$1.TID1500MeasurementReport,
|
|
220
604
|
TID1501MeasurementGroup$1 = TID1500$1.TID1501MeasurementGroup;
|
|
221
605
|
var DicomMetaDictionary$3 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMetaDictionary;
|
|
@@ -347,7 +731,7 @@ var MeasurementReport$1 = /*#__PURE__*/function () {
|
|
|
347
731
|
ReferencedSOPClassUID: sopCommonModule.sopClassUID,
|
|
348
732
|
ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
|
|
349
733
|
};
|
|
350
|
-
if (Normalizer$
|
|
734
|
+
if (Normalizer$4.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
|
|
351
735
|
ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
|
|
352
736
|
}
|
|
353
737
|
|
|
@@ -1181,80 +1565,353 @@ ArrowAnnotate$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentif
|
|
|
1181
1565
|
};
|
|
1182
1566
|
MeasurementReport$1.registerTool(ArrowAnnotate$1);
|
|
1183
1567
|
|
|
1184
|
-
var
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
var datasetToBlob$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.datasetToBlob,
|
|
1190
|
-
BitArray$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.BitArray,
|
|
1191
|
-
DicomMessage$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMessage,
|
|
1192
|
-
DicomMetaDictionary$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMetaDictionary;
|
|
1193
|
-
var Normalizer$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
1194
|
-
var SegmentationDerivation$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
|
|
1195
|
-
var Segmentation$3 = {
|
|
1196
|
-
generateSegmentation: generateSegmentation$2,
|
|
1197
|
-
generateToolState: generateToolState$2
|
|
1198
|
-
};
|
|
1199
|
-
|
|
1200
|
-
/**
|
|
1201
|
-
*
|
|
1202
|
-
* @typedef {Object} BrushData
|
|
1203
|
-
* @property {Object} toolState - The cornerstoneTools global toolState.
|
|
1204
|
-
* @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
|
|
1205
|
-
* seriesInstanceUid.
|
|
1206
|
-
*/
|
|
1207
|
-
|
|
1208
|
-
/**
|
|
1209
|
-
* generateSegmentation - Generates cornerstoneTools brush data, given a stack of
|
|
1210
|
-
* imageIds, images and the cornerstoneTools brushData.
|
|
1211
|
-
*
|
|
1212
|
-
* @param {object[]} images An array of the cornerstone image objects.
|
|
1213
|
-
* @param {BrushData} brushData and object containing the brushData.
|
|
1214
|
-
* @returns {type} description
|
|
1215
|
-
*/
|
|
1216
|
-
function generateSegmentation$2(images, brushData) {
|
|
1217
|
-
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
1218
|
-
includeSliceSpacing: true
|
|
1219
|
-
};
|
|
1220
|
-
var toolState = brushData.toolState,
|
|
1221
|
-
segments = brushData.segments;
|
|
1222
|
-
|
|
1223
|
-
// Calculate the dimensions of the data cube.
|
|
1224
|
-
var image0 = images[0];
|
|
1225
|
-
var dims = {
|
|
1226
|
-
x: image0.columns,
|
|
1227
|
-
y: image0.rows,
|
|
1228
|
-
z: images.length
|
|
1229
|
-
};
|
|
1230
|
-
dims.xy = dims.x * dims.y;
|
|
1231
|
-
var numSegments = _getSegCount(seg, segments);
|
|
1232
|
-
if (!numSegments) {
|
|
1233
|
-
throw new Error("No segments to export!");
|
|
1568
|
+
var TID300CobbAngle$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.CobbAngle;
|
|
1569
|
+
var COBB_ANGLE = "CobbAngle";
|
|
1570
|
+
var CobbAngle$1 = /*#__PURE__*/function () {
|
|
1571
|
+
function CobbAngle() {
|
|
1572
|
+
_classCallCheck(this, CobbAngle);
|
|
1234
1573
|
}
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1574
|
+
_createClass(CobbAngle, null, [{
|
|
1575
|
+
key: "getMeasurementData",
|
|
1576
|
+
value:
|
|
1577
|
+
// TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
|
|
1578
|
+
function getMeasurementData(MeasurementGroup) {
|
|
1579
|
+
var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
|
|
1580
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
1581
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
1582
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
1583
|
+
var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
|
|
1584
|
+
rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
1585
|
+
toolType: CobbAngle.toolType,
|
|
1586
|
+
handles: {
|
|
1587
|
+
start: {},
|
|
1588
|
+
end: {},
|
|
1589
|
+
start2: {
|
|
1590
|
+
highlight: true,
|
|
1591
|
+
drawnIndependently: true
|
|
1592
|
+
},
|
|
1593
|
+
end2: {
|
|
1594
|
+
highlight: true,
|
|
1595
|
+
drawnIndependently: true
|
|
1596
|
+
},
|
|
1597
|
+
textBox: {
|
|
1598
|
+
hasMoved: false,
|
|
1599
|
+
movesIndependently: false,
|
|
1600
|
+
drawnIndependently: true,
|
|
1601
|
+
allowedOutsideImage: true,
|
|
1602
|
+
hasBoundingBox: true
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1605
|
+
});
|
|
1606
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
|
|
1607
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
1608
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
1609
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[2];
|
|
1610
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[3];
|
|
1611
|
+
state.handles.start2.x = _SCOORDGroup$GraphicD[4];
|
|
1612
|
+
state.handles.start2.y = _SCOORDGroup$GraphicD[5];
|
|
1613
|
+
state.handles.end2.x = _SCOORDGroup$GraphicD[6];
|
|
1614
|
+
state.handles.end2.y = _SCOORDGroup$GraphicD[7];
|
|
1615
|
+
return state;
|
|
1616
|
+
}
|
|
1617
|
+
}, {
|
|
1618
|
+
key: "getTID300RepresentationArguments",
|
|
1619
|
+
value: function getTID300RepresentationArguments(tool) {
|
|
1620
|
+
var handles = tool.handles,
|
|
1621
|
+
finding = tool.finding,
|
|
1622
|
+
findingSites = tool.findingSites;
|
|
1623
|
+
var point1 = handles.start;
|
|
1624
|
+
var point2 = handles.end;
|
|
1625
|
+
var point3 = handles.start2;
|
|
1626
|
+
var point4 = handles.end2;
|
|
1627
|
+
var rAngle = tool.rAngle;
|
|
1628
|
+
var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:CobbAngle";
|
|
1629
|
+
return {
|
|
1630
|
+
point1: point1,
|
|
1631
|
+
point2: point2,
|
|
1632
|
+
point3: point3,
|
|
1633
|
+
point4: point4,
|
|
1634
|
+
rAngle: rAngle,
|
|
1635
|
+
trackingIdentifierTextValue: trackingIdentifierTextValue,
|
|
1636
|
+
finding: finding,
|
|
1637
|
+
findingSites: findingSites || []
|
|
1638
|
+
};
|
|
1639
|
+
}
|
|
1640
|
+
}]);
|
|
1641
|
+
return CobbAngle;
|
|
1642
|
+
}();
|
|
1643
|
+
CobbAngle$1.toolType = COBB_ANGLE;
|
|
1644
|
+
CobbAngle$1.utilityToolType = COBB_ANGLE;
|
|
1645
|
+
CobbAngle$1.TID300Representation = TID300CobbAngle$2;
|
|
1646
|
+
CobbAngle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
1647
|
+
if (!TrackingIdentifier.includes(":")) {
|
|
1648
|
+
return false;
|
|
1243
1649
|
}
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1650
|
+
var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
|
|
1651
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
1652
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
1653
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
1654
|
+
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
1655
|
+
return false;
|
|
1656
|
+
}
|
|
1657
|
+
return toolType === COBB_ANGLE;
|
|
1658
|
+
};
|
|
1659
|
+
MeasurementReport$1.registerTool(CobbAngle$1);
|
|
1660
|
+
|
|
1661
|
+
var TID300Angle = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Angle;
|
|
1662
|
+
var ANGLE = "Angle";
|
|
1663
|
+
var Angle$1 = /*#__PURE__*/function () {
|
|
1664
|
+
function Angle() {
|
|
1665
|
+
_classCallCheck(this, Angle);
|
|
1666
|
+
}
|
|
1667
|
+
_createClass(Angle, null, [{
|
|
1668
|
+
key: "getMeasurementData",
|
|
1669
|
+
value:
|
|
1670
|
+
/**
|
|
1671
|
+
* Generate TID300 measurement data for a plane angle measurement - use a Angle, but label it as Angle
|
|
1672
|
+
*/
|
|
1673
|
+
function getMeasurementData(MeasurementGroup) {
|
|
1674
|
+
var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
|
|
1675
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
1676
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
1677
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
1678
|
+
var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
|
|
1679
|
+
rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
1680
|
+
toolType: Angle.toolType,
|
|
1681
|
+
handles: {
|
|
1682
|
+
start: {},
|
|
1683
|
+
middle: {},
|
|
1684
|
+
end: {},
|
|
1685
|
+
textBox: {
|
|
1686
|
+
hasMoved: false,
|
|
1687
|
+
movesIndependently: false,
|
|
1688
|
+
drawnIndependently: true,
|
|
1689
|
+
allowedOutsideImage: true,
|
|
1690
|
+
hasBoundingBox: true
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
});
|
|
1694
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
|
|
1695
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
1696
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
1697
|
+
state.handles.middle.x = _SCOORDGroup$GraphicD[2];
|
|
1698
|
+
state.handles.middle.y = _SCOORDGroup$GraphicD[3];
|
|
1699
|
+
state.handles.middle.x = _SCOORDGroup$GraphicD[4];
|
|
1700
|
+
state.handles.middle.y = _SCOORDGroup$GraphicD[5];
|
|
1701
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[6];
|
|
1702
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[7];
|
|
1703
|
+
return state;
|
|
1704
|
+
}
|
|
1705
|
+
}, {
|
|
1706
|
+
key: "getTID300RepresentationArguments",
|
|
1707
|
+
value: function getTID300RepresentationArguments(tool) {
|
|
1708
|
+
var handles = tool.handles,
|
|
1709
|
+
finding = tool.finding,
|
|
1710
|
+
findingSites = tool.findingSites;
|
|
1711
|
+
var point1 = handles.start;
|
|
1712
|
+
var point2 = handles.middle;
|
|
1713
|
+
var point3 = handles.middle;
|
|
1714
|
+
var point4 = handles.end;
|
|
1715
|
+
var rAngle = tool.rAngle;
|
|
1716
|
+
var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:Angle";
|
|
1717
|
+
return {
|
|
1718
|
+
point1: point1,
|
|
1719
|
+
point2: point2,
|
|
1720
|
+
point3: point3,
|
|
1721
|
+
point4: point4,
|
|
1722
|
+
rAngle: rAngle,
|
|
1723
|
+
trackingIdentifierTextValue: trackingIdentifierTextValue,
|
|
1724
|
+
finding: finding,
|
|
1725
|
+
findingSites: findingSites || []
|
|
1726
|
+
};
|
|
1727
|
+
}
|
|
1728
|
+
}]);
|
|
1729
|
+
return Angle;
|
|
1730
|
+
}();
|
|
1731
|
+
Angle$1.toolType = ANGLE;
|
|
1732
|
+
Angle$1.utilityToolType = ANGLE;
|
|
1733
|
+
Angle$1.TID300Representation = TID300Angle;
|
|
1734
|
+
Angle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
1735
|
+
if (!TrackingIdentifier.includes(":")) {
|
|
1736
|
+
return false;
|
|
1737
|
+
}
|
|
1738
|
+
var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
|
|
1739
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
1740
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
1741
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
1742
|
+
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
1743
|
+
return false;
|
|
1744
|
+
}
|
|
1745
|
+
return toolType === ANGLE;
|
|
1746
|
+
};
|
|
1747
|
+
MeasurementReport$1.registerTool(Angle$1);
|
|
1748
|
+
|
|
1749
|
+
var TID300Polyline$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Polyline;
|
|
1750
|
+
var RectangleRoi = /*#__PURE__*/function () {
|
|
1751
|
+
function RectangleRoi() {
|
|
1752
|
+
_classCallCheck(this, RectangleRoi);
|
|
1753
|
+
}
|
|
1754
|
+
_createClass(RectangleRoi, null, [{
|
|
1755
|
+
key: "getMeasurementData",
|
|
1756
|
+
value: function getMeasurementData(MeasurementGroup) {
|
|
1757
|
+
var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
|
|
1758
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
1759
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
|
|
1760
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup;
|
|
1761
|
+
var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
|
|
1762
|
+
toolType: RectangleRoi.toolType,
|
|
1763
|
+
handles: {
|
|
1764
|
+
start: {},
|
|
1765
|
+
end: {},
|
|
1766
|
+
textBox: {
|
|
1767
|
+
active: false,
|
|
1768
|
+
hasMoved: false,
|
|
1769
|
+
movesIndependently: false,
|
|
1770
|
+
drawnIndependently: true,
|
|
1771
|
+
allowedOutsideImage: true,
|
|
1772
|
+
hasBoundingBox: true
|
|
1773
|
+
},
|
|
1774
|
+
initialRotation: 0
|
|
1775
|
+
},
|
|
1776
|
+
cachedStats: {
|
|
1777
|
+
area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0
|
|
1778
|
+
},
|
|
1779
|
+
color: undefined,
|
|
1780
|
+
invalidated: true
|
|
1781
|
+
});
|
|
1782
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
|
|
1783
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
1784
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
1785
|
+
_SCOORDGroup$GraphicD[2];
|
|
1786
|
+
_SCOORDGroup$GraphicD[3];
|
|
1787
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[4];
|
|
1788
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[5];
|
|
1789
|
+
return state;
|
|
1790
|
+
}
|
|
1791
|
+
}, {
|
|
1792
|
+
key: "getTID300RepresentationArguments",
|
|
1793
|
+
value: function getTID300RepresentationArguments(tool) {
|
|
1794
|
+
var finding = tool.finding,
|
|
1795
|
+
findingSites = tool.findingSites,
|
|
1796
|
+
_tool$cachedStats = tool.cachedStats,
|
|
1797
|
+
cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
|
|
1798
|
+
handles = tool.handles;
|
|
1799
|
+
var start = handles.start,
|
|
1800
|
+
end = handles.end;
|
|
1801
|
+
var points = [start, {
|
|
1802
|
+
x: start.x,
|
|
1803
|
+
y: end.y
|
|
1804
|
+
}, end, {
|
|
1805
|
+
x: end.x,
|
|
1806
|
+
y: start.y
|
|
1807
|
+
}];
|
|
1808
|
+
var area = cachedStats.area,
|
|
1809
|
+
perimeter = cachedStats.perimeter;
|
|
1810
|
+
var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:RectangleRoi";
|
|
1811
|
+
return {
|
|
1812
|
+
points: points,
|
|
1813
|
+
area: area,
|
|
1814
|
+
perimeter: perimeter,
|
|
1815
|
+
trackingIdentifierTextValue: trackingIdentifierTextValue,
|
|
1816
|
+
finding: finding,
|
|
1817
|
+
findingSites: findingSites || []
|
|
1818
|
+
};
|
|
1819
|
+
}
|
|
1820
|
+
}]);
|
|
1821
|
+
return RectangleRoi;
|
|
1822
|
+
}();
|
|
1823
|
+
RectangleRoi.toolType = "RectangleRoi";
|
|
1824
|
+
RectangleRoi.utilityToolType = "RectangleRoi";
|
|
1825
|
+
RectangleRoi.TID300Representation = TID300Polyline$2;
|
|
1826
|
+
RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
1827
|
+
if (!TrackingIdentifier.includes(":")) {
|
|
1828
|
+
return false;
|
|
1829
|
+
}
|
|
1830
|
+
var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
|
|
1831
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
1832
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
1833
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
1834
|
+
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
1835
|
+
return false;
|
|
1836
|
+
}
|
|
1837
|
+
return toolType === RectangleRoi.toolType;
|
|
1838
|
+
};
|
|
1839
|
+
MeasurementReport$1.registerTool(RectangleRoi);
|
|
1840
|
+
|
|
1841
|
+
var _utilities$orientatio$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.orientation,
|
|
1842
|
+
rotateDirectionCosinesInPlane$1 = _utilities$orientatio$1.rotateDirectionCosinesInPlane,
|
|
1843
|
+
flipIOP$1 = _utilities$orientatio$1.flipImageOrientationPatient,
|
|
1844
|
+
flipMatrix2D$1 = _utilities$orientatio$1.flipMatrix2D,
|
|
1845
|
+
rotateMatrix902D$1 = _utilities$orientatio$1.rotateMatrix902D;
|
|
1846
|
+
var datasetToBlob = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.datasetToBlob,
|
|
1847
|
+
BitArray$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.BitArray,
|
|
1848
|
+
DicomMessage$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMessage,
|
|
1849
|
+
DicomMetaDictionary$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMetaDictionary;
|
|
1850
|
+
var Normalizer$3 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
1851
|
+
var SegmentationDerivation$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
|
|
1852
|
+
var Segmentation$5 = {
|
|
1853
|
+
generateSegmentation: generateSegmentation$3,
|
|
1854
|
+
generateToolState: generateToolState$3
|
|
1855
|
+
};
|
|
1856
|
+
|
|
1857
|
+
/**
|
|
1858
|
+
*
|
|
1859
|
+
* @typedef {Object} BrushData
|
|
1860
|
+
* @property {Object} toolState - The cornerstoneTools global toolState.
|
|
1861
|
+
* @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
|
|
1862
|
+
* seriesInstanceUid.
|
|
1863
|
+
*/
|
|
1864
|
+
|
|
1865
|
+
/**
|
|
1866
|
+
* generateSegmentation - Generates cornerstoneTools brush data, given a stack of
|
|
1867
|
+
* imageIds, images and the cornerstoneTools brushData.
|
|
1868
|
+
*
|
|
1869
|
+
* @param {object[]} images An array of the cornerstone image objects.
|
|
1870
|
+
* @param {BrushData} brushData and object containing the brushData.
|
|
1871
|
+
* @returns {type} description
|
|
1872
|
+
*/
|
|
1873
|
+
function generateSegmentation$3(images, brushData) {
|
|
1874
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
1875
|
+
includeSliceSpacing: true
|
|
1876
|
+
};
|
|
1877
|
+
var toolState = brushData.toolState,
|
|
1878
|
+
segments = brushData.segments;
|
|
1879
|
+
|
|
1880
|
+
// Calculate the dimensions of the data cube.
|
|
1881
|
+
var image0 = images[0];
|
|
1882
|
+
var dims = {
|
|
1883
|
+
x: image0.columns,
|
|
1884
|
+
y: image0.rows,
|
|
1885
|
+
z: images.length
|
|
1886
|
+
};
|
|
1887
|
+
dims.xy = dims.x * dims.y;
|
|
1888
|
+
var numSegments = _getSegCount(seg, segments);
|
|
1889
|
+
if (!numSegments) {
|
|
1890
|
+
throw new Error("No segments to export!");
|
|
1891
|
+
}
|
|
1892
|
+
var isMultiframe = image0.imageId.includes("?frame");
|
|
1893
|
+
var seg = _createSegFromImages$1(images, isMultiframe, options);
|
|
1894
|
+
var _getNumberOfFramesPer = _getNumberOfFramesPerSegment(toolState, images, segments),
|
|
1895
|
+
referencedFramesPerSegment = _getNumberOfFramesPer.referencedFramesPerSegment,
|
|
1896
|
+
segmentIndicies = _getNumberOfFramesPer.segmentIndicies;
|
|
1897
|
+
var NumberOfFrames = 0;
|
|
1898
|
+
for (var i = 0; i < referencedFramesPerSegment.length; i++) {
|
|
1899
|
+
NumberOfFrames += referencedFramesPerSegment[i].length;
|
|
1900
|
+
}
|
|
1901
|
+
seg.setNumberOfFrames(NumberOfFrames);
|
|
1902
|
+
for (var _i = 0; _i < segmentIndicies.length; _i++) {
|
|
1903
|
+
var segmentIndex = segmentIndicies[_i];
|
|
1904
|
+
var referencedFrameIndicies = referencedFramesPerSegment[_i];
|
|
1905
|
+
|
|
1906
|
+
// Frame numbers start from 1.
|
|
1907
|
+
var referencedFrameNumbers = referencedFrameIndicies.map(function (element) {
|
|
1908
|
+
return element + 1;
|
|
1909
|
+
});
|
|
1910
|
+
var segment = segments[segmentIndex];
|
|
1911
|
+
seg.addSegment(segment, _extractCornerstoneToolsPixelData(segmentIndex, referencedFrameIndicies, toolState, images, dims), referencedFrameNumbers);
|
|
1255
1912
|
}
|
|
1256
1913
|
seg.bitPackPixelData();
|
|
1257
|
-
var segBlob = datasetToBlob
|
|
1914
|
+
var segBlob = datasetToBlob(seg.dataset);
|
|
1258
1915
|
return segBlob;
|
|
1259
1916
|
}
|
|
1260
1917
|
function _extractCornerstoneToolsPixelData(segmentIndex, referencedFrames, toolState, images, dims) {
|
|
@@ -1332,8 +1989,8 @@ function _createSegFromImages$1(images, isMultiframe, options) {
|
|
|
1332
1989
|
datasets.push(_dataset);
|
|
1333
1990
|
}
|
|
1334
1991
|
}
|
|
1335
|
-
var multiframe = Normalizer$
|
|
1336
|
-
return new SegmentationDerivation$
|
|
1992
|
+
var multiframe = Normalizer$3.normalizeToDataset(datasets);
|
|
1993
|
+
return new SegmentationDerivation$2([multiframe], options);
|
|
1337
1994
|
}
|
|
1338
1995
|
|
|
1339
1996
|
/**
|
|
@@ -1346,11 +2003,11 @@ function _createSegFromImages$1(images, isMultiframe, options) {
|
|
|
1346
2003
|
* @returns {Object} The toolState and an object from which the
|
|
1347
2004
|
* segment metadata can be derived.
|
|
1348
2005
|
*/
|
|
1349
|
-
function generateToolState$
|
|
2006
|
+
function generateToolState$3(imageIds, arrayBuffer, metadataProvider) {
|
|
1350
2007
|
var dicomData = DicomMessage$1.readFile(arrayBuffer);
|
|
1351
2008
|
var dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
|
|
1352
2009
|
dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
|
|
1353
|
-
var multiframe = Normalizer$
|
|
2010
|
+
var multiframe = Normalizer$3.normalizeToDataset([dataset]);
|
|
1354
2011
|
var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
1355
2012
|
if (!imagePlaneModule) {
|
|
1356
2013
|
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
@@ -1370,7 +2027,7 @@ function generateToolState$2(imageIds, arrayBuffer, metadataProvider) {
|
|
|
1370
2027
|
for (var i = 0; i < PerFrameFunctionalGroupsSequence.length; i++) {
|
|
1371
2028
|
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
|
|
1372
2029
|
var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
1373
|
-
var pixelDataI2D =
|
|
2030
|
+
var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength), [multiframe.Rows, multiframe.Columns]);
|
|
1374
2031
|
var alignedPixelDataI = alignPixelDataWithSourceData$1(pixelDataI2D, ImageOrientationPatientI, validOrientations);
|
|
1375
2032
|
if (!alignedPixelDataI) {
|
|
1376
2033
|
console.warn("This segmentation object is not in-plane with the source data. Bailing out of IO. It'd be better to render this with vtkjs. ");
|
|
@@ -1465,7 +2122,7 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
|
|
|
1465
2122
|
function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
|
|
1466
2123
|
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
1467
2124
|
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
1468
|
-
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance
|
|
2125
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
|
|
1469
2126
|
}
|
|
1470
2127
|
|
|
1471
2128
|
/**
|
|
@@ -1478,7 +2135,7 @@ function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider
|
|
|
1478
2135
|
* from the cornerstone imageIds.
|
|
1479
2136
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
1480
2137
|
*/
|
|
1481
|
-
function getImageIdOfReferencedSingleFramedSOPInstance
|
|
2138
|
+
function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds, metadataProvider) {
|
|
1482
2139
|
return imageIds.find(function (imageId) {
|
|
1483
2140
|
var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
1484
2141
|
if (!sopCommonModule) {
|
|
@@ -1604,26 +2261,37 @@ function getSegmentMetadata$1(multiframe) {
|
|
|
1604
2261
|
};
|
|
1605
2262
|
}
|
|
1606
2263
|
|
|
1607
|
-
|
|
1608
|
-
|
|
2264
|
+
/**
|
|
2265
|
+
* Cornerstone adapters events
|
|
2266
|
+
*/
|
|
2267
|
+
var Events;
|
|
2268
|
+
(function (Events) {
|
|
2269
|
+
/**
|
|
2270
|
+
* Cornerstone segmentation load progress event
|
|
2271
|
+
*/
|
|
2272
|
+
Events["SEGMENTATION_LOAD_PROGRESS"] = "CORNERSTONE_ADAPTER_SEGMENTATION_LOAD_PROGRESS";
|
|
2273
|
+
})(Events || (Events = {}));
|
|
2274
|
+
var Events$1 = Events;
|
|
2275
|
+
|
|
2276
|
+
var index = /*#__PURE__*/Object.freeze({
|
|
2277
|
+
__proto__: null,
|
|
2278
|
+
Events: Events$1
|
|
2279
|
+
});
|
|
2280
|
+
|
|
2281
|
+
var _utilities$orientatio = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.orientation,
|
|
2282
|
+
rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
|
|
1609
2283
|
flipIOP = _utilities$orientatio.flipImageOrientationPatient,
|
|
1610
2284
|
flipMatrix2D = _utilities$orientatio.flipMatrix2D,
|
|
1611
2285
|
rotateMatrix902D = _utilities$orientatio.rotateMatrix902D,
|
|
1612
2286
|
nearlyEqual = _utilities$orientatio.nearlyEqual;
|
|
1613
|
-
var
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
var
|
|
1618
|
-
var SegmentationDerivation = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
|
|
2287
|
+
var BitArray$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.BitArray,
|
|
2288
|
+
DicomMessage = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMessage,
|
|
2289
|
+
DicomMetaDictionary$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMetaDictionary;
|
|
2290
|
+
var Normalizer$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
2291
|
+
var SegmentationDerivation$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
|
|
1619
2292
|
var _utilities$compressio = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.compression,
|
|
1620
2293
|
encode = _utilities$compressio.encode,
|
|
1621
2294
|
decode = _utilities$compressio.decode;
|
|
1622
|
-
var Segmentation$2 = {
|
|
1623
|
-
generateSegmentation: generateSegmentation$1,
|
|
1624
|
-
generateToolState: generateToolState$1,
|
|
1625
|
-
fillSegmentation: fillSegmentation$1
|
|
1626
|
-
};
|
|
1627
2295
|
|
|
1628
2296
|
/**
|
|
1629
2297
|
*
|
|
@@ -1632,10 +2300,9 @@ var Segmentation$2 = {
|
|
|
1632
2300
|
* @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
|
|
1633
2301
|
* seriesInstanceUid.
|
|
1634
2302
|
*/
|
|
1635
|
-
|
|
1636
2303
|
var generateSegmentationDefaultOptions = {
|
|
1637
2304
|
includeSliceSpacing: true,
|
|
1638
|
-
rleEncode:
|
|
2305
|
+
rleEncode: false
|
|
1639
2306
|
};
|
|
1640
2307
|
|
|
1641
2308
|
/**
|
|
@@ -1648,7 +2315,7 @@ var generateSegmentationDefaultOptions = {
|
|
|
1648
2315
|
* @param {Object} userOptions Options to pass to the segmentation derivation and `fillSegmentation`.
|
|
1649
2316
|
* @returns {Blob}
|
|
1650
2317
|
*/
|
|
1651
|
-
function generateSegmentation$
|
|
2318
|
+
function generateSegmentation$2(images, inputLabelmaps3D) {
|
|
1652
2319
|
var userOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
1653
2320
|
var isMultiframe = images[0].imageId.includes("?frame");
|
|
1654
2321
|
var segmentation = _createSegFromImages(images, isMultiframe, userOptions);
|
|
@@ -1656,12 +2323,13 @@ function generateSegmentation$1(images, inputLabelmaps3D) {
|
|
|
1656
2323
|
}
|
|
1657
2324
|
|
|
1658
2325
|
/**
|
|
1659
|
-
*
|
|
2326
|
+
* Fills a given segmentation object with data from the input labelmaps3D
|
|
1660
2327
|
*
|
|
1661
|
-
* @param
|
|
1662
|
-
* @param
|
|
1663
|
-
* @param
|
|
1664
|
-
*
|
|
2328
|
+
* @param segmentation - The segmentation object to be filled.
|
|
2329
|
+
* @param inputLabelmaps3D - An array of 3D labelmaps, or a single 3D labelmap.
|
|
2330
|
+
* @param userOptions - Optional configuration settings. Will override the default options.
|
|
2331
|
+
*
|
|
2332
|
+
* @returns {object} The filled segmentation object.
|
|
1665
2333
|
*/
|
|
1666
2334
|
function fillSegmentation$1(segmentation, inputLabelmaps3D) {
|
|
1667
2335
|
var userOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
@@ -1714,7 +2382,7 @@ function fillSegmentation$1(segmentation, inputLabelmaps3D) {
|
|
|
1714
2382
|
return element + 1;
|
|
1715
2383
|
});
|
|
1716
2384
|
var segmentMetadata = metadata[segmentIndex];
|
|
1717
|
-
var labelmaps =
|
|
2385
|
+
var labelmaps = _getLabelmapsFromReferencedFrameIndicies(labelmap3D, referencedFrameIndicies);
|
|
1718
2386
|
segmentation.addSegmentFromLabelmap(segmentMetadata, labelmaps, segmentIndex, referencedFrameNumbers);
|
|
1719
2387
|
}
|
|
1720
2388
|
}
|
|
@@ -1743,10 +2411,9 @@ function fillSegmentation$1(segmentation, inputLabelmaps3D) {
|
|
|
1743
2411
|
// If no rleEncoding, at least bitpack the data.
|
|
1744
2412
|
segmentation.bitPackPixelData();
|
|
1745
2413
|
}
|
|
1746
|
-
|
|
1747
|
-
return segBlob;
|
|
2414
|
+
return segmentation;
|
|
1748
2415
|
}
|
|
1749
|
-
function
|
|
2416
|
+
function _getLabelmapsFromReferencedFrameIndicies(labelmap3D, referencedFrameIndicies) {
|
|
1750
2417
|
var labelmaps2D = labelmap3D.labelmaps2D;
|
|
1751
2418
|
var labelmaps = [];
|
|
1752
2419
|
for (var i = 0; i < referencedFrameIndicies.length; i++) {
|
|
@@ -1782,8 +2449,8 @@ function _createSegFromImages(images, isMultiframe, options) {
|
|
|
1782
2449
|
datasets.push(_dataset);
|
|
1783
2450
|
}
|
|
1784
2451
|
}
|
|
1785
|
-
var multiframe = Normalizer$
|
|
1786
|
-
return new SegmentationDerivation([multiframe], options);
|
|
2452
|
+
var multiframe = Normalizer$2.normalizeToDataset(datasets);
|
|
2453
|
+
return new SegmentationDerivation$1([multiframe], options);
|
|
1787
2454
|
}
|
|
1788
2455
|
|
|
1789
2456
|
/**
|
|
@@ -1793,8 +2460,7 @@ function _createSegFromImages(images, isMultiframe, options) {
|
|
|
1793
2460
|
* @param {string[]} imageIds - An array of the imageIds.
|
|
1794
2461
|
* @param {ArrayBuffer} arrayBuffer - The SEG arrayBuffer.
|
|
1795
2462
|
* @param {*} metadataProvider.
|
|
1796
|
-
* @param {
|
|
1797
|
-
* @param {number} tolerance - default value 1.e-3.
|
|
2463
|
+
* @param {obj} options - Options object.
|
|
1798
2464
|
*
|
|
1799
2465
|
* @return {[]ArrayBuffer}a list of array buffer for each labelMap
|
|
1800
2466
|
* @return {Object} an object from which the segment metadata can be derived
|
|
@@ -1802,83 +2468,9 @@ function _createSegFromImages(images, isMultiframe, options) {
|
|
|
1802
2468
|
* @return {[][][]} 3D list containing the track of segments per frame for each labelMap
|
|
1803
2469
|
* (available only for the overlapping case).
|
|
1804
2470
|
*/
|
|
1805
|
-
function generateToolState$
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
var dicomData = DicomMessage.readFile(arrayBuffer);
|
|
1809
|
-
var dataset = DicomMetaDictionary$1.naturalizeDataset(dicomData.dict);
|
|
1810
|
-
dataset._meta = DicomMetaDictionary$1.namifyDataset(dicomData.meta);
|
|
1811
|
-
var multiframe = Normalizer$1.normalizeToDataset([dataset]);
|
|
1812
|
-
var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
1813
|
-
var generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
|
|
1814
|
-
var SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
1815
|
-
if (!imagePlaneModule) {
|
|
1816
|
-
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
1817
|
-
}
|
|
1818
|
-
var ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [].concat(_toConsumableArray(imagePlaneModule.rowCosines), _toConsumableArray(imagePlaneModule.columnCosines)) : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z];
|
|
1819
|
-
|
|
1820
|
-
// Get IOP from ref series, compute supported orientations:
|
|
1821
|
-
var validOrientations = getValidOrientations(ImageOrientationPatient);
|
|
1822
|
-
var sliceLength = multiframe.Columns * multiframe.Rows;
|
|
1823
|
-
var segMetadata = getSegmentMetadata(multiframe, SeriesInstanceUID);
|
|
1824
|
-
var TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];
|
|
1825
|
-
var pixelData;
|
|
1826
|
-
if (TransferSyntaxUID === "1.2.840.10008.1.2.5") {
|
|
1827
|
-
var rleEncodedFrames = Array.isArray(multiframe.PixelData) ? multiframe.PixelData : [multiframe.PixelData];
|
|
1828
|
-
pixelData = decode(rleEncodedFrames, multiframe.Rows, multiframe.Columns);
|
|
1829
|
-
if (multiframe.BitsStored === 1) {
|
|
1830
|
-
console.warn("No implementation for rle + bitbacking.");
|
|
1831
|
-
return;
|
|
1832
|
-
}
|
|
1833
|
-
} else {
|
|
1834
|
-
pixelData = unpackPixelData(multiframe);
|
|
1835
|
-
if (!pixelData) {
|
|
1836
|
-
throw new Error("Fractional segmentations are not yet supported");
|
|
1837
|
-
}
|
|
1838
|
-
}
|
|
1839
|
-
var orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
|
|
1840
|
-
var overlapping = false;
|
|
1841
|
-
if (!skipOverlapping) {
|
|
1842
|
-
overlapping = checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance);
|
|
1843
|
-
}
|
|
1844
|
-
var insertFunction;
|
|
1845
|
-
switch (orientation) {
|
|
1846
|
-
case "Planar":
|
|
1847
|
-
if (overlapping) {
|
|
1848
|
-
insertFunction = insertOverlappingPixelDataPlanar;
|
|
1849
|
-
} else {
|
|
1850
|
-
insertFunction = insertPixelDataPlanar;
|
|
1851
|
-
}
|
|
1852
|
-
break;
|
|
1853
|
-
case "Perpendicular":
|
|
1854
|
-
//insertFunction = insertPixelDataPerpendicular;
|
|
1855
|
-
throw new Error("Segmentations orthogonal to the acquisition plane of the source data are not yet supported.");
|
|
1856
|
-
case "Oblique":
|
|
1857
|
-
throw new Error("Segmentations oblique to the acquisition plane of the source data are not yet supported.");
|
|
1858
|
-
}
|
|
1859
|
-
|
|
1860
|
-
/* if SEGs are overlapping:
|
|
1861
|
-
1) the labelmapBuffer will contain M volumes which have non-overlapping segments;
|
|
1862
|
-
2) segmentsOnFrame will have M * numberOfFrames values to track in which labelMap are the segments;
|
|
1863
|
-
3) insertFunction will return the number of LabelMaps
|
|
1864
|
-
4) generateToolState return is an array*/
|
|
1865
|
-
|
|
1866
|
-
var segmentsOnFrameArray = [];
|
|
1867
|
-
segmentsOnFrameArray[0] = [];
|
|
1868
|
-
var segmentsOnFrame = [];
|
|
1869
|
-
var arrayBufferLength = sliceLength * imageIds.length * 2; // 2 bytes per label voxel in cst4.
|
|
1870
|
-
var labelmapBufferArray = [];
|
|
1871
|
-
labelmapBufferArray[0] = new ArrayBuffer(arrayBufferLength);
|
|
1872
|
-
insertFunction(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance);
|
|
1873
|
-
return {
|
|
1874
|
-
labelmapBufferArray: labelmapBufferArray,
|
|
1875
|
-
segMetadata: segMetadata,
|
|
1876
|
-
segmentsOnFrame: segmentsOnFrame,
|
|
1877
|
-
segmentsOnFrameArray: segmentsOnFrameArray
|
|
1878
|
-
};
|
|
1879
|
-
}
|
|
1880
|
-
|
|
1881
|
-
// function insertPixelDataPerpendicular(
|
|
2471
|
+
function generateToolState$2(_x, _x2, _x3, _x4) {
|
|
2472
|
+
return _generateToolState.apply(this, arguments);
|
|
2473
|
+
} // function insertPixelDataPerpendicular(
|
|
1882
2474
|
// segmentsOnFrame,
|
|
1883
2475
|
// labelmapBuffer,
|
|
1884
2476
|
// pixelData,
|
|
@@ -1893,30 +2485,23 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
|
1893
2485
|
// Rows,
|
|
1894
2486
|
// Columns
|
|
1895
2487
|
// } = multiframe;
|
|
1896
|
-
|
|
1897
2488
|
// const firstImagePlaneModule = metadataProvider.get(
|
|
1898
2489
|
// "imagePlaneModule",
|
|
1899
2490
|
// imageIds[0]
|
|
1900
2491
|
// );
|
|
1901
|
-
|
|
1902
2492
|
// const lastImagePlaneModule = metadataProvider.get(
|
|
1903
2493
|
// "imagePlaneModule",
|
|
1904
2494
|
// imageIds[imageIds.length - 1]
|
|
1905
2495
|
// );
|
|
1906
|
-
|
|
1907
2496
|
// console.log(firstImagePlaneModule);
|
|
1908
2497
|
// console.log(lastImagePlaneModule);
|
|
1909
|
-
|
|
1910
2498
|
// const corners = [
|
|
1911
2499
|
// ...getCorners(firstImagePlaneModule),
|
|
1912
2500
|
// ...getCorners(lastImagePlaneModule)
|
|
1913
2501
|
// ];
|
|
1914
|
-
|
|
1915
2502
|
// console.log(`corners:`);
|
|
1916
2503
|
// console.log(corners);
|
|
1917
|
-
|
|
1918
2504
|
// const indexToWorld = mat4.create();
|
|
1919
|
-
|
|
1920
2505
|
// const ippFirstFrame = firstImagePlaneModule.imagePositionPatient;
|
|
1921
2506
|
// const rowCosines = Array.isArray(firstImagePlaneModule.rowCosines)
|
|
1922
2507
|
// ? [...firstImagePlaneModule.rowCosines]
|
|
@@ -1925,7 +2510,6 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
|
1925
2510
|
// firstImagePlaneModule.rowCosines.y,
|
|
1926
2511
|
// firstImagePlaneModule.rowCosines.z
|
|
1927
2512
|
// ];
|
|
1928
|
-
|
|
1929
2513
|
// const columnCosines = Array.isArray(firstImagePlaneModule.columnCosines)
|
|
1930
2514
|
// ? [...firstImagePlaneModule.columnCosines]
|
|
1931
2515
|
// : [
|
|
@@ -1933,9 +2517,7 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
|
1933
2517
|
// firstImagePlaneModule.columnCosines.y,
|
|
1934
2518
|
// firstImagePlaneModule.columnCosines.z
|
|
1935
2519
|
// ];
|
|
1936
|
-
|
|
1937
2520
|
// const { pixelSpacing } = firstImagePlaneModule;
|
|
1938
|
-
|
|
1939
2521
|
// mat4.set(
|
|
1940
2522
|
// indexToWorld,
|
|
1941
2523
|
// // Column 1
|
|
@@ -1959,50 +2541,36 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
|
1959
2541
|
// 0,
|
|
1960
2542
|
// 1
|
|
1961
2543
|
// );
|
|
1962
|
-
|
|
1963
2544
|
// // TODO -> Get origin and (x,y,z) increments to build a translation matrix:
|
|
1964
2545
|
// // TODO -> Equation C.7.6.2.1-1
|
|
1965
|
-
|
|
1966
2546
|
// // | cx*di rx* Xx 0 | |x|
|
|
1967
2547
|
// // | cy*di ry Xy 0 | |y|
|
|
1968
2548
|
// // | cz*di rz Xz 0 | |z|
|
|
1969
2549
|
// // | tx ty tz 1 | |1|
|
|
1970
|
-
|
|
1971
2550
|
// // const [
|
|
1972
2551
|
// // 0, 0 , 0 , 0,
|
|
1973
2552
|
// // 0, 0 , 0 , 0,
|
|
1974
2553
|
// // 0, 0 , 0 , 0,
|
|
1975
2554
|
// // ipp[0], ipp[1] , ipp[2] , 1,
|
|
1976
2555
|
// // ]
|
|
1977
|
-
|
|
1978
2556
|
// // Each frame:
|
|
1979
|
-
|
|
1980
2557
|
// // Find which corner the first voxel lines up with (one of 8 corners.)
|
|
1981
|
-
|
|
1982
2558
|
// // Find how i,j,k orient with respect to source volume.
|
|
1983
2559
|
// // Go through each frame, find location in source to start, and whether to increment +/ix,+/-y,+/-z
|
|
1984
2560
|
// // through each voxel.
|
|
1985
|
-
|
|
1986
2561
|
// // [1,0,0,0,1,0]
|
|
1987
|
-
|
|
1988
2562
|
// // const [
|
|
1989
|
-
|
|
1990
2563
|
// // ]
|
|
1991
|
-
|
|
1992
2564
|
// // Invert transformation matrix to get worldToIndex
|
|
1993
|
-
|
|
1994
2565
|
// // Apply world to index on each point to fill up the matrix.
|
|
1995
|
-
|
|
1996
2566
|
// // const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence
|
|
1997
2567
|
// // ? SharedFunctionalGroupsSequence.PlaneOrientationSequence
|
|
1998
2568
|
// // .ImageOrientationPatient
|
|
1999
2569
|
// // : undefined;
|
|
2000
2570
|
// // const sliceLength = Columns * Rows;
|
|
2001
2571
|
// }
|
|
2002
|
-
|
|
2003
2572
|
// function getCorners(imagePlaneModule) {
|
|
2004
2573
|
// // console.log(imagePlaneModule);
|
|
2005
|
-
|
|
2006
2574
|
// const {
|
|
2007
2575
|
// rows,
|
|
2008
2576
|
// columns,
|
|
@@ -2012,22 +2580,18 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
|
2012
2580
|
// rowPixelSpacing,
|
|
2013
2581
|
// columnPixelSpacing
|
|
2014
2582
|
// } = imagePlaneModule;
|
|
2015
|
-
|
|
2016
2583
|
// const rowLength = columns * columnPixelSpacing;
|
|
2017
2584
|
// const columnLength = rows * rowPixelSpacing;
|
|
2018
|
-
|
|
2019
2585
|
// const entireRowVector = [
|
|
2020
2586
|
// rowLength * columnCosines[0],
|
|
2021
2587
|
// rowLength * columnCosines[1],
|
|
2022
2588
|
// rowLength * columnCosines[2]
|
|
2023
2589
|
// ];
|
|
2024
|
-
|
|
2025
2590
|
// const entireColumnVector = [
|
|
2026
2591
|
// columnLength * rowCosines[0],
|
|
2027
2592
|
// columnLength * rowCosines[1],
|
|
2028
2593
|
// columnLength * rowCosines[2]
|
|
2029
2594
|
// ];
|
|
2030
|
-
|
|
2031
2595
|
// const topLeft = [ipp[0], ipp[1], ipp[2]];
|
|
2032
2596
|
// const topRight = [
|
|
2033
2597
|
// topLeft[0] + entireRowVector[0],
|
|
@@ -2039,29 +2603,160 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
|
2039
2603
|
// topLeft[1] + entireColumnVector[1],
|
|
2040
2604
|
// topLeft[2] + entireColumnVector[2]
|
|
2041
2605
|
// ];
|
|
2042
|
-
|
|
2043
2606
|
// const bottomRight = [
|
|
2044
2607
|
// bottomLeft[0] + entireRowVector[0],
|
|
2045
2608
|
// bottomLeft[1] + entireRowVector[1],
|
|
2046
2609
|
// bottomLeft[2] + entireRowVector[2]
|
|
2047
2610
|
// ];
|
|
2048
|
-
|
|
2049
2611
|
// return [topLeft, topRight, bottomLeft, bottomRight];
|
|
2050
2612
|
// }
|
|
2051
|
-
|
|
2052
2613
|
/**
|
|
2053
2614
|
* Find the reference frame of the segmentation frame in the source data.
|
|
2054
2615
|
*
|
|
2055
2616
|
* @param {Object} multiframe dicom metadata
|
|
2056
2617
|
* @param {Int} frameSegment frame dicom index
|
|
2057
2618
|
* @param {String[]} imageIds A list of imageIds.
|
|
2058
|
-
* @param {Object}
|
|
2059
|
-
* metadata from imageIds.
|
|
2619
|
+
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUID to imageId
|
|
2060
2620
|
* @param {Float} tolerance The tolerance parameter
|
|
2061
2621
|
*
|
|
2062
2622
|
* @returns {String} Returns the imageId
|
|
2063
2623
|
*/
|
|
2064
|
-
function
|
|
2624
|
+
function _generateToolState() {
|
|
2625
|
+
_generateToolState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider, options) {
|
|
2626
|
+
var _options$skipOverlapp, skipOverlapping, _options$tolerance, tolerance, _options$TypedArrayCo, TypedArrayConstructor, _options$maxBytesPerC, maxBytesPerChunk, eventTarget, triggerEvent, dicomData, dataset, multiframe, imagePlaneModule, generalSeriesModule, SeriesInstanceUID, ImageOrientationPatient, validOrientations, sliceLength, segMetadata, TransferSyntaxUID, pixelData, pixelDataChunks, rleEncodedFrames, orientation, sopUIDImageIdIndexMap, overlapping, insertFunction, segmentsOnFrameArray, segmentsOnFrame, arrayBufferLength, labelmapBufferArray, imageIdMaps, segmentsPixelIndices, centroidXYZ;
|
|
2627
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
2628
|
+
while (1) switch (_context.prev = _context.next) {
|
|
2629
|
+
case 0:
|
|
2630
|
+
_options$skipOverlapp = options.skipOverlapping, skipOverlapping = _options$skipOverlapp === void 0 ? false : _options$skipOverlapp, _options$tolerance = options.tolerance, tolerance = _options$tolerance === void 0 ? 1e-3 : _options$tolerance, _options$TypedArrayCo = options.TypedArrayConstructor, TypedArrayConstructor = _options$TypedArrayCo === void 0 ? Uint8Array : _options$TypedArrayCo, _options$maxBytesPerC = options.maxBytesPerChunk, maxBytesPerChunk = _options$maxBytesPerC === void 0 ? 199000000 : _options$maxBytesPerC, eventTarget = options.eventTarget, triggerEvent = options.triggerEvent;
|
|
2631
|
+
dicomData = DicomMessage.readFile(arrayBuffer);
|
|
2632
|
+
dataset = DicomMetaDictionary$1.naturalizeDataset(dicomData.dict);
|
|
2633
|
+
dataset._meta = DicomMetaDictionary$1.namifyDataset(dicomData.meta);
|
|
2634
|
+
multiframe = Normalizer$2.normalizeToDataset([dataset]);
|
|
2635
|
+
imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
|
|
2636
|
+
generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
|
|
2637
|
+
SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
|
|
2638
|
+
if (!imagePlaneModule) {
|
|
2639
|
+
console.warn("Insufficient metadata, imagePlaneModule missing.");
|
|
2640
|
+
}
|
|
2641
|
+
ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [].concat(_toConsumableArray(imagePlaneModule.rowCosines), _toConsumableArray(imagePlaneModule.columnCosines)) : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z]; // Get IOP from ref series, compute supported orientations:
|
|
2642
|
+
validOrientations = getValidOrientations(ImageOrientationPatient);
|
|
2643
|
+
sliceLength = multiframe.Columns * multiframe.Rows;
|
|
2644
|
+
segMetadata = getSegmentMetadata(multiframe, SeriesInstanceUID);
|
|
2645
|
+
TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];
|
|
2646
|
+
if (!(TransferSyntaxUID === "1.2.840.10008.1.2.5")) {
|
|
2647
|
+
_context.next = 23;
|
|
2648
|
+
break;
|
|
2649
|
+
}
|
|
2650
|
+
rleEncodedFrames = Array.isArray(multiframe.PixelData) ? multiframe.PixelData : [multiframe.PixelData];
|
|
2651
|
+
pixelData = decode(rleEncodedFrames, multiframe.Rows, multiframe.Columns);
|
|
2652
|
+
if (!(multiframe.BitsStored === 1)) {
|
|
2653
|
+
_context.next = 20;
|
|
2654
|
+
break;
|
|
2655
|
+
}
|
|
2656
|
+
console.warn("No implementation for rle + bitbacking.");
|
|
2657
|
+
return _context.abrupt("return");
|
|
2658
|
+
case 20:
|
|
2659
|
+
// Todo: need to test this with rle data
|
|
2660
|
+
pixelDataChunks = [pixelData];
|
|
2661
|
+
_context.next = 26;
|
|
2662
|
+
break;
|
|
2663
|
+
case 23:
|
|
2664
|
+
pixelDataChunks = unpackPixelData(multiframe, {
|
|
2665
|
+
maxBytesPerChunk: maxBytesPerChunk
|
|
2666
|
+
});
|
|
2667
|
+
if (pixelDataChunks) {
|
|
2668
|
+
_context.next = 26;
|
|
2669
|
+
break;
|
|
2670
|
+
}
|
|
2671
|
+
throw new Error("Fractional segmentations are not yet supported");
|
|
2672
|
+
case 26:
|
|
2673
|
+
orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance); // Pre-compute the sop UID to imageId index map so that in the for loop
|
|
2674
|
+
// we don't have to call metadataProvider.get() for each imageId over
|
|
2675
|
+
// and over again.
|
|
2676
|
+
sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
|
|
2677
|
+
var _metadataProvider$get = metadataProvider.get("generalImageModule", imageId),
|
|
2678
|
+
sopInstanceUid = _metadataProvider$get.sopInstanceUid;
|
|
2679
|
+
acc[sopInstanceUid] = imageId;
|
|
2680
|
+
return acc;
|
|
2681
|
+
}, {});
|
|
2682
|
+
overlapping = false;
|
|
2683
|
+
if (!skipOverlapping) {
|
|
2684
|
+
overlapping = checkSEGsOverlapping(pixelDataChunks, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, sopUIDImageIdIndexMap);
|
|
2685
|
+
}
|
|
2686
|
+
_context.t0 = orientation;
|
|
2687
|
+
_context.next = _context.t0 === "Planar" ? 33 : _context.t0 === "Perpendicular" ? 35 : _context.t0 === "Oblique" ? 36 : 37;
|
|
2688
|
+
break;
|
|
2689
|
+
case 33:
|
|
2690
|
+
if (overlapping) {
|
|
2691
|
+
insertFunction = insertOverlappingPixelDataPlanar;
|
|
2692
|
+
} else {
|
|
2693
|
+
insertFunction = insertPixelDataPlanar;
|
|
2694
|
+
}
|
|
2695
|
+
return _context.abrupt("break", 37);
|
|
2696
|
+
case 35:
|
|
2697
|
+
throw new Error("Segmentations orthogonal to the acquisition plane of the source data are not yet supported.");
|
|
2698
|
+
case 36:
|
|
2699
|
+
throw new Error("Segmentations oblique to the acquisition plane of the source data are not yet supported.");
|
|
2700
|
+
case 37:
|
|
2701
|
+
/* if SEGs are overlapping:
|
|
2702
|
+
1) the labelmapBuffer will contain M volumes which have non-overlapping segments;
|
|
2703
|
+
2) segmentsOnFrame will have M * numberOfFrames values to track in which labelMap are the segments;
|
|
2704
|
+
3) insertFunction will return the number of LabelMaps
|
|
2705
|
+
4) generateToolState return is an array*/
|
|
2706
|
+
segmentsOnFrameArray = [];
|
|
2707
|
+
segmentsOnFrameArray[0] = [];
|
|
2708
|
+
segmentsOnFrame = [];
|
|
2709
|
+
arrayBufferLength = sliceLength * imageIds.length * TypedArrayConstructor.BYTES_PER_ELEMENT;
|
|
2710
|
+
labelmapBufferArray = [];
|
|
2711
|
+
labelmapBufferArray[0] = new ArrayBuffer(arrayBufferLength);
|
|
2712
|
+
|
|
2713
|
+
// Precompute the indices and metadata so that we don't have to call
|
|
2714
|
+
// a function for each imageId in the for loop.
|
|
2715
|
+
imageIdMaps = imageIds.reduce(function (acc, curr, index) {
|
|
2716
|
+
acc.indices[curr] = index;
|
|
2717
|
+
acc.metadata[curr] = metadataProvider.get("instance", curr);
|
|
2718
|
+
return acc;
|
|
2719
|
+
}, {
|
|
2720
|
+
indices: {},
|
|
2721
|
+
metadata: {}
|
|
2722
|
+
}); // This is the centroid calculation for each segment Index, the data structure
|
|
2723
|
+
// is a Map with key = segmentIndex and value = {imageIdIndex: centroid, ...}
|
|
2724
|
+
// later on we will use this data structure to calculate the centroid of the
|
|
2725
|
+
// segment in the labelmapBuffer
|
|
2726
|
+
segmentsPixelIndices = new Map();
|
|
2727
|
+
_context.next = 47;
|
|
2728
|
+
return insertFunction(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelDataChunks, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent);
|
|
2729
|
+
case 47:
|
|
2730
|
+
// calculate the centroid of each segment
|
|
2731
|
+
centroidXYZ = new Map();
|
|
2732
|
+
segmentsPixelIndices.forEach(function (imageIdIndexBufferIndex, segmentIndex) {
|
|
2733
|
+
var _calculateCentroid = calculateCentroid(imageIdIndexBufferIndex, multiframe),
|
|
2734
|
+
xAcc = _calculateCentroid.xAcc,
|
|
2735
|
+
yAcc = _calculateCentroid.yAcc,
|
|
2736
|
+
zAcc = _calculateCentroid.zAcc,
|
|
2737
|
+
count = _calculateCentroid.count;
|
|
2738
|
+
centroidXYZ.set(segmentIndex, {
|
|
2739
|
+
x: Math.floor(xAcc / count),
|
|
2740
|
+
y: Math.floor(yAcc / count),
|
|
2741
|
+
z: Math.floor(zAcc / count)
|
|
2742
|
+
});
|
|
2743
|
+
});
|
|
2744
|
+
return _context.abrupt("return", {
|
|
2745
|
+
labelmapBufferArray: labelmapBufferArray,
|
|
2746
|
+
segMetadata: segMetadata,
|
|
2747
|
+
segmentsOnFrame: segmentsOnFrame,
|
|
2748
|
+
segmentsOnFrameArray: segmentsOnFrameArray,
|
|
2749
|
+
centroids: centroidXYZ
|
|
2750
|
+
});
|
|
2751
|
+
case 50:
|
|
2752
|
+
case "end":
|
|
2753
|
+
return _context.stop();
|
|
2754
|
+
}
|
|
2755
|
+
}, _callee);
|
|
2756
|
+
}));
|
|
2757
|
+
return _generateToolState.apply(this, arguments);
|
|
2758
|
+
}
|
|
2759
|
+
function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
|
|
2065
2760
|
var imageId = undefined;
|
|
2066
2761
|
if (!multiframe) {
|
|
2067
2762
|
return imageId;
|
|
@@ -2101,7 +2796,7 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
2101
2796
|
}
|
|
2102
2797
|
}
|
|
2103
2798
|
if (frameSourceImageSequence) {
|
|
2104
|
-
imageId =
|
|
2799
|
+
imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
|
|
2105
2800
|
}
|
|
2106
2801
|
if (imageId === undefined && ReferencedSeriesSequence) {
|
|
2107
2802
|
var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
|
|
@@ -2116,7 +2811,7 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
|
|
|
2116
2811
|
* @returns {boolean} Returns a flag if segmentations overlapping
|
|
2117
2812
|
*/
|
|
2118
2813
|
|
|
2119
|
-
function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance) {
|
|
2814
|
+
function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, sopUIDImageIdIndexMap) {
|
|
2120
2815
|
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
2121
2816
|
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
2122
2817
|
SegmentSequence = multiframe.SegmentSequence,
|
|
@@ -2143,7 +2838,7 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
|
|
|
2143
2838
|
console.warn("Could not retrieve the segment index for frame segment " + frameSegment + ", skipping this frame.");
|
|
2144
2839
|
return "continue";
|
|
2145
2840
|
}
|
|
2146
|
-
var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance);
|
|
2841
|
+
var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2147
2842
|
if (!imageId) {
|
|
2148
2843
|
console.warn("Image not present in stack, can't import frame : " + frameSegment + ".");
|
|
2149
2844
|
return "continue";
|
|
@@ -2171,12 +2866,13 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
|
|
|
2171
2866
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
2172
2867
|
var _step$value = _slicedToArray(_step.value, 2),
|
|
2173
2868
|
role = _step$value[1];
|
|
2174
|
-
var temp2DArray = new
|
|
2869
|
+
var temp2DArray = new TypedArrayConstructor(sliceLength).fill(0);
|
|
2175
2870
|
for (var i = 0; i < role.length; ++i) {
|
|
2176
2871
|
var _frameSegment = role[i];
|
|
2177
2872
|
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_frameSegment];
|
|
2178
2873
|
var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
2179
|
-
var
|
|
2874
|
+
var view = readFromUnpackedChunks(pixelData, _frameSegment * sliceLength, sliceLength);
|
|
2875
|
+
var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(view, [Rows, Columns]);
|
|
2180
2876
|
var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
|
|
2181
2877
|
if (!alignedPixelDataI) {
|
|
2182
2878
|
console.warn("Individual SEG frames are out of plane with respect to the first SEG frame, this is not yet supported, skipping this frame.");
|
|
@@ -2200,15 +2896,14 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
|
|
|
2200
2896
|
}
|
|
2201
2897
|
return false;
|
|
2202
2898
|
}
|
|
2203
|
-
function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance) {
|
|
2899
|
+
function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap) {
|
|
2204
2900
|
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
2205
2901
|
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
2206
2902
|
Rows = multiframe.Rows,
|
|
2207
2903
|
Columns = multiframe.Columns;
|
|
2208
2904
|
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
2209
2905
|
var sliceLength = Columns * Rows;
|
|
2210
|
-
var arrayBufferLength = sliceLength * imageIds.length *
|
|
2211
|
-
|
|
2906
|
+
var arrayBufferLength = sliceLength * imageIds.length * TypedArrayConstructor.BYTES_PER_ELEMENT;
|
|
2212
2907
|
// indicate the number of labelMaps
|
|
2213
2908
|
var M = 1;
|
|
2214
2909
|
|
|
@@ -2219,7 +2914,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
|
|
|
2219
2914
|
var tempBuffer = labelmapBufferArray[m].slice(0);
|
|
2220
2915
|
|
|
2221
2916
|
// temp list for checking overlaps
|
|
2222
|
-
var tempSegmentsOnFrame =
|
|
2917
|
+
var tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(segmentsOnFrameArray[m]);
|
|
2223
2918
|
|
|
2224
2919
|
/** split overlapping SEGs algorithm for each segment:
|
|
2225
2920
|
* A) copy the labelmapBuffer in the array with index 0
|
|
@@ -2241,12 +2936,17 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
|
|
|
2241
2936
|
return "continue";
|
|
2242
2937
|
}
|
|
2243
2938
|
var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
2244
|
-
|
|
2939
|
+
|
|
2940
|
+
// Since we moved to the chunks approach, we need to read the data
|
|
2941
|
+
// and handle scenarios where the portion of data is in one chunk
|
|
2942
|
+
// and the other portion is in another chunk
|
|
2943
|
+
var view = readFromUnpackedChunks(pixelData, _i2 * sliceLength, sliceLength);
|
|
2944
|
+
var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(view, [Rows, Columns]);
|
|
2245
2945
|
var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
|
|
2246
2946
|
if (!alignedPixelDataI) {
|
|
2247
2947
|
throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. " + "This is not yet supported. Aborting segmentation loading.");
|
|
2248
2948
|
}
|
|
2249
|
-
var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance);
|
|
2949
|
+
var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
2250
2950
|
if (!imageId) {
|
|
2251
2951
|
console.warn("Image not present in stack, can't import frame : " + _i2 + ".");
|
|
2252
2952
|
i = _i2;
|
|
@@ -2259,9 +2959,8 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
|
|
|
2259
2959
|
var imageIdIndex = imageIds.findIndex(function (element) {
|
|
2260
2960
|
return element === imageId;
|
|
2261
2961
|
});
|
|
2262
|
-
var byteOffset = sliceLength *
|
|
2263
|
-
|
|
2264
|
-
var labelmap2DView = new Uint16Array(tempBuffer, byteOffset, sliceLength);
|
|
2962
|
+
var byteOffset = sliceLength * imageIdIndex * TypedArrayConstructor.BYTES_PER_ELEMENT;
|
|
2963
|
+
var labelmap2DView = new TypedArrayConstructor(tempBuffer, byteOffset, sliceLength);
|
|
2265
2964
|
var data = alignedPixelDataI.data;
|
|
2266
2965
|
var segmentOnFrame = false;
|
|
2267
2966
|
for (var j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {
|
|
@@ -2274,7 +2973,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
|
|
|
2274
2973
|
M++;
|
|
2275
2974
|
}
|
|
2276
2975
|
tempBuffer = labelmapBufferArray[m].slice(0);
|
|
2277
|
-
tempSegmentsOnFrame =
|
|
2976
|
+
tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(segmentsOnFrameArray[m]);
|
|
2278
2977
|
_i2 = 0;
|
|
2279
2978
|
break;
|
|
2280
2979
|
} else {
|
|
@@ -2300,12 +2999,12 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
|
|
|
2300
2999
|
if (_ret2 === "continue") continue;
|
|
2301
3000
|
}
|
|
2302
3001
|
labelmapBufferArray[m] = tempBuffer.slice(0);
|
|
2303
|
-
segmentsOnFrameArray[m] =
|
|
3002
|
+
segmentsOnFrameArray[m] = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(tempSegmentsOnFrame);
|
|
2304
3003
|
|
|
2305
3004
|
// reset temp variables/buffers for new segment
|
|
2306
3005
|
m = 0;
|
|
2307
3006
|
tempBuffer = labelmapBufferArray[m].slice(0);
|
|
2308
|
-
tempSegmentsOnFrame =
|
|
3007
|
+
tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(segmentsOnFrameArray[m]);
|
|
2309
3008
|
}
|
|
2310
3009
|
}
|
|
2311
3010
|
var getSegmentIndex = function getSegmentIndex(multiframe, frame) {
|
|
@@ -2314,60 +3013,93 @@ var getSegmentIndex = function getSegmentIndex(multiframe, frame) {
|
|
|
2314
3013
|
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];
|
|
2315
3014
|
return PerFrameFunctionalGroups && PerFrameFunctionalGroups.SegmentIdentificationSequence ? PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber : SharedFunctionalGroupsSequence.SegmentIdentificationSequence ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence.ReferencedSegmentNumber : undefined;
|
|
2316
3015
|
};
|
|
2317
|
-
function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance) {
|
|
3016
|
+
function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
|
|
2318
3017
|
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
2319
3018
|
PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
|
|
2320
3019
|
Rows = multiframe.Rows,
|
|
2321
3020
|
Columns = multiframe.Columns;
|
|
2322
3021
|
var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
|
|
2323
3022
|
var sliceLength = Columns * Rows;
|
|
2324
|
-
var
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
}
|
|
2345
|
-
var imageIdIndex = imageIds.findIndex(function (element) {
|
|
2346
|
-
return element === imageId;
|
|
2347
|
-
});
|
|
2348
|
-
var byteOffset = sliceLength * 2 * imageIdIndex; // 2 bytes/pixel
|
|
2349
|
-
|
|
2350
|
-
var labelmap2DView = new Uint16Array(labelmapBufferArray[0], byteOffset, sliceLength);
|
|
2351
|
-
var data = alignedPixelDataI.data;
|
|
2352
|
-
for (var j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {
|
|
2353
|
-
if (data[j]) {
|
|
2354
|
-
for (var x = j; x < len; ++x) {
|
|
2355
|
-
if (data[x]) {
|
|
2356
|
-
labelmap2DView[x] = segmentIndex;
|
|
2357
|
-
}
|
|
3023
|
+
var i = 0;
|
|
3024
|
+
var groupsLen = PerFrameFunctionalGroupsSequence.length;
|
|
3025
|
+
var chunkSize = Math.ceil(groupsLen / 10); // 10% of total length
|
|
3026
|
+
|
|
3027
|
+
var shouldTriggerEvent = triggerEvent && eventTarget;
|
|
3028
|
+
|
|
3029
|
+
// Below, we chunk the processing of the frames to avoid blocking the main thread
|
|
3030
|
+
// if the segmentation is large. We also use a promise to allow the caller to
|
|
3031
|
+
// wait for the processing to finish.
|
|
3032
|
+
return new Promise(function (resolve) {
|
|
3033
|
+
function processInChunks() {
|
|
3034
|
+
// process one chunk
|
|
3035
|
+
for (var end = Math.min(i + chunkSize, groupsLen); i < end; ++i) {
|
|
3036
|
+
var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
|
|
3037
|
+
var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
|
|
3038
|
+
var view = readFromUnpackedChunks(pixelData, i * sliceLength, sliceLength);
|
|
3039
|
+
var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(view, [Rows, Columns]);
|
|
3040
|
+
var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
|
|
3041
|
+
if (!alignedPixelDataI) {
|
|
3042
|
+
throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. " + "This is not yet supported. Aborting segmentation loading.");
|
|
2358
3043
|
}
|
|
2359
|
-
|
|
2360
|
-
|
|
3044
|
+
var segmentIndex = getSegmentIndex(multiframe, i);
|
|
3045
|
+
if (segmentIndex === undefined) {
|
|
3046
|
+
throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");
|
|
2361
3047
|
}
|
|
2362
|
-
|
|
2363
|
-
|
|
3048
|
+
if (!segmentsPixelIndices.has(segmentIndex)) {
|
|
3049
|
+
segmentsPixelIndices.set(segmentIndex, {});
|
|
3050
|
+
}
|
|
3051
|
+
var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
|
|
3052
|
+
if (!imageId) {
|
|
3053
|
+
console.warn("Image not present in stack, can't import frame : " + i + ".");
|
|
3054
|
+
continue;
|
|
3055
|
+
}
|
|
3056
|
+
var sourceImageMetadata = imageIdMaps.metadata[imageId];
|
|
3057
|
+
if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
|
|
3058
|
+
throw new Error("Individual SEG frames have different geometry dimensions (Rows and Columns) " + "respect to the source image reference frame. This is not yet supported. " + "Aborting segmentation loading. ");
|
|
3059
|
+
}
|
|
3060
|
+
var imageIdIndex = imageIdMaps.indices[imageId];
|
|
3061
|
+
var byteOffset = sliceLength * imageIdIndex * TypedArrayConstructor.BYTES_PER_ELEMENT;
|
|
3062
|
+
var labelmap2DView = new TypedArrayConstructor(labelmapBufferArray[0], byteOffset, sliceLength);
|
|
3063
|
+
var data = alignedPixelDataI.data;
|
|
3064
|
+
var indexCache = [];
|
|
3065
|
+
for (var j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {
|
|
3066
|
+
if (data[j]) {
|
|
3067
|
+
for (var x = j; x < len; ++x) {
|
|
3068
|
+
if (data[x]) {
|
|
3069
|
+
labelmap2DView[x] = segmentIndex;
|
|
3070
|
+
indexCache.push(x);
|
|
3071
|
+
}
|
|
3072
|
+
}
|
|
3073
|
+
if (!segmentsOnFrame[imageIdIndex]) {
|
|
3074
|
+
segmentsOnFrame[imageIdIndex] = [];
|
|
3075
|
+
}
|
|
3076
|
+
segmentsOnFrame[imageIdIndex].push(segmentIndex);
|
|
3077
|
+
break;
|
|
3078
|
+
}
|
|
3079
|
+
}
|
|
3080
|
+
var segmentIndexObject = segmentsPixelIndices.get(segmentIndex);
|
|
3081
|
+
segmentIndexObject[imageIdIndex] = indexCache;
|
|
3082
|
+
segmentsPixelIndices.set(segmentIndex, segmentIndexObject);
|
|
3083
|
+
}
|
|
3084
|
+
|
|
3085
|
+
// trigger an event after each chunk
|
|
3086
|
+
if (shouldTriggerEvent) {
|
|
3087
|
+
var percentComplete = Math.round(i / groupsLen * 100);
|
|
3088
|
+
triggerEvent(eventTarget, Events$1.SEGMENTATION_LOAD_PROGRESS, {
|
|
3089
|
+
percentComplete: percentComplete
|
|
3090
|
+
});
|
|
3091
|
+
}
|
|
3092
|
+
|
|
3093
|
+
// schedule next chunk
|
|
3094
|
+
if (i < groupsLen) {
|
|
3095
|
+
setTimeout(processInChunks, 0);
|
|
3096
|
+
} else {
|
|
3097
|
+
// resolve the Promise when all chunks have been processed
|
|
3098
|
+
resolve();
|
|
2364
3099
|
}
|
|
2365
3100
|
}
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
var _ret3 = _loop5();
|
|
2369
|
-
if (_ret3 === "continue") continue;
|
|
2370
|
-
}
|
|
3101
|
+
processInChunks();
|
|
3102
|
+
});
|
|
2371
3103
|
}
|
|
2372
3104
|
function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
|
|
2373
3105
|
var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
|
|
@@ -2406,12 +3138,13 @@ function checkIfPerpendicular(iop1, iop2, tolerance) {
|
|
|
2406
3138
|
}
|
|
2407
3139
|
|
|
2408
3140
|
/**
|
|
2409
|
-
* unpackPixelData - Unpacks
|
|
3141
|
+
* unpackPixelData - Unpacks bit packed pixelData if the Segmentation is BINARY.
|
|
2410
3142
|
*
|
|
2411
3143
|
* @param {Object} multiframe The multiframe dataset.
|
|
3144
|
+
* @param {Object} options Options for the unpacking.
|
|
2412
3145
|
* @return {Uint8Array} The unpacked pixelData.
|
|
2413
3146
|
*/
|
|
2414
|
-
function unpackPixelData(multiframe) {
|
|
3147
|
+
function unpackPixelData(multiframe, options) {
|
|
2415
3148
|
var segType = multiframe.SegmentationType;
|
|
2416
3149
|
var data;
|
|
2417
3150
|
if (Array.isArray(multiframe.PixelData)) {
|
|
@@ -2423,7 +3156,10 @@ function unpackPixelData(multiframe) {
|
|
|
2423
3156
|
dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .log */ .cM.error("This segmentation pixeldata is undefined.");
|
|
2424
3157
|
}
|
|
2425
3158
|
if (segType === "BINARY") {
|
|
2426
|
-
|
|
3159
|
+
// For extreme big data, we can't unpack the data at once and we need to
|
|
3160
|
+
// chunk it and unpack each chunk separately.
|
|
3161
|
+
// MAX 2GB is the limit right now to allocate a buffer
|
|
3162
|
+
return getUnpackedChunks(data, options.maxBytesPerChunk);
|
|
2427
3163
|
}
|
|
2428
3164
|
var pixelData = new Uint8Array(data);
|
|
2429
3165
|
var max = multiframe.MaximumFractionalValue;
|
|
@@ -2437,20 +3173,35 @@ function unpackPixelData(multiframe) {
|
|
|
2437
3173
|
dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .log */ .cM.warn("This segmentation object is actually binary... processing as such.");
|
|
2438
3174
|
return pixelData;
|
|
2439
3175
|
}
|
|
3176
|
+
function getUnpackedChunks(data, maxBytesPerChunk) {
|
|
3177
|
+
var bitArray = new Uint8Array(data);
|
|
3178
|
+
var chunks = [];
|
|
3179
|
+
var maxBitsPerChunk = maxBytesPerChunk * 8;
|
|
3180
|
+
var numberOfChunks = Math.ceil(bitArray.length * 8 / maxBitsPerChunk);
|
|
3181
|
+
for (var i = 0; i < numberOfChunks; i++) {
|
|
3182
|
+
var startBit = i * maxBitsPerChunk;
|
|
3183
|
+
var endBit = Math.min(startBit + maxBitsPerChunk, bitArray.length * 8);
|
|
3184
|
+
var startByte = Math.floor(startBit / 8);
|
|
3185
|
+
var endByte = Math.ceil(endBit / 8);
|
|
3186
|
+
var chunk = bitArray.slice(startByte, endByte);
|
|
3187
|
+
var unpackedChunk = BitArray$1.unpack(chunk);
|
|
3188
|
+
chunks.push(unpackedChunk);
|
|
3189
|
+
}
|
|
3190
|
+
return chunks;
|
|
3191
|
+
}
|
|
2440
3192
|
|
|
2441
3193
|
/**
|
|
2442
|
-
*
|
|
3194
|
+
* getImageIdOfSourceImageBySourceImageSequence - Returns the Cornerstone imageId of the source image.
|
|
2443
3195
|
*
|
|
2444
3196
|
* @param {Object} SourceImageSequence Sequence describing the source image.
|
|
2445
3197
|
* @param {String[]} imageIds A list of imageIds.
|
|
2446
|
-
* @param {Object}
|
|
2447
|
-
* metadata from imageIds.
|
|
3198
|
+
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
2448
3199
|
* @return {String} The corresponding imageId.
|
|
2449
3200
|
*/
|
|
2450
|
-
function
|
|
3201
|
+
function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
|
|
2451
3202
|
var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
|
|
2452
3203
|
ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
|
|
2453
|
-
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber,
|
|
3204
|
+
return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
2454
3205
|
}
|
|
2455
3206
|
|
|
2456
3207
|
/**
|
|
@@ -2460,7 +3211,7 @@ function getImageIdOfSourceImagebySourceImageSequence(SourceImageSequence, image
|
|
|
2460
3211
|
* @param {String} FrameOfReferenceUID Frame of reference.
|
|
2461
3212
|
* @param {Object} PerFrameFunctionalGroup Sequence describing segmentation reference attributes per frame.
|
|
2462
3213
|
* @param {String[]} imageIds A list of imageIds.
|
|
2463
|
-
* @param {Object}
|
|
3214
|
+
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
2464
3215
|
* @param {Float} tolerance The tolerance parameter
|
|
2465
3216
|
*
|
|
2466
3217
|
* @return {String} The corresponding imageId.
|
|
@@ -2480,26 +3231,6 @@ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfR
|
|
|
2480
3231
|
}
|
|
2481
3232
|
}
|
|
2482
3233
|
|
|
2483
|
-
/**
|
|
2484
|
-
* getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId
|
|
2485
|
-
* corresponding to the specified sopInstanceUid for single-frame images.
|
|
2486
|
-
*
|
|
2487
|
-
* @param {String} sopInstanceUid The sopInstanceUid of the desired image.
|
|
2488
|
-
* @param {String[]} imageIds The list of imageIds.
|
|
2489
|
-
* @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids
|
|
2490
|
-
* from the cornerstone imageIds.
|
|
2491
|
-
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
2492
|
-
*/
|
|
2493
|
-
function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds, metadataProvider) {
|
|
2494
|
-
return imageIds.find(function (imageId) {
|
|
2495
|
-
var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
|
|
2496
|
-
if (!sopCommonModule) {
|
|
2497
|
-
return;
|
|
2498
|
-
}
|
|
2499
|
-
return sopCommonModule.sopInstanceUID === sopInstanceUid;
|
|
2500
|
-
});
|
|
2501
|
-
}
|
|
2502
|
-
|
|
2503
3234
|
/**
|
|
2504
3235
|
* getImageIdOfReferencedFrame - Returns the imageId corresponding to the
|
|
2505
3236
|
* specified sopInstanceUid and frameNumber for multi-frame images.
|
|
@@ -2507,23 +3238,16 @@ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds,
|
|
|
2507
3238
|
* @param {String} sopInstanceUid The sopInstanceUid of the desired image.
|
|
2508
3239
|
* @param {Number} frameNumber The frame number.
|
|
2509
3240
|
* @param {String} imageIds The list of imageIds.
|
|
2510
|
-
* @param {Object}
|
|
2511
|
-
* from the cornerstone imageIds.
|
|
3241
|
+
* @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
|
|
2512
3242
|
* @return {String} The imageId that corresponds to the sopInstanceUid.
|
|
2513
3243
|
*/
|
|
2514
|
-
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber,
|
|
2515
|
-
var imageId =
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
return (
|
|
2522
|
-
//frameNumber is zero indexed for cornerstoneDICOMImageLoader image Ids.
|
|
2523
|
-
sopCommonModule.sopInstanceUID === sopInstanceUid && imageIdFrameNumber === frameNumber - 1
|
|
2524
|
-
);
|
|
2525
|
-
});
|
|
2526
|
-
return imageId;
|
|
3244
|
+
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
3245
|
+
var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
3246
|
+
if (!imageId) {
|
|
3247
|
+
return;
|
|
3248
|
+
}
|
|
3249
|
+
var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
|
|
3250
|
+
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
2527
3251
|
}
|
|
2528
3252
|
|
|
2529
3253
|
/**
|
|
@@ -2604,397 +3328,228 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations, tolerance)
|
|
|
2604
3328
|
* compareArrays - Returns true if array1 and array2 are equal
|
|
2605
3329
|
* within a tolerance.
|
|
2606
3330
|
*
|
|
2607
|
-
* @param {Number[]} array1 - An array.
|
|
2608
|
-
* @param {Number[]} array2 - An array.
|
|
2609
|
-
* @param {Number} tolerance.
|
|
2610
|
-
* @return {Boolean} True if array1 and array2 are equal.
|
|
2611
|
-
*/
|
|
2612
|
-
function compareArrays(array1, array2, tolerance) {
|
|
2613
|
-
if (array1.length != array2.length) {
|
|
2614
|
-
return false;
|
|
2615
|
-
}
|
|
2616
|
-
for (var i = 0; i < array1.length; ++i) {
|
|
2617
|
-
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
2618
|
-
return false;
|
|
2619
|
-
}
|
|
2620
|
-
}
|
|
2621
|
-
return true;
|
|
2622
|
-
}
|
|
2623
|
-
function getSegmentMetadata(multiframe, seriesInstanceUid) {
|
|
2624
|
-
var segmentSequence = multiframe.SegmentSequence;
|
|
2625
|
-
var data = [];
|
|
2626
|
-
if (Array.isArray(segmentSequence)) {
|
|
2627
|
-
data = [undefined].concat(_toConsumableArray(segmentSequence));
|
|
2628
|
-
} else {
|
|
2629
|
-
// Only one segment, will be stored as an object.
|
|
2630
|
-
data = [undefined, segmentSequence];
|
|
2631
|
-
}
|
|
2632
|
-
return {
|
|
2633
|
-
seriesInstanceUid: seriesInstanceUid,
|
|
2634
|
-
data: data
|
|
2635
|
-
};
|
|
2636
|
-
}
|
|
2637
|
-
|
|
2638
|
-
var Segmentation$1 = {
|
|
2639
|
-
generateSegmentation: generateSegmentation,
|
|
2640
|
-
generateToolState: generateToolState,
|
|
2641
|
-
fillSegmentation: fillSegmentation
|
|
2642
|
-
};
|
|
2643
|
-
|
|
2644
|
-
/**
|
|
2645
|
-
* generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
|
|
2646
|
-
*
|
|
2647
|
-
* @param {object[]} images An array of the cornerstone image objects.
|
|
2648
|
-
* @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.
|
|
2649
|
-
* For 3.X: the BrushData.
|
|
2650
|
-
* @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.
|
|
2651
|
-
* @returns {Object}
|
|
2652
|
-
*/
|
|
2653
|
-
function generateSegmentation(images, labelmaps3DorBrushData) {
|
|
2654
|
-
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
2655
|
-
includeSliceSpacing: true
|
|
2656
|
-
};
|
|
2657
|
-
var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
|
|
2658
|
-
if (cornerstoneToolsVersion === 4) {
|
|
2659
|
-
return Segmentation$2.generateSegmentation(images, labelmaps3DorBrushData, options);
|
|
2660
|
-
}
|
|
2661
|
-
if (cornerstoneToolsVersion === 3) {
|
|
2662
|
-
return Segmentation$3.generateSegmentation(images, labelmaps3DorBrushData, options);
|
|
2663
|
-
}
|
|
2664
|
-
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
2665
|
-
}
|
|
2666
|
-
|
|
2667
|
-
/**
|
|
2668
|
-
* generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
|
|
2669
|
-
* derive cornerstoneTools toolState and brush metadata.
|
|
2670
|
-
*
|
|
2671
|
-
* @param {string[]} imageIds An array of the imageIds.
|
|
2672
|
-
* @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
|
|
2673
|
-
* @param {*} metadataProvider
|
|
2674
|
-
* @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
|
|
2675
|
-
* @param {number} tolerance - default value 1.e-3.
|
|
2676
|
-
* @param {number} cornerstoneToolsVersion - default value 4.
|
|
2677
|
-
*
|
|
2678
|
-
* @returns {Object} The toolState and an object from which the
|
|
2679
|
-
* segment metadata can be derived.
|
|
2680
|
-
*/
|
|
2681
|
-
function generateToolState(imageIds, arrayBuffer, metadataProvider) {
|
|
2682
|
-
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
2683
|
-
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
2684
|
-
var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
|
|
2685
|
-
if (cornerstoneToolsVersion === 4) {
|
|
2686
|
-
return Segmentation$2.generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
2687
|
-
}
|
|
2688
|
-
if (cornerstoneToolsVersion === 3) {
|
|
2689
|
-
return Segmentation$3.generateToolState(imageIds, arrayBuffer, metadataProvider);
|
|
2690
|
-
}
|
|
2691
|
-
console.warn("No generateToolState adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
2692
|
-
}
|
|
2693
|
-
|
|
2694
|
-
/**
|
|
2695
|
-
* fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
|
|
2696
|
-
*
|
|
2697
|
-
* @param {object[]} segmentation An empty segmentation derived dataset.
|
|
2698
|
-
* @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
|
|
2699
|
-
* @param {Object} userOptions Options object to override default options.
|
|
2700
|
-
* @returns {Blob} description
|
|
2701
|
-
*/
|
|
2702
|
-
function fillSegmentation(segmentation, inputLabelmaps3D) {
|
|
2703
|
-
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
2704
|
-
includeSliceSpacing: true
|
|
2705
|
-
};
|
|
2706
|
-
var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
|
|
2707
|
-
if (cornerstoneToolsVersion === 4) {
|
|
2708
|
-
return Segmentation$2.fillSegmentation(segmentation, inputLabelmaps3D, options);
|
|
2709
|
-
}
|
|
2710
|
-
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
2711
|
-
}
|
|
2712
|
-
|
|
2713
|
-
var TID300CobbAngle$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.CobbAngle;
|
|
2714
|
-
var COBB_ANGLE = "CobbAngle";
|
|
2715
|
-
var CobbAngle$1 = /*#__PURE__*/function () {
|
|
2716
|
-
function CobbAngle() {
|
|
2717
|
-
_classCallCheck(this, CobbAngle);
|
|
2718
|
-
}
|
|
2719
|
-
_createClass(CobbAngle, null, [{
|
|
2720
|
-
key: "getMeasurementData",
|
|
2721
|
-
value:
|
|
2722
|
-
// TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
|
|
2723
|
-
function getMeasurementData(MeasurementGroup) {
|
|
2724
|
-
var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
|
|
2725
|
-
defaultState = _MeasurementReport$ge.defaultState,
|
|
2726
|
-
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
2727
|
-
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
2728
|
-
var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
|
|
2729
|
-
rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
2730
|
-
toolType: CobbAngle.toolType,
|
|
2731
|
-
handles: {
|
|
2732
|
-
start: {},
|
|
2733
|
-
end: {},
|
|
2734
|
-
start2: {
|
|
2735
|
-
highlight: true,
|
|
2736
|
-
drawnIndependently: true
|
|
2737
|
-
},
|
|
2738
|
-
end2: {
|
|
2739
|
-
highlight: true,
|
|
2740
|
-
drawnIndependently: true
|
|
2741
|
-
},
|
|
2742
|
-
textBox: {
|
|
2743
|
-
hasMoved: false,
|
|
2744
|
-
movesIndependently: false,
|
|
2745
|
-
drawnIndependently: true,
|
|
2746
|
-
allowedOutsideImage: true,
|
|
2747
|
-
hasBoundingBox: true
|
|
2748
|
-
}
|
|
2749
|
-
}
|
|
2750
|
-
});
|
|
2751
|
-
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
|
|
2752
|
-
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
2753
|
-
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
2754
|
-
state.handles.end.x = _SCOORDGroup$GraphicD[2];
|
|
2755
|
-
state.handles.end.y = _SCOORDGroup$GraphicD[3];
|
|
2756
|
-
state.handles.start2.x = _SCOORDGroup$GraphicD[4];
|
|
2757
|
-
state.handles.start2.y = _SCOORDGroup$GraphicD[5];
|
|
2758
|
-
state.handles.end2.x = _SCOORDGroup$GraphicD[6];
|
|
2759
|
-
state.handles.end2.y = _SCOORDGroup$GraphicD[7];
|
|
2760
|
-
return state;
|
|
2761
|
-
}
|
|
2762
|
-
}, {
|
|
2763
|
-
key: "getTID300RepresentationArguments",
|
|
2764
|
-
value: function getTID300RepresentationArguments(tool) {
|
|
2765
|
-
var handles = tool.handles,
|
|
2766
|
-
finding = tool.finding,
|
|
2767
|
-
findingSites = tool.findingSites;
|
|
2768
|
-
var point1 = handles.start;
|
|
2769
|
-
var point2 = handles.end;
|
|
2770
|
-
var point3 = handles.start2;
|
|
2771
|
-
var point4 = handles.end2;
|
|
2772
|
-
var rAngle = tool.rAngle;
|
|
2773
|
-
var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:CobbAngle";
|
|
2774
|
-
return {
|
|
2775
|
-
point1: point1,
|
|
2776
|
-
point2: point2,
|
|
2777
|
-
point3: point3,
|
|
2778
|
-
point4: point4,
|
|
2779
|
-
rAngle: rAngle,
|
|
2780
|
-
trackingIdentifierTextValue: trackingIdentifierTextValue,
|
|
2781
|
-
finding: finding,
|
|
2782
|
-
findingSites: findingSites || []
|
|
2783
|
-
};
|
|
2784
|
-
}
|
|
2785
|
-
}]);
|
|
2786
|
-
return CobbAngle;
|
|
2787
|
-
}();
|
|
2788
|
-
CobbAngle$1.toolType = COBB_ANGLE;
|
|
2789
|
-
CobbAngle$1.utilityToolType = COBB_ANGLE;
|
|
2790
|
-
CobbAngle$1.TID300Representation = TID300CobbAngle$2;
|
|
2791
|
-
CobbAngle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
2792
|
-
if (!TrackingIdentifier.includes(":")) {
|
|
2793
|
-
return false;
|
|
2794
|
-
}
|
|
2795
|
-
var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
|
|
2796
|
-
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
2797
|
-
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
2798
|
-
toolType = _TrackingIdentifier$s2[1];
|
|
2799
|
-
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
2800
|
-
return false;
|
|
2801
|
-
}
|
|
2802
|
-
return toolType === COBB_ANGLE;
|
|
2803
|
-
};
|
|
2804
|
-
MeasurementReport$1.registerTool(CobbAngle$1);
|
|
2805
|
-
|
|
2806
|
-
var TID300Angle = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Angle;
|
|
2807
|
-
var ANGLE = "Angle";
|
|
2808
|
-
var Angle$1 = /*#__PURE__*/function () {
|
|
2809
|
-
function Angle() {
|
|
2810
|
-
_classCallCheck(this, Angle);
|
|
2811
|
-
}
|
|
2812
|
-
_createClass(Angle, null, [{
|
|
2813
|
-
key: "getMeasurementData",
|
|
2814
|
-
value:
|
|
2815
|
-
/**
|
|
2816
|
-
* Generate TID300 measurement data for a plane angle measurement - use a Angle, but label it as Angle
|
|
2817
|
-
*/
|
|
2818
|
-
function getMeasurementData(MeasurementGroup) {
|
|
2819
|
-
var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
|
|
2820
|
-
defaultState = _MeasurementReport$ge.defaultState,
|
|
2821
|
-
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
2822
|
-
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
2823
|
-
var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
|
|
2824
|
-
rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
2825
|
-
toolType: Angle.toolType,
|
|
2826
|
-
handles: {
|
|
2827
|
-
start: {},
|
|
2828
|
-
middle: {},
|
|
2829
|
-
end: {},
|
|
2830
|
-
textBox: {
|
|
2831
|
-
hasMoved: false,
|
|
2832
|
-
movesIndependently: false,
|
|
2833
|
-
drawnIndependently: true,
|
|
2834
|
-
allowedOutsideImage: true,
|
|
2835
|
-
hasBoundingBox: true
|
|
2836
|
-
}
|
|
2837
|
-
}
|
|
2838
|
-
});
|
|
2839
|
-
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
|
|
2840
|
-
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
2841
|
-
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
2842
|
-
state.handles.middle.x = _SCOORDGroup$GraphicD[2];
|
|
2843
|
-
state.handles.middle.y = _SCOORDGroup$GraphicD[3];
|
|
2844
|
-
state.handles.middle.x = _SCOORDGroup$GraphicD[4];
|
|
2845
|
-
state.handles.middle.y = _SCOORDGroup$GraphicD[5];
|
|
2846
|
-
state.handles.end.x = _SCOORDGroup$GraphicD[6];
|
|
2847
|
-
state.handles.end.y = _SCOORDGroup$GraphicD[7];
|
|
2848
|
-
return state;
|
|
2849
|
-
}
|
|
2850
|
-
}, {
|
|
2851
|
-
key: "getTID300RepresentationArguments",
|
|
2852
|
-
value: function getTID300RepresentationArguments(tool) {
|
|
2853
|
-
var handles = tool.handles,
|
|
2854
|
-
finding = tool.finding,
|
|
2855
|
-
findingSites = tool.findingSites;
|
|
2856
|
-
var point1 = handles.start;
|
|
2857
|
-
var point2 = handles.middle;
|
|
2858
|
-
var point3 = handles.middle;
|
|
2859
|
-
var point4 = handles.end;
|
|
2860
|
-
var rAngle = tool.rAngle;
|
|
2861
|
-
var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:Angle";
|
|
2862
|
-
return {
|
|
2863
|
-
point1: point1,
|
|
2864
|
-
point2: point2,
|
|
2865
|
-
point3: point3,
|
|
2866
|
-
point4: point4,
|
|
2867
|
-
rAngle: rAngle,
|
|
2868
|
-
trackingIdentifierTextValue: trackingIdentifierTextValue,
|
|
2869
|
-
finding: finding,
|
|
2870
|
-
findingSites: findingSites || []
|
|
2871
|
-
};
|
|
2872
|
-
}
|
|
2873
|
-
}]);
|
|
2874
|
-
return Angle;
|
|
2875
|
-
}();
|
|
2876
|
-
Angle$1.toolType = ANGLE;
|
|
2877
|
-
Angle$1.utilityToolType = ANGLE;
|
|
2878
|
-
Angle$1.TID300Representation = TID300Angle;
|
|
2879
|
-
Angle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
2880
|
-
if (!TrackingIdentifier.includes(":")) {
|
|
3331
|
+
* @param {Number[]} array1 - An array.
|
|
3332
|
+
* @param {Number[]} array2 - An array.
|
|
3333
|
+
* @param {Number} tolerance.
|
|
3334
|
+
* @return {Boolean} True if array1 and array2 are equal.
|
|
3335
|
+
*/
|
|
3336
|
+
function compareArrays(array1, array2, tolerance) {
|
|
3337
|
+
if (array1.length != array2.length) {
|
|
2881
3338
|
return false;
|
|
2882
3339
|
}
|
|
2883
|
-
var
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
2888
|
-
return false;
|
|
3340
|
+
for (var i = 0; i < array1.length; ++i) {
|
|
3341
|
+
if (!nearlyEqual(array1[i], array2[i], tolerance)) {
|
|
3342
|
+
return false;
|
|
3343
|
+
}
|
|
2889
3344
|
}
|
|
2890
|
-
return
|
|
2891
|
-
}
|
|
2892
|
-
|
|
3345
|
+
return true;
|
|
3346
|
+
}
|
|
3347
|
+
function getSegmentMetadata(multiframe, seriesInstanceUid) {
|
|
3348
|
+
var segmentSequence = multiframe.SegmentSequence;
|
|
3349
|
+
var data = [];
|
|
3350
|
+
if (Array.isArray(segmentSequence)) {
|
|
3351
|
+
data = [undefined].concat(_toConsumableArray(segmentSequence));
|
|
3352
|
+
} else {
|
|
3353
|
+
// Only one segment, will be stored as an object.
|
|
3354
|
+
data = [undefined, segmentSequence];
|
|
3355
|
+
}
|
|
3356
|
+
return {
|
|
3357
|
+
seriesInstanceUid: seriesInstanceUid,
|
|
3358
|
+
data: data
|
|
3359
|
+
};
|
|
3360
|
+
}
|
|
2893
3361
|
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
3362
|
+
/**
|
|
3363
|
+
* Reads a range of bytes from an array of ArrayBuffer chunks and
|
|
3364
|
+
* aggregate them into a new Uint8Array.
|
|
3365
|
+
*
|
|
3366
|
+
* @param {ArrayBuffer[]} chunks - An array of ArrayBuffer chunks.
|
|
3367
|
+
* @param {number} offset - The offset of the first byte to read.
|
|
3368
|
+
* @param {number} length - The number of bytes to read.
|
|
3369
|
+
* @returns {Uint8Array} A new Uint8Array containing the requested bytes.
|
|
3370
|
+
*/
|
|
3371
|
+
function readFromUnpackedChunks(chunks, offset, length) {
|
|
3372
|
+
var mapping = getUnpackedOffsetAndLength(chunks, offset, length);
|
|
3373
|
+
|
|
3374
|
+
// If all the data is in one chunk, we can just slice that chunk
|
|
3375
|
+
if (mapping.start.chunkIndex === mapping.end.chunkIndex) {
|
|
3376
|
+
return new Uint8Array(chunks[mapping.start.chunkIndex].buffer, mapping.start.offset, length);
|
|
3377
|
+
} else {
|
|
3378
|
+
// If the data spans multiple chunks, we need to create a new Uint8Array and copy the data from each chunk
|
|
3379
|
+
var result = new Uint8Array(length);
|
|
3380
|
+
var resultOffset = 0;
|
|
3381
|
+
for (var i = mapping.start.chunkIndex; i <= mapping.end.chunkIndex; i++) {
|
|
3382
|
+
var start = i === mapping.start.chunkIndex ? mapping.start.offset : 0;
|
|
3383
|
+
var end = i === mapping.end.chunkIndex ? mapping.end.offset : chunks[i].length;
|
|
3384
|
+
result.set(new Uint8Array(chunks[i].buffer, start, end - start), resultOffset);
|
|
3385
|
+
resultOffset += end - start;
|
|
3386
|
+
}
|
|
3387
|
+
return result;
|
|
2898
3388
|
}
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
|
|
2928
|
-
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
2929
|
-
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
2930
|
-
_SCOORDGroup$GraphicD[2];
|
|
2931
|
-
_SCOORDGroup$GraphicD[3];
|
|
2932
|
-
state.handles.end.x = _SCOORDGroup$GraphicD[4];
|
|
2933
|
-
state.handles.end.y = _SCOORDGroup$GraphicD[5];
|
|
2934
|
-
return state;
|
|
3389
|
+
}
|
|
3390
|
+
function getUnpackedOffsetAndLength(chunks, offset, length) {
|
|
3391
|
+
var totalBytes = chunks.reduce(function (total, chunk) {
|
|
3392
|
+
return total + chunk.length;
|
|
3393
|
+
}, 0);
|
|
3394
|
+
if (offset < 0 || offset + length > totalBytes) {
|
|
3395
|
+
throw new Error("Offset and length out of bounds");
|
|
3396
|
+
}
|
|
3397
|
+
var startChunkIndex = 0;
|
|
3398
|
+
var startOffsetInChunk = offset;
|
|
3399
|
+
while (startOffsetInChunk >= chunks[startChunkIndex].length) {
|
|
3400
|
+
startOffsetInChunk -= chunks[startChunkIndex].length;
|
|
3401
|
+
startChunkIndex++;
|
|
3402
|
+
}
|
|
3403
|
+
var endChunkIndex = startChunkIndex;
|
|
3404
|
+
var endOffsetInChunk = startOffsetInChunk + length;
|
|
3405
|
+
while (endOffsetInChunk > chunks[endChunkIndex].length) {
|
|
3406
|
+
endOffsetInChunk -= chunks[endChunkIndex].length;
|
|
3407
|
+
endChunkIndex++;
|
|
3408
|
+
}
|
|
3409
|
+
return {
|
|
3410
|
+
start: {
|
|
3411
|
+
chunkIndex: startChunkIndex,
|
|
3412
|
+
offset: startOffsetInChunk
|
|
3413
|
+
},
|
|
3414
|
+
end: {
|
|
3415
|
+
chunkIndex: endChunkIndex,
|
|
3416
|
+
offset: endOffsetInChunk
|
|
2935
3417
|
}
|
|
2936
|
-
}
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
3418
|
+
};
|
|
3419
|
+
}
|
|
3420
|
+
function calculateCentroid(imageIdIndexBufferIndex, multiframe) {
|
|
3421
|
+
var xAcc = 0;
|
|
3422
|
+
var yAcc = 0;
|
|
3423
|
+
var zAcc = 0;
|
|
3424
|
+
var count = 0;
|
|
3425
|
+
for (var _i3 = 0, _Object$entries = Object.entries(imageIdIndexBufferIndex); _i3 < _Object$entries.length; _i3++) {
|
|
3426
|
+
var _Object$entries$_i = _slicedToArray(_Object$entries[_i3], 2),
|
|
3427
|
+
imageIdIndex = _Object$entries$_i[0],
|
|
3428
|
+
bufferIndices = _Object$entries$_i[1];
|
|
3429
|
+
var z = Number(imageIdIndex);
|
|
3430
|
+
if (!bufferIndices || bufferIndices.length === 0) {
|
|
3431
|
+
continue;
|
|
3432
|
+
}
|
|
3433
|
+
var _iterator2 = _createForOfIteratorHelper(bufferIndices),
|
|
3434
|
+
_step2;
|
|
3435
|
+
try {
|
|
3436
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
3437
|
+
var bufferIndex = _step2.value;
|
|
3438
|
+
var y = Math.floor(bufferIndex / multiframe.Rows);
|
|
3439
|
+
var x = bufferIndex % multiframe.Rows;
|
|
3440
|
+
xAcc += x;
|
|
3441
|
+
yAcc += y;
|
|
3442
|
+
zAcc += z;
|
|
3443
|
+
count++;
|
|
3444
|
+
}
|
|
3445
|
+
} catch (err) {
|
|
3446
|
+
_iterator2.e(err);
|
|
3447
|
+
} finally {
|
|
3448
|
+
_iterator2.f();
|
|
2964
3449
|
}
|
|
2965
|
-
}]);
|
|
2966
|
-
return RectangleRoi;
|
|
2967
|
-
}();
|
|
2968
|
-
RectangleRoi.toolType = "RectangleRoi";
|
|
2969
|
-
RectangleRoi.utilityToolType = "RectangleRoi";
|
|
2970
|
-
RectangleRoi.TID300Representation = TID300Polyline$2;
|
|
2971
|
-
RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
2972
|
-
if (!TrackingIdentifier.includes(":")) {
|
|
2973
|
-
return false;
|
|
2974
|
-
}
|
|
2975
|
-
var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
|
|
2976
|
-
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
2977
|
-
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
2978
|
-
toolType = _TrackingIdentifier$s2[1];
|
|
2979
|
-
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
2980
|
-
return false;
|
|
2981
3450
|
}
|
|
2982
|
-
return
|
|
3451
|
+
return {
|
|
3452
|
+
xAcc: xAcc,
|
|
3453
|
+
yAcc: yAcc,
|
|
3454
|
+
zAcc: zAcc,
|
|
3455
|
+
count: count
|
|
3456
|
+
};
|
|
3457
|
+
}
|
|
3458
|
+
var Segmentation$4 = {
|
|
3459
|
+
generateSegmentation: generateSegmentation$2,
|
|
3460
|
+
generateToolState: generateToolState$2,
|
|
3461
|
+
fillSegmentation: fillSegmentation$1
|
|
2983
3462
|
};
|
|
2984
|
-
MeasurementReport$1.registerTool(RectangleRoi);
|
|
2985
3463
|
|
|
2986
|
-
var
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
3464
|
+
var Segmentation$3 = {
|
|
3465
|
+
generateSegmentation: generateSegmentation$1,
|
|
3466
|
+
generateToolState: generateToolState$1,
|
|
3467
|
+
fillSegmentation: fillSegmentation
|
|
3468
|
+
};
|
|
3469
|
+
|
|
3470
|
+
/**
|
|
3471
|
+
* generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
|
|
3472
|
+
*
|
|
3473
|
+
* @param {object[]} images An array of the cornerstone image objects.
|
|
3474
|
+
* @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.
|
|
3475
|
+
* For 3.X: the BrushData.
|
|
3476
|
+
* @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.
|
|
3477
|
+
* @returns {Object}
|
|
3478
|
+
*/
|
|
3479
|
+
function generateSegmentation$1(images, labelmaps3DorBrushData) {
|
|
3480
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
3481
|
+
includeSliceSpacing: true
|
|
3482
|
+
};
|
|
3483
|
+
var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
|
|
3484
|
+
if (cornerstoneToolsVersion === 4) {
|
|
3485
|
+
return Segmentation$4.generateSegmentation(images, labelmaps3DorBrushData, options);
|
|
3486
|
+
}
|
|
3487
|
+
if (cornerstoneToolsVersion === 3) {
|
|
3488
|
+
return Segmentation$5.generateSegmentation(images, labelmaps3DorBrushData, options);
|
|
3489
|
+
}
|
|
3490
|
+
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
3491
|
+
}
|
|
3492
|
+
|
|
3493
|
+
/**
|
|
3494
|
+
* generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
|
|
3495
|
+
* derive cornerstoneTools toolState and brush metadata.
|
|
3496
|
+
*
|
|
3497
|
+
* @param {string[]} imageIds An array of the imageIds.
|
|
3498
|
+
* @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
|
|
3499
|
+
* @param {*} metadataProvider
|
|
3500
|
+
* @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
|
|
3501
|
+
* @param {number} tolerance - default value 1.e-3.
|
|
3502
|
+
* @param {number} cornerstoneToolsVersion - default value 4.
|
|
3503
|
+
*
|
|
3504
|
+
* @returns {Object} The toolState and an object from which the
|
|
3505
|
+
* segment metadata can be derived.
|
|
3506
|
+
*/
|
|
3507
|
+
function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
|
|
3508
|
+
var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
3509
|
+
var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
|
|
3510
|
+
var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
|
|
3511
|
+
if (cornerstoneToolsVersion === 4) {
|
|
3512
|
+
return Segmentation$4.generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
3513
|
+
}
|
|
3514
|
+
if (cornerstoneToolsVersion === 3) {
|
|
3515
|
+
return Segmentation$5.generateToolState(imageIds, arrayBuffer, metadataProvider);
|
|
3516
|
+
}
|
|
3517
|
+
console.warn("No generateToolState adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
3518
|
+
}
|
|
3519
|
+
|
|
3520
|
+
/**
|
|
3521
|
+
* fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
|
|
3522
|
+
*
|
|
3523
|
+
* @param {object[]} segmentation An empty segmentation derived dataset.
|
|
3524
|
+
* @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
|
|
3525
|
+
* @param {Object} userOptions Options object to override default options.
|
|
3526
|
+
* @returns {Blob} description
|
|
3527
|
+
*/
|
|
3528
|
+
function fillSegmentation(segmentation, inputLabelmaps3D) {
|
|
3529
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
3530
|
+
includeSliceSpacing: true
|
|
3531
|
+
};
|
|
3532
|
+
var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
|
|
3533
|
+
if (cornerstoneToolsVersion === 4) {
|
|
3534
|
+
return Segmentation$4.fillSegmentation(segmentation, inputLabelmaps3D, options);
|
|
3535
|
+
}
|
|
3536
|
+
console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
|
|
3537
|
+
}
|
|
3538
|
+
|
|
3539
|
+
var CornerstoneSR = {
|
|
3540
|
+
Length: Length$1,
|
|
3541
|
+
FreehandRoi: FreehandRoi,
|
|
3542
|
+
Bidirectional: Bidirectional$1,
|
|
3543
|
+
EllipticalRoi: EllipticalRoi,
|
|
3544
|
+
CircleRoi: CircleRoi,
|
|
3545
|
+
ArrowAnnotate: ArrowAnnotate$1,
|
|
3546
|
+
MeasurementReport: MeasurementReport$1,
|
|
3547
|
+
CobbAngle: CobbAngle$1,
|
|
3548
|
+
Angle: Angle$1,
|
|
3549
|
+
RectangleRoi: RectangleRoi
|
|
3550
|
+
};
|
|
3551
|
+
var CornerstoneSEG = {
|
|
3552
|
+
Segmentation: Segmentation$3
|
|
2998
3553
|
};
|
|
2999
3554
|
|
|
3000
3555
|
/******************************************************************************
|
|
@@ -3049,7 +3604,7 @@ var CodingScheme = {
|
|
|
3049
3604
|
|
|
3050
3605
|
var TID1500 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID1500, addAccessors = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.addAccessors;
|
|
3051
3606
|
var StructuredReport = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.StructuredReport;
|
|
3052
|
-
var Normalizer = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
3607
|
+
var Normalizer$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
3053
3608
|
var TID1500MeasurementReport = TID1500.TID1500MeasurementReport, TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
|
|
3054
3609
|
var DicomMetaDictionary = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMetaDictionary;
|
|
3055
3610
|
var FINDING = { CodingSchemeDesignator: "DCM", CodeValue: "121071" };
|
|
@@ -3218,7 +3773,7 @@ var MeasurementReport = /** @class */ (function () {
|
|
|
3218
3773
|
if ((instance &&
|
|
3219
3774
|
instance.NumberOfFrames &&
|
|
3220
3775
|
instance.NumberOfFrames > 1) ||
|
|
3221
|
-
Normalizer.isMultiframeSOPClassUID(sopClassUID)) {
|
|
3776
|
+
Normalizer$1.isMultiframeSOPClassUID(sopClassUID)) {
|
|
3222
3777
|
ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
|
|
3223
3778
|
}
|
|
3224
3779
|
// Loop through each tool type for the image
|
|
@@ -3853,26 +4408,26 @@ var EllipticalROI = /** @class */ (function () {
|
|
|
3853
4408
|
]);
|
|
3854
4409
|
pointsWorld.push(worldPos);
|
|
3855
4410
|
}
|
|
3856
|
-
var majorAxisStart =
|
|
3857
|
-
var majorAxisEnd =
|
|
3858
|
-
var minorAxisStart =
|
|
3859
|
-
var minorAxisEnd =
|
|
3860
|
-
var majorAxisVec =
|
|
3861
|
-
|
|
4411
|
+
var majorAxisStart = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[0]);
|
|
4412
|
+
var majorAxisEnd = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[1]);
|
|
4413
|
+
var minorAxisStart = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[2]);
|
|
4414
|
+
var minorAxisEnd = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[3]);
|
|
4415
|
+
var majorAxisVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.create */ .R3.create();
|
|
4416
|
+
gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.sub */ .R3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);
|
|
3862
4417
|
// normalize majorAxisVec to avoid scaling issues
|
|
3863
|
-
|
|
3864
|
-
var minorAxisVec =
|
|
3865
|
-
|
|
3866
|
-
|
|
4418
|
+
gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.normalize */ .R3.normalize(majorAxisVec, majorAxisVec);
|
|
4419
|
+
var minorAxisVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.create */ .R3.create();
|
|
4420
|
+
gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.sub */ .R3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);
|
|
4421
|
+
gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.normalize */ .R3.normalize(minorAxisVec, minorAxisVec);
|
|
3867
4422
|
var imagePlaneModule = metadata.get("imagePlaneModule", referencedImageId);
|
|
3868
4423
|
if (!imagePlaneModule) {
|
|
3869
4424
|
throw new Error("imageId does not have imagePlaneModule metadata");
|
|
3870
4425
|
}
|
|
3871
4426
|
var columnCosines = imagePlaneModule.columnCosines;
|
|
3872
4427
|
// find which axis is parallel to the columnCosines
|
|
3873
|
-
var columnCosinesVec =
|
|
3874
|
-
var projectedMajorAxisOnColVec =
|
|
3875
|
-
var projectedMinorAxisOnColVec =
|
|
4428
|
+
var columnCosinesVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues(columnCosines[0], columnCosines[1], columnCosines[2]);
|
|
4429
|
+
var projectedMajorAxisOnColVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.dot */ .R3.dot(columnCosinesVec, majorAxisVec);
|
|
4430
|
+
var projectedMinorAxisOnColVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.dot */ .R3.dot(columnCosinesVec, minorAxisVec);
|
|
3876
4431
|
var absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec);
|
|
3877
4432
|
var absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec);
|
|
3878
4433
|
var ellipsePoints = [];
|
|
@@ -4177,7 +4732,7 @@ var PlanarFreehandROI = /** @class */ (function () {
|
|
|
4177
4732
|
]);
|
|
4178
4733
|
worldCoords.push(point);
|
|
4179
4734
|
}
|
|
4180
|
-
var distanceBetweenFirstAndLastPoint =
|
|
4735
|
+
var distanceBetweenFirstAndLastPoint = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.distance */ .R3.distance(worldCoords[worldCoords.length - 1], worldCoords[0]);
|
|
4181
4736
|
var isOpenContour = true;
|
|
4182
4737
|
// If the contour is closed, this should have been encoded as exactly the same point, so check for a very small difference.
|
|
4183
4738
|
if (distanceBetweenFirstAndLastPoint < closedContourThreshold) {
|
|
@@ -4329,7 +4884,116 @@ Probe.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
|
|
|
4329
4884
|
};
|
|
4330
4885
|
MeasurementReport.registerTool(Probe);
|
|
4331
4886
|
|
|
4332
|
-
var
|
|
4887
|
+
var Normalizer = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
|
|
4888
|
+
var SegmentationDerivation = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
|
|
4889
|
+
/**
|
|
4890
|
+
* generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
|
|
4891
|
+
*
|
|
4892
|
+
* @param images - An array of the cornerstone image objects, which includes imageId and metadata
|
|
4893
|
+
* @param labelmaps - An array of the 3D Volumes that contain the segmentation data.
|
|
4894
|
+
*/
|
|
4895
|
+
function generateSegmentation(images, labelmaps, metadata, options) {
|
|
4896
|
+
if (options === void 0) { options = {}; }
|
|
4897
|
+
var segmentation = _createMultiframeSegmentationFromReferencedImages(images, metadata, options);
|
|
4898
|
+
return fillSegmentation$1(segmentation, labelmaps, options);
|
|
4899
|
+
}
|
|
4900
|
+
/**
|
|
4901
|
+
* _createMultiframeSegmentationFromReferencedImages - description
|
|
4902
|
+
*
|
|
4903
|
+
* @param images - An array of the cornerstone image objects related to the reference
|
|
4904
|
+
* series that the segmentation is derived from. You can use methods such as
|
|
4905
|
+
* volume.getCornerstoneImages() to get this array.
|
|
4906
|
+
*
|
|
4907
|
+
* @param options - the options object for the SegmentationDerivation.
|
|
4908
|
+
* @returns The Seg derived dataSet.
|
|
4909
|
+
*/
|
|
4910
|
+
function _createMultiframeSegmentationFromReferencedImages(images, metadata, options) {
|
|
4911
|
+
var datasets = images.map(function (image) {
|
|
4912
|
+
// add the sopClassUID to the dataset
|
|
4913
|
+
var instance = metadata.get("instance", image.imageId);
|
|
4914
|
+
return __assign(__assign(__assign({}, image), instance), {
|
|
4915
|
+
// Todo: move to dcmjs tag style
|
|
4916
|
+
SOPClassUID: instance.SopClassUID || instance.SOPClassUID, SOPInstanceUID: instance.SopInstanceUID || instance.SOPInstanceUID, PixelData: image.getPixelData(), _vrMap: {
|
|
4917
|
+
PixelData: "OW"
|
|
4918
|
+
}, _meta: {} });
|
|
4919
|
+
});
|
|
4920
|
+
var multiframe = Normalizer.normalizeToDataset(datasets);
|
|
4921
|
+
return new SegmentationDerivation([multiframe], options);
|
|
4922
|
+
}
|
|
4923
|
+
|
|
4924
|
+
/**
|
|
4925
|
+
* Generates 2D label maps from a 3D label map.
|
|
4926
|
+
* @param labelmap3D - The 3D label map object to generate 2D label maps from. It is derived
|
|
4927
|
+
* from the volume labelmap.
|
|
4928
|
+
* @returns The label map object containing the 2D label maps and segments on label maps.
|
|
4929
|
+
*/
|
|
4930
|
+
function generateLabelMaps2DFrom3D(labelmap3D) {
|
|
4931
|
+
// 1. we need to generate labelmaps2D from labelmaps3D, a labelmap2D is for each
|
|
4932
|
+
// slice
|
|
4933
|
+
var scalarData = labelmap3D.scalarData, dimensions = labelmap3D.dimensions;
|
|
4934
|
+
// scalarData is a flat array of all the pixels in the volume.
|
|
4935
|
+
var labelmaps2D = [];
|
|
4936
|
+
var segmentsOnLabelmap3D = new Set();
|
|
4937
|
+
// X-Y are the row and column dimensions, Z is the number of slices.
|
|
4938
|
+
for (var z = 0; z < dimensions[2]; z++) {
|
|
4939
|
+
var pixelData = scalarData.slice(z * dimensions[0] * dimensions[1], (z + 1) * dimensions[0] * dimensions[1]);
|
|
4940
|
+
var segmentsOnLabelmap = [];
|
|
4941
|
+
for (var i = 0; i < pixelData.length; i++) {
|
|
4942
|
+
var segment = pixelData[i];
|
|
4943
|
+
if (!segmentsOnLabelmap.includes(segment) && segment !== 0) {
|
|
4944
|
+
segmentsOnLabelmap.push(segment);
|
|
4945
|
+
}
|
|
4946
|
+
}
|
|
4947
|
+
var labelmap2D = {
|
|
4948
|
+
segmentsOnLabelmap: segmentsOnLabelmap,
|
|
4949
|
+
pixelData: pixelData,
|
|
4950
|
+
rows: dimensions[1],
|
|
4951
|
+
columns: dimensions[0]
|
|
4952
|
+
};
|
|
4953
|
+
if (segmentsOnLabelmap.length === 0) {
|
|
4954
|
+
continue;
|
|
4955
|
+
}
|
|
4956
|
+
segmentsOnLabelmap.forEach(function (segmentIndex) {
|
|
4957
|
+
segmentsOnLabelmap3D.add(segmentIndex);
|
|
4958
|
+
});
|
|
4959
|
+
labelmaps2D[dimensions[2] - 1 - z] = labelmap2D;
|
|
4960
|
+
}
|
|
4961
|
+
// remove segment 0 from segmentsOnLabelmap3D
|
|
4962
|
+
labelmap3D.segmentsOnLabelmap = Array.from(segmentsOnLabelmap3D);
|
|
4963
|
+
labelmap3D.labelmaps2D = labelmaps2D;
|
|
4964
|
+
return labelmap3D;
|
|
4965
|
+
}
|
|
4966
|
+
|
|
4967
|
+
var Segmentation$2 = CornerstoneSEG.Segmentation;
|
|
4968
|
+
var generateToolStateCornerstoneLegacy = Segmentation$2.generateToolState;
|
|
4969
|
+
/**
|
|
4970
|
+
* generateToolState - Given a set of cornerstoneTools imageIds and a Segmentation buffer,
|
|
4971
|
+
* derive cornerstoneTools toolState and brush metadata.
|
|
4972
|
+
*
|
|
4973
|
+
* @param imageIds - An array of the imageIds.
|
|
4974
|
+
* @param arrayBuffer - The SEG arrayBuffer.
|
|
4975
|
+
* @param skipOverlapping - skip checks for overlapping segs, default value false.
|
|
4976
|
+
* @param tolerance - default value 1.e-3.
|
|
4977
|
+
*
|
|
4978
|
+
* @returns a list of array buffer for each labelMap
|
|
4979
|
+
* an object from which the segment metadata can be derived
|
|
4980
|
+
* list containing the track of segments per frame
|
|
4981
|
+
* list containing the track of segments per frame for each labelMap (available only for the overlapping case).
|
|
4982
|
+
*/
|
|
4983
|
+
function generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance) {
|
|
4984
|
+
if (skipOverlapping === void 0) { skipOverlapping = false; }
|
|
4985
|
+
if (tolerance === void 0) { tolerance = 1e-3; }
|
|
4986
|
+
return generateToolStateCornerstoneLegacy(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
|
|
4987
|
+
}
|
|
4988
|
+
|
|
4989
|
+
var Segmentation$1 = /*#__PURE__*/Object.freeze({
|
|
4990
|
+
__proto__: null,
|
|
4991
|
+
generateLabelMaps2DFrom3D: generateLabelMaps2DFrom3D,
|
|
4992
|
+
generateSegmentation: generateSegmentation,
|
|
4993
|
+
generateToolState: generateToolState
|
|
4994
|
+
});
|
|
4995
|
+
|
|
4996
|
+
var Cornerstone3DSR = {
|
|
4333
4997
|
Bidirectional: Bidirectional,
|
|
4334
4998
|
CobbAngle: CobbAngle,
|
|
4335
4999
|
Angle: Angle,
|
|
@@ -4344,6 +5008,9 @@ var Cornerstone3D = {
|
|
|
4344
5008
|
CodeScheme: CodingScheme,
|
|
4345
5009
|
CORNERSTONE_3D_TAG: CORNERSTONE_3D_TAG
|
|
4346
5010
|
};
|
|
5011
|
+
var Cornerstone3DSEG = {
|
|
5012
|
+
Segmentation: Segmentation$1
|
|
5013
|
+
};
|
|
4347
5014
|
|
|
4348
5015
|
var Colors = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.Colors,
|
|
4349
5016
|
BitArray = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.BitArray;
|
|
@@ -4528,23 +5195,26 @@ var Segmentation = /*#__PURE__*/function () {
|
|
|
4528
5195
|
return Segmentation;
|
|
4529
5196
|
}();
|
|
4530
5197
|
|
|
4531
|
-
var
|
|
4532
|
-
|
|
5198
|
+
var VTKjsSEG = {
|
|
5199
|
+
Segmentation: Segmentation
|
|
4533
5200
|
};
|
|
4534
5201
|
|
|
4535
|
-
var
|
|
4536
|
-
|
|
4537
|
-
|
|
4538
|
-
|
|
5202
|
+
var adaptersSR = {
|
|
5203
|
+
Cornerstone: CornerstoneSR,
|
|
5204
|
+
Cornerstone3D: Cornerstone3DSR
|
|
5205
|
+
};
|
|
5206
|
+
var adaptersSEG = {
|
|
5207
|
+
Cornerstone: CornerstoneSEG,
|
|
5208
|
+
Cornerstone3D: Cornerstone3DSEG,
|
|
5209
|
+
VTKjs: VTKjsSEG
|
|
4539
5210
|
};
|
|
4540
5211
|
|
|
4541
5212
|
|
|
4542
|
-
//# sourceMappingURL=adapters.es.js.map
|
|
4543
5213
|
|
|
4544
5214
|
|
|
4545
5215
|
/***/ }),
|
|
4546
5216
|
|
|
4547
|
-
/***/
|
|
5217
|
+
/***/ 27318:
|
|
4548
5218
|
/***/ ((module) => {
|
|
4549
5219
|
|
|
4550
5220
|
"use strict";
|
|
@@ -4562,7 +5232,7 @@ module.exports = iota
|
|
|
4562
5232
|
|
|
4563
5233
|
/***/ }),
|
|
4564
5234
|
|
|
4565
|
-
/***/
|
|
5235
|
+
/***/ 8516:
|
|
4566
5236
|
/***/ ((module) => {
|
|
4567
5237
|
|
|
4568
5238
|
/*!
|
|
@@ -4580,11 +5250,11 @@ module.exports = function isBuffer (obj) {
|
|
|
4580
5250
|
|
|
4581
5251
|
/***/ }),
|
|
4582
5252
|
|
|
4583
|
-
/***/
|
|
5253
|
+
/***/ 87513:
|
|
4584
5254
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
4585
5255
|
|
|
4586
|
-
var iota = __webpack_require__(
|
|
4587
|
-
var isBuffer = __webpack_require__(
|
|
5256
|
+
var iota = __webpack_require__(27318)
|
|
5257
|
+
var isBuffer = __webpack_require__(8516)
|
|
4588
5258
|
|
|
4589
5259
|
var hasTypedArrays = ((typeof Float64Array) !== "undefined")
|
|
4590
5260
|
|