larvitar 4.0.0-alpha.6 → 4.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -52,8 +52,9 @@ declare const setDefaultToolsProps: (newProps: Partial<ToolConfig>[]) => void;
|
|
|
52
52
|
* Register a custom tool
|
|
53
53
|
* @param {String} toolName - The name of the tool
|
|
54
54
|
* @param {Object} toolClass - The tool class
|
|
55
|
+
* @param {String} toolVersion - The version of the tool, can be "MPR", "3D" (to be used with cs3D) or "" (default - cs legacy)
|
|
55
56
|
* NOTE: toolName must be unique
|
|
56
57
|
* NOTE: toolClass must be a valid cornerstone tool
|
|
57
58
|
*/
|
|
58
|
-
declare const registerExternalTool: (toolName: string, toolClass: any) => void;
|
|
59
|
+
declare const registerExternalTool: (toolName: string, toolClass: any, toolVersion?: "MPR" | "3D" | "") => void;
|
|
59
60
|
export { DEFAULT_TOOLS, DEFAULT_TOOLS_3D, DEFAULT_TOOLS_MPR, DEFAULT_STYLE, DEFAULT_SETTINGS, DEFAULT_MOUSE_KEYS, dvTools, getDefaultToolsByType, setDefaultToolsProps, registerExternalTool };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BaseTool } from "@cornerstonejs/tools";
|
|
2
|
+
import * as EventTypes from "@cornerstonejs/tools/dist/esm/types/EventTypes";
|
|
3
|
+
/**
|
|
4
|
+
* WindowLevel tool manipulates the windowLevel applied to a viewport. It
|
|
5
|
+
* provides a way to set the windowCenter and windowWidth of a viewport
|
|
6
|
+
* by dragging mouse over the image.
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
declare class CustomWWWLTool extends BaseTool {
|
|
10
|
+
static toolName: string;
|
|
11
|
+
constructor(toolProps?: {}, defaultToolProps?: {
|
|
12
|
+
supportedInteractionTypes: string[];
|
|
13
|
+
});
|
|
14
|
+
touchDragCallback(evt: EventTypes.InteractionEventType): void;
|
|
15
|
+
mouseDragCallback(evt: EventTypes.InteractionEventType): void;
|
|
16
|
+
getPTScaledNewRange({ deltaPointsCanvas, lower, upper, clientHeight, viewport, volumeId, isPreScaled }: {
|
|
17
|
+
deltaPointsCanvas: any;
|
|
18
|
+
lower: any;
|
|
19
|
+
upper: any;
|
|
20
|
+
clientHeight: any;
|
|
21
|
+
viewport: any;
|
|
22
|
+
volumeId: any;
|
|
23
|
+
isPreScaled: any;
|
|
24
|
+
}): {
|
|
25
|
+
lower: any;
|
|
26
|
+
upper: any;
|
|
27
|
+
};
|
|
28
|
+
getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper }: {
|
|
29
|
+
viewport: any;
|
|
30
|
+
deltaPointsCanvas: any;
|
|
31
|
+
volumeId: any;
|
|
32
|
+
lower: any;
|
|
33
|
+
upper: any;
|
|
34
|
+
}): {
|
|
35
|
+
lower: number;
|
|
36
|
+
upper: number;
|
|
37
|
+
};
|
|
38
|
+
_getMultiplierFromDynamicRange(viewport: any, volumeId: any): number;
|
|
39
|
+
_getImageDynamicRangeFromViewport(viewport: any): number;
|
|
40
|
+
_getImageDynamicRangeFromMiddleSlice: (scalarData: any, dimensions: any) => number;
|
|
41
|
+
private _getMinMax;
|
|
42
|
+
}
|
|
43
|
+
export default CustomWWWLTool;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* @desc This file provides functionalities
|
|
3
3
|
* for initializing tools and stacks
|
|
4
4
|
*/
|
|
5
|
+
import * as cornerstone from "@cornerstonejs/core";
|
|
5
6
|
import * as cornerstoneTools from "@cornerstonejs/tools";
|
|
6
7
|
import type { ToolConfig, ToolSettings, ToolStyle } from "../../imaging/tools/types";
|
|
7
8
|
import type { RenderingEngine } from "@cornerstonejs/core";
|
|
@@ -41,8 +42,32 @@ export declare const setToolDisabled: (toolName: string, groupId?: string, reset
|
|
|
41
42
|
/**
|
|
42
43
|
* @function syncViewportsCamera
|
|
43
44
|
* @desc Synchronizes the camera position of two (volume) viewports
|
|
45
|
+
* @param id - unique id for the synchronizer @default "default"
|
|
44
46
|
* @param targetViewportId - the id of the target viewport where the camera will be synced
|
|
45
47
|
* @param sourceViewportId - the id of the source viewport from where the camera position will be taken
|
|
46
48
|
*/
|
|
47
|
-
export declare const syncViewportsCamera: (targetViewportId: string, sourceViewportId: string) => void;
|
|
48
|
-
|
|
49
|
+
export declare const syncViewportsCamera: (id: string | undefined, targetViewportId: string, sourceViewportId: string) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Create a tool group and add the specified viewports and tools to it.
|
|
52
|
+
* @function createToolGroup
|
|
53
|
+
* @param groupId - The id of the tool group to create. @default "default"
|
|
54
|
+
* @param viewports
|
|
55
|
+
* @param tools
|
|
56
|
+
* @returns toolGroup - The created tool group.
|
|
57
|
+
*/
|
|
58
|
+
export declare const createToolGroup: (groupId?: string, viewports?: string[], tools?: any[]) => cornerstoneTools.Types.IToolGroup | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Set slab thickness and mode for a given viewport
|
|
61
|
+
* @function setSlab
|
|
62
|
+
* @param slabThickness - The thickness of the slab [in mm].
|
|
63
|
+
* @param slabMode - The blend mode to use for the slab.
|
|
64
|
+
* @param viewportId - The id of the viewport where the slab will be set.
|
|
65
|
+
*/
|
|
66
|
+
export declare const setSlab: (slabThickness: number, slabMode: cornerstone.Enums.BlendModes, viewportId: string) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Set the window width and level for a given viewport
|
|
69
|
+
* @param ww - window width
|
|
70
|
+
* @param wl - window level
|
|
71
|
+
* @param viewportId - The id of the viewport where the window width and level will be set.
|
|
72
|
+
*/
|
|
73
|
+
export declare const setWWWL: (ww: number, wl: number, viewportId: string) => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -49,9 +49,10 @@ import { renderImage as _renderImage } from "./imaging3d/imageRendering";
|
|
|
49
49
|
import { renderMpr as _renderMpr } from "./imaging3d/imageRendering";
|
|
50
50
|
import { prefetchMetadataInformation as _prefetchMetadataInformation } from "./imaging3d/multiframe";
|
|
51
51
|
import { convertMultiframeImageIds as _convertMultiframeImageIds } from "./imaging3d/multiframe";
|
|
52
|
-
import { addDefaultTools as _addDefaultTools, initializeCSTools as _initializeCSTools, addTool as _addTool, setToolActive as _setToolActive, setToolPassive as _setToolPassive, setToolEnabled as _setToolEnabled, setToolDisabled as _setToolDisabled, syncViewportsCamera as _syncViewportsCamera, createToolGroup as _createToolGroup } from "./imaging3d/tools/main";
|
|
52
|
+
import { addDefaultTools as _addDefaultTools, initializeCSTools as _initializeCSTools, addTool as _addTool, setToolActive as _setToolActive, setToolPassive as _setToolPassive, setToolEnabled as _setToolEnabled, setToolDisabled as _setToolDisabled, syncViewportsCamera as _syncViewportsCamera, createToolGroup as _createToolGroup, setSlab as _setSlab } from "./imaging3d/tools/main";
|
|
53
|
+
import _CustomWWWLTool from "./imaging3d/tools/custom/exampleCustomTool";
|
|
53
54
|
import { updateImageManager, populateImageManager, getImageManager, resetImageManager, removeDataFromImageManager, getDataFromImageManager, getSopInstanceUIDFromImageManager, getImageTracker, populateGSPSManager, getGSPSManager, resetGSPSManager, getFileManager, resetFileManager, populateFileManager, getDataFromFileManager } from "./imaging/imageManagers";
|
|
54
|
-
export { _cornerstone, _cornerstoneDICOMImageLoader, _cornerstoneTools, _initializeCSTools, _initializeImageLoader, _readFiles, _renderImage, _renderMpr, _registerStreamingImageVolume, _convertMetadata, _loadAndCacheMetadata, _prefetchMetadataInformation, _convertMultiframeImageIds, _addDefaultTools, _addTool, _setToolActive, _setToolPassive, _setToolEnabled, _setToolDisabled, _syncViewportsCamera, _createToolGroup, VERSION, cornerstone, cornerstoneTools, parseDicom, cornerstoneFileImageLoader, segModule, cornerstoneDICOMImageLoader, checkAndClearMemory, checkMemoryAllocation, getUsedMemory, getAvailableMemory, getPerformanceMonitor, activatePerformanceMonitor, deactivatePerformanceMonitor, store, parseECG, renderECG, unrenderECG, syncECGFrame, updateECGMarker, updateECGTotalTime, getDefaultECGLayout, getImagePresets, setImagePreset, setImageCustomPreset, getNormalOrientation, getMinPixelValue, getMaxPixelValue, getPixelRepresentation, getTypedArrayFromDataType, getSortedStack, randomId, getMeanValue, getReslicedMetadata, getReslicedPixeldata, getDistanceBetweenSlices, getImageMetadata, buildHeader, getCachedPixelData, buildData, buildDataAsync, importNRRDImage, exportImageToBase64, exportImageToBase64OriginalSizes, anonymize, customizeByteArray, buildLayer, updateLayer, getActiveLayer, setActiveLayer, initializeImageLoader, initializeWebImageLoader, initializeFileImageLoader, registerNRRDImageLoader, registerResliceLoader, registerMultiFrameImageLoader, registerSingleFrameImageLoader, registerDsaImageLoader, updateLoadedStack, reset, readFile, readFiles, parseDataSet, clearImageParsing, convertQidoMetadata, clearImageCache, clearStandardImageCache, clearDSAImageCache, loadAndCacheImages, renderFileImage, renderDICOMPDF, renderWebImage, disableViewport, unloadViewport, resizeViewport, renderImage, redrawImage, resetViewports, updateViewportData, toggleMouseToolsListeners, storeViewportData, invertImage, flipImageHorizontal, flipImageVertical, rotateImageLeft, rotateImageRight, updateImageManager, populateImageManager, getImageManager, resetImageManager, removeDataFromImageManager, getDataFromImageManager, getSopInstanceUIDFromImageManager, getImageTracker, populateGSPSManager, getGSPSManager, resetGSPSManager, populateFileManager, getFileManager, resetFileManager, getDataFromFileManager, resliceSeries, getColormapsList, applyColorMap, addColorMap, fillPixelData, HSVToRGB, parseContours, getImageFrame, buildNrrdImage, getNrrdImageId, loadNrrdImage, getImageIdFromSlice, getSliceNumberFromImageId, getNrrdSerieDimensions, loadReslicedImage, getDicomImageId, cacheImage, cacheImages, loadAndCacheImageStack, loadAndCacheDsaImageStack, loadMultiFrameImage, buildMultiFrameImage, getMultiFrameImageId, clearMultiFrameCache, setSingleFrameCache, clearSingleFrameCache, loadSingleFrameImage, populateDsaImageIds, resetFileLoader, getFileCustomImageId, applyDSAShift, addDiameterTool, addContoursTool, addMaskEditingTool, getCurrentMaskData, addStackStateToElement, addSeedsTool, clearMeasurements, getToolState, clearToolStateByName, updateDiameterTool, addToolStateSingleSlice, clearCornerstoneElements, syncToolStack, updateStackToolState, setSegmentationConfig, csToolsUpdateStack, initializeCSTools, setToolsStyle, addDefaultTools, addTool, setToolActive, setToolDisabled, setToolEnabled, setToolPassive, DEFAULT_TOOLS, dvTools, getDefaultToolsByType, setDefaultToolsProps, registerExternalTool, addMouseKeyHandlers, removeMouseKeyHandlers, initSegmentationModule, addSegmentationMask, setActiveLabelmap, setActiveSegment, undoLastStroke, redoLastStroke, setBrushProps, hexToRgb, rgbToHex, clearSegmentationState, deleteMask, enableBrushTool, disableBrushTool, toggleContourMode, toggleVisibility, getActiveLabelmapBuffer, updateTemporalViewportData, logger, setLogLevel };
|
|
55
|
+
export { _cornerstone, _cornerstoneDICOMImageLoader, _cornerstoneTools, _initializeCSTools, _initializeImageLoader, _readFiles, _renderImage, _renderMpr, _registerStreamingImageVolume, _convertMetadata, _loadAndCacheMetadata, _prefetchMetadataInformation, _convertMultiframeImageIds, _addDefaultTools, _addTool, _setToolActive, _setToolPassive, _setToolEnabled, _setToolDisabled, _syncViewportsCamera, _createToolGroup, _setSlab, _CustomWWWLTool, VERSION, cornerstone, cornerstoneTools, parseDicom, cornerstoneFileImageLoader, segModule, cornerstoneDICOMImageLoader, checkAndClearMemory, checkMemoryAllocation, getUsedMemory, getAvailableMemory, getPerformanceMonitor, activatePerformanceMonitor, deactivatePerformanceMonitor, store, parseECG, renderECG, unrenderECG, syncECGFrame, updateECGMarker, updateECGTotalTime, getDefaultECGLayout, getImagePresets, setImagePreset, setImageCustomPreset, getNormalOrientation, getMinPixelValue, getMaxPixelValue, getPixelRepresentation, getTypedArrayFromDataType, getSortedStack, randomId, getMeanValue, getReslicedMetadata, getReslicedPixeldata, getDistanceBetweenSlices, getImageMetadata, buildHeader, getCachedPixelData, buildData, buildDataAsync, importNRRDImage, exportImageToBase64, exportImageToBase64OriginalSizes, anonymize, customizeByteArray, buildLayer, updateLayer, getActiveLayer, setActiveLayer, initializeImageLoader, initializeWebImageLoader, initializeFileImageLoader, registerNRRDImageLoader, registerResliceLoader, registerMultiFrameImageLoader, registerSingleFrameImageLoader, registerDsaImageLoader, updateLoadedStack, reset, readFile, readFiles, parseDataSet, clearImageParsing, convertQidoMetadata, clearImageCache, clearStandardImageCache, clearDSAImageCache, loadAndCacheImages, renderFileImage, renderDICOMPDF, renderWebImage, disableViewport, unloadViewport, resizeViewport, renderImage, redrawImage, resetViewports, updateViewportData, toggleMouseToolsListeners, storeViewportData, invertImage, flipImageHorizontal, flipImageVertical, rotateImageLeft, rotateImageRight, updateImageManager, populateImageManager, getImageManager, resetImageManager, removeDataFromImageManager, getDataFromImageManager, getSopInstanceUIDFromImageManager, getImageTracker, populateGSPSManager, getGSPSManager, resetGSPSManager, populateFileManager, getFileManager, resetFileManager, getDataFromFileManager, resliceSeries, getColormapsList, applyColorMap, addColorMap, fillPixelData, HSVToRGB, parseContours, getImageFrame, buildNrrdImage, getNrrdImageId, loadNrrdImage, getImageIdFromSlice, getSliceNumberFromImageId, getNrrdSerieDimensions, loadReslicedImage, getDicomImageId, cacheImage, cacheImages, loadAndCacheImageStack, loadAndCacheDsaImageStack, loadMultiFrameImage, buildMultiFrameImage, getMultiFrameImageId, clearMultiFrameCache, setSingleFrameCache, clearSingleFrameCache, loadSingleFrameImage, populateDsaImageIds, resetFileLoader, getFileCustomImageId, applyDSAShift, addDiameterTool, addContoursTool, addMaskEditingTool, getCurrentMaskData, addStackStateToElement, addSeedsTool, clearMeasurements, getToolState, clearToolStateByName, updateDiameterTool, addToolStateSingleSlice, clearCornerstoneElements, syncToolStack, updateStackToolState, setSegmentationConfig, csToolsUpdateStack, initializeCSTools, setToolsStyle, addDefaultTools, addTool, setToolActive, setToolDisabled, setToolEnabled, setToolPassive, DEFAULT_TOOLS, dvTools, getDefaultToolsByType, setDefaultToolsProps, registerExternalTool, addMouseKeyHandlers, removeMouseKeyHandlers, initSegmentationModule, addSegmentationMask, setActiveLabelmap, setActiveSegment, undoLastStroke, redoLastStroke, setBrushProps, hexToRgb, rgbToHex, clearSegmentationState, deleteMask, enableBrushTool, disableBrushTool, toggleContourMode, toggleVisibility, getActiveLabelmapBuffer, updateTemporalViewportData, logger, setLogLevel };
|
|
55
56
|
export declare const updateLarvitarManager: (...args: any) => any;
|
|
56
57
|
export declare const populateLarvitarManager: (...args: any) => any;
|
|
57
58
|
export declare const getLarvitarManager: (...args: any) => any;
|
package/dist/larvitar.js
CHANGED
|
@@ -83603,6 +83603,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
83603
83603
|
DEFAULT_TOOLS: () => (/* reexport */ index_DEFAULT_TOOLS),
|
|
83604
83604
|
HSVToRGB: () => (/* reexport */ index_HSVToRGB),
|
|
83605
83605
|
VERSION: () => (/* binding */ index_VERSION),
|
|
83606
|
+
_CustomWWWLTool: () => (/* reexport */ index_exampleCustomTool),
|
|
83606
83607
|
_addDefaultTools: () => (/* reexport */ index_main_addDefaultTools),
|
|
83607
83608
|
_addTool: () => (/* reexport */ index_main_addTool),
|
|
83608
83609
|
_convertMetadata: () => (/* reexport */ index_convertMetadata),
|
|
@@ -83619,6 +83620,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
83619
83620
|
_registerStreamingImageVolume: () => (/* reexport */ index_registerStreamingImageVolume),
|
|
83620
83621
|
_renderImage: () => (/* reexport */ index_imageRendering_renderImage),
|
|
83621
83622
|
_renderMpr: () => (/* reexport */ index_renderMpr),
|
|
83623
|
+
_setSlab: () => (/* reexport */ index_setSlab),
|
|
83622
83624
|
_setToolActive: () => (/* reexport */ index_main_setToolActive),
|
|
83623
83625
|
_setToolDisabled: () => (/* reexport */ index_main_setToolDisabled),
|
|
83624
83626
|
_setToolEnabled: () => (/* reexport */ index_main_setToolEnabled),
|
|
@@ -85549,7 +85551,7 @@ __webpack_require__.d(index_dist_esm_constants_namespaceObject, {
|
|
|
85549
85551
|
});
|
|
85550
85552
|
|
|
85551
85553
|
;// ./package.json
|
|
85552
|
-
const index_package_namespaceObject = /*#__PURE__*/JSON.parse('{"name":"larvitar","keywords":["DICOM","imaging","medical","cornerstone"],"version":"4.0.0-alpha.
|
|
85554
|
+
const index_package_namespaceObject = /*#__PURE__*/JSON.parse('{"name":"larvitar","keywords":["DICOM","imaging","medical","cornerstone"],"version":"4.0.0-alpha.7","description":"typescript library for parsing, loading, rendering and interacting with DICOM images","repository":{"url":"https://github.com/dvisionlab/Larvitar.git","type":"git"},"main":"dist/larvitar.js","types":"dist/index.d.ts","files":["dist","imaging/**/*.d.ts","imaging3d/**/*.d.ts"],"scripts":{"coverage":"typescript-coverage-report","format":"prettier --write \\"imaging/**/*.{js,ts,json,css,md}\\" \\"imaging3d/**/*.{js,ts,json,css,md}\\" \\"docs/examples/**/*.html\\"","format:check":"prettier --check \\"imaging/**/*.{js,ts,json,css,md}\\" \\"imaging3d/**/*.{js,ts,json,css,md}\\" \\"docs/examples/**/*.html\\"","postinstall":"patch-package","build":"webpack --config ./bundler/webpack.prod.debug.js","dev":"webpack --progress --config ./bundler/webpack.dev.js","docs:dev":"vuepress dev docs","docs:build":"vuepress build docs","cypress":"cypress open","cypress:run":"cypress run","cypress:run:headless":"cypress run --headless"},"author":"Simone Manini <simone.manini@dvisionlab.com> (https://www.dvisionlab.com)","contributors":["Mattia Ronzoni <mattia.ronzoni@dvisionlab.com> (https://www.dvisionlab.com)","Laura Borghesi <laura.borghesi@dvisionlab.com> (https://www.dvisionlab.com)","Sara Zanchi <sara.zanchi@dvisionlab.com> (https://www.dvisionlab.com)"],"license":"MIT","dependencies":{"@cornerstonejs/core":"^3.12.1","@cornerstonejs/dicom-image-loader":"^3.12.1","@cornerstonejs/nifti-volume-loader":"^3.12.1","@cornerstonejs/tools":"^3.12.1","@hyzyla/pdfium":"^2.1.2","@icr/polyseg-wasm":"^0.4.0","consola":"^3.4.0","cornerstone-core":"^2.6.1","cornerstone-file-image-loader":"^0.3.0","cornerstone-tools":"^6.0.7","cornerstone-wado-image-loader":"^4.13.2","cornerstone-web-image-loader":"^2.1.1","crypto-js":"^4.1.1","dcmjs":"^0.34.0","dicom-character-set":"^1.0.3","dicom-parser":"^1.8.13","hammerjs":"^2.0.8","jpeg-lossless-decoder-js":"^2.0.7","keycode-js":"^3.1.0","lodash":"^4.17.15","pako":"^1.0.10","plotly.js-dist-min":"^2.27.1","uuid":"^8.3.2"},"devDependencies":{"@babel/core":"^7.21.8","@rollup/plugin-commonjs":"^28.0.3","@types/cornerstone-core":"^2.3.0","@types/crypto-js":"^4.1.1","@types/hammerjs":"^2.0.41","@types/lodash":"^4.14.192","@types/papaparse":"^5.3.7","@types/plotly.js":"^2.12.30","@types/plotly.js-dist-min":"^2.3.4","@types/uuid":"^9.0.1","@vuepress/bundler-vite":"^2.0.0-rc.18","@vuepress/plugin-slimsearch":"^2.0.0-rc.68","@vuepress/theme-default":"^2.0.0-rc.60","babel-loader":"^9.1.2","clean-webpack-plugin":"^4.0.0","cypress":"^14.2.0","cypress-image-snapshot":"^4.0.1","cypress-mochawesome-reporter":"^3.8.2","cypress-multi-reporters":"^2.0.5","eslint":"^9.17.0","html-loader":"^4.2.0","html-webpack-plugin":"^5.6.0","jsdom":"^26.0.0","lodash-webpack-plugin":"^0.11.6","mocha-json-reporter":"^1.0.0-1","patch-package":"^8.0.0","prettier":"^3.5.3","sass-embedded":"^1.80.7","ts-loader":"^9.4.2","typescript":"^5.0.2","typescript-coverage-report":"^0.7.0","vuepress":"^2.0.0-rc.18","webpack":"^5.76.3","webpack-cli":"^5.0.1","webpack-dev-server":"^4.13.1"}}');
|
|
85553
85555
|
// EXTERNAL MODULE: ./node_modules/cornerstone-core/dist/cornerstone.js
|
|
85554
85556
|
var index_dist_cornerstone = __webpack_require__(1198);
|
|
85555
85557
|
var index_cornerstone_default = /*#__PURE__*/__webpack_require__.n(index_dist_cornerstone);
|
|
@@ -98019,15 +98021,21 @@ const index_setDefaultToolsProps = function (newProps) {
|
|
|
98019
98021
|
* Register a custom tool
|
|
98020
98022
|
* @param {String} toolName - The name of the tool
|
|
98021
98023
|
* @param {Object} toolClass - The tool class
|
|
98024
|
+
* @param {String} toolVersion - The version of the tool, can be "MPR", "3D" (to be used with cs3D) or "" (default - cs legacy)
|
|
98022
98025
|
* NOTE: toolName must be unique
|
|
98023
98026
|
* NOTE: toolClass must be a valid cornerstone tool
|
|
98024
98027
|
*/
|
|
98025
|
-
const index_registerExternalTool = function (toolName, toolClass) {
|
|
98028
|
+
const index_registerExternalTool = function (toolName, toolClass, toolVersion = "") {
|
|
98026
98029
|
if (index_dvTools[toolName] || index_DEFAULT_TOOLS[toolName]) {
|
|
98027
98030
|
index_logger_logger.debug(`${toolName} already exists, it will be replaced`);
|
|
98028
98031
|
}
|
|
98032
|
+
const targetTools = toolVersion === "MPR"
|
|
98033
|
+
? index_DEFAULT_TOOLS_MPR
|
|
98034
|
+
: toolVersion === "3D"
|
|
98035
|
+
? index_DEFAULT_TOOLS_3D
|
|
98036
|
+
: index_DEFAULT_TOOLS;
|
|
98029
98037
|
index_dvTools[toolClass.name] = toolClass;
|
|
98030
|
-
|
|
98038
|
+
targetTools[toolName] = {
|
|
98031
98039
|
name: toolName,
|
|
98032
98040
|
class: toolClass.name,
|
|
98033
98041
|
viewports: "all",
|
|
@@ -284142,9 +284150,9 @@ var index_main_awaiter = (undefined && undefined.__awaiter) || function (thisArg
|
|
|
284142
284150
|
*/
|
|
284143
284151
|
const index_main_initializeCSTools = function (settings, style) {
|
|
284144
284152
|
return index_main_awaiter(this, void 0, void 0, function* () {
|
|
284145
|
-
// TODO proper config
|
|
284153
|
+
// TODO proper config (eg style, settings, etc)
|
|
284146
284154
|
yield index_init_init();
|
|
284147
|
-
index_logger_logger.warn("initializeCSTools is not implemented yet");
|
|
284155
|
+
index_logger_logger.warn("initializeCSTools is not fully implemented yet");
|
|
284148
284156
|
});
|
|
284149
284157
|
};
|
|
284150
284158
|
/**
|
|
@@ -284177,7 +284185,8 @@ const index_main_addTool = function (toolName, customConfig, groupId) {
|
|
|
284177
284185
|
if (!toolClassName) {
|
|
284178
284186
|
throw new Error(`Tool ${toolName} class not found. Please check tools/default or pass a valid tool class name in the configuration object.`);
|
|
284179
284187
|
}
|
|
284180
|
-
const toolClass =
|
|
284188
|
+
const toolClass = index_dvTools[toolClassName] ||
|
|
284189
|
+
index_dist_esm_namespaceObject[toolClassName];
|
|
284181
284190
|
index_addTool_addTool(toolClass);
|
|
284182
284191
|
if (groupId) {
|
|
284183
284192
|
const toolGroup = index_ToolGroupManager_getToolGroup(groupId);
|
|
@@ -284311,33 +284320,53 @@ const index_main_setToolDisabled = function (toolName, groupId = "default", rese
|
|
|
284311
284320
|
/**
|
|
284312
284321
|
* @function syncViewportsCamera
|
|
284313
284322
|
* @desc Synchronizes the camera position of two (volume) viewports
|
|
284323
|
+
* @param id - unique id for the synchronizer @default "default"
|
|
284314
284324
|
* @param targetViewportId - the id of the target viewport where the camera will be synced
|
|
284315
284325
|
* @param sourceViewportId - the id of the source viewport from where the camera position will be taken
|
|
284316
284326
|
*/
|
|
284317
|
-
const index_syncViewportsCamera = function (
|
|
284318
|
-
|
|
284319
|
-
|
|
284320
|
-
|
|
284321
|
-
return;
|
|
284322
|
-
}
|
|
284323
|
-
let cameraSync = index_SynchronizerManager_getSynchronizer('default');
|
|
284327
|
+
const index_syncViewportsCamera = function (id = "default", // unique id for the synchronizer
|
|
284328
|
+
targetViewportId, sourceViewportId) {
|
|
284329
|
+
var _a, _b, _c, _d;
|
|
284330
|
+
let cameraSync = index_SynchronizerManager_getSynchronizer(id);
|
|
284324
284331
|
if (!cameraSync) {
|
|
284325
|
-
cameraSync =
|
|
284332
|
+
cameraSync =
|
|
284333
|
+
index_createCameraPositionSynchronizer(id);
|
|
284326
284334
|
}
|
|
284327
284335
|
else if (cameraSync) {
|
|
284328
284336
|
// cameraSync.getSourceViewports().forEach((viewportId) => {
|
|
284329
284337
|
// cameraSync!.removeSource(viewportId);
|
|
284330
284338
|
// });
|
|
284331
|
-
index_SynchronizerManager_destroySynchronizer(
|
|
284332
|
-
cameraSync =
|
|
284339
|
+
index_SynchronizerManager_destroySynchronizer(id);
|
|
284340
|
+
cameraSync =
|
|
284341
|
+
index_createCameraPositionSynchronizer(id);
|
|
284342
|
+
}
|
|
284343
|
+
const targetRenderingEngineId = (_a = index_getEnabledElementByViewportId(targetViewportId)) === null || _a === void 0 ? void 0 : _a.renderingEngineId;
|
|
284344
|
+
const sourceRenderingEngineId = (_b = index_getEnabledElementByViewportId(sourceViewportId)) === null || _b === void 0 ? void 0 : _b.renderingEngineId;
|
|
284345
|
+
if (!targetRenderingEngineId || !sourceRenderingEngineId) {
|
|
284346
|
+
index_logger_logger.error("syncViewportsCamera: no rendering engine found for one of the viewports");
|
|
284347
|
+
return;
|
|
284348
|
+
}
|
|
284349
|
+
// get plane and position from the source viewport and set to target viewport
|
|
284350
|
+
// TODO why the sync does not work first time ?
|
|
284351
|
+
const sourceViewport = (_c = index_getEnabledElementByViewportId(sourceViewportId)) === null || _c === void 0 ? void 0 : _c.viewport;
|
|
284352
|
+
if (!sourceViewport) {
|
|
284353
|
+
index_logger_logger.error("syncViewportsCamera: source viewport not found");
|
|
284354
|
+
return;
|
|
284355
|
+
}
|
|
284356
|
+
const sourceViewRef = sourceViewport.getViewReference();
|
|
284357
|
+
const targetViewport = (_d = index_getEnabledElementByViewportId(targetViewportId)) === null || _d === void 0 ? void 0 : _d.viewport;
|
|
284358
|
+
if (!targetViewport) {
|
|
284359
|
+
index_logger_logger.error("syncViewportsCamera: target viewport not found");
|
|
284360
|
+
return;
|
|
284333
284361
|
}
|
|
284334
|
-
|
|
284335
|
-
|
|
284336
|
-
|
|
284362
|
+
targetViewport.setViewReference(sourceViewRef);
|
|
284363
|
+
cameraSync.add({
|
|
284364
|
+
renderingEngineId: sourceRenderingEngineId,
|
|
284365
|
+
viewportId: sourceViewportId
|
|
284337
284366
|
});
|
|
284338
|
-
cameraSync.
|
|
284339
|
-
renderingEngineId:
|
|
284340
|
-
viewportId: targetViewportId
|
|
284367
|
+
cameraSync.add({
|
|
284368
|
+
renderingEngineId: targetRenderingEngineId,
|
|
284369
|
+
viewportId: targetViewportId
|
|
284341
284370
|
});
|
|
284342
284371
|
const targetElement = index_getEnabledElementByViewportId(targetViewportId);
|
|
284343
284372
|
targetElement.viewport.render();
|
|
@@ -284346,33 +284375,310 @@ const index_syncViewportsCamera = function (targetViewportId, sourceViewportId)
|
|
|
284346
284375
|
index_logger_logger.debug(`Camera sync added from ${sourceViewportId} to ${targetViewportId}`);
|
|
284347
284376
|
// FIXME: how to force a refresh of the viewport?
|
|
284348
284377
|
};
|
|
284349
|
-
|
|
284350
|
-
|
|
284351
|
-
|
|
284352
|
-
|
|
284353
|
-
|
|
284354
|
-
|
|
284378
|
+
/**
|
|
284379
|
+
* Create a tool group and add the specified viewports and tools to it.
|
|
284380
|
+
* @function createToolGroup
|
|
284381
|
+
* @param groupId - The id of the tool group to create. @default "default"
|
|
284382
|
+
* @param viewports
|
|
284383
|
+
* @param tools
|
|
284384
|
+
* @returns toolGroup - The created tool group.
|
|
284385
|
+
*/
|
|
284386
|
+
const index_main_createToolGroup = function (groupId = "default", viewports = [], tools = [] // TODO type this properly
|
|
284387
|
+
) {
|
|
284355
284388
|
const toolGroup = index_ToolGroupManager_createToolGroup(groupId);
|
|
284356
284389
|
if (!toolGroup) {
|
|
284357
284390
|
index_logger_logger.error("createToolGroup: tool group not created");
|
|
284358
284391
|
return;
|
|
284359
284392
|
}
|
|
284360
284393
|
viewports.forEach(vp => {
|
|
284361
|
-
|
|
284362
|
-
|
|
284363
|
-
|
|
284364
|
-
|
|
284365
|
-
// csTools.utilities.stackPrefetch.enable(viewport.element);
|
|
284366
|
-
if (vp === "MPR") {
|
|
284394
|
+
var _a;
|
|
284395
|
+
const renderingEngineId = (_a = index_getEnabledElementByViewportId(vp)) === null || _a === void 0 ? void 0 : _a.renderingEngineId;
|
|
284396
|
+
if (!renderingEngineId) {
|
|
284397
|
+
index_logger_logger.error(`createToolGroup: rendering engine not found for viewport ${vp}`);
|
|
284367
284398
|
return;
|
|
284368
284399
|
}
|
|
284369
|
-
toolGroup.addViewport(vp,
|
|
284400
|
+
toolGroup.addViewport(vp, renderingEngineId);
|
|
284401
|
+
});
|
|
284402
|
+
tools.forEach(tool => {
|
|
284403
|
+
index_main_addTool(tool.name, tool.configuration, groupId);
|
|
284404
|
+
index_logger_logger.debug(`Tool ${tool.name} added to group:`, groupId);
|
|
284370
284405
|
});
|
|
284371
284406
|
return toolGroup;
|
|
284372
284407
|
};
|
|
284373
|
-
|
|
284374
|
-
|
|
284375
|
-
|
|
284408
|
+
/**
|
|
284409
|
+
* Set slab thickness and mode for a given viewport
|
|
284410
|
+
* @function setSlab
|
|
284411
|
+
* @param slabThickness - The thickness of the slab [in mm].
|
|
284412
|
+
* @param slabMode - The blend mode to use for the slab.
|
|
284413
|
+
* @param viewportId - The id of the viewport where the slab will be set.
|
|
284414
|
+
*/
|
|
284415
|
+
const index_setSlab = function (slabThickness, slabMode, viewportId) {
|
|
284416
|
+
const viewport = index_getEnabledElementByViewportId(viewportId).viewport;
|
|
284417
|
+
if (!viewport || viewport instanceof index_RenderingEngine_StackViewport) {
|
|
284418
|
+
index_logger_logger.error("setSlab: viewport not found");
|
|
284419
|
+
return;
|
|
284420
|
+
}
|
|
284421
|
+
viewport.setBlendMode(slabMode);
|
|
284422
|
+
viewport.setProperties({ slabThickness });
|
|
284423
|
+
viewport.render();
|
|
284424
|
+
};
|
|
284425
|
+
/**
|
|
284426
|
+
* Set the window width and level for a given viewport
|
|
284427
|
+
* @param ww - window width
|
|
284428
|
+
* @param wl - window level
|
|
284429
|
+
* @param viewportId - The id of the viewport where the window width and level will be set.
|
|
284430
|
+
*/
|
|
284431
|
+
const index_setWWWL = function (ww, wl, viewportId) {
|
|
284432
|
+
const viewport = index_getEnabledElementByViewportId(viewportId).viewport;
|
|
284433
|
+
if (!viewport || viewport instanceof index_RenderingEngine_StackViewport) {
|
|
284434
|
+
index_logger_logger.error("setWWWL: viewport not found");
|
|
284435
|
+
return;
|
|
284436
|
+
}
|
|
284437
|
+
viewport.setProperties({ voiRange: { lower: wl - ww / 2, upper: wl + ww / 2 } });
|
|
284438
|
+
viewport.render();
|
|
284439
|
+
};
|
|
284440
|
+
|
|
284441
|
+
;// ./imaging3d/tools/custom/exampleCustomTool.ts
|
|
284442
|
+
|
|
284443
|
+
|
|
284444
|
+
// Todo: should move to configuration
|
|
284445
|
+
const index_exampleCustomTool_DEFAULT_MULTIPLIER = 4;
|
|
284446
|
+
const index_exampleCustomTool_DEFAULT_IMAGE_DYNAMIC_RANGE = 1024;
|
|
284447
|
+
const index_exampleCustomTool_PT = "PT";
|
|
284448
|
+
/**
|
|
284449
|
+
* WindowLevel tool manipulates the windowLevel applied to a viewport. It
|
|
284450
|
+
* provides a way to set the windowCenter and windowWidth of a viewport
|
|
284451
|
+
* by dragging mouse over the image.
|
|
284452
|
+
*
|
|
284453
|
+
*/
|
|
284454
|
+
class index_CustomWWWLTool extends index_base_BaseTool {
|
|
284455
|
+
constructor(toolProps = {}, defaultToolProps = {
|
|
284456
|
+
supportedInteractionTypes: ["Mouse", "Touch"]
|
|
284457
|
+
}) {
|
|
284458
|
+
super(toolProps, defaultToolProps);
|
|
284459
|
+
// @ts-ignore
|
|
284460
|
+
this._getImageDynamicRangeFromMiddleSlice = (scalarData, dimensions) => {
|
|
284461
|
+
const middleSliceIndex = Math.floor(dimensions[2] / 2);
|
|
284462
|
+
const frameLength = dimensions[0] * dimensions[1];
|
|
284463
|
+
let bytesPerVoxel;
|
|
284464
|
+
let TypedArrayConstructor;
|
|
284465
|
+
if (scalarData instanceof Float32Array) {
|
|
284466
|
+
bytesPerVoxel = 4;
|
|
284467
|
+
TypedArrayConstructor = Float32Array;
|
|
284468
|
+
}
|
|
284469
|
+
else if (scalarData instanceof Uint8Array) {
|
|
284470
|
+
bytesPerVoxel = 1;
|
|
284471
|
+
TypedArrayConstructor = Uint8Array;
|
|
284472
|
+
}
|
|
284473
|
+
else if (scalarData instanceof Uint16Array) {
|
|
284474
|
+
bytesPerVoxel = 2;
|
|
284475
|
+
TypedArrayConstructor = Uint16Array;
|
|
284476
|
+
}
|
|
284477
|
+
else if (scalarData instanceof Int16Array) {
|
|
284478
|
+
bytesPerVoxel = 2;
|
|
284479
|
+
TypedArrayConstructor = Int16Array;
|
|
284480
|
+
}
|
|
284481
|
+
const buffer = scalarData.buffer;
|
|
284482
|
+
// @ts-ignore
|
|
284483
|
+
const byteOffset = middleSliceIndex * frameLength * bytesPerVoxel;
|
|
284484
|
+
// @ts-ignore
|
|
284485
|
+
const frame = new TypedArrayConstructor(buffer, byteOffset, frameLength);
|
|
284486
|
+
// @ts-ignore
|
|
284487
|
+
const { max, min } = this._getMinMax(frame, frameLength);
|
|
284488
|
+
return max - min;
|
|
284489
|
+
};
|
|
284490
|
+
}
|
|
284491
|
+
touchDragCallback(evt) {
|
|
284492
|
+
this.mouseDragCallback(evt);
|
|
284493
|
+
}
|
|
284494
|
+
mouseDragCallback(evt) {
|
|
284495
|
+
var _a, _b;
|
|
284496
|
+
const { element, deltaPoints } = evt.detail;
|
|
284497
|
+
const enabledElement = index_getEnabledElement(element);
|
|
284498
|
+
if (!enabledElement) {
|
|
284499
|
+
throw new Error("Enabled element not found");
|
|
284500
|
+
}
|
|
284501
|
+
const { viewport } = enabledElement;
|
|
284502
|
+
let volumeId, lower, upper, modality, newRange, viewportsContainingVolumeUID;
|
|
284503
|
+
let isPreScaled = false;
|
|
284504
|
+
const properties = viewport.getProperties();
|
|
284505
|
+
if (viewport instanceof index_RenderingEngine_VolumeViewport) {
|
|
284506
|
+
volumeId = viewport.getVolumeId();
|
|
284507
|
+
viewportsContainingVolumeUID =
|
|
284508
|
+
index_utilities_getViewportsWithVolumeId(volumeId);
|
|
284509
|
+
// @ts-ignore
|
|
284510
|
+
({ lower, upper } = properties.voiRange);
|
|
284511
|
+
const volume = index_esm_cache_cache.getVolume(volumeId);
|
|
284512
|
+
if (!volume) {
|
|
284513
|
+
throw new Error("Volume not found " + volumeId);
|
|
284514
|
+
}
|
|
284515
|
+
modality = volume.metadata.Modality;
|
|
284516
|
+
isPreScaled = volume.scaling && Object.keys(volume.scaling).length > 0;
|
|
284517
|
+
}
|
|
284518
|
+
else if (properties.voiRange) {
|
|
284519
|
+
modality = viewport.modality;
|
|
284520
|
+
({ lower, upper } = properties.voiRange);
|
|
284521
|
+
const { preScale = { scaled: false } } = ((_a = viewport.getImageData) === null || _a === void 0 ? void 0 : _a.call(viewport)) || {};
|
|
284522
|
+
// @ts-ignore
|
|
284523
|
+
isPreScaled =
|
|
284524
|
+
preScale.scaled && ((_b = preScale.scalingParameters) === null || _b === void 0 ? void 0 : _b.suvbw) !== undefined;
|
|
284525
|
+
}
|
|
284526
|
+
else {
|
|
284527
|
+
throw new Error("Viewport is not a valid type");
|
|
284528
|
+
}
|
|
284529
|
+
// If modality is PT an the viewport is pre-scaled (SUV),
|
|
284530
|
+
// treat it special to not include the canvas delta in
|
|
284531
|
+
// the x direction. For other modalities, use the canvas delta in both
|
|
284532
|
+
// directions, and if the viewport is a volumeViewport, the multiplier
|
|
284533
|
+
// is calculate using the volume min and max.
|
|
284534
|
+
if (modality === index_exampleCustomTool_PT && isPreScaled) {
|
|
284535
|
+
newRange = this.getPTScaledNewRange({
|
|
284536
|
+
deltaPointsCanvas: deltaPoints.canvas,
|
|
284537
|
+
lower,
|
|
284538
|
+
upper,
|
|
284539
|
+
clientHeight: element.clientHeight,
|
|
284540
|
+
isPreScaled,
|
|
284541
|
+
viewport,
|
|
284542
|
+
volumeId
|
|
284543
|
+
});
|
|
284544
|
+
}
|
|
284545
|
+
else {
|
|
284546
|
+
newRange = this.getNewRange({
|
|
284547
|
+
viewport,
|
|
284548
|
+
deltaPointsCanvas: deltaPoints.canvas,
|
|
284549
|
+
volumeId,
|
|
284550
|
+
lower,
|
|
284551
|
+
upper
|
|
284552
|
+
});
|
|
284553
|
+
}
|
|
284554
|
+
// If the range is not valid. Do nothing
|
|
284555
|
+
if (newRange.lower >= newRange.upper) {
|
|
284556
|
+
return;
|
|
284557
|
+
}
|
|
284558
|
+
viewport.setProperties({
|
|
284559
|
+
voiRange: newRange
|
|
284560
|
+
});
|
|
284561
|
+
viewport.render();
|
|
284562
|
+
if (viewport instanceof index_RenderingEngine_VolumeViewport) {
|
|
284563
|
+
viewportsContainingVolumeUID.forEach(vp => {
|
|
284564
|
+
if (viewport !== vp) {
|
|
284565
|
+
vp.render();
|
|
284566
|
+
}
|
|
284567
|
+
});
|
|
284568
|
+
return;
|
|
284569
|
+
}
|
|
284570
|
+
}
|
|
284571
|
+
// @ts-ignore
|
|
284572
|
+
getPTScaledNewRange({ deltaPointsCanvas, lower, upper, clientHeight, viewport, volumeId, isPreScaled }) {
|
|
284573
|
+
let multiplier = index_exampleCustomTool_DEFAULT_MULTIPLIER;
|
|
284574
|
+
if (isPreScaled) {
|
|
284575
|
+
multiplier = 5 / clientHeight;
|
|
284576
|
+
}
|
|
284577
|
+
else {
|
|
284578
|
+
multiplier =
|
|
284579
|
+
this._getMultiplierFromDynamicRange(viewport, volumeId) ||
|
|
284580
|
+
index_exampleCustomTool_DEFAULT_MULTIPLIER;
|
|
284581
|
+
}
|
|
284582
|
+
const deltaY = deltaPointsCanvas[1];
|
|
284583
|
+
const wcDelta = deltaY * multiplier;
|
|
284584
|
+
upper -= wcDelta;
|
|
284585
|
+
upper = isPreScaled ? Math.max(upper, 0.1) : upper;
|
|
284586
|
+
return { lower, upper };
|
|
284587
|
+
}
|
|
284588
|
+
// @ts-ignore
|
|
284589
|
+
getNewRange({ viewport, deltaPointsCanvas, volumeId, lower, upper }) {
|
|
284590
|
+
const multiplier = this._getMultiplierFromDynamicRange(viewport, volumeId) ||
|
|
284591
|
+
index_exampleCustomTool_DEFAULT_MULTIPLIER;
|
|
284592
|
+
const wwDelta = deltaPointsCanvas[0] * multiplier;
|
|
284593
|
+
const wcDelta = deltaPointsCanvas[1] * multiplier;
|
|
284594
|
+
let { windowWidth, windowCenter } = index_toWindowLevel(lower, upper);
|
|
284595
|
+
windowWidth += wwDelta;
|
|
284596
|
+
windowCenter += wcDelta;
|
|
284597
|
+
windowWidth = Math.max(windowWidth, 1);
|
|
284598
|
+
const voiLutFunction = viewport.getProperties().VOILUTFunction;
|
|
284599
|
+
// Convert back to range
|
|
284600
|
+
return index_toLowHighRange(windowWidth, windowCenter, voiLutFunction);
|
|
284601
|
+
}
|
|
284602
|
+
// @ts-ignore
|
|
284603
|
+
_getMultiplierFromDynamicRange(viewport, volumeId) {
|
|
284604
|
+
var _a;
|
|
284605
|
+
let imageDynamicRange;
|
|
284606
|
+
if (volumeId) {
|
|
284607
|
+
const imageVolume = index_esm_cache_cache.getVolume(volumeId);
|
|
284608
|
+
const { voxelManager } = viewport.getImageData();
|
|
284609
|
+
const middleSlicePixelData = voxelManager.getMiddleSliceData();
|
|
284610
|
+
const calculatedDynamicRange = middleSlicePixelData.reduce(
|
|
284611
|
+
// @ts-ignore
|
|
284612
|
+
(acc, pixel) => {
|
|
284613
|
+
return [Math.min(acc[0], pixel), Math.max(acc[1], pixel)];
|
|
284614
|
+
}, [Infinity, -Infinity]);
|
|
284615
|
+
const BitsStored = (_a = imageVolume === null || imageVolume === void 0 ? void 0 : imageVolume.metadata) === null || _a === void 0 ? void 0 : _a.BitsStored;
|
|
284616
|
+
const metadataDynamicRange = BitsStored ? 2 ** BitsStored : Infinity;
|
|
284617
|
+
// Burned in Pixels often use pixel values above the BitsStored.
|
|
284618
|
+
// This results in a multiplier which is way higher than what you would
|
|
284619
|
+
// want in practice. Thus we take the min between the metadata dynamic
|
|
284620
|
+
// range and actual middle slice dynamic range.
|
|
284621
|
+
imageDynamicRange = Math.min(calculatedDynamicRange, metadataDynamicRange);
|
|
284622
|
+
}
|
|
284623
|
+
else {
|
|
284624
|
+
imageDynamicRange = this._getImageDynamicRangeFromViewport(viewport);
|
|
284625
|
+
}
|
|
284626
|
+
const ratio = imageDynamicRange / index_exampleCustomTool_DEFAULT_IMAGE_DYNAMIC_RANGE;
|
|
284627
|
+
return ratio > 1 ? Math.round(ratio) : ratio;
|
|
284628
|
+
}
|
|
284629
|
+
// @ts-ignore
|
|
284630
|
+
_getImageDynamicRangeFromViewport(viewport) {
|
|
284631
|
+
const { imageData, voxelManager } = viewport.getImageData();
|
|
284632
|
+
// this should address the case where the voxelManager is used
|
|
284633
|
+
// for the new volume viewport model
|
|
284634
|
+
if (voxelManager === null || voxelManager === void 0 ? void 0 : voxelManager.getRange) {
|
|
284635
|
+
const range = voxelManager.getRange();
|
|
284636
|
+
return range[1] - range[0];
|
|
284637
|
+
}
|
|
284638
|
+
const dimensions = imageData.getDimensions();
|
|
284639
|
+
if (imageData.getRange) {
|
|
284640
|
+
const imageDataRange = imageData.getRange();
|
|
284641
|
+
return imageDataRange[1] - imageDataRange[0];
|
|
284642
|
+
}
|
|
284643
|
+
let scalarData;
|
|
284644
|
+
// if getScalarData is a method on imageData
|
|
284645
|
+
if (imageData.getScalarData) {
|
|
284646
|
+
scalarData = imageData.getScalarData();
|
|
284647
|
+
}
|
|
284648
|
+
else {
|
|
284649
|
+
scalarData = imageData.getPointData().getScalars().getData();
|
|
284650
|
+
}
|
|
284651
|
+
if (dimensions[2] !== 1) {
|
|
284652
|
+
return this._getImageDynamicRangeFromMiddleSlice(scalarData, dimensions);
|
|
284653
|
+
}
|
|
284654
|
+
let range;
|
|
284655
|
+
if (scalarData.getRange) {
|
|
284656
|
+
range = scalarData.getRange();
|
|
284657
|
+
}
|
|
284658
|
+
else {
|
|
284659
|
+
const { min, max } = this._getMinMax(scalarData, scalarData.length);
|
|
284660
|
+
range = [min, max];
|
|
284661
|
+
}
|
|
284662
|
+
return range[1] - range[0];
|
|
284663
|
+
}
|
|
284664
|
+
_getMinMax(frame, frameLength) {
|
|
284665
|
+
let min = Infinity;
|
|
284666
|
+
let max = -Infinity;
|
|
284667
|
+
for (let i = 0; i < frameLength; i++) {
|
|
284668
|
+
const voxel = frame[i];
|
|
284669
|
+
if (voxel < min) {
|
|
284670
|
+
min = voxel;
|
|
284671
|
+
}
|
|
284672
|
+
if (voxel > max) {
|
|
284673
|
+
max = voxel;
|
|
284674
|
+
}
|
|
284675
|
+
}
|
|
284676
|
+
return { max, min };
|
|
284677
|
+
}
|
|
284678
|
+
}
|
|
284679
|
+
index_CustomWWWLTool.toolName = "CustomWWWLTool";
|
|
284680
|
+
index_CustomWWWLTool.toolName = "CustomWWWLTool";
|
|
284681
|
+
/* harmony default export */ const index_exampleCustomTool = (index_CustomWWWLTool);
|
|
284376
284682
|
|
|
284377
284683
|
;// ./index.ts
|
|
284378
284684
|
|
|
@@ -284447,6 +284753,7 @@ console.groupEnd();
|
|
|
284447
284753
|
|
|
284448
284754
|
|
|
284449
284755
|
|
|
284756
|
+
|
|
284450
284757
|
// alias for backward compatibility
|
|
284451
284758
|
// deprecate in future release
|
|
284452
284759
|
const index_updateLarvitarManager = index_createAliasWithWarning(index_updateImageManager, "updateImageManager", "updateLarvitarManager");
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"medical",
|
|
7
7
|
"cornerstone"
|
|
8
8
|
],
|
|
9
|
-
"version": "4.0.0-alpha.
|
|
9
|
+
"version": "4.0.0-alpha.7",
|
|
10
10
|
"description": "typescript library for parsing, loading, rendering and interacting with DICOM images",
|
|
11
11
|
"repository": {
|
|
12
12
|
"url": "https://github.com/dvisionlab/Larvitar.git",
|