volview 4.0.0 → 4.0.1

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.
Files changed (404) hide show
  1. package/dist/css/app.925b979f.css +1 -0
  2. package/dist/css/chunk-vendors.43a6a19a.css +5 -0
  3. package/{public → dist}/favicon.ico +0 -0
  4. package/{public → dist}/global.css +0 -0
  5. package/{src/assets/KitwareHeadAndNeck.jpg → dist/img/KitwareHeadAndNeck.11db5ffb.jpg} +0 -0
  6. package/dist/index.html +1 -0
  7. package/dist/itk/image-io/BMPImageIOReadImage.js +1 -0
  8. package/dist/itk/image-io/BMPImageIOReadImage.umd.js +1 -0
  9. package/dist/itk/image-io/BMPImageIOReadImage.wasm +0 -0
  10. package/dist/itk/image-io/BMPImageIOWriteImage.js +1 -0
  11. package/dist/itk/image-io/BMPImageIOWriteImage.umd.js +1 -0
  12. package/dist/itk/image-io/BMPImageIOWriteImage.wasm +0 -0
  13. package/dist/itk/image-io/GDCMImageIOReadImage.js +1 -0
  14. package/dist/itk/image-io/GDCMImageIOReadImage.umd.js +1 -0
  15. package/dist/itk/image-io/GDCMImageIOReadImage.wasm +0 -0
  16. package/dist/itk/image-io/GDCMImageIOWriteImage.js +1 -0
  17. package/dist/itk/image-io/GDCMImageIOWriteImage.umd.js +1 -0
  18. package/dist/itk/image-io/GDCMImageIOWriteImage.wasm +0 -0
  19. package/dist/itk/image-io/JPEGImageIOReadImage.js +1 -0
  20. package/dist/itk/image-io/JPEGImageIOReadImage.umd.js +1 -0
  21. package/dist/itk/image-io/JPEGImageIOReadImage.wasm +0 -0
  22. package/dist/itk/image-io/JPEGImageIOWriteImage.js +1 -0
  23. package/dist/itk/image-io/JPEGImageIOWriteImage.umd.js +1 -0
  24. package/dist/itk/image-io/JPEGImageIOWriteImage.wasm +0 -0
  25. package/dist/itk/image-io/MetaImageIOReadImage.js +1 -0
  26. package/dist/itk/image-io/MetaImageIOReadImage.umd.js +1 -0
  27. package/dist/itk/image-io/MetaImageIOReadImage.wasm +0 -0
  28. package/dist/itk/image-io/MetaImageIOWriteImage.js +1 -0
  29. package/dist/itk/image-io/MetaImageIOWriteImage.umd.js +1 -0
  30. package/dist/itk/image-io/MetaImageIOWriteImage.wasm +0 -0
  31. package/dist/itk/image-io/NiftiImageIOReadImage.js +1 -0
  32. package/dist/itk/image-io/NiftiImageIOReadImage.umd.js +1 -0
  33. package/dist/itk/image-io/NiftiImageIOReadImage.wasm +0 -0
  34. package/dist/itk/image-io/NiftiImageIOWriteImage.js +1 -0
  35. package/dist/itk/image-io/NiftiImageIOWriteImage.umd.js +1 -0
  36. package/dist/itk/image-io/NiftiImageIOWriteImage.wasm +0 -0
  37. package/dist/itk/image-io/NrrdImageIOReadImage.js +1 -0
  38. package/dist/itk/image-io/NrrdImageIOReadImage.umd.js +1 -0
  39. package/dist/itk/image-io/NrrdImageIOReadImage.wasm +0 -0
  40. package/dist/itk/image-io/NrrdImageIOWriteImage.js +1 -0
  41. package/dist/itk/image-io/NrrdImageIOWriteImage.umd.js +1 -0
  42. package/dist/itk/image-io/NrrdImageIOWriteImage.wasm +0 -0
  43. package/dist/itk/image-io/PNGImageIOReadImage.js +1 -0
  44. package/dist/itk/image-io/PNGImageIOReadImage.umd.js +1 -0
  45. package/dist/itk/image-io/PNGImageIOReadImage.wasm +0 -0
  46. package/dist/itk/image-io/PNGImageIOWriteImage.js +1 -0
  47. package/dist/itk/image-io/PNGImageIOWriteImage.umd.js +1 -0
  48. package/dist/itk/image-io/PNGImageIOWriteImage.wasm +0 -0
  49. package/dist/itk/image-io/ReadDICOMTags.js +1 -0
  50. package/dist/itk/image-io/ReadDICOMTags.umd.js +1 -0
  51. package/dist/itk/image-io/ReadDICOMTags.wasm +0 -0
  52. package/dist/itk/image-io/ReadImageDICOMFileSeries.js +1 -0
  53. package/dist/itk/image-io/ReadImageDICOMFileSeries.umd.js +1 -0
  54. package/dist/itk/image-io/ReadImageDICOMFileSeries.wasm +0 -0
  55. package/dist/itk/image-io/VTKImageIOReadImage.js +1 -0
  56. package/dist/itk/image-io/VTKImageIOReadImage.umd.js +1 -0
  57. package/dist/itk/image-io/VTKImageIOReadImage.wasm +0 -0
  58. package/dist/itk/image-io/VTKImageIOWriteImage.js +1 -0
  59. package/dist/itk/image-io/VTKImageIOWriteImage.umd.js +1 -0
  60. package/dist/itk/image-io/VTKImageIOWriteImage.wasm +0 -0
  61. package/dist/itk/pipelines/dicom.js +1 -0
  62. package/dist/itk/pipelines/dicom.umd.js +1 -0
  63. package/{src/io/itk-dicom/web-build → dist/itk/pipelines}/dicom.umd.wasm +0 -0
  64. package/{src/io/itk-dicom/web-build → dist/itk/pipelines}/dicom.wasm +0 -0
  65. package/dist/itk/web-workers/IOInput.d.ts +6 -0
  66. package/dist/itk/web-workers/IOInput.js +1 -0
  67. package/dist/itk/web-workers/ITKConfig.d.ts +8 -0
  68. package/dist/itk/web-workers/ITKConfig.js +1 -0
  69. package/dist/itk/web-workers/RunPipelineInput.d.ts +10 -0
  70. package/dist/itk/web-workers/RunPipelineInput.js +1 -0
  71. package/dist/itk/web-workers/WebWorkerInput.d.ts +6 -0
  72. package/dist/itk/web-workers/WebWorkerInput.js +1 -0
  73. package/dist/itk/web-workers/bundles/pipeline.worker.js +1 -0
  74. package/dist/itk/web-workers/loadImageIOPipelineModule.d.ts +4 -0
  75. package/dist/itk/web-workers/loadImageIOPipelineModule.js +1 -0
  76. package/dist/itk/web-workers/loadMeshIOPipelineModule.d.ts +4 -0
  77. package/dist/itk/web-workers/loadMeshIOPipelineModule.js +1 -0
  78. package/dist/itk/web-workers/loadPipelineModule.d.ts +3 -0
  79. package/dist/itk/web-workers/loadPipelineModule.js +1 -0
  80. package/dist/itk/web-workers/min-bundles/pipeline.worker.js +3 -0
  81. package/dist/itk/web-workers/pipeline.worker.d.ts +1 -0
  82. package/dist/itk/web-workers/pipeline.worker.js +1 -0
  83. package/dist/itk/web-workers/runPipeline.d.ts +5 -0
  84. package/dist/itk/web-workers/runPipeline.js +1 -0
  85. package/dist/js/23.be4d694e.js +21 -0
  86. package/dist/js/23.be4d694e.js.map +1 -0
  87. package/dist/js/385.51ca48a2.js +2 -0
  88. package/dist/js/385.51ca48a2.js.map +1 -0
  89. package/dist/js/422.c64a6aa7.js +2 -0
  90. package/dist/js/422.c64a6aa7.js.map +1 -0
  91. package/dist/js/979.c4823352.js +2 -0
  92. package/dist/js/979.c4823352.js.map +1 -0
  93. package/dist/js/app.81e49d9a.js +2 -0
  94. package/dist/js/app.81e49d9a.js.map +1 -0
  95. package/dist/js/chunk-vendors.0ab48f8d.js +33 -0
  96. package/dist/js/chunk-vendors.0ab48f8d.js.map +1 -0
  97. package/{public → dist}/pvm-sample.png +0 -0
  98. package/package.json +3 -2
  99. package/.browserslistrc +0 -4
  100. package/.editorconfig +0 -6
  101. package/.env +0 -6
  102. package/.eslintrc.js +0 -109
  103. package/.gitattributes +0 -1
  104. package/.github/workflows/checks.yml +0 -16
  105. package/.github/workflows/publish.yml +0 -52
  106. package/.prettierignore +0 -5
  107. package/CONTRIBUTING.md +0 -29
  108. package/babel.config.js +0 -3
  109. package/documentation/config.js +0 -15
  110. package/documentation/content/KWVolViewLogo.png +0 -0
  111. package/documentation/content/KWVolViewLogo.svg +0 -35
  112. package/documentation/content/VolViewLogo.png +0 -0
  113. package/documentation/content/VolViewLogo.svg +0 -22
  114. package/documentation/content/doc/index.md +0 -64
  115. package/documentation/content/doc/loading_data.md +0 -30
  116. package/documentation/content/doc/mouse_controls.md +0 -34
  117. package/documentation/content/doc/quick_start_guide.md +0 -75
  118. package/documentation/content/doc/rendering.md +0 -27
  119. package/documentation/content/doc/state_files.md +0 -18
  120. package/documentation/content/doc/toolbar.md +0 -20
  121. package/documentation/content/doc/welcome_screen.md +0 -23
  122. package/documentation/content/gallery/01-volview-welcome-notes.jpg +0 -0
  123. package/documentation/content/gallery/01-volview-welcome.jpg +0 -0
  124. package/documentation/content/gallery/02-volview-about.jpg +0 -0
  125. package/documentation/content/gallery/02-volview-notifications.jpg +0 -0
  126. package/documentation/content/gallery/02-volview-settings.jpg +0 -0
  127. package/documentation/content/gallery/03-volview-sample-datasets.jpg +0 -0
  128. package/documentation/content/gallery/04-volview-active-data.jpg +0 -0
  129. package/documentation/content/gallery/05-volview-select-data-to-delete.jpg +0 -0
  130. package/documentation/content/gallery/06-volview-corner-annotation.jpg +0 -0
  131. package/documentation/content/gallery/07-volview-layout-notes.jpg +0 -0
  132. package/documentation/content/gallery/07-volview-layout.jpg +0 -0
  133. package/documentation/content/gallery/09-volview-layout-3DPrimary.jpg +0 -0
  134. package/documentation/content/gallery/10-volview-wl-pan-zoom-notes.jpg +0 -0
  135. package/documentation/content/gallery/10-volview-wl-pan-zoom.jpg +0 -0
  136. package/documentation/content/gallery/11-volview-paint-notes.jpg +0 -0
  137. package/documentation/content/gallery/11-volview-paint.jpg +0 -0
  138. package/documentation/content/gallery/12-volview-paint-options.jpg +0 -0
  139. package/documentation/content/gallery/13-volview-crop-notes.jpg +0 -0
  140. package/documentation/content/gallery/13-volview-crop.jpg +0 -0
  141. package/documentation/content/gallery/14-volview-ruler.jpg +0 -0
  142. package/documentation/content/gallery/15-volview-crosshairs.jpg +0 -0
  143. package/documentation/content/gallery/16-volview-rendering.jpg +0 -0
  144. package/documentation/content/gallery/17-volview-colormap-notes.jpg +0 -0
  145. package/documentation/content/gallery/17-volview-colormap.jpg +0 -0
  146. package/documentation/content/gallery/17-volview-opacity-notes.jpg +0 -0
  147. package/documentation/content/gallery/17-volview-opacity.jpg +0 -0
  148. package/documentation/content/gallery/17-volview-opacity2.jpg +0 -0
  149. package/documentation/content/gallery/18-volview-presets.jpg +0 -0
  150. package/documentation/content/gallery/19-volview-color.jpg +0 -0
  151. package/documentation/content/gallery/19-volview-color2.jpg +0 -0
  152. package/documentation/content/gallery/20-volview-lightfollowcamera0.jpg +0 -0
  153. package/documentation/content/gallery/20-volview-lightfollowcamera1.jpg +0 -0
  154. package/documentation/content/gallery/20-volview-lightfollowcamera2.jpg +0 -0
  155. package/documentation/content/gallery/20-volview-lightfollowcamera3.jpg +0 -0
  156. package/documentation/content/gallery/21-volview-hybrid-final.jpg +0 -0
  157. package/documentation/content/gallery/21-volview-hybrid0.0.jpg +0 -0
  158. package/documentation/content/gallery/21-volview-hybrid0.5.jpg +0 -0
  159. package/documentation/content/gallery/21-volview-hybrid1.0.jpg +0 -0
  160. package/documentation/content/gallery/LocalAmbientOcclusion.jpg +0 -0
  161. package/documentation/content/gallery/Notes.pptx +0 -0
  162. package/documentation/content/gallery/VolView-Overview.jpg +0 -0
  163. package/documentation/content/gallery/index.md +0 -53
  164. package/documentation/content/icon/favicon-16x16.png +0 -0
  165. package/documentation/content/icon/favicon-196x196.png +0 -0
  166. package/documentation/content/icon/favicon-32x32.png +0 -0
  167. package/documentation/content/icon/favicon-96x96.png +0 -0
  168. package/documentation/content/index.pug +0 -43
  169. package/documentation/content/logo.png +0 -0
  170. package/documentation/content/logo.svg +0 -20
  171. package/documentation/data/menu.yml +0 -3
  172. package/documentation/themes/navy/layout/partial/footer.swig +0 -22
  173. package/documentation/tpl/__en__ +0 -31
  174. package/documentation/tpl/__sidebar__ +0 -11
  175. package/patches/jsdom-global+3.0.2.patch +0 -12
  176. package/patches/vue-toastification+1.7.14.patch +0 -41
  177. package/patches/vuetify+2.6.10.patch +0 -13
  178. package/prettier.config.js +0 -9
  179. package/public/index.html +0 -28
  180. package/server/helper.py +0 -147
  181. package/server/host.js +0 -134
  182. package/server/serialize.js +0 -111
  183. package/server/serialize.py +0 -203
  184. package/server/server.py +0 -84
  185. package/server/test.py +0 -17
  186. package/src/assets/logo.png +0 -0
  187. package/src/assets/logo.svg +0 -20
  188. package/src/assets/samples/3DUS-Fetus.jpg +0 -0
  189. package/src/assets/samples/CTA-Head_and_Neck.jpg +0 -0
  190. package/src/assets/samples/MRA-Head_and_Neck.jpg +0 -0
  191. package/src/assets/samples/MRI-Cardiac.jpg +0 -0
  192. package/src/assets/samples/MRI-PROSTATEx.jpg +0 -0
  193. package/src/components/AboutBox.vue +0 -157
  194. package/src/components/AiModule.vue +0 -60
  195. package/src/components/AnnotationsModule.vue +0 -37
  196. package/src/components/App.vue +0 -539
  197. package/src/components/ColorFunctionSlider.vue +0 -181
  198. package/src/components/DataBrowser.vue +0 -173
  199. package/src/components/DragAndDrop.vue +0 -107
  200. package/src/components/GroupableItem.vue +0 -30
  201. package/src/components/ImageDataBrowser.vue +0 -186
  202. package/src/components/ImageListCard.vue +0 -114
  203. package/src/components/ItemGroup.vue +0 -74
  204. package/src/components/LabelmapList.vue +0 -36
  205. package/src/components/LayoutGrid.vue +0 -96
  206. package/src/components/MeasurementsList.vue +0 -134
  207. package/src/components/MessageCenter.vue +0 -189
  208. package/src/components/MessageItem.vue +0 -83
  209. package/src/components/MessageNotificationContent.vue +0 -20
  210. package/src/components/MessageNotifications.vue +0 -84
  211. package/src/components/ModelBrowser.vue +0 -83
  212. package/src/components/ModulePanel.vue +0 -137
  213. package/src/components/PaintControls.vue +0 -174
  214. package/src/components/PatientBrowser.vue +0 -280
  215. package/src/components/PatientStudyVolumeBrowser.vue +0 -325
  216. package/src/components/RenderingModule.vue +0 -49
  217. package/src/components/ResizableNavDrawer.vue +0 -158
  218. package/src/components/SampleDataBrowser.vue +0 -198
  219. package/src/components/SaveSession.vue +0 -57
  220. package/src/components/Settings.vue +0 -35
  221. package/src/components/SliceSlider.vue +0 -182
  222. package/src/components/SpleenModule.vue +0 -101
  223. package/src/components/ToolButton.vue +0 -58
  224. package/src/components/ToolStrip.vue +0 -186
  225. package/src/components/ViewOverlayGrid.vue +0 -84
  226. package/src/components/VolumePresets.vue +0 -165
  227. package/src/components/VolumeProperties.vue +0 -171
  228. package/src/components/VolumeRendering.vue +0 -365
  229. package/src/components/VtkThreeView.vue +0 -512
  230. package/src/components/VtkTwoView.vue +0 -665
  231. package/src/components/__tests__/ResizableNavDrawer.spec.js +0 -32
  232. package/src/components/__tests__/ToolButton.spec.js +0 -46
  233. package/src/components/icons/KitwareLogoIcon.vue +0 -54
  234. package/src/components/icons/VolViewFullLogo.vue +0 -139
  235. package/src/components/icons/VolViewLogo.vue +0 -78
  236. package/src/components/styles/utils.css +0 -16
  237. package/src/components/styles/vtk-view.css +0 -116
  238. package/src/components/tools/CropTool.vue +0 -61
  239. package/src/components/tools/CrosshairsTool.vue +0 -93
  240. package/src/components/tools/MouseManipulatorTool.vue +0 -108
  241. package/src/components/tools/PaintTool.vue +0 -54
  242. package/src/components/tools/PanTool.vue +0 -35
  243. package/src/components/tools/RulerTool.vue +0 -202
  244. package/src/components/tools/SliceScrollTool.vue +0 -123
  245. package/src/components/tools/WindowLevelTool.vue +0 -191
  246. package/src/components/tools/ZoomTool.vue +0 -35
  247. package/src/components/tools/crop/Crop2D.vue +0 -367
  248. package/src/components/tools/crop/Crop2DLineHandle.vue +0 -103
  249. package/src/components/tools/crop/Crop3D.vue +0 -192
  250. package/src/components/tools/crop/CropControls.vue +0 -38
  251. package/src/components/tools/crop/types.ts +0 -12
  252. package/src/components/tools/crosshairs/CrosshairSVG2D.vue +0 -125
  253. package/src/components/tools/crosshairs/CrosshairsWidget2D.vue +0 -100
  254. package/src/components/tools/paint/PaintWidget2D.vue +0 -192
  255. package/src/components/tools/ruler/RulerSVG2D.vue +0 -181
  256. package/src/components/tools/ruler/RulerWidget2D.vue +0 -154
  257. package/src/composables/__tests__/useDoubleRecord.spec.ts +0 -57
  258. package/src/composables/__tests__/useOrientationLabels.spec.ts +0 -29
  259. package/src/composables/isViewAnimating.ts +0 -25
  260. package/src/composables/manageVTKSubscription.ts +0 -6
  261. package/src/composables/onProxyManagerEvent.ts +0 -50
  262. package/src/composables/proxyManager.ts +0 -13
  263. package/src/composables/sync/__tests__/createPrimitiveSyncContext.spec.ts +0 -41
  264. package/src/composables/sync/__tests__/useWindowingSync.spec.ts +0 -51
  265. package/src/composables/sync/createPrimitiveSyncContext.ts +0 -83
  266. package/src/composables/sync/useWindowingSync.ts +0 -48
  267. package/src/composables/useAppLoadingNotifications.ts +0 -73
  268. package/src/composables/useCameraOrientation.ts +0 -34
  269. package/src/composables/useCurrentImage.ts +0 -74
  270. package/src/composables/useCurrentSlice.ts +0 -43
  271. package/src/composables/useDoubleRecord.ts +0 -77
  272. package/src/composables/useEventListener.ts +0 -26
  273. package/src/composables/useGlobalErrorHook.ts +0 -18
  274. package/src/composables/useMultiSelection.ts +0 -29
  275. package/src/composables/useOrientationLabels.ts +0 -62
  276. package/src/composables/usePanels.ts +0 -42
  277. package/src/composables/usePersistCameraConfig.ts +0 -138
  278. package/src/composables/useResizeObserver.ts +0 -37
  279. package/src/composables/useResizeToFit.ts +0 -50
  280. package/src/composables/useSceneBuilder.ts +0 -96
  281. package/src/composables/useToast.js +0 -11
  282. package/src/composables/useVTKCallback.ts +0 -33
  283. package/src/composables/useVTKWorldToDisplay.ts +0 -141
  284. package/src/composables/useViewProxy.ts +0 -87
  285. package/src/composables/useVolumeThumbnailing.ts +0 -173
  286. package/src/composables/useWebGLWatchdog.ts +0 -32
  287. package/src/composables/useWidgetManager.ts +0 -41
  288. package/src/config.ts +0 -182
  289. package/src/constants.ts +0 -38
  290. package/src/core/id.ts +0 -18
  291. package/src/core/provider.ts +0 -31
  292. package/src/core/proxies.ts +0 -90
  293. package/src/core/thumbnailers/__tests__/vtk-image.spec.ts +0 -58
  294. package/src/core/thumbnailers/index.ts +0 -5
  295. package/src/core/thumbnailers/volume-thumbnailer.ts +0 -130
  296. package/src/core/thumbnailers/vtk-image.ts +0 -142
  297. package/src/core/tools/__tests__/paint.spec.ts +0 -101
  298. package/src/core/tools/__tests__/ruler.spec.ts +0 -73
  299. package/src/core/tools/paint/brush.ts +0 -20
  300. package/src/core/tools/paint/ellipse-brush.ts +0 -96
  301. package/src/core/tools/paint/index.ts +0 -141
  302. package/src/core/tools/ruler.ts +0 -149
  303. package/src/global.d.ts +0 -24
  304. package/src/io/__tests__/io.spec.ts +0 -26
  305. package/src/io/dicom.ts +0 -187
  306. package/src/io/index.ts +0 -11
  307. package/src/io/io.ts +0 -157
  308. package/src/io/itk/itkConfig.js +0 -8
  309. package/src/io/itk-dicom/dicom.cpp +0 -327
  310. package/src/io/itk-dicom/web-build/dicom.js +0 -16
  311. package/src/io/itk-dicom/web-build/dicom.umd.js +0 -21
  312. package/src/io/manifest.ts +0 -30
  313. package/src/io/readers.ts +0 -36
  314. package/src/io/state-file/index.ts +0 -170
  315. package/src/io/state-file/schema.ts +0 -277
  316. package/src/io/state-file/utils.ts +0 -33
  317. package/src/io/types.ts +0 -4
  318. package/src/io/vtk/async.reader.worker.ts +0 -50
  319. package/src/io/vtk/async.ts +0 -58
  320. package/src/io/vtk/async.writer.worker.ts +0 -46
  321. package/src/io/vtk/common.ts +0 -30
  322. package/src/io/zip.ts +0 -31
  323. package/src/main.js +0 -66
  324. package/src/main.ts +0 -1
  325. package/src/plugins/vuetify.js +0 -25
  326. package/src/shims-itk.d.ts +0 -67
  327. package/src/shims-misc.d.ts +0 -4
  328. package/src/shims-tsx.d.ts +0 -13
  329. package/src/shims-vtk.d.ts +0 -1042
  330. package/src/shims-vue.d.ts +0 -5
  331. package/src/store/__tests__/datasets.spec.ts +0 -75
  332. package/src/store/__tests__/messages.spec.ts +0 -74
  333. package/src/store/__tests__/rulers.spec.ts +0 -77
  334. package/src/store/__tests__/view-configs.spec.ts +0 -37
  335. package/src/store/datasets-dicom.ts +0 -398
  336. package/src/store/datasets-files.ts +0 -35
  337. package/src/store/datasets-images.ts +0 -118
  338. package/src/store/datasets-labelmaps.ts +0 -136
  339. package/src/store/datasets-models.ts +0 -25
  340. package/src/store/datasets.ts +0 -341
  341. package/src/store/messages.ts +0 -144
  342. package/src/store/tools/crop.ts +0 -136
  343. package/src/store/tools/crosshairs.ts +0 -131
  344. package/src/store/tools/index.ts +0 -95
  345. package/src/store/tools/paint.ts +0 -191
  346. package/src/store/tools/rulers.ts +0 -305
  347. package/src/store/tools/types.ts +0 -54
  348. package/src/store/view-configs/camera.ts +0 -51
  349. package/src/store/view-configs/common.ts +0 -61
  350. package/src/store/view-configs/slicing.ts +0 -86
  351. package/src/store/view-configs/types.ts +0 -39
  352. package/src/store/view-configs/volume-coloring.ts +0 -193
  353. package/src/store/view-configs/windowing.ts +0 -69
  354. package/src/store/view-configs.ts +0 -78
  355. package/src/store/views.ts +0 -130
  356. package/src/types/index.ts +0 -16
  357. package/src/types/layout.ts +0 -10
  358. package/src/types/lps.ts +0 -40
  359. package/src/types/views.ts +0 -65
  360. package/src/types/vtk-types.ts +0 -29
  361. package/src/utils/__tests__/lps.spec.ts +0 -102
  362. package/src/utils/color.ts +0 -23
  363. package/src/utils/errors.js +0 -3
  364. package/src/utils/fetch.ts +0 -101
  365. package/src/utils/hacks.ts +0 -14
  366. package/src/utils/index.ts +0 -83
  367. package/src/utils/lps.ts +0 -129
  368. package/src/utils/manipulators.ts +0 -35
  369. package/src/utils/promise-worker.ts +0 -45
  370. package/src/utils/vtk-helpers.ts +0 -215
  371. package/src/utils/workerHandler.js +0 -42
  372. package/src/vtk/ColorMaps.ts +0 -72
  373. package/src/vtk/CrosshairsWidget/behavior.ts +0 -112
  374. package/src/vtk/CrosshairsWidget/index.d.ts +0 -22
  375. package/src/vtk/CrosshairsWidget/index.js +0 -73
  376. package/src/vtk/CrosshairsWidget/state.ts +0 -51
  377. package/src/vtk/IJKSliceRepresentationProxy/index.d.ts +0 -9
  378. package/src/vtk/IJKSliceRepresentationProxy/index.js +0 -59
  379. package/src/vtk/LPSView2DProxy/index.d.ts +0 -18
  380. package/src/vtk/LPSView2DProxy/index.js +0 -89
  381. package/src/vtk/LPSView3DProxy/index.d.ts +0 -16
  382. package/src/vtk/LPSView3DProxy/index.js +0 -78
  383. package/src/vtk/LabelMap/index.d.ts +0 -16
  384. package/src/vtk/LabelMap/index.js +0 -49
  385. package/src/vtk/LabelMapSliceRepProxy/index.d.ts +0 -6
  386. package/src/vtk/LabelMapSliceRepProxy/index.js +0 -104
  387. package/src/vtk/MedicalColorPresets.json +0 -1448
  388. package/src/vtk/PaintBrushContextRepresentation/index.js +0 -191
  389. package/src/vtk/PaintWidget/behavior.ts +0 -101
  390. package/src/vtk/PaintWidget/index.d.ts +0 -28
  391. package/src/vtk/PaintWidget/index.js +0 -56
  392. package/src/vtk/PaintWidget/state.ts +0 -41
  393. package/src/vtk/PiecewiseWidget/index.js +0 -203
  394. package/src/vtk/RulerWidget/behavior.ts +0 -185
  395. package/src/vtk/RulerWidget/index.d.ts +0 -25
  396. package/src/vtk/RulerWidget/index.js +0 -79
  397. package/src/vtk/RulerWidget/state.ts +0 -63
  398. package/src/vtk/TreJsonConverter/index.js +0 -150
  399. package/src/vtk/proxy.js +0 -66
  400. package/src/vtk/proxyUtils.js +0 -16
  401. package/src/vtk/webvr-empty.js +0 -1
  402. package/tests/testUtils.js +0 -12
  403. package/tsconfig.json +0 -46
  404. package/vue.config.js +0 -86
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/app.81e49d9a.js","mappings":"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","sources":["webpack://VolView/./src/components/App.vue?75f9","webpack://VolView/src/components/ResizableNavDrawer.vue","webpack://VolView/./src/components/ResizableNavDrawer.vue","webpack://VolView/./src/components/ResizableNavDrawer.vue?9d02","webpack://VolView/./src/components/ToolButton.vue?9757","webpack://VolView/src/components/ToolButton.vue","webpack://VolView/./src/components/ToolButton.vue?2c6a","webpack://VolView/./src/components/ToolButton.vue","webpack://VolView/./src/components/LayoutGrid.vue?d673","webpack://VolView/./src/components/VtkTwoView.vue?f6d9","webpack://VolView/./src/composables/manageVTKSubscription.ts","webpack://VolView/./src/composables/useResizeToFit.ts","webpack://VolView/./src/components/SliceSlider.vue?ac88","webpack://VolView/src/components/SliceSlider.vue","webpack://VolView/./src/components/SliceSlider.vue?3df9","webpack://VolView/./src/components/SliceSlider.vue","webpack://VolView/./src/components/ViewOverlayGrid.vue?6287","webpack://VolView/./src/components/ViewOverlayGrid.vue?8363","webpack://VolView/./src/components/ViewOverlayGrid.vue","webpack://VolView/./src/composables/useResizeObserver.ts","webpack://VolView/./src/constants.ts","webpack://VolView/./src/composables/useVTKCallback.ts","webpack://VolView/./src/composables/useOrientationLabels.ts","webpack://VolView/./src/utils/lps.ts","webpack://VolView/./src/utils/index.ts","webpack://VolView/./src/store/tools/types.ts","webpack://VolView/./src/vtk/RulerWidget/state.ts","webpack://VolView/./src/types/layout.ts","webpack://VolView/./src/io/state-file/schema.ts","webpack://VolView/./src/store/datasets-files.ts","webpack://VolView/./src/io/state-file/utils.ts","webpack://VolView/./src/io/zip.ts","webpack://VolView/./src/io/io.ts","webpack://VolView/./src/io/index.ts","webpack://VolView/./src/store/datasets-images.ts","webpack://VolView/./src/store/datasets-dicom.ts","webpack://VolView/./src/store/datasets-models.ts","webpack://VolView/./src/store/messages.ts","webpack://VolView/./src/utils/fetch.ts","webpack://VolView/./src/io/manifest.ts","webpack://VolView/./src/store/datasets.ts","webpack://VolView/./src/composables/useCurrentImage.ts","webpack://VolView/./src/composables/useCameraOrientation.ts","webpack://VolView/./src/store/tools/crop.ts","webpack://VolView/./src/vtk/CrosshairsWidget/state.ts","webpack://VolView/./src/vtk/CrosshairsWidget/behavior.ts","webpack://VolView/./src/vtk/CrosshairsWidget/index.js","webpack://VolView/./src/composables/useDoubleRecord.ts","webpack://VolView/./src/store/view-configs/common.ts","webpack://VolView/./src/store/view-configs/slicing.ts","webpack://VolView/./src/store/view-configs/windowing.ts","webpack://VolView/./src/store/view-configs/camera.ts","webpack://VolView/./src/utils/vtk-helpers.ts","webpack://VolView/./src/config.ts","webpack://VolView/./src/vtk/ColorMaps.ts","webpack://VolView/./src/store/view-configs/volume-coloring.ts","webpack://VolView/./src/store/view-configs.ts","webpack://VolView/./src/store/views.ts","webpack://VolView/./src/store/tools/crosshairs.ts","webpack://VolView/./src/vtk/LabelMap/index.js","webpack://VolView/./src/utils/promise-worker.ts","webpack://VolView/./src/io/vtk/async.ts","webpack://VolView/./src/store/datasets-labelmaps.ts","webpack://VolView/./src/store/tools/paint.ts","webpack://VolView/./src/utils/manipulators.ts","webpack://VolView/./src/store/tools/rulers.ts","webpack://VolView/./src/store/tools/index.ts","webpack://VolView/./src/components/tools/WindowLevelTool.vue","webpack://VolView/./src/components/tools/WindowLevelTool.vue?1536","webpack://VolView/./src/components/tools/SliceScrollTool.vue?a249","webpack://VolView/./src/components/tools/MouseManipulatorTool.vue?976d","webpack://VolView/./src/components/tools/PanTool.vue?e06e","webpack://VolView/./src/components/tools/ZoomTool.vue?8289","webpack://VolView/./src/components/tools/ruler/RulerWidget2D.vue?6bd4","webpack://VolView/./src/components/tools/WindowLevelTool.vue?8322","webpack://VolView/./src/components/tools/SliceScrollTool.vue","webpack://VolView/./src/components/tools/SliceScrollTool.vue?5607","webpack://VolView/./src/components/tools/MouseManipulatorTool.vue","webpack://VolView/./src/components/tools/MouseManipulatorTool.vue?cf49","webpack://VolView/./src/components/tools/PanTool.vue","webpack://VolView/./src/components/tools/PanTool.vue?81cf","webpack://VolView/./src/components/tools/ZoomTool.vue","webpack://VolView/./src/components/tools/ZoomTool.vue?1930","webpack://VolView/./src/components/tools/RulerTool.vue?ed88","webpack://VolView/./src/components/tools/ruler/RulerWidget2D.vue","webpack://VolView/./src/components/tools/ruler/RulerWidget2D.vue?af2f","webpack://VolView/./src/components/tools/ruler/RulerSVG2D.vue?caab","webpack://VolView/./src/components/tools/ruler/RulerSVG2D.vue","webpack://VolView/./src/components/tools/ruler/RulerSVG2D.vue?2b5d","webpack://VolView/./src/components/tools/ruler/RulerSVG2D.vue?1bde","webpack://VolView/./src/vtk/RulerWidget/behavior.ts","webpack://VolView/./src/vtk/RulerWidget/index.js","webpack://VolView/./src/components/tools/RulerTool.vue","webpack://VolView/./src/components/tools/RulerTool.vue?6a06","webpack://VolView/./src/components/tools/RulerTool.vue?2ba0","webpack://VolView/./src/components/tools/PaintTool.vue?2601","webpack://VolView/./src/components/tools/paint/PaintWidget2D.vue?b6ef","webpack://VolView/./src/components/tools/paint/PaintWidget2D.vue","webpack://VolView/./src/components/tools/paint/PaintWidget2D.vue?6d32","webpack://VolView/./src/components/tools/PaintTool.vue","webpack://VolView/./src/components/tools/PaintTool.vue?7408","webpack://VolView/./src/components/tools/PaintTool.vue?cb57","webpack://VolView/./src/composables/useSceneBuilder.ts","webpack://VolView/./src/composables/usePersistCameraConfig.ts","webpack://VolView/./src/components/tools/CrosshairsTool.vue?e8a8","webpack://VolView/./src/components/tools/crosshairs/CrosshairsWidget2D.vue?33f0","webpack://VolView/./src/core/proxies.ts","webpack://VolView/./src/components/tools/crosshairs/CrosshairsWidget2D.vue","webpack://VolView/./src/components/tools/crosshairs/CrosshairsWidget2D.vue?76d5","webpack://VolView/./src/components/tools/crosshairs/CrosshairSVG2D.vue?9137","webpack://VolView/./src/components/tools/crosshairs/CrosshairSVG2D.vue","webpack://VolView/./src/components/tools/crosshairs/CrosshairSVG2D.vue?1455","webpack://VolView/./src/components/tools/crosshairs/CrosshairSVG2D.vue?5466","webpack://VolView/./src/components/tools/CrosshairsTool.vue","webpack://VolView/./src/components/tools/CrosshairsTool.vue?dbc4","webpack://VolView/./src/components/tools/CrosshairsTool.vue?4bf0","webpack://VolView/./src/composables/useViewProxy.ts","webpack://VolView/./src/composables/useWidgetManager.ts","webpack://VolView/./src/composables/sync/createPrimitiveSyncContext.ts","webpack://VolView/./src/composables/sync/useWindowingSync.ts","webpack://VolView/./src/components/tools/CropTool.vue?c380","webpack://VolView/./src/components/tools/crop/Crop2D.vue?0263","webpack://VolView/./src/composables/useCurrentSlice.ts","webpack://VolView/./src/composables/useVTKWorldToDisplay.ts","webpack://VolView/./src/components/tools/crop/Crop2DLineHandle.vue?0313","webpack://VolView/./src/components/tools/crop/Crop2DLineHandle.vue","webpack://VolView/./src/components/tools/crop/Crop2DLineHandle.vue?69ac","webpack://VolView/./src/components/tools/crop/Crop2DLineHandle.vue?e3a3","webpack://VolView/./src/components/tools/crop/Crop2D.vue","webpack://VolView/./src/components/tools/crop/Crop2D.vue?f90f","webpack://VolView/./src/components/tools/crop/Crop2D.vue?665d","webpack://VolView/./src/components/tools/crop/Crop3D.vue","webpack://VolView/./src/components/tools/crop/Crop3D.vue?83f2","webpack://VolView/./src/components/tools/crop/Crop3D.vue?e780","webpack://VolView/./src/components/tools/CropTool.vue","webpack://VolView/./src/components/tools/CropTool.vue?cc12","webpack://VolView/./src/components/tools/CropTool.vue?813f","webpack://VolView/./src/components/VtkTwoView.vue","webpack://VolView/./src/components/VtkTwoView.vue?7286","webpack://VolView/./src/components/VtkTwoView.vue?78a0","webpack://VolView/./src/components/VtkThreeView.vue?d771","webpack://VolView/./src/composables/proxyManager.ts","webpack://VolView/./src/composables/isViewAnimating.ts","webpack://VolView/./src/components/VtkThreeView.vue","webpack://VolView/./src/components/VtkThreeView.vue?716f","webpack://VolView/./src/components/VtkThreeView.vue?099b","webpack://VolView/./src/components/LayoutGrid.vue","webpack://VolView/./src/components/SampleDataBrowser.vue","webpack://VolView/./src/components/LayoutGrid.vue?252d","webpack://VolView/./src/components/LayoutGrid.vue?954e","webpack://VolView/./src/components/ModulePanel.vue?773c","webpack://VolView/./src/components/DataBrowser.vue?1eca","webpack://VolView/./src/components/SampleDataBrowser.vue?2dfe","webpack://VolView/./src/components/ImageListCard.vue?5bfc","webpack://VolView/./src/components/ImageListCard.vue","webpack://VolView/./src/components/ImageListCard.vue?05b2","webpack://VolView/./src/components/ImageListCard.vue?ad56","webpack://VolView/./src/components/SampleDataBrowser.vue?ac29","webpack://VolView/./src/components/SampleDataBrowser.vue?4ae8","webpack://VolView/./src/components/ImageDataBrowser.vue?090e","webpack://VolView/./src/components/ItemGroup.vue","webpack://VolView/./src/components/GroupableItem.vue","webpack://VolView/./src/core/thumbnailers/index.ts","webpack://VolView/src/components/ItemGroup.vue","webpack://VolView/./src/components/ItemGroup.vue?7388","webpack://VolView/src/components/GroupableItem.vue","webpack://VolView/./src/components/GroupableItem.vue?41f1","webpack://VolView/./src/core/thumbnailers/vtk-image.ts","webpack://VolView/./src/composables/useMultiSelection.ts","webpack://VolView/./src/components/ImageDataBrowser.vue","webpack://VolView/./src/components/ImageDataBrowser.vue?46f3","webpack://VolView/./src/components/ImageDataBrowser.vue?349a","webpack://VolView/./src/components/PatientBrowser.vue?6241","webpack://VolView/./src/components/PatientStudyVolumeBrowser.vue?b231","webpack://VolView/./src/components/PatientStudyVolumeBrowser.vue","webpack://VolView/./src/components/PatientStudyVolumeBrowser.vue?073c","webpack://VolView/./src/components/PatientStudyVolumeBrowser.vue?58ac","webpack://VolView/./src/composables/usePanels.ts","webpack://VolView/./src/components/PatientBrowser.vue","webpack://VolView/./src/components/PatientBrowser.vue?7cd8","webpack://VolView/./src/components/PatientBrowser.vue?b116","webpack://VolView/./src/components/DataBrowser.vue","webpack://VolView/./src/components/DataBrowser.vue?5d74","webpack://VolView/./src/components/DataBrowser.vue?c71b","webpack://VolView/./src/components/RenderingModule.vue?f321","webpack://VolView/./src/components/VolumeProperties.vue?8cb9","webpack://VolView/./src/components/VolumeProperties.vue","webpack://VolView/./src/components/VolumeProperties.vue?f6f1","webpack://VolView/./src/components/VolumeProperties.vue?4e20","webpack://VolView/./src/components/VolumeRendering.vue?f270","webpack://VolView/./src/vtk/PiecewiseWidget/index.js","webpack://VolView/src/components/ColorFunctionSlider.vue","webpack://VolView/./src/components/ColorFunctionSlider.vue","webpack://VolView/./src/components/ColorFunctionSlider.vue?2e20","webpack://VolView/./src/core/thumbnailers/volume-thumbnailer.ts","webpack://VolView/./src/composables/useVolumeThumbnailing.ts","webpack://VolView/./src/components/VolumeRendering.vue","webpack://VolView/./src/components/VolumeRendering.vue?90d2","webpack://VolView/./src/components/VolumeRendering.vue?a8b0","webpack://VolView/./src/components/VolumePresets.vue?49da","webpack://VolView/./src/components/VolumePresets.vue","webpack://VolView/./src/components/VolumePresets.vue?53a8","webpack://VolView/./src/components/VolumePresets.vue?3109","webpack://VolView/./src/components/RenderingModule.vue","webpack://VolView/./src/components/RenderingModule.vue?1b57","webpack://VolView/./src/components/RenderingModule.vue?ac98","webpack://VolView/./src/components/AnnotationsModule.vue?5e1a","webpack://VolView/./src/components/MeasurementsList.vue?096d","webpack://VolView/./src/components/MeasurementsList.vue","webpack://VolView/./src/components/MeasurementsList.vue?80fd","webpack://VolView/./src/components/MeasurementsList.vue?f7d9","webpack://VolView/./src/components/LabelmapList.vue?a1d5","webpack://VolView/./src/components/LabelmapList.vue","webpack://VolView/./src/components/LabelmapList.vue?0be8","webpack://VolView/./src/components/LabelmapList.vue?c61e","webpack://VolView/./src/components/AnnotationsModule.vue","webpack://VolView/./src/components/AnnotationsModule.vue?5ea5","webpack://VolView/./src/components/AnnotationsModule.vue?31d2","webpack://VolView/./src/components/ModulePanel.vue","webpack://VolView/./src/components/ModulePanel.vue?c1fc","webpack://VolView/./src/components/ModulePanel.vue?784a","webpack://VolView/./src/components/DragAndDrop.vue?6d37","webpack://VolView/src/components/DragAndDrop.vue","webpack://VolView/./src/components/DragAndDrop.vue?dfa3","webpack://VolView/./src/components/DragAndDrop.vue","webpack://VolView/./src/components/AboutBox.vue?bc24","webpack://VolView/./src/components/icons/VolViewFullLogo.vue?37f0","webpack://VolView/src/components/icons/VolViewFullLogo.vue","webpack://VolView/./src/components/icons/VolViewFullLogo.vue?c2f0","webpack://VolView/./src/components/icons/VolViewFullLogo.vue","webpack://VolView/src/components/AboutBox.vue","webpack://VolView/./src/components/AboutBox.vue?a057","webpack://VolView/./src/components/AboutBox.vue","webpack://VolView/./src/components/ToolStrip.vue?c0af","webpack://VolView/./src/components/PaintControls.vue?f4eb","webpack://VolView/./src/utils/color.ts","webpack://VolView/./src/components/PaintControls.vue","webpack://VolView/./src/components/PaintControls.vue?8058","webpack://VolView/./src/components/PaintControls.vue?48ab","webpack://VolView/./src/components/tools/crop/CropControls.vue?0a31","webpack://VolView/./src/components/tools/crop/CropControls.vue","webpack://VolView/./src/components/tools/crop/CropControls.vue?c904","webpack://VolView/./src/components/tools/crop/CropControls.vue?5ffd","webpack://VolView/./src/components/ToolStrip.vue","webpack://VolView/./src/components/ToolStrip.vue?0ce2","webpack://VolView/./src/components/ToolStrip.vue?8b60","webpack://VolView/./src/components/MessageCenter.vue?3777","webpack://VolView/./src/components/MessageItem.vue?94ee","webpack://VolView/./src/components/MessageItem.vue","webpack://VolView/./src/components/MessageItem.vue?b7ca","webpack://VolView/./src/components/MessageItem.vue?ed8a","webpack://VolView/./src/components/MessageCenter.vue","webpack://VolView/./src/components/MessageCenter.vue?0781","webpack://VolView/./src/components/MessageCenter.vue?2a1e","webpack://VolView/./src/composables/useToast.js","webpack://VolView/./src/components/MessageNotificationContent.vue?7445","webpack://VolView/./src/components/MessageNotificationContent.vue","webpack://VolView/./src/components/MessageNotificationContent.vue?e9cb","webpack://VolView/./src/components/MessageNotificationContent.vue?1ddc","webpack://VolView/./src/components/MessageNotifications.vue","webpack://VolView/./src/components/MessageNotifications.vue?37ec","webpack://VolView/./src/components/MessageNotifications.vue?195f","webpack://VolView/./src/components/Settings.vue?b53a","webpack://VolView/./src/components/icons/KitwareLogoIcon.vue?2d0e","webpack://VolView/src/components/icons/KitwareLogoIcon.vue","webpack://VolView/./src/components/icons/KitwareLogoIcon.vue?5d2b","webpack://VolView/./src/components/icons/KitwareLogoIcon.vue","webpack://VolView/./src/plugins/vuetify.js","webpack://VolView/./src/components/Settings.vue","webpack://VolView/./src/components/Settings.vue?23aa","webpack://VolView/./src/components/Settings.vue?a1f0","webpack://VolView/./src/components/icons/VolViewLogo.vue?8b1c","webpack://VolView/./src/components/icons/VolViewLogo.vue","webpack://VolView/./src/io/state-file/index.ts","webpack://VolView/./src/components/SaveSession.vue?660f","webpack://VolView/./src/components/SaveSession.vue","webpack://VolView/./src/components/SaveSession.vue?8871","webpack://VolView/./src/components/SaveSession.vue?2c56","webpack://VolView/./src/composables/useGlobalErrorHook.ts","webpack://VolView/./src/composables/onProxyManagerEvent.ts","webpack://VolView/./src/composables/useWebGLWatchdog.ts","webpack://VolView/./src/composables/useAppLoadingNotifications.ts","webpack://VolView/./src/components/App.vue","webpack://VolView/./src/components/App.vue?bca1","webpack://VolView/./src/components/App.vue?cce7","webpack://VolView/./src/io/dicom.ts","webpack://VolView/./src/io/readers.ts","webpack://VolView/./src/vtk/LPSView3DProxy/index.js","webpack://VolView/./src/vtk/LPSView2DProxy/index.js","webpack://VolView/./src/vtk/IJKSliceRepresentationProxy/index.js","webpack://VolView/./src/vtk/LabelMapSliceRepProxy/index.js","webpack://VolView/./src/vtk/proxy.js","webpack://VolView/./src/core/id.ts","webpack://VolView/./src/vtk/PaintBrushContextRepresentation/index.js","webpack://VolView/./src/vtk/PaintWidget/behavior.ts","webpack://VolView/./src/vtk/PaintWidget/state.ts","webpack://VolView/./src/vtk/PaintWidget/index.js","webpack://VolView/./src/core/tools/paint/ellipse-brush.ts","webpack://VolView/./src/core/tools/paint/index.ts","webpack://VolView/./src/core/tools/ruler.ts","webpack://VolView/./src/core/provider.ts","webpack://VolView/./src/utils/hacks.ts","webpack://VolView/./src/main.js","webpack://VolView/./src/io/itk/itkConfig.js","webpack://VolView/webpack/bootstrap","webpack://VolView/webpack/runtime/amd define","webpack://VolView/webpack/runtime/amd options","webpack://VolView/webpack/runtime/chunk loaded","webpack://VolView/webpack/runtime/compat get default export","webpack://VolView/webpack/runtime/define property getters","webpack://VolView/webpack/runtime/get javascript chunk filename","webpack://VolView/webpack/runtime/global","webpack://VolView/webpack/runtime/hasOwnProperty shorthand","webpack://VolView/webpack/runtime/make namespace object","webpack://VolView/webpack/runtime/node module decorator","webpack://VolView/webpack/runtime/publicPath","webpack://VolView/webpack/runtime/jsonp chunk loading","webpack://VolView/webpack/startup"],"sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('drag-and-drop',{attrs:{\"enabled\":\"\",\"id\":\"app-container\"},on:{\"drop\":_vm.openFiles},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar dragHover = ref.dragHover;\nreturn [_c('v-app',[_c('v-app-bar',{attrs:{\"app\":\"\",\"dense\":\"\",\"clipped-left\":\"\"}},[(_vm.$vuetify.breakpoint.mobile)?_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.leftSideBar = !_vm.leftSideBar}}},[_c('v-icon',[_vm._v(\"mdi-menu\")])],1):_vm._e(),_c('v-toolbar-title',{staticClass:\"d-flex flex-row align-center mt-1\"},[(_vm.$vuetify.breakpoint.mobile)?_c('vol-view-logo'):_c('vol-view-full-logo')],1),_c('v-spacer'),_c('v-btn',{staticClass:\"toolbar-button\",attrs:{\"tile\":\"\",\"icon\":\"\"},on:{\"click\":function($event){_vm.aboutBoxDialog = !_vm.aboutBoxDialog}}},[_c('v-icon',[_vm._v(\"mdi-help-circle-outline\")])],1)],1),_c('resizable-nav-drawer',{attrs:{\"id\":\"left-nav\",\"app\":\"\",\"clipped\":\"\",\"touchless\":\"\",\"min-width\":450,\"max-width\":550,\"width\":450,\"handle-size\":4},model:{value:(_vm.leftSideBar),callback:function ($$v) {_vm.leftSideBar=$$v},expression:\"leftSideBar\"}},[_c('module-panel',{on:{\"close\":function($event){_vm.leftSideBar = false}}})],1),_c('v-main',{attrs:{\"id\":\"content-main\"}},[_c('div',{staticClass:\"fill-height d-flex flex-row flex-grow-1\"},[_c('div',{staticClass:\"grey darken-4 d-flex flex-column align-center\",attrs:{\"id\":\"tools-strip\"}},[_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-folder-open\",\"name\":\"Open files\"},on:{\"click\":_vm.userPromptFiles}}),_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-content-save-all\",\"name\":\"Save session\"},on:{\"click\":function($event){_vm.saveDialog = true}}}),_c('div',{staticClass:\"my-1 tool-separator\"}),_c('v-menu',{attrs:{\"offset-x\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',[_c('tool-button',_vm._g(_vm._b({attrs:{\"size\":\"40\",\"icon\":\"mdi-view-dashboard\",\"name\":\"Layouts\"}},'tool-button',attrs,false),on))],1)]}}],null,true)},[_c('v-card',[_c('v-card-text',[_c('v-radio-group',{staticClass:\"mt-0\",attrs:{\"hide-details\":\"\"},model:{value:(_vm.layoutName),callback:function ($$v) {_vm.layoutName=$$v},expression:\"layoutName\"}},_vm._l((_vm.Layouts),function(value,key){return _c('v-radio',{key:key,attrs:{\"label\":value.name,\"value\":key}})}),1)],1)],1)],1),(_vm.hasData)?[_c('tool-strip')]:_vm._e(),_c('v-spacer'),_c('v-badge',{attrs:{\"overlap\":\"\",\"offset-x\":\"20\",\"offset-y\":\"20\",\"content\":_vm.messageCount,\"color\":_vm.messageBadgeColor,\"value\":_vm.messageCount > 0}},[_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-bell-outline\",\"name\":\"Notifications\"},on:{\"click\":function($event){_vm.messageDialog = true}}})],1),_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-cog\",\"name\":\"Settings\"},on:{\"click\":function($event){_vm.settingsDialog = true}}})],2),_c('div',{staticClass:\"d-flex flex-column flex-grow-1\"},[_c('layout-grid',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.hasData),expression:\"hasData\"}],attrs:{\"layout\":_vm.currentLayout}}),_c('v-row',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.hasData),expression:\"!hasData\"}],staticClass:\"clickable grey darken-3\",attrs:{\"no-gutters\":\"\",\"align\":\"center\"},on:{\"click\":_vm.userPromptFiles}},[_c('v-col',[_c('v-row',{attrs:{\"justify\":\"center\"}},[_c('v-card',{staticClass:\"text-center headline\",attrs:{\"flat\":\"\",\"dark\":\"\",\"color\":\"transparent\"}},[_c('div',[_c('v-icon',{attrs:{\"size\":\"64\"}},[_vm._v(\"mdi-folder-open\")])],1),_c('div',[_vm._v(\"Click to open local files.\")]),_c('div',{staticClass:\"mt-8\"},[_c('v-icon',{attrs:{\"size\":\"64\"}},[_vm._v(\"mdi-arrow-down-bold\")])],1),_c('div',[_vm._v(\"Drag & drop your DICOM files.\")]),_c('div',{staticClass:\"vertical-offset-margin\"},[_c('v-icon',{attrs:{\"size\":\"64\"}},[_vm._v(\"mdi-cloud-off-outline\")])],1),_c('div',[_vm._v(\"Secure: Your data never leaves your machine.\")])])],1)],1)],1)],1)])]),_c('v-dialog',{attrs:{\"width\":\"35%\"},model:{value:(_vm.aboutBoxDialog),callback:function ($$v) {_vm.aboutBoxDialog=$$v},expression:\"aboutBoxDialog\"}},[_c('about-box')],1),_c('v-dialog',{attrs:{\"width\":\"75%\",\"content-class\":\"fill-height\"},model:{value:(_vm.messageDialog),callback:function ($$v) {_vm.messageDialog=$$v},expression:\"messageDialog\"}},[_c('message-center',{on:{\"close\":function($event){_vm.messageDialog = false}}})],1),_c('message-notifications',{on:{\"open-notifications\":function($event){_vm.messageDialog = true}}}),_c('v-dialog',{attrs:{\"width\":\"50%\"},model:{value:(_vm.settingsDialog),callback:function ($$v) {_vm.settingsDialog=$$v},expression:\"settingsDialog\"}},[_c('settings',{on:{\"close\":function($event){_vm.settingsDialog = false}}})],1),_c('v-dialog',{attrs:{\"width\":\"30%\"},model:{value:(_vm.saveDialog),callback:function ($$v) {_vm.saveDialog=$$v},expression:\"saveDialog\"}},[_c('save-session',{on:{\"close\":function($event){_vm.saveDialog = false}}})],1),_c('v-overlay',{staticClass:\"text-center\",attrs:{\"value\":dragHover,\"color\":\"#fff\",\"z-index\":\"100\"}},[_c('v-icon',{attrs:{\"color\":\"black\",\"size\":\"4.75rem\"}},[_vm._v(\"mdi-download\")]),_c('div',{staticClass:\"text-h2 font-weight-bold black--text\"},[_vm._v(\" Drop your files to open \")])],1)],1)]}}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<script>\nimport { VNavigationDrawer } from 'vuetify/lib';\n\nexport const RESIZE_CURSOR = 'ew-resize';\n\n/**\n * Events: onResize(width:Number)\n */\nexport default {\n name: 'ResizableNavDrawer',\n props: {\n minWidth: Number,\n maxWidth: Number,\n width: Number,\n handleSize: {\n type: Number,\n default: 4,\n },\n },\n\n data() {\n return {\n internalWidth: this.width,\n };\n },\n\n computed: {\n handleSizeCSS() {\n return `${this.handleSize}px`;\n },\n },\n\n mounted() {\n this.oldCursor = '';\n this.oldUserSelect = '';\n\n this.setResizableStyles();\n this.setEvents();\n },\n\n beforeDestroy() {\n this.clearEvents();\n this.stopResize();\n },\n\n render(h) {\n // forwards slots, scoped slots, and more to v-navigation-drawer\n return h(\n VNavigationDrawer,\n {\n props: {\n // this.$attrs is the non-prop attrs we receive, which should\n // be forwarded to v-navigation-drawer\n ...this.$attrs,\n width: this.internalWidth,\n },\n on: this.$listeners,\n scopedSlots: this.$scopedSlots,\n ref: 'infoPane',\n },\n this.$slots.default\n );\n },\n\n methods: {\n setResizableStyles() {\n // manual styling\n const el = this.$refs.infoPane.$el.querySelector(\n '.v-navigation-drawer__border'\n );\n\n // NOTE: width is not reactive to handle size\n el.style.width = this.handleSizeCSS;\n el.style.backgroundColor = 'transparent';\n el.style.touchAction = 'none';\n // NOTE: dynamically setting \"right\" won't update the border position\n if ('right' in this.$attrs) {\n el.style.borderLeft = '2px solid rgba(0, 0, 0, 0.24)';\n } else {\n el.style.borderRight = '2px solid rgba(0, 0, 0, 0.24)';\n }\n el.style.cursor = RESIZE_CURSOR;\n },\n\n setEvents() {\n this.drawerBorder = this.$refs.infoPane.$el.querySelector(\n '.v-navigation-drawer__border'\n );\n this.drawerBorder.addEventListener('pointerdown', this.startResize);\n this.drawerBorder.addEventListener('pointermove', this.handleResize);\n this.drawerBorder.addEventListener('pointerup', this.stopResize);\n },\n\n clearEvents() {\n this.drawerBorder.removeEventListener('pointerdown', this.startResize);\n this.drawerBorder.removeEventListener('pointermove', this.handleResize);\n this.drawerBorder.removeEventListener('pointerup', this.stopResize);\n },\n\n startResize(ev) {\n if (this.drawerBorder.hasPointerCapture(ev.pointerId)) return;\n this.drawerBorder.setPointerCapture(ev.pointerId);\n\n this.$refs.infoPane.$el.style.transition = 'initial';\n\n this.setCursor(RESIZE_CURSOR);\n this.disableSelection();\n },\n\n stopResize(ev) {\n if (ev) {\n if (!this.drawerBorder.hasPointerCapture(ev.pointerId)) return;\n this.drawerBorder.releasePointerCapture(ev.pointerId);\n }\n\n this.$refs.infoPane.$el.style.transition = '';\n\n this.resetCursor();\n this.resetSelection();\n },\n\n handleResize(evt) {\n if (!this.drawerBorder.hasPointerCapture(evt.pointerId)) return;\n\n const width =\n 'right' in this.$attrs\n ? document.body.scrollWidth - evt.clientX\n : evt.clientX;\n\n const min = this.minWidth || this.handleSize;\n const max = this.maxWidth || Infinity;\n this.internalWidth = Math.min(max, Math.max(min, width));\n\n this.$emit('resize', this.internalWidth);\n },\n\n setCursor(cursor) {\n this.oldCursor = document.body.style.cursor;\n document.body.style.cursor = cursor;\n },\n\n resetCursor() {\n document.body.style.cursor = this.oldCursor;\n this.oldCursor = '';\n },\n\n disableSelection() {\n this.oldUserSelect = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n },\n\n resetSelection() {\n document.body.style.userSelect = this.oldUserSelect;\n this.oldUserSelect = '';\n },\n },\n};\n</script>\n","var render, staticRenderFns\nimport script from \"./ResizableNavDrawer.vue?vue&type=script&lang=js&\"\nexport * from \"./ResizableNavDrawer.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ResizableNavDrawer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ResizableNavDrawer.vue?vue&type=script&lang=js&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-tooltip',{attrs:{\"right\":\"\",\"transition\":\"slide-x-transition\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g(_vm._b({class:_vm.classV,attrs:{\"text\":\"\",\"tile\":\"\",\"dark\":\"\",\"height\":_vm.sizeV,\"width\":_vm.sizeV,\"min-width\":_vm.sizeV,\"max-width\":_vm.sizeV}},'v-btn',_vm.$attrs,false),Object.assign({}, on, _vm.$listeners)),[_c('v-icon',{attrs:{\"size\":_vm.iconSize}},[_vm._v(_vm._s(_vm.icon))]),_vm._t(\"default\")],2)]}}],null,true)},[_c('span',[_vm._v(_vm._s(_vm.name))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <v-tooltip right transition=\"slide-x-transition\">\n <template v-slot:activator=\"{ on }\">\n <v-btn\n text\n tile\n dark\n :height=\"sizeV\"\n :width=\"sizeV\"\n :min-width=\"sizeV\"\n :max-width=\"sizeV\"\n :class=\"classV\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n >\n <v-icon :size=\"iconSize\">{{ icon }}</v-icon>\n <slot />\n </v-btn>\n </template>\n <span>{{ name }}</span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n name: 'ToolButton',\n props: {\n icon: { type: String, required: true },\n name: { type: String, required: true },\n size: { type: [Number, String], default: 40 },\n buttonClass: [String, Array, Object],\n },\n\n computed: {\n sizeV() {\n return Number(this.size);\n },\n iconSize() {\n return Math.floor(0.6 * this.sizeV);\n },\n classV() {\n const classSpec = this.buttonClass;\n if (typeof classSpec === 'string') {\n return classSpec;\n }\n if (Array.isArray(classSpec)) {\n return classSpec.join(' ');\n }\n if (classSpec && Object.keys(classSpec).length) {\n return Object.keys(this.buttonClass)\n .filter((key) => this.buttonClass[key])\n .join(' ');\n }\n return '';\n },\n },\n};\n</script>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ToolButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ToolButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ToolButton.vue?vue&type=template&id=7cd77314&\"\nimport script from \"./ToolButton.vue?vue&type=script&lang=js&\"\nexport * from \"./ToolButton.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VIcon,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"layout-container flex-equal\",class:_vm.flexFlow},_vm._l((_vm.items),function(item,i){return _c('div',{key:i,staticClass:\"d-flex flex-equal\"},[(item.type === 'layout')?_c('layout-grid',{attrs:{\"layout\":item}}):_c('div',{staticClass:\"layout-item\"},[_c(item.component,_vm._b({key:item.id,tag:\"component\",attrs:{\"id\":item.id}},'component',item.props,false))],1)],1)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"vtk-container-wrapper\",attrs:{\"tabindex\":\"0\"},on:{\"pointerenter\":function($event){_vm.hover = true},\"pointerleave\":function($event){_vm.hover = false},\"focusin\":function($event){_vm.hover = true},\"focusout\":function($event){_vm.hover = false}}},[_c('div',{staticClass:\"vtk-gutter\"},[_c('v-tooltip',{attrs:{\"right\":\"\",\"transition\":\"slide-x-transition\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({attrs:{\"dark\":\"\",\"x-small\":\"\",\"icon\":\"\"},on:{\"click\":_vm.enableResizeToFit}},'v-btn',attrs,false),on),[_c('v-icon',{staticClass:\"py-1\",attrs:{\"small\":\"\"}},[_vm._v(\"mdi-camera-flip-outline\")])],1)]}}])},[_c('span',[_vm._v(\"Reset camera\")])]),_c('slice-slider',{staticClass:\"slice-slider\",attrs:{\"slice\":_vm.slice,\"min\":_vm.sliceMin,\"max\":_vm.sliceMax,\"step\":1,\"handle-height\":20},on:{\"input\":_vm.setSlice}})],1),_c('div',{staticClass:\"vtk-container\",class:_vm.active ? 'active' : ''},[_c('div',{staticClass:\"vtk-sub-container\"},[_c('div',{ref:\"vtkContainerRef\",staticClass:\"vtk-view\"})]),_c('div',{staticClass:\"overlay-no-events tool-layer\"},[_c('pan-tool',{attrs:{\"view-id\":_vm.viewID}}),_c('zoom-tool',{attrs:{\"view-id\":_vm.viewID}}),_c('slice-scroll-tool',{attrs:{\"view-id\":_vm.viewID}}),_c('window-level-tool',{attrs:{\"view-id\":_vm.viewID}}),_c('ruler-tool',{attrs:{\"view-type\":\"2D\",\"view-id\":_vm.viewID,\"widget-manager\":_vm.widgetManager,\"view-direction\":_vm.viewDirection,\"slice\":_vm.slice}}),_c('paint-tool',{attrs:{\"view-id\":_vm.viewID,\"view-direction\":_vm.viewDirection,\"widget-manager\":_vm.widgetManager,\"slice\":_vm.slice}}),_c('crosshairs-tool',{attrs:{\"view-id\":_vm.viewID,\"view-direction\":_vm.viewDirection,\"widget-manager\":_vm.widgetManager,\"slice\":_vm.slice}}),_c('crop-tool',{attrs:{\"view-id\":_vm.viewID}})],1),_c('view-overlay-grid',{staticClass:\"overlay-no-events view-annotations\",scopedSlots:_vm._u([{key:\"top-middle\",fn:function(){return [_c('div',{staticClass:\"annotation-cell\"},[_c('span',[_vm._v(_vm._s(_vm.topLabel))])])]},proxy:true},{key:\"middle-left\",fn:function(){return [_c('div',{staticClass:\"annotation-cell\"},[_c('span',[_vm._v(_vm._s(_vm.leftLabel))])])]},proxy:true},{key:\"bottom-left\",fn:function(){return [_c('div',{staticClass:\"annotation-cell\"},[_c('div',[_vm._v(\"Slice: \"+_vm._s(_vm.slice + 1)+\"/\"+_vm._s(_vm.sliceMax + 1))]),(\n typeof _vm.windowWidth === 'number' &&\n typeof _vm.windowLevel === 'number'\n )?_c('div',[_vm._v(\" W/L: \"+_vm._s(_vm.windowWidth.toFixed(2))+\" / \"+_vm._s(_vm.windowLevel.toFixed(2))+\" \")]):_vm._e()])]},proxy:true},{key:\"top-right\",fn:function(){return [_c('div',{staticClass:\"annotation-cell\"},[(_vm.dicomInfo !== null)?_c('v-menu',{attrs:{\"open-on-hover\":\"\",\"offset-y\":\"\",\"left\":\"\",\"nudge-left\":\"10\",\"dark\":\"\",\"max-width\":\"300px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\n var on = ref.on;\n var attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({staticClass:\"pointer-events-all\",attrs:{\"dark\":\"\",\"small\":\"\",\"icon\":\"\"}},'v-btn',attrs,false),on),[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\" mdi-information \")])],1)]}}],null,false,2094956767)},[_c('v-list',{staticClass:\"grey darken-3\"},[_c('v-list-item',[_c('v-list-item-content',[_c('v-list-item-title',{staticClass:\"font-weight-bold\"},[_vm._v(\" PATIENT / CASE \")]),_c('v-divider'),_c('v-list-item-title',[_vm._v(\" ID: \"+_vm._s(_vm.dicomInfo.patientID)+\" \")])],1)],1),_c('v-list-item',[_c('v-list-item-content',[_c('v-list-item-title',{staticClass:\"font-weight-bold\"},[_vm._v(\" STUDY \")]),_c('v-divider'),_c('v-list-item-title',[_vm._v(\" ID: \"+_vm._s(_vm.dicomInfo.studyID)+\" \")]),_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.dicomInfo.studyDescription)+\" \")])],1)],1),_c('v-list-item',[_c('v-list-item-content',[_c('v-list-item-title',{staticClass:\"font-weight-bold\"},[_vm._v(\" SERIES \")]),_c('v-divider'),_c('v-list-item-title',[_vm._v(\" Series #: \"+_vm._s(_vm.dicomInfo.seriesNumber)+\" \")]),_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.dicomInfo.seriesDescription)+\" \")])],1)],1)],1)],1):_vm._e()],1)]},proxy:true}])}),_c('transition',{attrs:{\"name\":\"loading\"}},[(_vm.isImageLoading)?_c('div',{staticClass:\"overlay-no-events loading\"},[_c('div',[_vm._v(\"Loading the image\")]),_c('div',[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"color\":\"blue\"}})],1)]):_vm._e()])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { onUnmounted } from '@vue/composition-api';\nimport { vtkSubscription } from '@kitware/vtk.js/interfaces';\n\nexport function manageVTKSubscription(subscription: vtkSubscription) {\n onUnmounted(() => subscription.unsubscribe());\n}\n","import { ref } from '@vue/composition-api';\nimport vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';\nimport { manageVTKSubscription } from '@src/composables/manageVTKSubscription';\nimport { vec3 } from 'gl-matrix';\n\nexport function useResizeToFit(\n camera: vtkCamera,\n initialValue: boolean = false\n) {\n const resizeToFit = ref(initialValue);\n\n let trackResizeToFit = true;\n const cachedCameraInfo = {\n position: [0, 0, 0] as vec3,\n parallelScale: 0,\n };\n\n manageVTKSubscription(\n camera.onModified(() => {\n if (trackResizeToFit && resizeToFit.value) {\n const position = camera.getPosition();\n const parallelScale = camera.getParallelScale();\n if (\n !vec3.equals(position, cachedCameraInfo.position) ||\n parallelScale !== cachedCameraInfo.parallelScale\n ) {\n resizeToFit.value = false;\n }\n }\n })\n );\n\n function ignoreResizeToFitTracking(cb: () => void) {\n if (trackResizeToFit) {\n trackResizeToFit = false;\n try {\n cb();\n } finally {\n trackResizeToFit = true;\n }\n }\n }\n\n function resetResizeToFitTracking() {\n cachedCameraInfo.position = camera.getPosition();\n cachedCameraInfo.parallelScale = camera.getParallelScale();\n }\n\n return { resizeToFit, ignoreResizeToFitTracking, resetResizeToFitTracking };\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"handleContainer\",staticClass:\"slice-slider\",on:{\"pointerdown\":_vm.onDragStart,\"pointermove\":_vm.onDragMove,\"pointerup\":_vm.onDragEnd,\"pointercancel\":_vm.onDragEnd,\"contextmenu\":function($event){return $event.preventDefault()}}},[_c('div',{staticClass:\"slice-slider-track\"}),_c('div',{ref:\"handle\",staticClass:\"slice-slider-handle\",style:({\n height: (_vm.handleHeight + \"px\"),\n transform: (\"translate3d(0, \" + _vm.handlePosition + \"px, 0)\"),\n })})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n class=\"slice-slider\"\n ref=\"handleContainer\"\n @pointerdown=\"onDragStart\"\n @pointermove=\"onDragMove\"\n @pointerup=\"onDragEnd\"\n @pointercancel=\"onDragEnd\"\n @contextmenu=\"$event.preventDefault()\"\n >\n <div class=\"slice-slider-track\" />\n <div\n class=\"slice-slider-handle\"\n ref=\"handle\"\n :style=\"{\n height: `${handleHeight}px`,\n transform: `translate3d(0, ${handlePosition}px, 0)`,\n }\"\n />\n </div>\n</template>\n\n<script>\nfunction getYOffsetFromTransform(matStr) {\n if (!matStr || matStr === 'none') {\n return 0;\n }\n const values = matStr\n .match(/matrix(?:3d)?\\((.+)\\)/)[1]\n .split(',')\n .map((v) => Number(v));\n const is3D = matStr.includes('3d');\n return is3D ? values[13] : values[5];\n}\n\nexport default {\n props: {\n slice: {\n type: Number,\n default: 0,\n },\n min: {\n type: Number,\n required: true,\n },\n max: {\n type: Number,\n required: true,\n },\n step: {\n type: Number,\n required: true,\n },\n handleHeight: {\n type: Number,\n default: 20,\n },\n },\n\n data() {\n return {\n maxHandlePos: 0,\n dragging: false,\n initialHandlePos: 0,\n initialMousePosY: 0,\n yOffset: 0,\n };\n },\n\n computed: {\n handlePosition() {\n const range = this.max - this.min <= 0 ? 1 : this.max - this.min;\n const pos = this.maxHandlePos * ((this.slice - this.min) / range);\n return this.dragging ? this.draggingHandlePos : pos;\n },\n draggingHandlePos() {\n return Math.min(\n Math.max(0, this.initialHandlePos + this.yOffset),\n this.maxHandlePos\n );\n },\n },\n\n mounted() {\n this.updateMaxHandlePos();\n this.resizeObserver = new ResizeObserver((entries) => {\n if (entries.length === 1) {\n this.updateMaxHandlePos();\n }\n });\n this.resizeObserver.observe(this.$refs.handleContainer);\n },\n\n beforeDestroy() {\n this.resizeObserver.disconnect();\n },\n\n methods: {\n updateMaxHandlePos() {\n this.maxHandlePos =\n this.$refs.handleContainer.clientHeight - this.handleHeight;\n },\n\n onDragStart(ev) {\n ev.preventDefault();\n\n this.dragging = true;\n this.initialMousePosY = ev.pageY;\n\n if (ev.target === this.$refs.handle) {\n const handleStyles = window.getComputedStyle(this.$refs.handle);\n this.initialHandlePos = getYOffsetFromTransform(handleStyles.transform);\n } else {\n // move handle to mouse pos\n const { y } = this.$refs.handleContainer.getBoundingClientRect();\n this.initialHandlePos = Math.max(\n 0,\n Math.min(this.maxHandlePos, ev.pageY - y - this.handleHeight / 2)\n );\n const newSlice = this.getNearestSlice(this.initialHandlePos);\n this.$emit('input', newSlice);\n }\n\n this.yOffset = 0;\n\n this.$refs.handleContainer.setPointerCapture(ev.pointerId);\n },\n\n onDragMove(ev) {\n if (!this.$refs.handleContainer.hasPointerCapture(ev.pointerId)) return;\n ev.preventDefault();\n\n this.yOffset = ev.pageY - this.initialMousePosY;\n const slice = this.getNearestSlice(this.handlePosition);\n this.$emit('input', slice);\n },\n\n onDragEnd(ev) {\n if (!this.$refs.handleContainer.hasPointerCapture(ev.pointerId)) return;\n ev.preventDefault();\n this.$refs.handleContainer.releasePointerCapture(ev.pointerId);\n\n this.dragging = false;\n const slice = this.getNearestSlice(this.handlePosition);\n this.$emit('input', slice);\n },\n\n getNearestSlice(pos) {\n const sliceEstimate = pos / this.maxHandlePos;\n const frac = sliceEstimate * (this.max - this.min) + this.min;\n return Math.round(frac / this.step) * this.step;\n },\n },\n};\n</script>\n\n<style scoped>\n.slice-slider {\n touch-action: none;\n}\n\n.slice-slider-handle {\n position: relative;\n width: 100%;\n background: #ccc;\n box-sizing: border-box;\n border-radius: 3px;\n border: 1px solid #999;\n}\n\n.slice-slider-track {\n position: absolute;\n margin: 0 auto;\n top: 8px;\n left: 0;\n right: 0;\n bottom: 8px;\n width: 1px;\n border: 1px solid #888;\n border-radius: 2px;\n}\n</style>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SliceSlider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SliceSlider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SliceSlider.vue?vue&type=template&id=091a8639&scoped=true&\"\nimport script from \"./SliceSlider.vue?vue&type=script&lang=js&\"\nexport * from \"./SliceSlider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SliceSlider.vue?vue&type=style&index=0&id=091a8639&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"091a8639\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:_vm.$style.gridRoot},[_c('div',{class:[_vm.$style.top, _vm.$style.row]},[_c('div',{class:[_vm.$style.left, _vm.$style.cell]},[_vm._t(\"top-left\")],2),_c('div',{class:[_vm.$style.center, _vm.$style.cell]},[_vm._t(\"top-middle\")],2),_c('div',{class:[_vm.$style.right, _vm.$style.cell]},[_vm._t(\"top-right\")],2)]),_c('div',{class:[_vm.$style.middle, _vm.$style.row]},[_c('div',{class:[_vm.$style.left, _vm.$style.cell]},[_vm._t(\"middle-left\")],2),_c('div',{class:[_vm.$style.center, _vm.$style.cell]},[_vm._t(\"middle-center\")],2),_c('div',{class:[_vm.$style.right, _vm.$style.cell]},[_vm._t(\"middle-right\")],2)]),_c('div',{class:[_vm.$style.bottom, _vm.$style.row]},[_c('div',{class:[_vm.$style.left, _vm.$style.cell]},[_vm._t(\"bottom-left\")],2),_c('div',{class:[_vm.$style.center, _vm.$style.cell]},[_vm._t(\"bottom-center\")],2),_c('div',{class:[_vm.$style.right, _vm.$style.cell]},[_vm._t(\"bottom-right\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// extracted by mini-css-extract-plugin\nexport default {\"gridRoot\":\"ViewOverlayGrid_gridRoot_SmXm0\",\"row\":\"ViewOverlayGrid_row_U9UZW\",\"cell\":\"ViewOverlayGrid_cell_HBC3F\",\"top\":\"ViewOverlayGrid_top_wZZpo\",\"left\":\"ViewOverlayGrid_left_AoBtT\",\"center\":\"ViewOverlayGrid_center_gCE3z\",\"middle\":\"ViewOverlayGrid_middle_lMLVm\",\"bottom\":\"ViewOverlayGrid_bottom_cdPFJ\",\"right\":\"ViewOverlayGrid_right_q8jVS\"};","import { render, staticRenderFns } from \"./ViewOverlayGrid.vue?vue&type=template&id=1b8ecaca&\"\nvar script = {}\nimport style0 from \"./ViewOverlayGrid.vue?vue&type=style&index=0&id=1b8ecaca&prod&module=true&lang=css&\"\n\n\n\n\nfunction injectStyles (context) {\n \n this[\"$style\"] = (style0.locals || style0)\n\n}\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n injectStyles,\n null,\n null\n \n)\n\nexport default component.exports","import { onBeforeUnmount, Ref, unref, watch } from '@vue/composition-api';\n\n/**\n * Invokes a callback whenever an element is resized.\n */\nexport function useResizeObserver(\n targetElRef: Ref<Element | null | undefined>,\n callback: (entry: ResizeObserverEntry) => void\n) {\n const observer = new ResizeObserver((entries) => {\n if (entries.length === 1) {\n callback(entries[0]);\n }\n });\n\n watch(\n targetElRef,\n (targetEl, prevTarget) => {\n if (prevTarget) {\n observer.unobserve(prevTarget);\n }\n if (targetEl) {\n observer.observe(targetEl);\n }\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n const targetEl = unref(targetElRef);\n if (targetEl) {\n observer.unobserve(targetEl);\n }\n });\n\n return observer;\n}\n","import vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport { ComputedRef, InjectionKey } from '@vue/composition-api';\n\nexport const NO_PROXY = -1;\nexport const NO_SELECTION = -1;\nexport const NO_WIDGET = -1;\n\nexport const EPSILON = 10e-6;\nexport const NOOP = () => {};\n\n/**\n * Retrieves the parent VtkTwoView's widget manager.\n */\nexport const VTKTwoViewWidgetManager: InjectionKey<\n ComputedRef<vtkWidgetManager>\n> = Symbol('VTKTwoViewWidgetManager');\n\n/**\n * Retrieves the parent VtkThreeView's widget manager.\n */\nexport const VTKThreeViewWidgetManager: InjectionKey<\n ComputedRef<vtkWidgetManager>\n> = Symbol('VTKThreeViewWidgetManager');\n\nexport const DataTypes = {\n Image: 'Image',\n Labelmap: 'Labelmap',\n Dicom: 'DICOM',\n Model: 'Model',\n};\n\nexport const Messages = {\n WebGLLost: {\n title: 'Viewer Error',\n details:\n 'Lost the WebGL context! Please reload the webpage. If the problem persists, you may need to restart your web browser.',\n },\n} as const;\n","import { vtkSubscription } from '@kitware/vtk.js/interfaces';\nimport { isRef, onUnmounted, watchEffect } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\n\ntype Listener = (obj: any) => void;\ntype VTKCallback = (listener: Listener) => vtkSubscription;\n\nexport function useVTKCallback(\n callback: MaybeRef<VTKCallback | null | undefined>\n) {\n const handleListener = (listener: Listener) => {\n let subscription: vtkSubscription | null = null;\n\n const cleanup = () => {\n subscription?.unsubscribe();\n subscription = null;\n };\n onUnmounted(cleanup);\n\n if (isRef(callback)) {\n watchEffect(() => {\n cleanup();\n if (callback.value) {\n subscription = callback.value(listener);\n }\n });\n } else if (callback) {\n subscription = callback(listener);\n }\n };\n\n return handleListener;\n}\n","import { computed, Ref, ref } from '@vue/composition-api';\nimport { vec3 } from 'gl-matrix';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport { EPSILON } from '../constants';\nimport { useVTKCallback } from './useVTKCallback';\n\nexport function toOrderedLabels(vec: Vector3) {\n return (\n vec\n .map((v, i) => ({ value: v, axis: i }))\n // remove components close to zero, since we won't show those labels\n .filter(({ value }) => Math.abs(value) > EPSILON)\n // sort from largest to smallest component\n .sort((a, b) => Math.abs(b.value) - Math.abs(a.value))\n // apply labels\n .map(({ value, axis }) => (Math.sign(value) === 1 ? 'LPS' : 'RAI')[axis])\n .join('')\n );\n}\n\n/**\n * Computes orientation labels for a given view.\n *\n * Labels are with respect to the current camera orientation.\n *\n * vtk.js coordinate coordinate is implied to be LPS, so orientation labels\n * are determined solely from the camera' direction and view-up.\n */\nexport function useOrientationLabels(view: Ref<vtkViewProxy>) {\n const camera = computed(() => view.value.getCamera());\n\n const top = ref('');\n const left = ref('');\n const bottom = ref('');\n const right = ref('');\n\n function updateAxes() {\n const vup = camera.value.getViewUp();\n const vdir = camera.value.getDirectionOfProjection();\n const vright = [0, 0, 0] as Vector3;\n\n // vup and vdir should not be parallel for cameras\n vec3.cross(vright, vdir, vup);\n\n const vbottom = vup.map((c) => c * -1) as Vector3;\n const vleft = vright.map((c) => c * -1) as Vector3;\n\n top.value = toOrderedLabels(vup);\n right.value = toOrderedLabels(vright);\n bottom.value = toOrderedLabels(vbottom);\n left.value = toOrderedLabels(vleft);\n }\n\n const cameraOnModified = useVTKCallback(\n computed(() => camera.value.onModified)\n );\n cameraOnModified(updateAxes);\n updateAxes();\n\n return { top, right, bottom, left };\n}\n","import { Bounds } from '@kitware/vtk.js/types';\nimport { vec3, mat3 } from 'gl-matrix';\nimport {\n LPSAxis,\n LPSAxisDir,\n LPSBounds,\n LPSDirections,\n LPSPoint,\n} from '../types/lps';\n\nexport const LPSAxes: LPSAxis[] = ['Sagittal', 'Coronal', 'Axial'];\n\nexport function createLPSPoint(): LPSPoint {\n return {\n Sagittal: 0,\n Coronal: 0,\n Axial: 0,\n };\n}\n\nexport function createLPSBounds(): LPSBounds {\n return {\n Sagittal: [0, 0],\n Coronal: [0, 0],\n Axial: [0, 0],\n };\n}\n\nexport function getAxisBounds(\n bounds: Bounds,\n axis: LPSAxis,\n directions: LPSDirections\n) {\n const index = 2 * directions[axis];\n return bounds.slice(index, index + 2) as [number, number];\n}\n\nexport function getLPSAxisFromDir(dir: LPSAxisDir): LPSAxis {\n switch (dir) {\n case 'Superior':\n case 'Inferior':\n return 'Axial';\n case 'Left':\n case 'Right':\n return 'Sagittal';\n case 'Posterior':\n case 'Anterior':\n return 'Coronal';\n default:\n throw new Error(`Invalid LPS direction: ${dir}`);\n }\n}\n\nexport const defaultLPSDirections = () => ({\n Left: vec3.fromValues(1, 0, 0),\n Right: vec3.fromValues(-1, 0, 0),\n Posterior: vec3.fromValues(0, 1, 0),\n Anterior: vec3.fromValues(0, -1, 0),\n Superior: vec3.fromValues(0, 0, 1),\n Inferior: vec3.fromValues(0, 0, -1),\n\n Sagittal: 0 as const,\n Coronal: 1 as const,\n Axial: 2 as const,\n});\n\n/**\n * Associates the column vectors of a 3x3 matrix with the LPS axes.\n *\n * For each of the LPS axes, this function returns the associated column index (0, 1, 2)\n * in the provided 3x3 column-major matrix.\n *\n * Approach:\n * - find the max of the direction matrix, ignoring columns and rows marked as done\n * - assign the column vector of that max value to the row axis\n * - mark that row and column as done\n * - continue until all rows and columns are done\n */\nexport function getLPSDirections(direction: mat3): LPSDirections {\n // Track the rows and columns that have yet to be assigned.\n const availableCols = [0, 1, 2];\n const availableRows = [0, 1, 2];\n const lpsDirs: LPSDirections = defaultLPSDirections();\n\n for (let i = 0; i < 3; i++) {\n let bestValue = 0;\n let bestValueLoc = [0, 0]; // col, row\n let removeIndices = [0, 0]; // indices into availableCols/Rows for deletion\n\n availableCols.forEach((col, colIdx) => {\n availableRows.forEach((row, rowIdx) => {\n const value = direction[col * 3 + row];\n if (Math.abs(value) > Math.abs(bestValue)) {\n bestValue = value;\n bestValueLoc = [col, row];\n removeIndices = [colIdx, rowIdx];\n }\n });\n });\n\n // the row index corresponds to the index of the LPS axis\n const [col, axis] = bestValueLoc;\n const axisVector = direction.slice(col * 3, (col + 1) * 3);\n const vecSign = Math.sign(bestValue);\n const posVector = axisVector.map((c) => c * vecSign) as vec3;\n const negVector = axisVector.map((c) => c * -vecSign) as vec3;\n if (axis === 0) {\n // Sagittal\n lpsDirs.Left = posVector;\n lpsDirs.Right = negVector;\n lpsDirs.Sagittal = col as 0 | 1 | 2;\n } else if (axis === 1) {\n // Coronal\n lpsDirs.Posterior = posVector;\n lpsDirs.Anterior = negVector;\n lpsDirs.Coronal = col as 0 | 1 | 2;\n } else if (axis === 2) {\n // Axial\n lpsDirs.Superior = posVector;\n lpsDirs.Inferior = negVector;\n lpsDirs.Axial = col as 0 | 1 | 2;\n }\n\n availableCols.splice(removeIndices[0], 1);\n availableRows.splice(removeIndices[1], 1);\n }\n\n return lpsDirs;\n}\n","type PromiseResolveFunction<T> = (value: T) => void;\ntype PromiseRejectFunction = (reason?: Error) => void;\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: PromiseResolveFunction<T>;\n reject: PromiseRejectFunction;\n}\n\nexport function defer<T>(): Deferred<T> {\n let innerResolve: PromiseResolveFunction<T> | null = null;\n let innerReject: PromiseRejectFunction | null = null;\n\n const resolve = (value: T) => {\n if (innerResolve) innerResolve(value);\n };\n const reject = (reason?: Error) => {\n if (innerReject) innerReject(reason);\n };\n\n const promise = new Promise<T>((res, rej) => {\n innerResolve = res;\n innerReject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\nexport function removeFromArray<T>(arr: Array<T>, el: T) {\n const idx = arr.indexOf(el);\n if (idx > -1) {\n arr.splice(idx, 1);\n }\n}\n\nexport function clampValue(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {\n return keys.reduce((o, k) => ({ ...o, [k]: obj[k] }), {} as Pick<T, K>);\n}\n\nexport function plural(n: number, word: string, pluralWord?: string) {\n return n > 1 ? pluralWord ?? `${word}s` : word;\n}\n\nexport const ensureDefault = <T>(\n key: string,\n records: Record<string, T>,\n default_: T\n) => {\n if (!(key in records)) {\n // eslint-disable-next-line no-param-reassign\n records[key] = default_;\n }\n\n return records[key];\n};\n\nexport function arrayEquals<T>(a: T[], b: T[]) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\n/**\n * Wraps non-arrays in an array.\n * @param maybeArray\n */\nexport function wrapInArray<T>(maybeArray: T | T[]): T[] {\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n\n/**\n * Extracts the basename from a URL.\n *\n * Requires that the URL global be present.\n */\nexport function getURLBasename(url: string) {\n return new URL(url).pathname.split('/').at(-1) ?? '';\n}\n","import { Vector3 } from '@kitware/vtk.js/types';\nimport { LPSAxis } from '@/src/types/lps';\nimport { InteractionState } from '@/src/vtk/RulerWidget/state';\n\nexport interface Ruler {\n name: string;\n /**\n * Point is in image index space.\n */\n firstPoint: Vector3 | null;\n /**\n * Point is in image index space.\n */\n secondPoint: Vector3 | null;\n /**\n * The associated view slicing axis.\n */\n viewAxis: LPSAxis | null;\n /**\n * The associated slice along the axis.\n */\n slice: number | null;\n /**\n * The associated image dataset.\n *\n * The ruler currently does not store orientation info,\n * and so depends on the associated image space.\n */\n imageID: string;\n /**\n * The current interaction state.\n */\n interactionState: InteractionState;\n /**\n * Ruler metadata\n */\n color: string;\n}\n\nexport enum Tools {\n WindowLevel = 'WindowLevel',\n Pan = 'Pan',\n Zoom = 'Zoom',\n Ruler = 'Ruler',\n Paint = 'Paint',\n Crosshairs = 'Crosshairs',\n Crop = 'Crop',\n}\n\nexport type LPSCroppingPlanes = {\n Sagittal: [number, number];\n Coronal: [number, number];\n Axial: [number, number];\n};\n","import { Vector3 } from '@kitware/vtk.js/types';\nimport vtkStateBuilder from '@kitware/vtk.js/Widgets/Core/StateBuilder';\nimport vtkWidgetState from '@kitware/vtk.js/Widgets/Core/WidgetState';\n\nexport enum InteractionState {\n Settled = 0,\n PlacingFirst = 1,\n PlacingSecond = 2,\n}\n\nexport interface RulerPointWidgetState extends vtkWidgetState {\n setOrigin(origin: Vector3 | null): boolean;\n getOrigin(): Vector3 | null;\n setScale1(scale: number): boolean;\n getScale1(): number;\n setVisible(visible: boolean): boolean;\n getVisible(): boolean;\n setColor(color: number): boolean;\n getColor(): number;\n}\n\nexport interface RulerWidgetState extends vtkWidgetState {\n getFirstPoint(): RulerPointWidgetState;\n getSecondPoint(): RulerPointWidgetState;\n getInteractionState(): InteractionState;\n setInteractionState(state: InteractionState): boolean;\n}\n\nexport default function generateState() {\n return vtkStateBuilder\n .createBuilder()\n .addStateFromMixin({\n labels: ['points'],\n name: 'firstPoint',\n mixins: ['origin', 'scale1', 'visible', 'color'],\n initialValues: {\n // diameter\n scale1: 20,\n origin: null,\n visible: false,\n },\n })\n .addStateFromMixin({\n labels: ['points'],\n name: 'secondPoint',\n mixins: ['origin', 'scale1', 'visible', 'color'],\n initialValues: {\n // diameter\n scale1: 20,\n origin: null,\n visible: false,\n },\n })\n .addField({\n name: 'interactionState',\n initialValue: InteractionState.PlacingFirst,\n })\n .addField({\n name: 'ID',\n initialValue: '',\n })\n .build() as RulerWidgetState;\n}\n","export enum LayoutDirection {\n V = 'V',\n H = 'H',\n}\n\nexport type Layout = {\n direction: LayoutDirection;\n items: Array<Layout | string>;\n name?: string;\n};\n","import JSZip from 'jszip';\nimport { z } from 'zod';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport vtkPiecewiseFunctionProxy, {\n PiecewiseGaussian,\n PiecewiseNode,\n} from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\n\nimport {\n Ruler,\n Tools as ToolsEnum,\n LPSCroppingPlanes,\n} from '@/src/store/tools/types';\nimport { InteractionState } from '@/src/vtk/RulerWidget/state';\n\nimport {\n CameraConfig,\n SliceConfig,\n WindowLevelConfig,\n VolumeColorConfig,\n} from '../../store/view-configs/types';\nimport { LPSAxisDir, LPSAxis } from '../../types/lps';\nimport { LayoutDirection } from '../../types/layout';\nimport {\n ViewType,\n ColorBy,\n ColorTransferFunction,\n OpacityFunction,\n OpacityGaussians,\n OpacityPoints,\n OpacityNodes,\n ColoringConfig,\n CVRConfig,\n} from '../../types/views';\n\nexport enum DataSetType {\n DICOM = 'dicom',\n IMAGE = 'image',\n}\n\nconst DataSetTypeNative = z.nativeEnum(DataSetType);\n\nconst LPSAxisDir: z.ZodType<LPSAxisDir> = z.union([\n z.literal('Left'),\n z.literal('Right'),\n z.literal('Posterior'),\n z.literal('Anterior'),\n z.literal('Superior'),\n z.literal('Inferior'),\n]);\n\nconst DataSet = z.object({\n id: z.string(),\n path: z.string(),\n type: DataSetTypeNative,\n});\nexport type DataSet = z.infer<typeof DataSet>;\n\nconst LayoutDirectionNative = z.nativeEnum(LayoutDirection);\n\nexport interface Layout {\n name?: string;\n direction: LayoutDirection;\n items: Array<Layout | string>;\n}\n\nconst Layout: z.ZodType<Layout> = z.lazy(() =>\n z.object({\n name: z.string().optional(),\n direction: LayoutDirectionNative,\n items: z.array(z.union([Layout, z.string()])),\n })\n);\n\nconst Vector3: z.ZodType<Vector3> = z.tuple([\n z.number(),\n z.number(),\n z.number(),\n]);\n\nconst WindowLevelConfig: z.ZodType<WindowLevelConfig> = z.object({\n width: z.number(),\n level: z.number(),\n min: z.number(),\n max: z.number(),\n});\n\nconst SliceConfig: z.ZodType<SliceConfig> = z.object({\n slice: z.number(),\n min: z.number(),\n max: z.number(),\n axisDirection: LPSAxisDir,\n});\n\nconst CameraConfig: z.ZodType<CameraConfig> = z.object({\n parallelScale: z.number().optional(),\n position: Vector3.optional(),\n focalPoint: Vector3.optional(),\n directionOfProjection: Vector3.optional(),\n viewUp: Vector3.optional(),\n});\n\nconst ColorBy: z.ZodType<ColorBy> = z.object({\n arrayName: z.string(),\n location: z.string(),\n});\n\nconst PiecewiseGaussian: z.ZodType<PiecewiseGaussian> = z.object({\n position: z.number(),\n height: z.number(),\n width: z.number(),\n xBias: z.number(),\n yBias: z.number(),\n});\n\nconst PiecewiseNode: z.ZodType<PiecewiseNode> = z.object({\n x: z.number(),\n y: z.number(),\n midpoint: z.number(),\n sharpness: z.number(),\n});\n\nconst OpacityGaussians: z.ZodType<OpacityGaussians> = z.object({\n mode: z.literal(vtkPiecewiseFunctionProxy.Mode.Gaussians),\n gaussians: PiecewiseGaussian.array(),\n mappingRange: z.tuple([z.number(), z.number()]),\n});\n\nconst OpacityPoints: z.ZodType<OpacityPoints> = z.object({\n mode: z.literal(vtkPiecewiseFunctionProxy.Mode.Points),\n preset: z.string(),\n shift: z.number(),\n mappingRange: z.tuple([z.number(), z.number()]),\n});\n\nconst OpacityNodes: z.ZodType<OpacityNodes> = z.object({\n mode: z.literal(vtkPiecewiseFunctionProxy.Mode.Nodes),\n nodes: PiecewiseNode.array(),\n mappingRange: z.tuple([z.number(), z.number()]),\n});\n\nconst OpacityFunction = z.union([\n OpacityGaussians,\n OpacityPoints,\n OpacityNodes,\n]);\n\nconst ColorTransferFunction: z.ZodType<ColorTransferFunction> = z.object({\n preset: z.string(),\n mappingRange: z.tuple([z.number(), z.number()]),\n});\n\nconst ColoringConfig: z.ZodType<ColoringConfig> = z.object({\n colorBy: ColorBy,\n transferFunction: ColorTransferFunction,\n opacityFunction: OpacityFunction,\n});\n\nconst CVRConfig: z.ZodType<CVRConfig> = z.object({\n enabled: z.boolean(),\n lightFollowsCamera: z.boolean(),\n useVolumetricScatteringBlending: z.boolean(),\n volumetricScatteringBlending: z.number(),\n useLocalAmbientOcclusion: z.boolean(),\n laoKernelSize: z.number(),\n laoKernelRadius: z.number(),\n ambient: z.number(),\n diffuse: z.number(),\n specular: z.number(),\n});\n\nconst VolumeColorConfig: z.ZodType<VolumeColorConfig> = z.object({\n colorBy: ColorBy,\n transferFunction: ColorTransferFunction,\n opacityFunction: OpacityFunction,\n cvr: CVRConfig,\n});\n\nconst ViewConfig = z.object({\n window: WindowLevelConfig.optional(),\n slice: SliceConfig.optional(),\n camera: CameraConfig.optional(),\n volumeColorConfig: VolumeColorConfig.optional(),\n});\n\nconst ViewType: z.ZodType<ViewType> = z.union([\n z.literal('2D'),\n z.literal('3D'),\n]);\n\nexport type ViewConfig = z.infer<typeof ViewConfig>;\n\nconst View = z.object({\n id: z.string(),\n type: ViewType,\n props: z.record(z.any()),\n config: z.record(ViewConfig),\n});\n\nexport type View = z.infer<typeof View>;\n\nexport const LabelMap = z.object({\n id: z.string(),\n parent: z.string(),\n path: z.string(),\n});\n\nexport type LabelMap = z.infer<typeof LabelMap>;\n\nconst LPSAxis: z.ZodType<LPSAxis> = z.union([\n z.literal('Axial'),\n z.literal('Sagittal'),\n z.literal('Coronal'),\n]);\n\nconst InteractionStateNative = z.nativeEnum(InteractionState);\n\nconst Ruler: z.ZodType<Ruler> = z.object({\n name: z.string(),\n firstPoint: Vector3.nullable(),\n secondPoint: Vector3.nullable(),\n viewAxis: LPSAxis.nullable(),\n slice: z.number().nullable(),\n imageID: z.string(),\n interactionState: InteractionStateNative,\n color: z.string(),\n});\n\nconst Crosshairs = z.object({\n position: Vector3,\n});\n\nexport type Crosshairs = z.infer<typeof Crosshairs>;\n\nconst ToolsEnumNative = z.nativeEnum(ToolsEnum);\n\nconst Paint = z.object({\n activeLabelmapID: z.string().nullable(),\n brushSize: z.number(),\n brushValue: z.number(),\n labelmapOpacity: z.number(),\n});\n\nconst LPSCroppingPlanes: z.ZodType<LPSCroppingPlanes> = z.object({\n Sagittal: z.tuple([z.number(), z.number()]),\n Coronal: z.tuple([z.number(), z.number()]),\n Axial: z.tuple([z.number(), z.number()]),\n});\n\nconst Cropping = z.record(LPSCroppingPlanes);\n\nconst Tools = z.object({\n rulers: Ruler.array(),\n crosshairs: Crosshairs,\n paint: Paint,\n crop: Cropping,\n current: ToolsEnumNative,\n});\n\nexport type Tools = z.infer<typeof Tools>;\n\nexport const ManifestSchema = z.object({\n version: z.string(),\n dataSets: DataSet.array(),\n labelMaps: LabelMap.array(),\n tools: Tools,\n views: View.array(),\n primarySelection: z.string().optional(),\n layout: Layout,\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\nexport interface StateFile {\n zip: JSZip;\n manifest: Manifest;\n}\n","import { del, set } from '@vue/composition-api';\nimport { defineStore } from 'pinia';\n\ninterface State {\n byDataID: Record<string, File[]>;\n}\n\n/**\n * Store the File objects associated with a given dataset.\n */\nexport const useFileStore = defineStore('files', {\n state: (): State => ({\n byDataID: {},\n }),\n getters: {\n getFiles: (state) => {\n return (dataID: string) => {\n if (dataID in state.byDataID) {\n return state.byDataID[dataID];\n }\n return null;\n };\n },\n },\n actions: {\n remove(dataID: string) {\n if (dataID in this.byDataID) {\n del(this.byDataID, dataID);\n }\n },\n add(dataID: string, files: File[]) {\n set(this.byDataID, dataID, files);\n },\n },\n});\n","import { StateFile, DataSetType } from './schema';\nimport { useFileStore } from '../../store/datasets-files';\n\nexport async function serializeData(\n stateFile: StateFile,\n dataIDs: string[],\n dataType: DataSetType\n) {\n const fileStore = useFileStore();\n const { manifest } = stateFile;\n const { zip } = stateFile;\n const { dataSets } = manifest;\n\n dataIDs.forEach((id) => {\n const files = fileStore.getFiles(id);\n if (files === null) {\n throw new Error(`No files for dataID: ${id}`);\n }\n\n const dataPath = `data/${id}/`;\n dataSets.push({\n id,\n path: dataPath,\n type: dataType,\n });\n\n files.forEach((file: File) => {\n const filePath = `data/${id}/${file.name}`;\n\n zip.file(filePath, file);\n });\n });\n}\n","import JSZip from 'jszip';\nimport { FileEntry } from './types';\n\nexport async function extractFilesFromZip(zipFile: File): Promise<FileEntry[]> {\n const zip = await JSZip.loadAsync(zipFile);\n const promises: Promise<File>[] = [];\n const paths: string[] = [];\n zip.forEach((relPath, file) => {\n if (!file.dir) {\n const splitPath = file.name.split('/');\n const baseName = splitPath[splitPath.length - 1];\n const path = [...splitPath.slice(0, splitPath.length - 1), ''].join('/');\n const fileEntry = zip.file(file.name);\n if (fileEntry) {\n promises.push(\n fileEntry.async('blob').then((blob) => new File([blob], baseName))\n );\n paths.push(path);\n }\n }\n });\n\n return Promise.all(promises).then((files) => {\n return files.map((file, index) => {\n return {\n file,\n path: paths[index],\n };\n });\n });\n}\n","import { extensionToImageIO } from 'itk-wasm';\nimport { extractFilesFromZip } from './zip';\nimport { FileEntry } from './types';\n\nexport const ARCHIVE_FILE_TYPES = new Set(['zip', 'application/zip']);\n\nexport const ITK_IMAGE_EXTENSIONS = Array.from(\n new Set(Array.from(extensionToImageIO.keys()).map((ext) => ext.toLowerCase()))\n);\n\n// remove duplicates\nexport const FILE_TYPES = Array.from(\n new Set(['vti', 'vtp', 'stl', 'dcm', 'zip', 'json', ...ITK_IMAGE_EXTENSIONS])\n);\n\n/**\n * file magic database\n * Used to handle certain cases where files have no extension\n */\nconst FILE_MAGIC_DB = [\n {\n type: 'dcm',\n skip: 128,\n header: Array.from('DICM').map((c) => c.charCodeAt(0)),\n },\n];\n\n// How much data to read when extracting file magic.\n// This should be generous enough for most files.\nconst HEAD_CHUNK = 512;\n\nfunction prefixEquals(target: Uint8Array, prefix: number[] | Uint8Array) {\n if (prefix.length > target.length) {\n return false;\n }\n for (let i = 0; i < prefix.length; i += 1) {\n if (prefix[i] !== target[i]) {\n return false;\n }\n }\n return true;\n}\n\nasync function getFileTypeFromMagic(file: File): Promise<string | null> {\n return new Promise((resolve) => {\n const head = file.slice(0, HEAD_CHUNK);\n const reader = new FileReader();\n reader.onload = () => {\n const chunk = new Uint8Array(reader.result! as ArrayBuffer);\n for (let i = 0; i < FILE_MAGIC_DB.length; i += 1) {\n const { type, header, skip = 0 } = FILE_MAGIC_DB[i];\n if (prefixEquals(chunk.slice(skip), header)) {\n resolve(type);\n return;\n }\n }\n resolve(null);\n };\n reader.readAsArrayBuffer(head);\n });\n}\n\n/**\n * Retypes a given File.\n *\n * Handy for when a file object has no type given.\n * Type is inferred from extension or magic.\n *\n * If type is not supported, file.type will be \"\".\n * @param file\n */\nexport async function retypeFile(file: File): Promise<File> {\n let type: string | null;\n\n type =\n FILE_TYPES.find((ext) => file.name.toLowerCase().endsWith(`.${ext}`)) ??\n null;\n\n if (!type) {\n type = await getFileTypeFromMagic(file);\n }\n\n if (!type) {\n type = '';\n }\n\n const retypedFile = new File([file], file.name, { type: type.toLowerCase() });\n return retypedFile;\n}\n\nexport async function extractArchivesRecursively(\n files: File[]\n): Promise<FileEntry[]> {\n const results = await Promise.all(\n files.map(async (file) => {\n if (ARCHIVE_FILE_TYPES.has(file.type)) {\n return extractFilesFromZip(file);\n }\n\n return [{ file, path: '' }];\n })\n );\n\n const archivedEntries = await Promise.all(\n results.flat().map(async (entry) => {\n return { file: await retypeFile(entry.file), path: entry.path };\n })\n );\n\n const archives = archivedEntries\n .filter(({ file }) => ARCHIVE_FILE_TYPES.has(file.type))\n .map(({ file }) => file);\n\n if (archives.length > 0) {\n const moreEntries = await extractArchivesRecursively(archives);\n return [...archivedEntries, ...moreEntries];\n }\n\n return archivedEntries;\n}\n\nexport type ReadAsType = 'ArrayBuffer' | 'Text';\n\nasync function readFileAs<T extends ArrayBuffer | string>(\n file: File,\n type: ReadAsType\n): Promise<T> {\n return new Promise((resolve) => {\n const fio = new globalThis.FileReader();\n fio.onload = () => resolve(fio.result as T);\n if (type === 'ArrayBuffer') {\n fio.readAsArrayBuffer(file);\n } else if (type === 'Text') {\n fio.readAsText(file);\n } else {\n throw new TypeError(`readAs${type} is not a function`);\n }\n });\n}\n\n/**\n * Reads a file and returns an ArrayBuffer\n * @async\n * @param {File} file\n */\nexport async function readFileAsArrayBuffer(file: File) {\n return readFileAs<ArrayBuffer>(file, 'ArrayBuffer');\n}\n\n/**\n * Reads a file and returns UTF-8 text\n * @async\n * @param {File} file\n */\nexport async function readFileAsUTF8Text(file: File) {\n return readFileAs<string>(file, 'Text');\n}\n","import { vtkObject } from '@kitware/vtk.js/interfaces';\n\nexport * from './io';\n\nexport type ReaderType = (file: File) => vtkObject | Promise<vtkObject>;\nexport type FileReaderMap = Map<string, ReaderType>;\n\n/**\n * A map of the currently registered file readers.\n */\nexport const FILE_READERS: FileReaderMap = new Map();\n","import { del, set } from '@vue/composition-api';\nimport { defineStore } from 'pinia';\nimport { vec3, mat3, mat4 } from 'gl-matrix';\nimport { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport { Bounds } from '@kitware/vtk.js/types';\n\nimport { defaultLPSDirections, getLPSDirections } from '../utils/lps';\nimport { removeFromArray } from '../utils';\nimport { StateFile, DataSetType, DataSet } from '../io/state-file/schema';\nimport { serializeData } from '../io/state-file/utils';\nimport { FILE_READERS } from '../io';\nimport { useFileStore } from './datasets-files';\nimport { LPSDirections } from '../types/lps';\n\nexport interface ImageMetadata {\n name: string;\n orientation: mat3;\n lpsOrientation: LPSDirections;\n spacing: vec3;\n origin: vec3;\n dimensions: vec3;\n worldBounds: Bounds;\n worldToIndex: mat4;\n indexToWorld: mat4;\n}\n\nexport const defaultImageMetadata = () => ({\n name: '(none)',\n orientation: mat3.create(),\n lpsOrientation: defaultLPSDirections(),\n spacing: vec3.fromValues(1, 1, 1),\n origin: vec3.create(),\n dimensions: vec3.fromValues(1, 1, 1),\n worldBounds: [0, 1, 0, 1, 0, 1] as Bounds,\n worldToIndex: mat4.create(),\n indexToWorld: mat4.create(),\n});\n\ninterface State {\n idList: string[]; // list of IDs\n dataIndex: Record<string, vtkImageData>; // ID -> VTK object\n metadata: Record<string, ImageMetadata>; // ID -> metadata\n}\n\nexport const useImageStore = defineStore('images', {\n state: (): State => ({\n idList: [],\n dataIndex: Object.create(null),\n metadata: Object.create(null),\n }),\n actions: {\n addVTKImageData(name: string, imageData: vtkImageData) {\n const id = this.$id.nextID();\n\n this.idList.push(id);\n set(this.dataIndex, id, imageData);\n\n this.$proxies.addData(id, imageData);\n\n set(this.metadata, id, { ...defaultImageMetadata(), name });\n this.updateData(id, imageData);\n return id;\n },\n\n updateData(id: string, imageData: vtkImageData) {\n if (id in this.metadata) {\n const metadata: ImageMetadata = {\n name: this.metadata[id].name,\n dimensions: imageData.getDimensions() as vec3,\n spacing: imageData.getSpacing() as vec3,\n origin: imageData.getOrigin() as vec3,\n orientation: imageData.getDirection(),\n lpsOrientation: getLPSDirections(imageData.getDirection()),\n worldBounds: imageData.getBounds(),\n worldToIndex: imageData.getWorldToIndex(),\n indexToWorld: imageData.getIndexToWorld(),\n };\n\n set(this.metadata, id, metadata);\n }\n },\n\n deleteData(id: string) {\n if (id in this.dataIndex) {\n del(this.dataIndex, id);\n del(this.metadata, id);\n removeFromArray(this.idList, id);\n }\n },\n\n async serialize(stateFile: StateFile) {\n const fileStore = useFileStore();\n // We want to filter out volume data (which is generated so don't have\n // associated files).\n const dataIDs = this.idList.filter((id) => {\n return id in fileStore.byDataID;\n });\n\n await serializeData(stateFile, dataIDs, DataSetType.IMAGE);\n },\n\n async deserialize(dataSet: DataSet, file: File) {\n const reader = FILE_READERS.get(file.type);\n if (reader) {\n const dataObj = await reader(\n new File([file], file.name, { type: file.type })\n );\n if (dataObj.isA('vtkImageData')) {\n const id = this.addVTKImageData(file.name, dataObj as vtkImageData);\n\n return id;\n }\n }\n\n throw new Error(`No reader for ${file.name}`);\n },\n },\n});\n","import vtkITKHelper from '@kitware/vtk.js/Common/DataModel/ITKHelper';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport { set, del } from '@vue/composition-api';\nimport { defineStore } from 'pinia';\nimport { pick, removeFromArray } from '../utils';\nimport { useImageStore } from './datasets-images';\nimport { useFileStore } from './datasets-files';\nimport { StateFile, DataSetType, DataSet } from '../io/state-file/schema';\nimport { serializeData } from '../io/state-file/utils';\n\nexport const ANONYMOUS_PATIENT = 'Anonymous';\nexport const ANONYMOUS_PATIENT_ID = 'ANONYMOUS';\n\nexport function imageCacheMultiKey(offset: number, asThumbnail: boolean) {\n return `${offset}!!${asThumbnail}`;\n}\n\nexport interface VolumeKeys {\n patientKey: string;\n studyKey: string;\n volumeKey: string;\n}\n\nexport interface PatientInfo {\n PatientID: string;\n PatientName: string;\n PatientBirthDate: string;\n PatientSex: string;\n}\n\nexport interface StudyInfo {\n StudyID: string;\n StudyInstanceUID: string;\n StudyDate: string;\n StudyTime: string;\n AccessionNumber: string;\n StudyDescription: string;\n}\n\nexport interface VolumeInfo {\n NumberOfSlices: number;\n VolumeID: string;\n Modality: string;\n SeriesInstanceUID: string;\n SeriesNumber: string;\n SeriesDescription: string;\n}\n\n/**\n * Generate a synthetic multi-key patient key from a Patient object.\n *\n * This key is used to try to uniquely identify a patient, since the PatientID\n * is not guaranteed to be unique (especially in the anonymous case).\n *\n * Required keys in the Patient object:\n * - PatientName\n * - PatientID\n * - PatientBirthDate\n * - PatientSex\n *\n * @param {Patient} patient\n */\nexport function genSynPatientKey(patient: PatientInfo) {\n const pid = patient.PatientID.trim();\n const name = patient.PatientName.trim();\n const bdate = patient.PatientBirthDate.trim();\n const sex = patient.PatientSex.trim();\n // we only care about making a unique key here. The\n // data doesn't actually matter.\n return [pid, name, bdate, sex].map((s) => s.replace('|', '_')).join('|');\n}\n\ninterface State {\n // volumeKey -> imageCacheMultiKey -> ITKImage\n sliceData: Record<string, Record<string, object>>;\n\n // volumeKey -> imageID\n volumeToImageID: Record<string, string>;\n // imageID -> volumeKey\n imageIDToVolumeKey: Record<string, string>;\n\n // volume invalidation information\n needsRebuild: Record<string, boolean>;\n\n // patientKey -> patient info\n patientInfo: Record<string, PatientInfo>;\n // patientKey -> array of studyKeys\n patientStudies: Record<string, string[]>;\n\n // studyKey -> study info\n studyInfo: Record<string, StudyInfo>;\n // studyKey -> array of volumeKeys\n studyVolumes: Record<string, string[]>;\n\n // volumeKey -> volume info\n volumeInfo: Record<string, VolumeInfo>;\n\n // parent pointers\n // volumeKey -> studyKey\n volumeStudy: Record<string, string>;\n // studyKey -> patientKey\n studyPatient: Record<string, string>;\n}\n\nexport const useDICOMStore = defineStore('dicom', {\n state: (): State => ({\n sliceData: {},\n volumeToImageID: {},\n imageIDToVolumeKey: {},\n patientInfo: {},\n patientStudies: {},\n studyInfo: {},\n studyVolumes: {},\n volumeInfo: {},\n volumeStudy: {},\n studyPatient: {},\n needsRebuild: {},\n }),\n actions: {\n async importFiles(files: File[]) {\n const fileStore = useFileStore();\n\n const dicomIO = this.$dicomIO;\n\n if (!files.length) {\n return [];\n }\n\n const nameToFileMap = new Map(files.map((f) => [f.name, f]));\n\n const volumesToFilesMap = await dicomIO.categorizeFiles(files);\n const updatedVolumeKeys: VolumeKeys[] = [];\n\n await Promise.all(\n Object.entries(volumesToFilesMap).map(\n async ([volumeKey, fileNames]) => {\n const volumeFiles: File[] = [];\n fileNames.forEach((fileName) => {\n const file = nameToFileMap.get(fileName);\n if (file) {\n volumeFiles.push(file);\n }\n });\n\n // Add file entries to the file store\n fileStore.add(volumeKey, volumeFiles);\n\n // Now read the tags\n const numberOfSlices = volumeFiles.length;\n\n if (!(volumeKey in this.volumeInfo)) {\n const info = await dicomIO.readTags(volumeFiles[0], [\n { name: 'PatientName', tag: '0010|0010', strconv: true },\n { name: 'PatientID', tag: '0010|0020', strconv: true },\n { name: 'PatientBirthDate', tag: '0010|0030' },\n { name: 'PatientSex', tag: '0010|0040' },\n { name: 'StudyInstanceUID', tag: '0020|000d' },\n { name: 'StudyDate', tag: '0008|0020' },\n { name: 'StudyTime', tag: '0008|0030' },\n { name: 'StudyID', tag: '0020|0010', strconv: true },\n { name: 'AccessionNumber', tag: '0008|0050' },\n { name: 'StudyDescription', tag: '0008|1030', strconv: true },\n { name: 'Modality', tag: '0008|0060' },\n { name: 'SeriesInstanceUID', tag: '0020|000e' },\n { name: 'SeriesNumber', tag: '0020|0011' },\n { name: 'SeriesDescription', tag: '0008|103e', strconv: true },\n ]);\n\n // TODO parse the raw string values\n const patient = {\n PatientID: info.PatientID || ANONYMOUS_PATIENT_ID,\n PatientName: info.PatientName || ANONYMOUS_PATIENT,\n PatientBirthDate: info.PatientBirthDate || '',\n PatientSex: info.PatientSex || '',\n };\n const patientKey = genSynPatientKey(patient);\n\n const studyKey = info.StudyInstanceUID;\n const study = pick(\n info,\n 'StudyID',\n 'StudyInstanceUID',\n 'StudyDate',\n 'StudyTime',\n 'AccessionNumber',\n 'StudyDescription'\n );\n\n const volumeInfo = {\n ...pick(\n info,\n 'Modality',\n 'SeriesInstanceUID',\n 'SeriesNumber',\n 'SeriesDescription'\n ),\n NumberOfSlices: numberOfSlices,\n VolumeID: volumeKey,\n };\n\n updatedVolumeKeys.push({\n patientKey,\n studyKey,\n volumeKey,\n });\n\n this._updateDatabase(patient, study, volumeInfo);\n }\n\n // invalidate any existing volume\n if (volumeKey in this.volumeToImageID) {\n // buildVolume requestor uses this as a rebuild hint\n set(this.needsRebuild, volumeKey, true);\n }\n }\n )\n );\n\n return updatedVolumeKeys;\n },\n\n _updateDatabase(\n patient: PatientInfo,\n study: StudyInfo,\n volume: VolumeInfo\n ) {\n const patientKey = patient.PatientID;\n const studyKey = study.StudyInstanceUID;\n const volumeKey = volume.VolumeID;\n\n if (!(patientKey in this.patientInfo)) {\n set(this.patientInfo, patientKey, patient);\n set(this.patientStudies, patientKey, []);\n }\n\n if (!(studyKey in this.studyInfo)) {\n set(this.studyInfo, studyKey, study);\n set(this.studyVolumes, studyKey, []);\n set(this.studyPatient, studyKey, patientKey);\n this.patientStudies[patientKey].push(studyKey);\n }\n\n if (!(volumeKey in this.volumeInfo)) {\n set(this.volumeInfo, volumeKey, volume);\n set(this.volumeStudy, volumeKey, studyKey);\n set(this.sliceData, volumeKey, {});\n this.studyVolumes[studyKey].push(volumeKey);\n }\n },\n\n deleteVolume(volumeKey: string) {\n const imageStore = useImageStore();\n if (volumeKey in this.volumeInfo) {\n const studyKey = this.volumeStudy[volumeKey];\n del(this.volumeInfo, volumeKey);\n del(this.sliceData, volumeKey);\n del(this.volumeStudy, volumeKey);\n\n if (volumeKey in this.volumeToImageID) {\n const imageID = this.volumeToImageID[volumeKey];\n imageStore.deleteData(imageID);\n del(this.volumeToImageID, volumeKey);\n del(this.imageIDToVolumeKey, imageID);\n }\n\n removeFromArray(this.studyVolumes[studyKey], volumeKey);\n if (this.studyVolumes[studyKey].length === 0) {\n this.deleteStudy(studyKey);\n }\n }\n },\n\n deleteStudy(studyKey: string) {\n if (studyKey in this.studyInfo) {\n const patientKey = this.studyPatient[studyKey];\n del(this.studyInfo, studyKey);\n del(this.studyPatient, studyKey);\n\n [...this.studyVolumes[studyKey]].forEach((volumeKey) =>\n this.deleteVolume(volumeKey)\n );\n del(this.studyVolumes, studyKey);\n\n removeFromArray(this.patientStudies[patientKey], studyKey);\n if (this.patientStudies[patientKey].length === 0) {\n this.deletePatient(patientKey);\n }\n }\n },\n\n deletePatient(patientKey: string) {\n if (patientKey in this.patientInfo) {\n del(this.patientInfo, patientKey);\n\n [...this.patientStudies[patientKey]].forEach((studyKey) =>\n this.deleteStudy(studyKey)\n );\n del(this.patientStudies, patientKey);\n }\n },\n\n async serialize(stateFile: StateFile) {\n const dataIDs = Object.keys(this.volumeInfo);\n await serializeData(stateFile, dataIDs, DataSetType.DICOM);\n },\n\n async deserialize(dataSet: DataSet, files: File[]) {\n return this.importFiles(files).then((volumeKeys) => {\n if (volumeKeys.length !== 1) {\n // Volumes are store individually so we should get one back.\n throw new Error('Invalid state file.');\n }\n\n return volumeKeys[0].volumeKey;\n });\n },\n\n // returns an ITK image object\n async getVolumeSlice(\n volumeKey: string,\n sliceIndex: number,\n asThumbnail = false\n ) {\n const dicomIO = this.$dicomIO;\n const fileStore = useFileStore();\n\n const cacheKey = imageCacheMultiKey(sliceIndex, asThumbnail);\n if (\n volumeKey in this.sliceData &&\n cacheKey in this.sliceData[volumeKey]\n ) {\n return this.sliceData[volumeKey][cacheKey];\n }\n\n if (!(volumeKey in this.volumeInfo)) {\n throw new Error(`Cannot find given volume key: ${volumeKey}`);\n }\n const volumeInfo = this.volumeInfo[volumeKey];\n const numSlices = volumeInfo.NumberOfSlices;\n\n if (sliceIndex < 1 || sliceIndex > numSlices) {\n throw new Error(`Slice ${sliceIndex} is out of bounds`);\n }\n\n const volumeFiles = fileStore.getFiles(volumeKey);\n\n if (!volumeFiles) {\n throw new Error(`No files found for volume key: ${volumeKey}`);\n }\n\n const sliceFile = volumeFiles[sliceIndex - 1];\n\n const itkImage = dicomIO.getVolumeSlice(sliceFile, asThumbnail);\n\n set(this.sliceData[volumeKey], cacheKey, itkImage);\n return itkImage;\n },\n\n async buildVolume(volumeKey: string, forceRebuild: boolean = false) {\n const imageStore = useImageStore();\n const fileStore = useFileStore();\n const dicomIO = this.$dicomIO;\n\n const rebuild = forceRebuild || this.needsRebuild[volumeKey];\n\n if (!rebuild && volumeKey in this.volumeToImageID) {\n return imageStore.dataIndex[this.volumeToImageID[volumeKey]];\n }\n\n if (!(volumeKey in this.volumeInfo)) {\n throw new Error(`Cannot find given volume key: ${volumeKey}`);\n }\n\n const volumeFiles = fileStore.getFiles(volumeKey);\n if (!volumeFiles) {\n throw new Error(`No files found for volume key: ${volumeKey}`);\n }\n\n const itkImage = await dicomIO.buildVolume(volumeFiles);\n const vtkImage: vtkImageData =\n vtkITKHelper.convertItkToVtkImage(itkImage);\n\n if (volumeKey in this.volumeToImageID) {\n const imageID = this.volumeToImageID[volumeKey];\n imageStore.updateData(imageID, vtkImage);\n } else {\n const name = this.volumeInfo[volumeKey].SeriesInstanceUID;\n const imageID = imageStore.addVTKImageData(name, vtkImage);\n set(this.volumeToImageID, volumeKey, imageID);\n set(this.imageIDToVolumeKey, imageID, volumeKey);\n }\n\n del(this.needsRebuild, volumeKey);\n\n return vtkImage;\n },\n },\n});\n","import { defineStore } from 'pinia';\nimport vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';\nimport { set } from '@vue/composition-api';\n\ninterface State {\n idList: string[]; // list of IDs\n dataIndex: Record<string, vtkPolyData>; // ID -> VTK object\n metadata: Record<string, {}>; // ID -> metadata\n}\nexport const useModelStore = defineStore('models', {\n state: (): State => ({\n idList: [],\n dataIndex: {},\n metadata: {},\n }),\n actions: {\n addVTKPolyData(name: string, polyData: vtkPolyData) {\n const id = this.$id.nextID();\n this.idList.push(id);\n set(this.dataIndex, id, polyData);\n this.$proxies.addData(id, polyData);\n return id;\n },\n },\n});\n","import { defineStore } from 'pinia';\nimport Vue from 'vue';\n\nexport enum MessageType {\n Error,\n Warning,\n Info,\n Success,\n}\n\nexport type MessageOptions = {\n details?: string;\n persist?: boolean;\n};\n\nexport interface Message {\n id: string;\n type: MessageType;\n title: string;\n options: MessageOptions;\n}\n\nexport type UpdateProgressFunction = (progress: number) => void;\nexport type TaskFunction = (updateProgress?: UpdateProgressFunction) => any;\ninterface State {\n _nextID: number;\n byID: Record<string, Message>;\n msgList: string[];\n}\n\nexport const useMessageStore = defineStore('message', {\n state: (): State => ({\n _nextID: 1,\n byID: {},\n msgList: [],\n }),\n getters: {\n messages(): Array<Message> {\n return this.msgList.map((id: string) => this.byID[id]);\n },\n // only info, error, warn\n importantMessages(): Array<Message> {\n return this.messages.filter((msg) => msg.type !== MessageType.Success);\n },\n },\n actions: {\n /**\n * Adds an error message.\n * @param title message title\n * @param opts an Error, a string containing details, or a MessageOptions\n */\n addError(title: string, opts?: Error | string | MessageOptions) {\n if (opts instanceof Error) {\n return this._addMessage(\n {\n type: MessageType.Error,\n title,\n },\n {\n details: String(opts),\n persist: false,\n }\n );\n }\n return this._addMessage(\n {\n type: MessageType.Error,\n title,\n },\n opts\n );\n },\n /**\n * Adds a warning message.\n * @param title message title\n * @param opts a string containing details or a MessageOptions\n */\n addWarning(title: string, details?: string | MessageOptions) {\n return this._addMessage(\n {\n type: MessageType.Warning,\n title,\n },\n details\n );\n },\n /**\n * Adds a success message.\n * @param title message title\n * @param opts a string containing details or a MessageOptions\n */\n addInfo(title: string, details?: string | MessageOptions) {\n return this._addMessage(\n {\n type: MessageType.Info,\n title,\n },\n details\n );\n },\n /**\n * Adds a success message.\n * @param title message title\n * @param opts a string containing details or a MessageOptions\n */\n addSuccess(title: string, details?: string | MessageOptions) {\n return this._addMessage(\n {\n type: MessageType.Success,\n title,\n },\n details\n );\n },\n clearOne(id: string) {\n if (id in this.byID) {\n Vue.delete(this.byID, id);\n const idx = this.msgList.indexOf(id);\n this.msgList.splice(idx, 1);\n }\n },\n clearAll() {\n this.byID = {};\n this.msgList = [];\n },\n _addMessage(\n msg: Omit<Message, 'id' | 'options'>,\n details?: string | MessageOptions\n ) {\n const id = String(this._nextID++);\n const options: MessageOptions = {\n persist: false,\n ...(typeof details === 'string' ? { details } : details),\n };\n Vue.set(this.byID, id, {\n ...msg,\n options,\n id,\n });\n this.msgList.push(id);\n return id;\n },\n },\n});\n","/**\n * Percent is in [0, 1]. If it's Infinity, then the progress is indeterminate.\n */\nexport type ProgressCallback = (percent: number) => void;\n\nexport interface FetchOptions {\n progress?: ProgressCallback;\n}\n\ninterface URLHandler {\n testURL(url: string): boolean;\n fetchURL(url: string, options?: FetchOptions): Promise<Blob | null>;\n}\n\n/**\n * Handles HTTP(S) connections.\n *\n * Progress is approximate, given that data can be sent over gzipped.\n */\nconst HTTPHandler: URLHandler = {\n testURL: (url) => {\n const { protocol } = new URL(url);\n return protocol === 'http:' || protocol === 'https:';\n },\n fetchURL: async (url, options = {}) => {\n const { progress } = options;\n\n const response = await fetch(url);\n const contentLength = Number(response.headers.get('content-length')) ?? -1;\n\n if (!progress) {\n return response.blob();\n }\n\n if (contentLength < 0) {\n progress(Infinity);\n return response.blob();\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n return null;\n }\n\n const bytes = new Uint8Array(contentLength);\n let recv = 0;\n let done = false;\n do {\n // eslint-disable-next-line no-await-in-loop\n const readData = await reader.read();\n done = readData.done;\n if (readData.value && !done) {\n bytes.set(readData.value, recv);\n recv += readData.value.length;\n progress(recv / contentLength);\n }\n } while (!done);\n\n return new Blob([bytes]);\n },\n};\n\n/**\n * Handles Google Bucket URLs\n */\nconst GoogleBucketHandler: URLHandler = {\n testURL: (url) => new URL(url).protocol === 'gs:',\n fetchURL: async (url, options = {}) => {\n const urlComponents = new URL(url);\n // gs URIs look like gs://bucket_name/file_name,\n // and pathname is everything after gs:\n // strip off both of the leading slashes.\n const bucketPath = urlComponents.pathname.slice(2);\n const httpURL = `https://storage.googleapis.com/${bucketPath}`;\n return HTTPHandler.fetchURL(httpURL, options);\n },\n};\n\nconst HANDLERS = [GoogleBucketHandler, HTTPHandler];\n\n/**\n * Fetches a file.\n * @returns a File instance.\n */\nexport async function fetchFile(\n url: string,\n name: string,\n options?: FetchOptions\n) {\n const handler = HANDLERS.find((h) => h.testURL(url));\n if (!handler) {\n throw new Error(`Cannot find a handler for URL: ${url}`);\n }\n\n const blob = await handler.fetchURL(url, options);\n if (!blob) {\n throw new Error(`Failed to download ${url}`);\n }\n\n return new File([blob], name);\n}\n","import { z } from 'zod';\nimport { getURLBasename } from '../utils';\nimport { fetchFile } from '../utils/fetch';\n\nconst RemoteResource = z.object({\n url: z.string(),\n name: z.optional(z.string()),\n});\n\nexport const RemoteDataManifest = z.object({\n resources: z.array(RemoteResource),\n});\n\nasync function fetchRemoteManifest(\n manifest: z.infer<typeof RemoteDataManifest>\n) {\n return Promise.all(\n manifest.resources.map((resource) =>\n fetchFile(resource.url, resource.name ?? getURLBasename(resource.url))\n )\n );\n}\n\nexport async function readRemoteManifestFile(manifestFile: File) {\n const decoder = new TextDecoder();\n const ab = await manifestFile.arrayBuffer();\n const text = decoder.decode(new Uint8Array(ab));\n const manifest = RemoteDataManifest.parse(JSON.parse(text));\n return fetchRemoteManifest(manifest);\n}\n","import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport { vtkObject } from '@kitware/vtk.js/interfaces';\nimport vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';\nimport { defineStore } from 'pinia';\nimport { computed, ref } from '@vue/composition-api';\nimport { useDICOMStore } from './datasets-dicom';\nimport { useImageStore } from './datasets-images';\nimport { useModelStore } from './datasets-models';\nimport { extractArchivesRecursively, retypeFile, FILE_READERS } from '../io';\nimport { useFileStore } from './datasets-files';\nimport { DataSet, StateFile, DataSetType } from '../io/state-file/schema';\nimport { useMessageStore } from './messages';\nimport { readRemoteManifestFile } from '../io/manifest';\n\nexport const DataType = {\n Image: 'Image',\n Model: 'Model',\n};\n\nconst makeFileSuccessStatus = (\n file: File,\n type: 'model' | 'image',\n dataID: string\n) =>\n ({\n type: 'file',\n loaded: true,\n filename: file.name,\n dataID,\n dataType: type,\n } as const);\n\nexport type FileLoadSuccess = ReturnType<typeof makeFileSuccessStatus>;\n\nexport const makeFileFailureStatus = (file: File | string, reason: string) =>\n ({\n type: 'file',\n loaded: false,\n filename: typeof file === 'string' ? file : file.name,\n error: new Error(reason),\n } as const);\n\nexport type FileLoadFailure = ReturnType<typeof makeFileFailureStatus>;\n\nconst makeDICOMSuccessStatus = (volumeKey: string) =>\n ({\n type: 'dicom',\n loaded: true,\n dataID: volumeKey,\n dataType: 'dicom',\n } as const);\n\nexport type DICOMLoadSuccess = ReturnType<typeof makeDICOMSuccessStatus>;\n\nconst makeDICOMFailureStatus = (error: Error) =>\n ({\n type: 'dicom',\n loaded: false,\n error,\n } as const);\n\nexport type DICOMLoadFailure = ReturnType<typeof makeDICOMFailureStatus>;\n\nexport type FileLoadResult = FileLoadSuccess | FileLoadFailure;\nexport type DICOMLoadResult = DICOMLoadSuccess | DICOMLoadFailure;\nexport type LoadResult = FileLoadResult | DICOMLoadResult;\n\nexport const makeDICOMSelection = (volumeKey: string) =>\n ({\n type: 'dicom',\n volumeKey,\n } as const);\n\nexport type DICOMSelection = ReturnType<typeof makeDICOMSelection>;\n\nexport const makeImageSelection = (imageID: string) =>\n ({\n type: 'image',\n dataID: imageID,\n } as const);\n\nexport type ImageSelection = ReturnType<typeof makeImageSelection>;\n\nexport type DataSelection = DICOMSelection | ImageSelection;\n\nexport function selectionEquals(s1: DataSelection, s2: DataSelection) {\n if (s1.type === 'dicom' && s2.type === 'dicom') {\n return s1.volumeKey === s2.volumeKey;\n }\n if (s1.type === 'image' && s2.type === 'image') {\n return s1.dataID === s2.dataID;\n }\n return false;\n}\n\nexport function convertSuccessResultToDataSelection(\n result: FileLoadSuccess | DICOMLoadSuccess\n) {\n if (result.type === 'dicom') {\n return makeDICOMSelection(result.dataID);\n }\n if (result.type === 'file') {\n if (result.dataType === 'image') {\n return makeImageSelection(result.dataID);\n }\n }\n return null;\n}\n\nexport const useDatasetStore = defineStore('dataset', () => {\n type _This = ReturnType<typeof useDatasetStore>;\n\n const imageStore = useImageStore();\n const modelStore = useModelStore();\n const dicomStore = useDICOMStore();\n const fileStore = useFileStore();\n\n // --- state --- //\n\n const primarySelection = ref<DataSelection | null>(null);\n\n // --- getters --- //\n\n const primaryDataset = computed<vtkImageData | null>(() => {\n const sel = primarySelection.value;\n const { dataIndex } = imageStore;\n const { volumeToImageID } = dicomStore;\n\n if (sel?.type === 'dicom') {\n const id = volumeToImageID[sel.volumeKey];\n return dataIndex[id] || null;\n }\n if (sel?.type === 'image') {\n return dataIndex[sel.dataID] || null;\n }\n return null;\n });\n\n const allDataIDs = computed(() => {\n return [...imageStore.idList, ...modelStore.idList];\n });\n\n function getDataProxyByID<T extends vtkObject>(this: _This, id: string) {\n return this.$proxies.getData<T>(id);\n }\n\n // --- actions --- //\n\n async function setPrimarySelection(sel: DataSelection | null) {\n primarySelection.value = sel;\n\n if (sel === null) {\n return;\n }\n\n // if selection is dicom, call buildVolume\n if (sel.type === 'dicom') {\n try {\n // trigger dicom dataset building\n await dicomStore.buildVolume(sel.volumeKey);\n } catch (err) {\n if (err instanceof Error) {\n const messageStore = useMessageStore();\n messageStore.addError('Failed to build volume(s)', {\n details: `${err}. More details can be found in the developer's console.`,\n });\n }\n }\n }\n }\n\n async function loadFiles(files: File[]): Promise<LoadResult[]> {\n let allFiles = await Promise.all(files.map((f) => retypeFile(f)));\n\n // process any json manifests\n const manifestFiles = allFiles.filter((file) => file.type === 'json');\n allFiles = allFiles.filter((file) => file.type !== 'json');\n\n const manifestStatuses: FileLoadResult[] = [];\n if (manifestFiles.length) {\n await Promise.all(\n manifestFiles.map(async (file) => {\n try {\n allFiles.push(...(await readRemoteManifestFile(file)));\n } catch (err) {\n manifestStatuses.push(\n makeFileFailureStatus(\n file,\n 'Failed to parse or download manifest'\n )\n );\n }\n })\n );\n }\n\n // process archives\n const fileEntries = await extractArchivesRecursively(allFiles);\n allFiles = fileEntries.map((entry) => entry.file);\n\n const dicoms = allFiles.filter(({ type }) => type === 'dcm');\n const otherFiles = allFiles.filter(({ type }) => type !== 'dcm');\n\n const dicomStatus = dicomStore\n .importFiles(dicoms)\n .then((volumeKeys) =>\n volumeKeys.map((volKey) => makeDICOMSuccessStatus(volKey.volumeKey))\n )\n .catch((err) => [makeDICOMFailureStatus(err)]);\n\n const otherStatuses = Promise.all([\n ...otherFiles.map(async (file) => {\n const reader = FILE_READERS.get(file.type);\n if (reader) {\n try {\n const dataObj = await reader(file);\n if (dataObj.isA('vtkImageData')) {\n const id = imageStore.addVTKImageData(\n file.name,\n dataObj as vtkImageData\n );\n fileStore.add(id, [file]);\n\n return makeFileSuccessStatus(file, 'image', id);\n }\n if (dataObj.isA('vtkPolyData')) {\n const id = modelStore.addVTKPolyData(\n file.name,\n dataObj as vtkPolyData\n );\n fileStore.add(id, [file]);\n\n return makeFileSuccessStatus(file, 'model', id);\n }\n return makeFileFailureStatus(\n file,\n `${file.name} did not result in a valid dataset`\n );\n } catch (e) {\n return makeFileFailureStatus(\n file,\n `Reading ${file.name} gave an error: ${e}`\n );\n }\n }\n // indicate an error has occurred\n return makeFileFailureStatus(file, `No reader for ${file.name}`);\n }),\n ]);\n\n const statuses = [...(await dicomStatus), ...(await otherStatuses)];\n return statuses;\n }\n\n async function serialize(stateFile: StateFile) {\n await dicomStore.serialize(stateFile);\n await imageStore.serialize(stateFile);\n\n if (primarySelection.value !== null) {\n let id = null;\n if (primarySelection.value.type === 'dicom') {\n id = primarySelection.value.volumeKey;\n } else {\n id = primarySelection.value.dataID;\n }\n\n const { manifest } = stateFile;\n manifest.primarySelection = id;\n }\n }\n\n async function deserialize(dataSet: DataSet, files: File[]) {\n // dicom\n if (dataSet.type === DataSetType.DICOM) {\n return dicomStore\n .deserialize(dataSet, files)\n .then((volumeKey) => makeDICOMSuccessStatus(volumeKey))\n .catch((err) => makeDICOMFailureStatus(err));\n }\n\n // image\n if (files.length !== 1) {\n throw new Error('Invalid state file.');\n }\n const file = files[0];\n\n return imageStore\n .deserialize(dataSet, file)\n .then((dataID) => makeFileSuccessStatus(file, 'image', dataID))\n .catch((err) =>\n makeFileFailureStatus(\n file.name,\n `Reading ${file.name} gave an error: ${err}`\n )\n );\n }\n\n // --- watch for deletion --- //\n\n imageStore.$onAction(({ name, args, after }) => {\n if (name !== 'deleteData') {\n return;\n }\n after(() => {\n const [id] = args;\n const sel = primarySelection.value;\n if (sel?.type === 'image' && sel.dataID === id) {\n primarySelection.value = null;\n }\n // remove file store entry\n fileStore.remove(id);\n });\n });\n\n dicomStore.$onAction(({ name, args, after }) => {\n if (name !== 'deleteVolume') {\n return;\n }\n after(() => {\n const [volumeKey] = args;\n const sel = primarySelection.value;\n if (sel?.type === 'dicom' && volumeKey === sel.volumeKey) {\n primarySelection.value = null;\n }\n\n // remove file store entry\n fileStore.remove(volumeKey);\n });\n });\n\n return {\n primarySelection,\n primaryDataset,\n allDataIDs,\n getDataProxyByID,\n setPrimarySelection,\n loadFiles,\n serialize,\n deserialize,\n };\n});\n","import { computed } from '@vue/composition-api';\nimport { useDatasetStore } from '../store/datasets';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport { defaultImageMetadata, useImageStore } from '../store/datasets-images';\nimport { createLPSBounds, getAxisBounds } from '../utils/lps';\n\n// Returns a spatially inflated image extent\nexport function getImageSpatialExtent(imageID: string | null) {\n const imageStore = useImageStore();\n\n if (imageID && imageID in imageStore.metadata) {\n const { lpsOrientation } = imageStore.metadata[imageID];\n const image = imageStore.dataIndex[imageID];\n if (image) {\n const extent = image.getSpatialExtent();\n return {\n Sagittal: getAxisBounds(extent, 'Sagittal', lpsOrientation),\n Coronal: getAxisBounds(extent, 'Coronal', lpsOrientation),\n Axial: getAxisBounds(extent, 'Axial', lpsOrientation),\n };\n }\n }\n return createLPSBounds();\n}\n\nexport function useCurrentImage() {\n const dataStore = useDatasetStore();\n const dicomStore = useDICOMStore();\n const imageStore = useImageStore();\n\n const currentImageID = computed(() => {\n const { primarySelection } = dataStore;\n const { volumeToImageID } = dicomStore;\n\n if (primarySelection?.type === 'image') {\n return primarySelection.dataID;\n }\n if (primarySelection?.type === 'dicom') {\n return volumeToImageID[primarySelection.volumeKey] || null;\n }\n return null;\n });\n\n const currentImageMetadata = computed(() => {\n const { metadata } = imageStore;\n const imageID = currentImageID.value;\n\n if (imageID) {\n return metadata[imageID];\n }\n return defaultImageMetadata();\n });\n\n const currentImageData = computed(() => {\n // assumed to be only images for now\n return dataStore.primaryDataset;\n });\n\n const currentImageExtent = computed(() =>\n getImageSpatialExtent(currentImageID.value)\n );\n\n const isImageLoading = computed(() => {\n return !!dataStore.primarySelection && !dataStore.primaryDataset;\n });\n\n return {\n currentImageData,\n currentImageID,\n currentImageMetadata,\n currentImageExtent,\n isImageLoading,\n };\n}\n","import { computed, Ref, unref } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\nimport { mat3 } from 'gl-matrix';\nimport { ImageMetadata } from '../store/datasets-images';\nimport { LPSAxisDir } from '../types/lps';\nimport { getLPSDirections } from '../utils/lps';\n\n/**\n *\n * @param {Ref<LPSAxisDir>} viewDirection an LPS view look-direction\n * @param {Ref<LPSAxisDir>} viewUp an LPS view up-direction\n * @param {Ref<ImageMetadata>} imageMetadataRef image metadata\n */\nexport function useCameraOrientation(\n viewDirection: MaybeRef<LPSAxisDir>,\n viewUp: MaybeRef<LPSAxisDir>,\n imageMetadataRef: Ref<ImageMetadata>\n) {\n const orientationMatrix = computed(\n () => imageMetadataRef.value.orientation as mat3\n );\n const lpsDirections = computed(() =>\n getLPSDirections(orientationMatrix.value)\n );\n const cameraDirVec = computed(\n () => lpsDirections.value[unref(viewDirection)]\n );\n const cameraUpVec = computed(() => lpsDirections.value[unref(viewUp)]);\n\n return {\n cameraDirVec,\n cameraUpVec,\n };\n}\n","import { getImageSpatialExtent } from '@/src/composables/useCurrentImage';\nimport { LPSAxis } from '@/src/types/lps';\nimport { getAxisBounds } from '@/src/utils/lps';\nimport vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';\nimport { Vector2, Vector3 } from '@kitware/vtk.js/types';\nimport { computed, reactive, readonly, set, unref } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\nimport { vec3 } from 'gl-matrix';\nimport { defineStore } from 'pinia';\nimport { ImageMetadata, useImageStore } from '../datasets-images';\nimport { LPSCroppingPlanes } from './types';\nimport { StateFile, Manifest } from '../../io/state-file/schema';\n\nfunction clampRangeToBounds(range: Vector2, bounds: Vector2) {\n return [\n Math.max(bounds[0], Math.min(bounds[1], range[0])),\n Math.max(bounds[0], Math.min(bounds[1], range[1])),\n ] as Vector2;\n}\n\nfunction convertCropBoundsToVTKPlane(\n cropBounds: LPSCroppingPlanes,\n metadata: ImageMetadata,\n axis: LPSAxis,\n lowerUpper: 0 | 1\n) {\n const { indexToWorld, orientation, lpsOrientation: lpsDirs } = metadata;\n\n const origin = [0, 0, 0] as Vector3;\n const axisIndex = lpsDirs[axis];\n origin[axisIndex] = cropBounds[axis][lowerUpper];\n vec3.transformMat4(origin, origin, indexToWorld);\n\n // The lower bound normal is the associated column in the\n // image orientation matrix. The upper bound normal is the\n // lower bound normal, but negated.\n const neg = -(lowerUpper * 2 - 1);\n const normal = [\n ...orientation.slice(axisIndex * 3, axisIndex * 3 + 3).map((c) => c * neg),\n ] as Vector3;\n\n return vtkPlane.newInstance({ origin, normal });\n}\n\nexport const useCropStore = defineStore('crop', () => {\n const imageStore = useImageStore();\n\n const state = reactive({\n croppingByImageID: {} as Record<string, LPSCroppingPlanes>,\n });\n\n const getComputedVTKPlanes = (imageID: MaybeRef<string | null>) =>\n computed(() => {\n const id = unref(imageID);\n if (id && id in state.croppingByImageID && id in imageStore.metadata) {\n const cropBounds = state.croppingByImageID[id];\n const metadata = imageStore.metadata[id];\n return [\n convertCropBoundsToVTKPlane(cropBounds, metadata, 'Sagittal', 0),\n convertCropBoundsToVTKPlane(cropBounds, metadata, 'Sagittal', 1),\n convertCropBoundsToVTKPlane(cropBounds, metadata, 'Coronal', 0),\n convertCropBoundsToVTKPlane(cropBounds, metadata, 'Coronal', 1),\n convertCropBoundsToVTKPlane(cropBounds, metadata, 'Axial', 0),\n convertCropBoundsToVTKPlane(cropBounds, metadata, 'Axial', 1),\n ];\n }\n return null;\n });\n\n const clampCroppingPlanes = (\n imageID: string,\n planes: LPSCroppingPlanes\n ): LPSCroppingPlanes => {\n const lpsBounds = getImageSpatialExtent(imageID);\n // if perf becomes an issue, change this to modify the planes arg\n return {\n Sagittal: clampRangeToBounds(planes.Sagittal, lpsBounds.Sagittal),\n Coronal: clampRangeToBounds(planes.Coronal, lpsBounds.Coronal),\n Axial: clampRangeToBounds(planes.Axial, lpsBounds.Axial),\n };\n };\n\n const setCropping = (imageID: string, planes: LPSCroppingPlanes) => {\n set(state.croppingByImageID, imageID, clampCroppingPlanes(imageID, planes));\n };\n\n const setCroppingForAxis = (\n imageID: string,\n axis: LPSAxis,\n planes: Vector2\n ) => {\n if (imageID in state.croppingByImageID) {\n setCropping(imageID, {\n ...state.croppingByImageID[imageID],\n [axis]: planes,\n });\n }\n };\n\n const resetCropping = (imageID: string) => {\n const image = imageStore.dataIndex[imageID];\n if (!image) return;\n\n const { lpsOrientation } = imageStore.metadata[imageID];\n const extent = image.getSpatialExtent();\n setCropping(imageID, {\n Sagittal: getAxisBounds(extent, 'Sagittal', lpsOrientation),\n Coronal: getAxisBounds(extent, 'Coronal', lpsOrientation),\n Axial: getAxisBounds(extent, 'Axial', lpsOrientation),\n });\n };\n\n function serialize(stateFile: StateFile) {\n const { tools } = stateFile.manifest;\n tools.crop = state.croppingByImageID;\n }\n\n function deserialize(manifest: Manifest, dataIDMap: Record<string, string>) {\n const cropping = manifest.tools.crop;\n\n Object.entries(cropping).forEach(([imageID, planes]) => {\n const newImageID = dataIDMap[imageID];\n setCropping(newImageID, planes);\n });\n }\n\n return {\n croppingByImageID: readonly(state.croppingByImageID),\n getComputedVTKPlanes,\n setCropping,\n setCroppingForAxis,\n resetCropping,\n serialize,\n deserialize,\n };\n});\n","import { Bounds, Vector3 } from '@kitware/vtk.js/types';\nimport vtkStateBuilder from '@kitware/vtk.js/Widgets/Core/StateBuilder';\nimport vtkWidgetState from '@kitware/vtk.js/Widgets/Core/WidgetState';\nimport { mat4 } from 'gl-matrix';\n\nexport interface CrosshairsHandleWidgetState extends vtkWidgetState {\n setOrigin(origin: Vector3 | null): boolean;\n getOrigin(): Vector3 | null;\n setScale1(scale: number): boolean;\n getScale1(): number;\n setVisible(visible: boolean): boolean;\n getVisible(): boolean;\n setBounds(bounds: Bounds): boolean;\n getBounds(): Bounds;\n}\n\nexport interface CrosshairsWidgetState extends vtkWidgetState {\n setPlaced(placed: boolean): boolean;\n getPlaced(): boolean;\n setIndexToWorld(indexToWorld: mat4): boolean;\n getIndexToWorld(): mat4;\n setWorldToIndex(worldToIndex: mat4): boolean;\n getWorldToIndex(): mat4;\n getHandle(): CrosshairsHandleWidgetState;\n}\n\nexport default function generateState() {\n return vtkStateBuilder\n .createBuilder()\n .addField({\n name: 'placed',\n initialValue: false,\n })\n .addField({\n name: 'indexToWorld',\n initialValue: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n })\n .addField({\n name: 'worldToIndex',\n initialValue: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n })\n .addStateFromMixin({\n labels: ['handle'],\n mixins: ['origin', 'bounds'],\n name: 'handle',\n initialValues: {\n origin: null,\n },\n })\n .build();\n}\n","import macro from '@kitware/vtk.js/macro';\nimport { Bounds } from '@kitware/vtk.js/types';\nimport { vec3 } from 'gl-matrix';\n\nfunction clampPointToBounds(bounds: Bounds, point: vec3) {\n return point.map((p, i) =>\n Math.max(bounds[i * 2], Math.min(bounds[i * 2 + 1], p))\n ) as vec3;\n}\n\nexport default function widgetBehavior(publicAPI: any, model: any) {\n model.classHierarchy.push('vtkCrosshairsWidgetProp');\n let isDragging = false;\n\n // support setting per-view widget manipulators\n macro.setGet(publicAPI, model, ['manipulator']);\n\n // --------------------------------------------------------------------------\n // Interactor events\n // --------------------------------------------------------------------------\n\n function ignoreKey(e: any) {\n return e.altKey || e.controlKey || e.shiftKey;\n }\n\n // --------------------------------------------------------------------------\n // Left press: Select handle to drag\n // --------------------------------------------------------------------------\n\n publicAPI.handleLeftButtonPress = (e: any) => {\n if (!model.pickable || ignoreKey(e)) {\n return macro.VOID;\n }\n\n model.widgetState.setPlaced(true);\n isDragging = true;\n model._interactor.requestAnimation(publicAPI);\n model._apiSpecificRenderWindow.setCursor('crosshairs');\n publicAPI.invokeStartInteractionEvent();\n publicAPI.handleMouseMove(e);\n return macro.EVENT_ABORT;\n };\n\n // --------------------------------------------------------------------------\n // Mouse move: Drag selected handle / Handle follow the mouse\n // --------------------------------------------------------------------------\n\n publicAPI.handleMouseMove = (callData: any) => {\n // technically need to call requestAnimation during\n // the initial phase of placing the crosshairs,\n // but that's not needed since no VTK object\n // is actually being rendered.\n\n if (\n (!model.widgetState.getPlaced() || isDragging) &&\n model.pickable &&\n model.manipulator &&\n !ignoreKey(callData)\n ) {\n const worldCoordsOfPointer = model.manipulator.handleEvent(\n callData,\n model._apiSpecificRenderWindow\n );\n\n const handle = model.widgetState.getHandle();\n const worldToIndex = model.widgetState.getWorldToIndex();\n const indexToWorld = model.widgetState.getIndexToWorld();\n if (worldToIndex.length && indexToWorld.length) {\n const indexCoordsOfPointer = vec3.create();\n const worldOrigin = vec3.create();\n const bounds = handle.getBounds();\n\n vec3.transformMat4(\n indexCoordsOfPointer,\n worldCoordsOfPointer,\n worldToIndex\n );\n const indexOrigin = clampPointToBounds(bounds, indexCoordsOfPointer);\n vec3.transformMat4(worldOrigin, indexOrigin, indexToWorld);\n\n handle.setOrigin(worldOrigin);\n publicAPI.invokeInteractionEvent();\n return macro.EVENT_ABORT;\n }\n }\n\n return macro.VOID;\n };\n\n // --------------------------------------------------------------------------\n // Left release: Finish drag / Create new handle\n // --------------------------------------------------------------------------\n\n publicAPI.handleLeftButtonRelease = () => {\n if (isDragging && model.pickable) {\n model._interactor.cancelAnimation(publicAPI);\n model._apiSpecificRenderWindow.setCursor('default');\n publicAPI.invokeEndInteractionEvent();\n }\n isDragging = false;\n };\n\n // --------------------------------------------------------------------------\n // Focus API - modeHandle follow mouse when widget has focus\n // --------------------------------------------------------------------------\n\n publicAPI.grabFocus = () => {};\n\n // --------------------------------------------------------------------------\n\n publicAPI.loseFocus = () => {};\n}\n","import macro from '@kitware/vtk.js/macro';\nimport vtkAbstractWidgetFactory from '@kitware/vtk.js/Widgets/Core/AbstractWidgetFactory';\nimport vtkPlanePointManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\n\nimport { ViewTypes } from '@kitware/vtk.js/Widgets/Core/WidgetManager/Constants';\n\nimport stateGenerator from './state';\nimport widgetBehavior from './behavior';\n\n// ----------------------------------------------------------------------------\n// Factory\n// ----------------------------------------------------------------------------\n\nfunction vtkCrosshairsWidget(publicAPI, model) {\n model.classHierarchy.push('vtkCrosshairsWidget');\n\n // --- Widget Requirement ---------------------------------------------------\n\n model.behavior = widgetBehavior;\n model.widgetState = stateGenerator();\n\n publicAPI.getRepresentationsForViewType = (viewType) => {\n switch (viewType) {\n case ViewTypes.DEFAULT:\n case ViewTypes.GEOMETRY:\n case ViewTypes.SLICE:\n case ViewTypes.VOLUME:\n default:\n return [];\n }\n };\n\n // --------------------------------------------------------------------------\n // initialization\n // --------------------------------------------------------------------------\n\n model.widgetState.onBoundsChange((bounds) => {\n const center = [\n (bounds[0] + bounds[1]) * 0.5,\n (bounds[2] + bounds[3]) * 0.5,\n (bounds[4] + bounds[5]) * 0.5,\n ];\n model.widgetState.getHandle().setOrigin(center);\n });\n\n // Default manipulator\n model.manipulator = vtkPlanePointManipulator.newInstance();\n}\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n // manipulator: null,\n};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkAbstractWidgetFactory.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['manipulator']);\n\n vtkCrosshairsWidget(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkCrosshairsWidget');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import { computed, del, reactive, set, unref } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\n\nexport function useDoubleRecord<V>() {\n type Map1 = Record<string, Record<string, V>>;\n type Map2 = Record<string, string>;\n const reactiveRoot = reactive<{ map: Map1 }>({\n map: {},\n });\n\n const _set = (k1: string, k2: string, v: V) => {\n if (!(k1 in reactiveRoot.map)) {\n set(reactiveRoot.map, k1, reactive<Map2>({}));\n }\n set(reactiveRoot.map[k1], k2, v);\n };\n\n const get = (k1: string, k2: string) => {\n return reactiveRoot.map[k1]?.[k2] ?? undefined;\n };\n\n const getComputed = (\n k1: MaybeRef<string | null | undefined>,\n k2: MaybeRef<string | null | undefined>\n ) => {\n return computed(() => {\n const k1v = unref(k1);\n const k2v = unref(k2);\n const { map } = reactiveRoot;\n if (!k1v || !k2v) return undefined;\n return map[k1v]?.[k2v];\n });\n };\n\n const has = (k1: string, k2: string) => {\n const { map } = reactiveRoot;\n return k1 in map && k2 in map[k1];\n };\n\n const hasComputed = (\n k1: MaybeRef<string | null | undefined>,\n k2: MaybeRef<string | null | undefined>\n ) => {\n return computed(() => {\n const k1v = unref(k1);\n const k2v = unref(k2);\n const { map } = reactiveRoot;\n if (!k1v || !k2v) return undefined;\n return k1v in map && k2v in map[k1v];\n });\n };\n\n const _delete = (k1: string, k2: string) => {\n if (k1 in reactiveRoot.map) {\n del(reactiveRoot.map[k1], k2);\n }\n };\n\n const deleteFirstKey = (k1: string) => {\n del(reactiveRoot.map, k1);\n };\n\n const deleteSecondKey = (k2: string) => {\n Object.keys(reactiveRoot.map).forEach((k1) => _delete(k1, k2));\n };\n\n return {\n set: _set,\n get,\n getComputed,\n has,\n hasComputed,\n delete: _delete,\n deleteFirstKey,\n deleteSecondKey,\n };\n}\n","import { useDoubleRecord } from '@/src/composables/useDoubleRecord';\nimport { StateFile, ViewConfig } from '../../io/state-file/schema';\nimport {\n CameraConfig,\n SliceConfig,\n VolumeColorConfig,\n WindowLevelConfig,\n} from './types';\nimport { ensureDefault } from '../../utils';\n\nclass ReturnTypeOfDoubleRecord<T> {\n Return = useDoubleRecord<T>();\n}\ntype ConfigMap = ReturnTypeOfDoubleRecord<any>['Return'];\n\nexport const removeViewFromConfig = (config: ConfigMap) => (viewID: string) =>\n config.deleteFirstKey(viewID);\n\nexport const removeDataFromConfig =\n (config: ConfigMap) => (dataID: string, viewID?: string) => {\n if (viewID) {\n config.delete(viewID, dataID);\n } else {\n config.deleteSecondKey(dataID);\n }\n };\n\ntype SubViewConfig =\n | CameraConfig\n | SliceConfig\n | VolumeColorConfig\n | WindowLevelConfig;\n\ntype ViewConfigGetter = (\n viewID: string,\n dataID: string\n) => SubViewConfig | undefined;\n\ntype ViewConfigStateKey = keyof ViewConfig;\n\nexport const serializeViewConfig = <K extends ViewConfigStateKey>(\n stateFile: StateFile,\n configGetter: ViewConfigGetter,\n viewConfigStateKey: K\n) => {\n const dataIDs = stateFile.manifest.dataSets.map((dataSet) => dataSet.id);\n const { views } = stateFile.manifest;\n\n views.forEach((view) => {\n dataIDs.forEach((dataID) => {\n const { config } = view;\n\n const viewConfig = configGetter(view.id, dataID);\n if (viewConfig !== undefined) {\n const configForData = ensureDefault(dataID, config, {} as ViewConfig);\n\n configForData[viewConfigStateKey] = viewConfig as ViewConfig[K];\n }\n });\n });\n};\n","import { MaybeRef } from '@vueuse/core';\nimport { useDoubleRecord } from '@/src/composables/useDoubleRecord';\nimport { clampValue } from '@/src/utils';\nimport {\n removeDataFromConfig,\n removeViewFromConfig,\n serializeViewConfig,\n} from './common';\nimport { StateFile, ViewConfig } from '../../io/state-file/schema';\nimport { SliceConfig } from './types';\n\nexport const defaultSliceConfig = (): SliceConfig => ({\n slice: 0,\n min: 0,\n max: 1,\n axisDirection: 'Inferior',\n});\n\nexport const setupSlicingConfig = () => {\n // (viewID, dataID) -> SliceConfig\n const sliceConfigs = useDoubleRecord<SliceConfig>();\n\n const getSliceConfig = (viewID: string, dataID: string) =>\n sliceConfigs.get(viewID, dataID);\n\n const getComputedSliceConfig = (\n viewID: MaybeRef<string | null>,\n dataID: MaybeRef<string | null>\n ) => sliceConfigs.getComputed(viewID, dataID);\n\n const updateSliceConfig = (\n viewID: string,\n dataID: string,\n update: Partial<SliceConfig>\n ) => {\n const config = {\n ...defaultSliceConfig(),\n ...sliceConfigs.get(viewID, dataID),\n ...update,\n };\n\n if ('min' in update || 'max' in update) {\n config.slice = Math.floor((config.min + config.max) / 2);\n }\n config.slice = clampValue(config.slice, config.min, config.max);\n\n sliceConfigs.set(viewID, dataID, config);\n };\n\n const resetSlice = (viewID: string, dataID: string) => {\n if (sliceConfigs.has(viewID, dataID)) {\n const config = sliceConfigs.get(viewID, dataID)!;\n // Make this consistent with ImageMapper + SliceRepresentationProxy\n // behavior. Setting this to floor() will affect images where the\n // middle slice is fractional.\n updateSliceConfig(viewID, dataID, {\n slice: Math.ceil((config.min + config.max) / 2),\n });\n }\n };\n\n const serialize = (stateFile: StateFile) => {\n serializeViewConfig(stateFile, getSliceConfig, 'slice');\n };\n\n const deserialize = (viewID: string, config: Record<string, ViewConfig>) => {\n Object.entries(config).forEach(([dataID, viewConfig]) => {\n if (viewConfig.slice) {\n sliceConfigs.set(viewID, dataID, viewConfig.slice);\n }\n });\n };\n\n return {\n removeView: removeViewFromConfig(sliceConfigs),\n removeData: removeDataFromConfig(sliceConfigs),\n serialize,\n deserialize,\n actions: {\n getSliceConfig,\n getComputedSliceConfig,\n updateSliceConfig,\n resetSlice,\n },\n };\n};\n","import { useDoubleRecord } from '@/src/composables/useDoubleRecord';\nimport {\n removeDataFromConfig,\n removeViewFromConfig,\n serializeViewConfig,\n} from './common';\nimport { StateFile, ViewConfig } from '../../io/state-file/schema';\nimport { WindowLevelConfig } from './types';\n\nexport const defaultWindowLevelConfig = (): WindowLevelConfig => ({\n width: 1,\n level: 0.5,\n min: 0,\n max: 1,\n});\n\nexport const setupWindowingConfig = () => {\n // (viewID, dataID) -> WindowLevelConfig\n const windowLevelConfigs = useDoubleRecord<WindowLevelConfig>();\n\n const getWindowingConfig = (viewID: string, dataID: string) =>\n windowLevelConfigs.get(viewID, dataID);\n\n const updateWindowingConfig = (\n viewID: string,\n dataID: string,\n update: Partial<WindowLevelConfig>\n ) => {\n const config = {\n ...defaultWindowLevelConfig(),\n ...windowLevelConfigs.get(viewID, dataID),\n ...update,\n };\n windowLevelConfigs.set(viewID, dataID, config);\n };\n\n const resetWindowLevel = (viewID: string, dataID: string) => {\n if (windowLevelConfigs.has(viewID, dataID)) {\n const config = windowLevelConfigs.get(viewID, dataID)!;\n const width = config.max - config.min;\n const level = (config.max + config.min) / 2;\n updateWindowingConfig(viewID, dataID, { width, level });\n }\n };\n\n const serialize = (stateFile: StateFile) => {\n serializeViewConfig(stateFile, getWindowingConfig, 'window');\n };\n\n const deserialize = (viewID: string, config: Record<string, ViewConfig>) => {\n Object.entries(config).forEach(([dataID, viewConfig]) => {\n if (viewConfig.window) {\n windowLevelConfigs.set(viewID, dataID, viewConfig.window);\n }\n });\n };\n\n return {\n removeView: removeViewFromConfig(windowLevelConfigs),\n removeData: removeDataFromConfig(windowLevelConfigs),\n serialize,\n deserialize,\n actions: {\n getWindowingConfig,\n updateWindowingConfig,\n resetWindowLevel,\n },\n };\n};\n","import { useDoubleRecord } from '@/src/composables/useDoubleRecord';\nimport {\n removeDataFromConfig,\n removeViewFromConfig,\n serializeViewConfig,\n} from './common';\nimport { StateFile, ViewConfig } from '../../io/state-file/schema';\nimport { CameraConfig } from './types';\n\nexport const setupCameraConfig = () => {\n // (viewID, dataID) -> CameraConfig\n const cameraConfigs = useDoubleRecord<CameraConfig>();\n\n const getCameraConfig = (viewID: string, dataID: string) =>\n cameraConfigs.get(viewID, dataID);\n\n const updateCameraConfig = (\n viewID: string,\n dataID: string,\n update: Partial<CameraConfig>\n ) => {\n const config = {\n ...cameraConfigs.get(viewID, dataID),\n ...update,\n };\n cameraConfigs.set(viewID, dataID, config);\n };\n\n const serialize = (stateFile: StateFile) => {\n serializeViewConfig(stateFile, getCameraConfig, 'camera');\n };\n\n const deserialize = (viewID: string, config: Record<string, ViewConfig>) => {\n Object.entries(config).forEach(([dataID, viewConfig]) => {\n if (viewConfig.camera) {\n cameraConfigs.set(viewID, dataID, viewConfig.camera);\n }\n });\n };\n\n return {\n removeView: removeViewFromConfig(cameraConfigs),\n removeData: removeDataFromConfig(cameraConfigs),\n serialize,\n deserialize,\n actions: {\n getCameraConfig,\n updateCameraConfig,\n },\n };\n};\n","import vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\nimport vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';\nimport vtkOpenGLRenderWindow from '@kitware/vtk.js/Rendering/OpenGL/RenderWindow';\nimport { Vector2, Vector3 } from '@kitware/vtk.js/types';\nimport { intersectDisplayWithPlane } from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport { OpacityFunction } from '../types/views';\n\nexport function computeWorldToDisplay(\n xyz: Vector3,\n renderer: vtkRenderer\n): Vector2 | null {\n const view = renderer.getRenderWindow()?.getViews()?.[0];\n if (view) {\n const [x, y, z] = xyz;\n return view.worldToDisplay(x, y, z, renderer);\n }\n return null;\n}\n\nexport function computeDisplayToWorld(\n xy: Vector2,\n renderer: vtkRenderer\n): Vector3 | null {\n const view = renderer.getRenderWindow()?.getViews()?.[0];\n if (view) {\n const [x, y] = xy;\n return view.displayToWorld(x, y, 0, renderer);\n }\n return null;\n}\n\nexport function normalizeMouseEventPosition(\n ev: MouseEvent,\n view: vtkOpenGLRenderWindow\n) {\n // TODO fix typing in vtk.js\n const canvas = (view as any).getCanvas() as HTMLCanvasElement | null;\n if (!canvas) return null;\n\n const bounds = canvas.getBoundingClientRect();\n const scaleX = canvas.width / bounds.width;\n const scaleY = canvas.height / bounds.height;\n return [\n scaleX * (ev.clientX - bounds.left),\n scaleY * (bounds.height - ev.clientY + bounds.top),\n ] as Vector2;\n}\n\nexport function intersectMouseEventWithPlane(\n ev: MouseEvent,\n renderer: vtkRenderer,\n origin: Vector3,\n normal: Vector3\n) {\n const view = renderer\n .getRenderWindow()\n ?.getViews()[0] as vtkOpenGLRenderWindow;\n if (!view) return null;\n\n const position = normalizeMouseEventPosition(ev, view);\n if (!position) return null;\n\n return intersectDisplayWithPlane(\n position[0],\n position[1],\n origin,\n normal,\n renderer,\n view\n );\n}\n\n/**\n * Converts world coordinates to SVG-friendly coordinates.\n *\n * Assumes that the SVG layer is the same size as the renderer.\n * TODO verify this is the case.\n */\nexport function worldToSVG(xyz: Vector3, renderer: vtkRenderer) {\n const coords = computeWorldToDisplay(xyz, renderer);\n const view = renderer.getRenderWindow()?.getViews()?.[0];\n if (coords && view) {\n const [, height] = view.getViewportSize(renderer);\n // convert from canvas space to svg space\n return [\n coords[0] / devicePixelRatio,\n (height - coords[1]) / devicePixelRatio,\n ] as Vector2;\n }\n return null;\n}\n\n/**\n * Gets the CSS coordinates for a vtk.js mouse event.\n */\nexport function getCSSCoordinatesFromEvent(eventData: any) {\n const { pokedRenderer }: { pokedRenderer: vtkRenderer } = eventData;\n const view = pokedRenderer?.getRenderWindow()?.getViews()?.[0] as\n | vtkOpenGLRenderWindow\n | undefined;\n const bbox = view?.getContainer()?.getBoundingClientRect();\n\n if (!('position' in eventData) || !bbox) {\n return null;\n }\n\n return [\n bbox.left + eventData.position.x / devicePixelRatio,\n bbox.top + bbox.height - eventData.position.y / devicePixelRatio,\n ] as Vector2;\n}\n\n/**\n * Shifts the opacity points from a preset.\n */\nexport function getShiftedOpacityFromPreset(\n presetName: string,\n effectiveRange: [number, number],\n shift: number\n) {\n const preset = vtkColorMaps.getPresetByName(presetName);\n if (preset.OpacityPoints) {\n const OpacityPoints = preset.OpacityPoints as number[];\n const points = [];\n for (let i = 0; i < OpacityPoints.length; i += 2) {\n points.push([OpacityPoints[i], OpacityPoints[i + 1]]);\n }\n\n const [xmin, xmax] = effectiveRange;\n const width = xmax - xmin;\n return points.map(([x, y]) => [(x - xmin) / width + shift, y]);\n }\n return null;\n}\n\n/**\n * Retrieves an OpacityFunction from a preset.\n */\nexport function getOpacityFunctionFromPreset(\n presetName: string\n): Partial<OpacityFunction> {\n const preset = vtkColorMaps.getPresetByName(presetName);\n\n if (preset.OpacityPoints) {\n return {\n mode: vtkPiecewiseFunctionProxy.Mode.Points,\n preset: presetName,\n shift: 0,\n };\n }\n return {\n mode: vtkPiecewiseFunctionProxy.Mode.Gaussians,\n // deep-copy necessary\n gaussians: JSON.parse(\n JSON.stringify(vtkPiecewiseFunctionProxy.Defaults.Gaussians)\n ),\n };\n}\n\n/**\n * Inflate an axis bounds defined as [min, max] by some delta.\n *\n * @param bounds Must be [number, number]. (Typed number[] for convenience.)\n * @param delta\n * @returns\n */\nexport function inflateAxisBounds(bounds: number[], delta: number) {\n return [bounds[0] + delta, bounds[1] + delta];\n}\n\n/**\n * Retrieves the color function range, if any.\n *\n * Will only return the color function range if the preset\n * has AbsoluteRange specified as true. For medical presets,\n * the range is defined by the transfer function point range,\n * rather than the dataset data range.\n * @param presetName\n * @returns\n */\nexport function getColorFunctionRangeFromPreset(\n presetName: string\n): [number, number] | null {\n const preset = vtkColorMaps.getPresetByName(presetName);\n if (!preset) return null;\n\n const { AbsoluteRange, RGBPoints } = preset;\n if (AbsoluteRange && RGBPoints) {\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < RGBPoints.length; i += 4) {\n min = Math.min(min, RGBPoints[i]);\n max = Math.max(max, RGBPoints[i]);\n }\n return [min, max];\n }\n return null;\n}\n\n/**\n * Retrieves the effective opacity mapping range, if any.\n *\n * Presets may specify an effective range for the scalar opacity\n * mapping range.\n * @param presetName\n * @returns\n */\nexport function getOpacityRangeFromPreset(presetName: string) {\n const preset = vtkColorMaps.getPresetByName(presetName);\n if (preset.EffectiveRange) {\n return [...preset.EffectiveRange] as [number, number];\n }\n return null;\n}\n","import MRICardiacThumbnail from '@/src/assets/samples/MRI-Cardiac.jpg';\nimport MRIPROSTATExThumbnail from '@/src/assets/samples/MRI-PROSTATEx.jpg';\nimport MRAHeadThumbnail from '@/src/assets/samples/MRA-Head_and_Neck.jpg';\nimport CTAHeadThumbnail from '@/src/assets/samples/CTA-Head_and_Neck.jpg';\nimport USFetusThumbnail from '@/src/assets/samples/3DUS-Fetus.jpg';\nimport { Layout, LayoutDirection } from './types/layout';\nimport { ViewSpec } from './types/views';\nimport { SampleDataset } from './types';\n\n/**\n * These are the initial view IDs.\n */\nexport const InitViewIDs: Record<string, string> = {\n Coronal: 'Coronal',\n Sagittal: 'Sagittal',\n Axial: 'Axial',\n Three: '3D',\n};\n\n/**\n * View spec for the initial view IDs.\n */\nexport const InitViewSpecs: Record<string, ViewSpec> = {\n [InitViewIDs.Coronal]: {\n viewType: '2D',\n props: {\n viewDirection: 'Right',\n viewUp: 'Superior',\n },\n },\n [InitViewIDs.Sagittal]: {\n viewType: '2D',\n props: {\n viewDirection: 'Posterior',\n viewUp: 'Superior',\n },\n },\n [InitViewIDs.Axial]: {\n viewType: '2D',\n props: {\n viewDirection: 'Superior',\n viewUp: 'Anterior',\n },\n },\n [InitViewIDs.Three]: {\n viewType: '3D',\n props: {\n viewDirection: 'Posterior',\n viewUp: 'Superior',\n },\n },\n};\n\n/**\n * The default view spec.\n */\nexport const DefaultViewSpec = InitViewSpecs[InitViewIDs.Axial];\n\n/**\n * Defines the default layouts.\n */\nexport const Layouts: Record<string, Layout> = [\n {\n name: 'Axial Primary',\n direction: LayoutDirection.V,\n items: [\n InitViewIDs.Axial,\n {\n direction: LayoutDirection.H,\n items: [InitViewIDs.Three, InitViewIDs.Coronal, InitViewIDs.Sagittal],\n },\n ],\n },\n {\n name: '3D Primary',\n direction: LayoutDirection.V,\n items: [\n InitViewIDs.Three,\n {\n direction: LayoutDirection.H,\n items: [InitViewIDs.Coronal, InitViewIDs.Sagittal, InitViewIDs.Axial],\n },\n ],\n },\n {\n name: 'Quad View',\n direction: LayoutDirection.H,\n items: [\n {\n direction: LayoutDirection.V,\n items: [InitViewIDs.Coronal, InitViewIDs.Three],\n },\n {\n direction: LayoutDirection.V,\n items: [InitViewIDs.Sagittal, InitViewIDs.Axial],\n },\n ],\n },\n {\n name: '3D Only',\n direction: LayoutDirection.H,\n items: [InitViewIDs.Three],\n },\n].reduce((layouts, layout) => {\n return { ...layouts, [layout.name]: layout };\n}, {});\n\nexport const LABELMAP_PALETTE = {\n 0: [0, 0, 0, 0], // eraser\n 1: [153, 153, 0, 255],\n 2: [76, 76, 0, 255],\n 3: [255, 255, 0, 255],\n 4: [0, 76, 0, 255],\n 5: [0, 153, 0, 255],\n 6: [0, 255, 0, 255],\n 7: [76, 0, 0, 255],\n 8: [153, 0, 0, 255],\n 9: [255, 0, 0, 255],\n 10: [0, 76, 76, 255],\n 11: [0, 153, 153, 255],\n 12: [0, 255, 255, 255],\n 13: [0, 0, 76, 255],\n 14: [0, 0, 153, 255],\n} as Record<number, number[]>;\n\nexport const SAMPLE_DATA: SampleDataset[] = [\n {\n name: 'CTA Head and Neck',\n filename: 'CTA-Head_and_Neck.zip',\n description:\n 'CTA head and neck scan of elderly patient with tumor. (80 MB)',\n url: 'https://data.kitware.com/api/v1/item/6347159711dab81428208e24/download',\n image: CTAHeadThumbnail,\n },\n {\n name: 'MRA Head and Neck',\n filename: 'MRA-Head_and_Neck.zip',\n description:\n 'MRA from Patient Contributed Image Repository. Click application help icon \"(?)\" for more info. (15 MB)',\n url: 'https://data.kitware.com/api/v1/item/6352a2b311dab8142820a33b/download',\n image: MRAHeadThumbnail,\n },\n {\n name: 'MRI Cardiac 3D and Cine',\n filename: 'MRI-Cardiac-3D_and_Cine.zip',\n description:\n 'MRI scan with two series: 3D axial non-gated and 2 chamber cine. (4 MB)',\n url: 'https://data.kitware.com/api/v1/item/6350b28f11dab8142820949d/download',\n image: MRICardiacThumbnail,\n },\n {\n name: 'MRI PROSTATEx',\n filename: 'MRI-PROSTATEx-0004.zip',\n description:\n 'MRI from the SPIE-AAPM-NCI PROSTATEx challenge. Click application help \"(?)\" icon for more info. (3 MB)',\n url: 'https://data.kitware.com/api/v1/item/63527c7311dab8142820a338/download',\n image: MRIPROSTATExThumbnail,\n },\n {\n name: '3D US Fetus',\n filename: '3DUS-Fetus.mha',\n description:\n '3D ultrasound of a baby. Downloaded from tomovision.com.(8 MB)',\n url: 'https://data.kitware.com/api/v1/item/635679c311dab8142820a4f4/download',\n image: USFetusThumbnail,\n },\n];\n\nexport const TOOL_COLORS = [\n '#8de4d3',\n '#f0a4b1',\n '#58f24c',\n '#a3c9fe',\n '#c8f251',\n '#fea53b',\n];\n\nexport const DEFAULT_PRESET_BY_MODALITY: Record<string, string> = {\n CT: 'CT-AAA',\n MR: 'CT-Coronary-Arteries-2',\n US: 'US-Fetal',\n};\n","import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport MedicalPresets from '@/src/vtk/MedicalColorPresets.json';\n\nfunction registerPresets(presets: typeof MedicalPresets) {\n for (let i = 0; i < presets.length; i += 1) {\n vtkColorMaps.addPreset(presets[i]);\n }\n}\n\nregisterPresets(MedicalPresets);\n\n/* prettier-ignore */\nconst GroupedPresets = [\n {\n group: 'Other',\n presets: [\n 'Cool to Warm',\n ],\n },\n {\n group: 'CT',\n presets: [\n 'CT-AAA',\n 'CT-AAA2',\n 'CT-Bone',\n 'CT-Bones',\n 'CT-Cardiac',\n 'CT-Cardiac2',\n 'CT-Cardiac3',\n 'CT-Chest-Contrast-Enhanced',\n 'CT-Chest-Vessels',\n 'CT-Coronary-Arteries',\n 'CT-Coronary-Arteries-2',\n 'CT-Coronary-Arteries-3',\n 'CT-Cropped-Volume-Bone',\n 'CT-Fat',\n 'CT-Liver-Vasculature',\n 'CT-Lung',\n 'CT-MIP',\n 'CT-Muscle',\n 'CT-Pulmonary-Arteries',\n 'CT-Soft-Tissue',\n 'CT-Air',\n 'CT-X-ray',\n ],\n },\n {\n group: 'MR',\n presets: [\n 'MR-Default',\n 'MR-Angio',\n 'MR-MIP',\n 'MR-T2-Brain',\n ],\n },\n {\n group: 'DTI',\n presets: [\n 'DTI-FA-Brain',\n ],\n },\n {\n group: 'US',\n presets: [\n 'US-Fetal',\n ],\n },\n];\n\nexport const DEFAULT_PRESET = 'Cool to Warm';\nexport const PresetNameList = GroupedPresets.flatMap((group) => group.presets);\nexport default GroupedPresets;\n","import { MaybeRef } from '@vueuse/core';\nimport { useDoubleRecord } from '@/src/composables/useDoubleRecord';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\nimport {\n getColorFunctionRangeFromPreset,\n getOpacityFunctionFromPreset,\n getOpacityRangeFromPreset,\n} from '@/src/utils/vtk-helpers';\nimport { DEFAULT_PRESET_BY_MODALITY } from '@/src/config';\nimport { ColorTransferFunction } from '@/src/types/views';\nimport {\n removeDataFromConfig,\n removeViewFromConfig,\n serializeViewConfig,\n} from './common';\nimport { DEFAULT_PRESET } from '../../vtk/ColorMaps';\nimport { StateFile, ViewConfig } from '../../io/state-file/schema';\nimport { VolumeColorConfig } from './types';\nimport { useDICOMStore } from '../datasets-dicom';\nimport { useImageStore } from '../datasets-images';\n\nexport const DEFAULT_AMBIENT = 0.2;\nexport const DEFAULT_DIFFUSE = 0.7;\nexport const DEFAULT_SPECULAR = 0.3;\n\nfunction getPresetFromImageModality(imageID: string) {\n const dicomStore = useDICOMStore();\n if (imageID in dicomStore.imageIDToVolumeKey) {\n const volKey = dicomStore.imageIDToVolumeKey[imageID];\n const { Modality } = dicomStore.volumeInfo[volKey];\n if (Modality in DEFAULT_PRESET_BY_MODALITY) {\n return DEFAULT_PRESET_BY_MODALITY[Modality];\n }\n }\n return DEFAULT_PRESET;\n}\n\nexport const defaultVolumeColorConfig = (): VolumeColorConfig => ({\n colorBy: {\n arrayName: '',\n location: 'pointData',\n },\n transferFunction: {\n preset: '',\n mappingRange: [0, 1],\n },\n opacityFunction: {\n mode: vtkPiecewiseFunctionProxy.Mode.Gaussians,\n gaussians: [],\n mappingRange: [0, 1],\n },\n cvr: {\n enabled: true,\n lightFollowsCamera: true,\n useVolumetricScatteringBlending: false,\n volumetricScatteringBlending: 0.5,\n useLocalAmbientOcclusion: true,\n laoKernelRadius: 6,\n laoKernelSize: 3,\n ambient: DEFAULT_AMBIENT,\n diffuse: DEFAULT_DIFFUSE,\n specular: DEFAULT_SPECULAR,\n },\n});\n\nexport const setupVolumeColorConfig = () => {\n // (viewID, dataID) -> VolumeColorConfig\n const volumeColorConfigs = useDoubleRecord<VolumeColorConfig>();\n\n const getVolumeColorConfig = (viewID: string, dataID: string) =>\n volumeColorConfigs.get(viewID, dataID);\n\n const getComputedVolumeColorConfig = (\n viewID: MaybeRef<string | null>,\n dataID: MaybeRef<string | null>\n ) => volumeColorConfigs.getComputed(viewID, dataID);\n\n const updateVolumeColorConfig = (\n viewID: string,\n dataID: string,\n update: Partial<VolumeColorConfig>\n ) => {\n const config = {\n ...defaultVolumeColorConfig(),\n ...volumeColorConfigs.get(viewID, dataID),\n ...update,\n };\n volumeColorConfigs.set(viewID, dataID, config);\n };\n\n const createUpdateFunc = <K extends keyof VolumeColorConfig>(\n key: K,\n validator: (config: VolumeColorConfig[K]) => VolumeColorConfig[K] = (i) => i\n ) => {\n return (\n viewID: string,\n dataID: string,\n update: Partial<VolumeColorConfig[K]>\n ) => {\n const config =\n volumeColorConfigs.get(viewID, dataID) ?? defaultVolumeColorConfig();\n const updatedConfig = validator({\n ...config[key],\n ...update,\n });\n updateVolumeColorConfig(viewID, dataID, { [key]: updatedConfig });\n };\n };\n\n const updateVolumeColorBy = createUpdateFunc('colorBy');\n const updateVolumeColorTransferFunction =\n createUpdateFunc('transferFunction');\n const updateVolumeOpacityFunction = createUpdateFunc('opacityFunction');\n const updateVolumeCVRParameters = createUpdateFunc('cvr', (cvrConfig) => {\n return {\n ...cvrConfig,\n // 2X kernel size minimizes flickering lighting\n // Limit kernel radius to [2*size, 2*size+10]\n laoKernelRadius: Math.max(\n 2 * cvrConfig.laoKernelSize,\n Math.min(2 * cvrConfig.laoKernelSize + 10, cvrConfig.laoKernelRadius)\n ),\n };\n });\n\n const setVolumeColorPreset = (\n viewID: string,\n imageID: string,\n preset: string\n ) => {\n const imageStore = useImageStore();\n const image = imageStore.dataIndex[imageID];\n if (!image) return;\n const imageDataRange = image.getPointData().getScalars().getRange();\n\n const ctRange = getColorFunctionRangeFromPreset(preset);\n const ctFunc: Partial<ColorTransferFunction> = {\n preset,\n mappingRange: ctRange || imageDataRange,\n };\n updateVolumeColorTransferFunction(viewID, imageID, ctFunc);\n\n const opFunc = getOpacityFunctionFromPreset(preset);\n const opRange = getOpacityRangeFromPreset(preset);\n opFunc.mappingRange = opRange || imageDataRange;\n updateVolumeOpacityFunction(viewID, imageID, opFunc);\n };\n\n const resetToDefaultColoring = (\n viewID: string,\n dataID: string,\n image: vtkImageData\n ) => {\n const scalars = image.getPointData().getScalars();\n\n updateVolumeColorBy(viewID, dataID, {\n arrayName: scalars.getName(),\n location: 'pointData',\n });\n setVolumeColorPreset(viewID, dataID, getPresetFromImageModality(dataID));\n };\n\n const serialize = (stateFile: StateFile) => {\n serializeViewConfig(stateFile, getVolumeColorConfig, 'volumeColorConfig');\n };\n\n const deserialize = (viewID: string, config: Record<string, ViewConfig>) => {\n Object.entries(config).forEach(([dataID, viewConfig]) => {\n if (viewConfig.volumeColorConfig) {\n volumeColorConfigs.set(viewID, dataID, viewConfig.volumeColorConfig);\n }\n });\n };\n\n return {\n removeView: removeViewFromConfig(volumeColorConfigs),\n removeData: removeDataFromConfig(volumeColorConfigs),\n serialize,\n deserialize,\n actions: {\n getVolumeColorConfig,\n getComputedVolumeColorConfig,\n updateVolumeColorConfig,\n updateVolumeColorBy,\n updateVolumeColorTransferFunction,\n updateVolumeOpacityFunction,\n updateVolumeCVRParameters,\n resetToDefaultColoring,\n setVolumeColorPreset,\n },\n };\n};\n","import { defineStore } from 'pinia';\n\nimport { setupSlicingConfig } from './view-configs/slicing';\nimport { setupWindowingConfig } from './view-configs/windowing';\nimport { setupCameraConfig } from './view-configs/camera';\nimport { setupVolumeColorConfig } from './view-configs/volume-coloring';\nimport { StateFile, ViewConfig } from '../io/state-file/schema';\nimport { useImageStore } from './datasets-images';\n\n/**\n * This store saves view configuration that is associated with a specific\n * view. The key is a synthetic id generated from the view ID and data ID.\n */\nexport const useViewConfigStore = defineStore('viewConfig', () => {\n const sliceConfig = setupSlicingConfig();\n const windowingConfig = setupWindowingConfig();\n const cameraConfig = setupCameraConfig();\n const volumeColorConfig = setupVolumeColorConfig();\n\n const removeView = (viewID: string) => {\n sliceConfig.removeView(viewID);\n windowingConfig.removeView(viewID);\n cameraConfig.removeView(viewID);\n volumeColorConfig.removeView(viewID);\n };\n\n const removeData = (dataID: string, viewID?: string) => {\n sliceConfig.removeData(dataID, viewID);\n windowingConfig.removeData(dataID, viewID);\n cameraConfig.removeData(dataID, viewID);\n volumeColorConfig.removeData(dataID, viewID);\n };\n\n const serialize = (stateFile: StateFile) => {\n sliceConfig.serialize(stateFile);\n windowingConfig.serialize(stateFile);\n cameraConfig.serialize(stateFile);\n volumeColorConfig.serialize(stateFile);\n };\n\n const deserialize = (\n viewID: string,\n config: Record<string, ViewConfig>,\n dataIDMap: Record<string, string>\n ) => {\n // First update the view config map to use the new dataIDs\n const updatedConfig: Record<string, ViewConfig> = {};\n Object.entries(config).forEach(([dataID, viewConfig]) => {\n const newDataID = dataIDMap[dataID];\n updatedConfig[newDataID] = viewConfig;\n });\n\n sliceConfig.deserialize(viewID, updatedConfig);\n windowingConfig.deserialize(viewID, updatedConfig);\n cameraConfig.deserialize(viewID, updatedConfig);\n volumeColorConfig.deserialize(viewID, updatedConfig);\n };\n\n // delete hook\n const imageStore = useImageStore();\n imageStore.$onAction(({ name, args }) => {\n if (name === 'deleteData') {\n const [id] = args;\n removeData(id);\n }\n });\n\n return {\n removeView,\n removeData,\n serialize,\n deserialize,\n ...sliceConfig.actions,\n ...windowingConfig.actions,\n ...cameraConfig.actions,\n ...volumeColorConfig.actions,\n };\n});\n","import { set, del } from '@vue/composition-api';\nimport vtkAbstractRepresentationProxy from '@kitware/vtk.js/Proxy/Core/AbstractRepresentationProxy';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport { defineStore } from 'pinia';\nimport { DefaultViewSpec, InitViewSpecs } from '../config';\nimport { ViewProxyType } from '../core/proxies';\nimport { Layout, LayoutDirection } from '../types/layout';\nimport { useViewConfigStore } from './view-configs';\nimport { ViewSpec } from '../types/views';\nimport {\n StateFile,\n Layout as StateFileLayout,\n View,\n} from '../io/state-file/schema';\n\ninterface State {\n layout: Layout;\n viewSpecs: Record<string, ViewSpec>;\n}\n\nexport const useViewStore = defineStore('view', {\n state: (): State => ({\n layout: {\n direction: LayoutDirection.V,\n items: [],\n },\n viewSpecs: structuredClone(InitViewSpecs),\n }),\n getters: {\n viewIDs(state) {\n return Object.keys(state.viewSpecs);\n },\n getViewProxy() {\n return <T extends vtkViewProxy>(id: string) => {\n return this.$proxies.getView<T>(id);\n };\n },\n getDataRepresentationForView() {\n return <T extends vtkAbstractRepresentationProxy>(\n dataID: string,\n viewID: string\n ) => {\n return <T | null>(\n this.$proxies.getDataRepresentationForView(dataID, viewID)\n );\n };\n },\n },\n actions: {\n createOrGetViewProxy<T extends vtkViewProxy = vtkViewProxy>(\n id: string,\n type: ViewProxyType\n ) {\n return (\n this.$proxies.getView<T>(id) ?? <T>this.$proxies.createView(id, type)\n );\n },\n addView(id: string) {\n if (!(id in this.viewSpecs)) {\n set(this.viewSpecs, id, structuredClone(DefaultViewSpec));\n }\n },\n removeView(id: string) {\n if (id in this.viewSpecs) {\n del(this.viewSpecs, id);\n this.$proxies.removeView(id);\n }\n },\n setLayout(layout: Layout) {\n this.layout = layout;\n\n const layoutsToProcess = [layout];\n while (layoutsToProcess.length) {\n const ly = layoutsToProcess.shift()!;\n ly.items.forEach((item) => {\n if (typeof item === 'string') {\n // item is a view ID\n this.addView(item);\n } else {\n layoutsToProcess.push(item);\n }\n });\n }\n },\n serialize(stateFile: StateFile) {\n const viewConfigStore = useViewConfigStore();\n const { manifest } = stateFile;\n const { views } = manifest;\n\n manifest.layout = this.layout as StateFileLayout;\n\n // Serialize the view specs\n Object.entries(this.viewSpecs).forEach(([id, spec]) => {\n const type = spec.viewType;\n const { props } = spec;\n const config = {};\n\n const view = {\n id,\n type,\n props,\n config,\n };\n\n views.push(view);\n });\n\n // Serialize the view config\n viewConfigStore.serialize(stateFile);\n },\n deserialize(views: View[], dataIDMap: Record<string, string>) {\n const viewConfigStore = useViewConfigStore();\n\n views.forEach((view) => {\n const viewID = view.id;\n\n const viewSpec = {\n viewType: view.type,\n props: view.props,\n };\n\n this.viewSpecs[viewID] = viewSpec;\n\n // Now delegate the deserialization of the view config\n const { config } = view;\n viewConfigStore.deserialize(viewID, config, dataIDMap);\n });\n },\n },\n});\n","import { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport vtkCrosshairsWidget from '@/src/vtk/CrosshairsWidget';\nimport { Bounds, Vector3 } from '@kitware/vtk.js/types';\nimport { inflate } from '@kitware/vtk.js/Common/DataModel/BoundingBox';\nimport { computed, ref, unref, watch } from '@vue/composition-api';\nimport { vec3 } from 'gl-matrix';\nimport { defineStore } from 'pinia';\nimport { getLPSAxisFromDir } from '@/src/utils/lps';\nimport { Manifest, StateFile } from '@/src/io/state-file/schema';\nimport { useViewConfigStore } from '../view-configs';\nimport { useViewStore } from '../views';\n\nexport const useCrosshairsToolStore = defineStore('crosshairs', () => {\n type _This = ReturnType<typeof useCrosshairsToolStore>;\n\n const factory = vtkCrosshairsWidget.newInstance();\n const widgetState = factory.getWidgetState();\n const handle = widgetState.getHandle();\n\n const active = ref(false);\n const { currentImageID, currentImageMetadata } = useCurrentImage();\n\n // world-space\n const position = ref<Vector3>([0, 0, 0]);\n // image space\n const imagePosition = computed(() => {\n const out = vec3.create();\n vec3.transformMat4(\n out,\n position.value,\n currentImageMetadata.value.worldToIndex\n );\n return out as Vector3;\n });\n\n const viewConfigStore = useViewConfigStore();\n const viewStore = useViewStore();\n\n // only gets views that have a slicing config\n const currentViewIDs = computed(() => {\n const imageID = unref(currentImageID);\n if (imageID) {\n return viewStore.viewIDs.filter(\n (viewID) => !!viewConfigStore.getSliceConfig(viewID, imageID)\n );\n }\n return [];\n });\n\n function getWidgetFactory(this: _This) {\n return factory;\n }\n\n function setPosition(pos: Vector3) {\n position.value = pos;\n }\n\n // update the slicing\n watch(imagePosition, (indexPos) => {\n if (active.value) {\n const imageID = unref(currentImageID);\n const { lpsOrientation } = unref(currentImageMetadata);\n\n if (!imageID) {\n return;\n }\n\n currentViewIDs.value.forEach((viewID) => {\n const sliceConfig = viewConfigStore.getSliceConfig(viewID, imageID);\n const axis = getLPSAxisFromDir(sliceConfig!.axisDirection);\n const index = lpsOrientation[axis];\n const slice = Math.round(indexPos[index]);\n viewConfigStore.updateSliceConfig(viewID, imageID, { slice });\n });\n }\n });\n\n // update widget state based on current image\n watch(\n currentImageMetadata,\n (metadata) => {\n widgetState.setIndexToWorld(metadata.indexToWorld);\n widgetState.setWorldToIndex(metadata.worldToIndex);\n const [xDim, yDim, zDim] = metadata.dimensions;\n const imageBounds: Bounds = [0, xDim - 1, 0, yDim - 1, 0, zDim - 1];\n // inflate by 0.5, since the image slice rendering is inflated\n // by 0.5.\n handle.setBounds(inflate(imageBounds, 0.5));\n },\n { immediate: true }\n );\n\n // update the position\n handle.onModified(() => {\n const origin = handle.getOrigin();\n if (origin) {\n position.value = origin;\n }\n });\n\n function activateTool() {\n widgetState.setPlaced(false);\n active.value = true;\n return true;\n }\n\n function deactivateTool() {\n active.value = false;\n }\n\n function serialize(state: StateFile) {\n const { crosshairs } = state.manifest.tools;\n crosshairs.position = position.value;\n }\n\n function deserialize(manifest: Manifest) {\n const { crosshairs } = manifest.tools;\n position.value = crosshairs.position;\n }\n\n return {\n getWidgetFactory,\n setPosition,\n position,\n imagePosition,\n activateTool,\n deactivateTool,\n serialize,\n deserialize,\n };\n});\n","import macro from '@kitware/vtk.js/macro';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\n\n// ----------------------------------------------------------------------------\n// vtkLabelMap methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLabelMap(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLabelMap');\n\n if (model.colorMap === null) {\n // default colormap\n model.colorMap = {\n 0: [0, 0, 0, 0],\n 1: [0, 0, 0, 255],\n };\n }\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n // default opacity map uses 0 as the transparent pixel\n colorMap: null,\n};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkImageData.extend(publicAPI, model, initialValues);\n\n macro.setGet(publicAPI, model, ['colorMap']);\n\n // Object specific methods\n vtkLabelMap(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkLabelMap');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","/* eslint-disable */\nimport { defer, Deferred } from './index';\n\n// to be used to instantiate a worker\nexport default class PromiseWorker {\n private msgID: number;\n private worker: Worker;\n private waiting: Record<string, Deferred<any>>;\n\n constructor(worker: Worker) {\n this.msgID = 0;\n this.worker = worker;\n this.waiting = {};\n\n this.worker.onmessage = this.handleMessage.bind(this);\n }\n\n postMessage(message: any, transferables: any[] = []) {\n const wrappedMsg = {\n id: this.msgID,\n message,\n };\n\n const deferred = defer();\n this.waiting[wrappedMsg.id] = deferred;\n\n this.worker.postMessage(wrappedMsg, transferables);\n\n this.msgID += 1;\n return deferred.promise;\n }\n\n handleMessage(ev: any) {\n const { id, error, message } = ev.data;\n if (id in this.waiting) {\n const deferred = this.waiting[id];\n delete this.waiting[id];\n if (error) {\n deferred.reject(new Error(error));\n } else {\n deferred.resolve(message);\n }\n }\n }\n}\n","import vtk from '@kitware/vtk.js/vtk';\n\nimport PromiseWorker from '@/src/utils/promise-worker';\nimport vtkDataSet from '@kitware/vtk.js/Common/DataModel/DataSet';\nimport { vtkObject } from '@kitware/vtk.js/interfaces';\nimport { StateObject } from './common';\n\ninterface SuccessReadResult {\n status: 'success';\n obj: StateObject;\n}\n\ninterface FailResult {\n status: 'fail';\n error: Error;\n}\n\ntype ReadResult = SuccessReadResult | FailResult;\n\nexport const runAsyncVTKReader = (readerName: string) => async (file: File) => {\n const worker = new PromiseWorker(\n new Worker(new URL('./async.reader.worker.ts', import.meta.url))\n );\n const data = (await worker.postMessage({\n file,\n readerName,\n })) as ReadResult;\n if (data.status === 'success') {\n return vtk(data.obj) as vtkObject;\n }\n throw data.error;\n};\n\ninterface SuccessWriteResult {\n status: 'success';\n data: string;\n}\ntype WriteResult = SuccessWriteResult | FailResult;\n\nexport const runAsyncVTKWriter =\n (writerName: string) => async (dataSet: vtkDataSet) => {\n const worker = new PromiseWorker(\n new Worker(new URL('./async.writer.worker.ts', import.meta.url))\n );\n const result = (await worker.postMessage({\n obj: dataSet.getState(),\n writerName,\n })) as WriteResult;\n if (result.status === 'success') {\n return result.data;\n }\n throw result.error;\n };\n\nexport const stlReader = runAsyncVTKReader('stl');\nexport const vtiReader = runAsyncVTKReader('vti');\nexport const vtpReader = runAsyncVTKReader('vtp');\nexport const vtiWriter = runAsyncVTKWriter('vti');\n","import { set } from '@vue/composition-api';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport { defineStore } from 'pinia';\nimport { useImageStore } from '@/src/store/datasets-images';\nimport vtkLabelMap from '../vtk/LabelMap';\nimport { LABELMAP_PALETTE } from '../config';\nimport { StateFile, Manifest } from '../io/state-file/schema';\nimport { vtiReader, vtiWriter } from '../io/vtk/async';\nimport { FileEntry } from '../io/types';\n\nconst LabelmapArrayType = Uint8Array;\nexport type LabelmapArrayType = Uint8Array;\n\ninterface State {\n idList: string[];\n labelmaps: Record<string, vtkLabelMap>;\n parentImage: Record<string, string>;\n}\n\nfunction createLabelmapFromImage(imageData: vtkImageData) {\n const points = new LabelmapArrayType(imageData.getNumberOfPoints());\n const labelmap = vtkLabelMap.newInstance(\n imageData.get('spacing', 'origin', 'direction')\n );\n labelmap.getPointData().setScalars(\n vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: points,\n })\n );\n labelmap.setDimensions(imageData.getDimensions());\n labelmap.computeTransforms();\n labelmap.setColorMap(LABELMAP_PALETTE);\n\n return labelmap;\n}\n\nfunction toLabelMap(imageData: vtkImageData) {\n const labelmap = vtkLabelMap.newInstance(\n imageData.get(\n 'spacing',\n 'origin',\n 'direction',\n 'indexToWorld',\n 'worldToIndex',\n 'dataDescription',\n 'pointData'\n )\n );\n labelmap.setDimensions(imageData.getDimensions());\n labelmap.computeTransforms();\n labelmap.setColorMap(LABELMAP_PALETTE);\n\n return labelmap;\n}\n\nexport const useLabelmapStore = defineStore('labelmap', {\n state: (): State => ({\n idList: [],\n labelmaps: Object.create(null),\n parentImage: Object.create(null),\n }),\n actions: {\n newLabelmapFromImage(imageID: string) {\n const imageStore = useImageStore();\n const imageData = imageStore.dataIndex[imageID];\n if (!imageData) {\n return null;\n }\n\n const id = this.$id.nextID();\n const labelmap = createLabelmapFromImage(imageData);\n\n this.idList.push(id);\n set(this.parentImage, id, imageID);\n set(this.labelmaps, id, labelmap);\n\n this.$proxies.addData(id, labelmap);\n\n return id;\n },\n async serialize(state: StateFile) {\n const { labelMaps } = state.manifest;\n const { zip } = state;\n\n await Promise.all(\n Object.entries(this.labelmaps).map(async ([id, labelMap]) => {\n const labelPath = `labels/${id}.vti`;\n const parent = this.parentImage[id];\n labelMaps.push({\n id,\n parent,\n path: labelPath,\n });\n\n const serializedData = await vtiWriter(labelMap);\n zip.file(labelPath, serializedData);\n })\n );\n },\n async deserialize(\n manifest: Manifest,\n stateFiles: FileEntry[],\n dataIDMap: Record<string, string>\n ) {\n const { labelMaps } = manifest;\n\n const labelmapIDMap: Record<string, string> = {};\n\n labelMaps.forEach(async (labelMap) => {\n const [file] = stateFiles\n .filter(\n (entry) => `${entry.path}${entry.file.name}` === labelMap.path\n )\n .map((entry) => entry.file);\n\n // map parent id to new id\n labelMap.parent = dataIDMap[labelMap.parent];\n\n const { parent } = labelMap;\n const id = this.$id.nextID();\n labelmapIDMap[labelMap.id] = id;\n\n const imageData = await vtiReader(file);\n const labelMapObj = toLabelMap(imageData as vtkImageData);\n this.idList.push(id);\n set(this.parentImage, id, parent);\n set(this.labelmaps, id, labelMapObj);\n this.$proxies.addData(id, labelMapObj);\n });\n\n return labelmapIDMap;\n },\n },\n});\n","import { Vector2 } from '@kitware/vtk.js/types';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { Manifest, StateFile } from '@/src/io/state-file/schema';\nimport { computed, ref, watch } from '@vue/composition-api';\nimport { vec3 } from 'gl-matrix';\nimport { defineStore } from 'pinia';\nimport { Tools } from './types';\nimport { useLabelmapStore } from '../datasets-labelmaps';\n\nconst DEFAULT_BRUSH_SIZE = 4;\nconst DEFAULT_BRUSH_VALUE = 1;\n\nexport const usePaintToolStore = defineStore('paint', () => {\n type _This = ReturnType<typeof usePaintToolStore>;\n\n const activeLabelmapID = ref<string | null>(null);\n const brushSize = ref(DEFAULT_BRUSH_SIZE);\n const brushValue = ref(DEFAULT_BRUSH_VALUE);\n const strokePoints = ref<vec3[]>([]);\n const labelmapOpacity = ref(1);\n const isActive = ref(false);\n\n const { currentImageID } = useCurrentImage();\n\n function getWidgetFactory(this: _This) {\n return this.$paint.factory;\n }\n\n const activeLabelmap = computed(() => {\n if (!activeLabelmapID.value) return null;\n const labelmapStore = useLabelmapStore();\n return labelmapStore.labelmaps[activeLabelmapID.value] ?? null;\n });\n\n // --- actions --- //\n\n function selectOrCreateLabelmap(imageID: string | null) {\n if (!imageID) {\n activeLabelmapID.value = null;\n return;\n }\n\n const labelmapStore = useLabelmapStore();\n const found = Object.entries(labelmapStore.parentImage).find(\n ([, parentID]) => imageID === parentID\n );\n if (found) {\n [activeLabelmapID.value] = found;\n } else {\n activeLabelmapID.value = labelmapStore.newLabelmapFromImage(imageID);\n }\n }\n\n function setBrushSize(this: _This, size: number) {\n brushSize.value = Math.round(size);\n this.$paint.setBrushSize(size);\n }\n\n function setBrushValue(this: _This, value: number) {\n brushValue.value = value;\n this.$paint.setBrushValue(value);\n }\n\n function setLabelmapOpacity(opacity: number) {\n labelmapOpacity.value = Math.min(1, Math.max(0, opacity));\n }\n\n function doPaintStroke(this: _This, axisIndex: 0 | 1 | 2) {\n if (!activeLabelmap.value) {\n return;\n }\n\n const lastIndex = strokePoints.value.length - 1;\n if (lastIndex >= 0) {\n const lastPoint = strokePoints.value[lastIndex];\n const prevPoint =\n lastIndex >= 1 ? strokePoints.value[lastIndex - 1] : undefined;\n this.$paint.paintLabelmap(\n activeLabelmap.value,\n axisIndex,\n lastPoint,\n prevPoint\n );\n }\n }\n\n function setSliceAxis(this: _This, axisIndex: 0 | 1 | 2) {\n if (!activeLabelmap.value) return;\n const spacing = activeLabelmap.value.getSpacing();\n spacing.splice(axisIndex, 1);\n const scale: Vector2 = [1 / spacing[0], 1 / spacing[1]];\n this.$paint.setBrushScale(scale);\n }\n\n function startStroke(this: _This, indexPoint: vec3, axisIndex: 0 | 1 | 2) {\n strokePoints.value = [vec3.clone(indexPoint)];\n doPaintStroke.call(this, axisIndex);\n }\n\n function placeStrokePoint(\n this: _This,\n indexPoint: vec3,\n axisIndex: 0 | 1 | 2\n ) {\n strokePoints.value.push(indexPoint);\n doPaintStroke.call(this, axisIndex);\n }\n\n function endStroke(this: _This, indexPoint: vec3, axisIndex: 0 | 1 | 2) {\n strokePoints.value.push(indexPoint);\n doPaintStroke.call(this, axisIndex);\n }\n\n // --- setup and teardown --- //\n\n function activateTool(this: _This) {\n const imageID = currentImageID.value;\n if (!imageID) {\n return false;\n }\n selectOrCreateLabelmap(imageID);\n this.$paint.setBrushSize(this.brushSize);\n\n isActive.value = true;\n return true;\n }\n\n function deactivateTool() {\n activeLabelmapID.value = null;\n isActive.value = false;\n }\n\n function serialize(state: StateFile) {\n const { paint } = state.manifest.tools;\n\n paint.activeLabelmapID = activeLabelmapID.value;\n paint.brushSize = brushSize.value;\n paint.brushValue = brushValue.value;\n paint.labelmapOpacity = labelmapOpacity.value;\n }\n\n function deserialize(\n this: _This,\n manifest: Manifest,\n labelmapIDMap: Record<string, string>\n ) {\n const { paint } = manifest.tools;\n this.setBrushSize(paint.brushSize);\n this.setBrushValue(paint.brushValue);\n this.setLabelmapOpacity(paint.labelmapOpacity);\n isActive.value = manifest.tools.current === Tools.Paint;\n\n if (paint.activeLabelmapID !== null) {\n activeLabelmapID.value = labelmapIDMap[paint.activeLabelmapID];\n }\n }\n\n // --- change labelmap if paint is active --- //\n\n watch(currentImageID, (imageID) => {\n if (isActive.value) {\n selectOrCreateLabelmap(imageID);\n }\n });\n\n return {\n // state\n activeLabelmapID,\n brushSize,\n brushValue,\n strokePoints,\n labelmapOpacity,\n isActive,\n\n getWidgetFactory,\n\n activateTool,\n deactivateTool,\n\n selectOrCreateLabelmap,\n setBrushSize,\n setBrushValue,\n setLabelmapOpacity,\n setSliceAxis,\n startStroke,\n placeStrokePoint,\n endStroke,\n serialize,\n deserialize,\n };\n});\n","import { Vector3 } from '@kitware/vtk.js/types';\nimport vtkPlaneManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport { vec3 } from 'gl-matrix';\nimport { ImageMetadata } from '../store/datasets-images';\nimport { LPSAxisDir } from '../types/lps';\nimport { getLPSAxisFromDir } from './lps';\n\nexport function updatePlaneManipulatorFor2DView(\n manipulator: vtkPlaneManipulator,\n viewDir: LPSAxisDir,\n slice: number,\n imageMetadata: ImageMetadata\n) {\n const { lpsOrientation } = imageMetadata;\n const axis = lpsOrientation[getLPSAxisFromDir(viewDir)];\n\n const normal: vec3 = lpsOrientation[viewDir];\n const origin: vec3 = [0, 0, 0];\n origin[axis] = slice;\n\n vec3.transformMat4(origin, origin, imageMetadata.indexToWorld);\n\n manipulator.setUserNormal(normal as Vector3);\n manipulator.setUserOrigin(origin as Vector3);\n}\n\nexport function createPlaneManipulatorFor2DView(\n viewDir: LPSAxisDir,\n slice: number,\n imageMetadata: ImageMetadata\n) {\n const manipulator = vtkPlaneManipulator.newInstance();\n updatePlaneManipulatorFor2DView(manipulator, viewDir, slice, imageMetadata);\n return manipulator;\n}\n","import { computed, del, ref, set } from '@vue/composition-api';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport { distance2BetweenPoints } from '@kitware/vtk.js/Common/Core/Math';\nimport { removeFromArray } from '@/src/utils';\nimport { RulerStateUpdate } from '@/src/core/tools/ruler';\nimport { TOOL_COLORS } from '@/src/config';\nimport { defineStore } from 'pinia';\nimport { InteractionState } from '@/src/vtk/RulerWidget/state';\nimport { useViewConfigStore } from '@/src/store/view-configs';\nimport { createPlaneManipulatorFor2DView } from '@/src/utils/manipulators';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { getLPSAxisFromDir } from '@/src/utils/lps';\nimport { Manifest, StateFile } from '@/src/io/state-file/schema';\nimport { LPSAxisDir } from '@/src/types/lps';\nimport { Ruler } from './types';\nimport { useViewStore } from '../views';\n\nconst emptyRuler = (): Ruler => ({\n name: '',\n firstPoint: null,\n secondPoint: null,\n viewAxis: null,\n slice: null,\n imageID: '',\n interactionState: InteractionState.PlacingFirst,\n color: TOOL_COLORS[0],\n});\n\nexport type RulerPatch = Partial<Ruler> & RulerStateUpdate;\n\nexport const useRulerStore = defineStore('ruler', () => {\n type _This = ReturnType<typeof useRulerStore>;\n\n // --- state --- //\n\n const rulerIDs = ref<string[]>([]);\n const rulers = ref<Record<string, Ruler>>(Object.create(null));\n const activeRulerID = ref<string | null>(null);\n\n let colorIndex = 0;\n\n // --- getters --- //\n\n const lengthByID = computed(() => {\n const rulersIndex = rulers.value;\n return rulerIDs.value.reduce((lengths, id) => {\n const { firstPoint, secondPoint } = rulersIndex[id];\n return Object.assign(lengths, {\n [id]:\n firstPoint && secondPoint\n ? Math.sqrt(distance2BetweenPoints(firstPoint, secondPoint))\n : 0,\n });\n }, {} as Record<string, number>);\n });\n\n function getVTKFactory(this: _This, id: string) {\n return this.$rulers.getFactory(id);\n }\n\n // --- actions --- //\n\n function deactivateRuler(rulerID: string) {\n if (rulerID in rulers.value) {\n activeRulerID.value = null;\n }\n }\n\n function activateRuler(rulerID: string) {\n if (activeRulerID.value) {\n deactivateRuler(activeRulerID.value);\n }\n if (rulerID in rulers.value) {\n activeRulerID.value = rulerID;\n }\n }\n\n function updateRulerInternal(this: _This, id: string, patch: Partial<Ruler>) {\n if (id in rulers.value) {\n const ruler = rulers.value[id];\n Object.assign(ruler, patch);\n\n if (\n id === activeRulerID.value &&\n ruler.interactionState === InteractionState.Settled\n ) {\n deactivateRuler(id);\n }\n }\n }\n\n function updateRuler(this: _This, id: string, patch: Partial<Ruler>) {\n updateRulerInternal.call(this, id, patch);\n if (id in rulers.value) {\n const ruler = rulers.value[id];\n const update: RulerStateUpdate = {\n firstPoint: ruler.firstPoint,\n secondPoint: ruler.secondPoint,\n interactionState: ruler.interactionState,\n };\n this.$rulers.updateRuler(id, update);\n }\n }\n\n function addNewRuler(this: _This, rulerState: Partial<Ruler>) {\n const id = this.$id.nextID();\n\n set(rulers.value, id, emptyRuler());\n rulerIDs.value.push(id);\n\n this.$rulers.createRuler(id);\n\n const patch = { ...rulerState };\n // set color if necessary\n if (!('color' in patch)) {\n patch.color = TOOL_COLORS[colorIndex];\n colorIndex = (colorIndex + 1) % TOOL_COLORS.length;\n }\n\n updateRuler.call(this, id, patch);\n\n return id;\n }\n\n function removeRuler(this: _This, id: string) {\n deactivateRuler(id);\n removeFromArray(rulerIDs.value, id);\n del(rulers.value, id);\n this.$rulers.removeRuler(id);\n }\n\n function removeActiveRuler(this: _This) {\n if (activeRulerID.value) {\n removeRuler.call(this, activeRulerID.value);\n }\n }\n\n function addNewRulerFromViewEvent(\n this: _This,\n eventData: any,\n viewID: string\n ) {\n if (activeRulerID.value) {\n return;\n }\n\n const viewConfigStore = useViewConfigStore();\n const currentImage = useCurrentImage();\n\n const imageID = currentImage.currentImageID.value;\n const imageMetadata = currentImage.currentImageMetadata.value;\n\n if (!imageID) {\n return;\n }\n\n const sliceConfig = viewConfigStore.getSliceConfig(viewID, imageID);\n if (!sliceConfig) {\n return;\n }\n\n const { slice, axisDirection: viewDirection } = sliceConfig;\n const viewAxis = getLPSAxisFromDir(viewDirection);\n\n const viewProxy = this.$proxies.getView(viewID);\n if (!viewProxy) {\n return;\n }\n\n const id = addNewRuler.call(this, {\n name: 'Ruler',\n imageID,\n });\n const manipulator = createPlaneManipulatorFor2DView(\n viewDirection,\n slice,\n imageMetadata\n );\n const coords = manipulator.handleEvent(\n eventData,\n viewProxy.getOpenglRenderWindow()\n );\n if (coords.length) {\n updateRuler.call(this, id, {\n firstPoint: coords as Vector3,\n slice,\n imageID,\n viewAxis,\n interactionState: InteractionState.PlacingSecond,\n });\n }\n\n activateRuler(id);\n }\n\n function jumpToRuler(rulerID: string) {\n const ruler = rulers.value[rulerID];\n if (!ruler?.viewAxis || ruler?.slice == null) return;\n\n const { currentImageID } = useCurrentImage();\n const imageID = currentImageID.value;\n if (!imageID || ruler.imageID !== imageID) return;\n\n const viewStore = useViewStore();\n const relevantViewIDs = viewStore.viewIDs.filter((viewID) => {\n const viewSpec = viewStore.viewSpecs[viewID];\n const viewDir = viewSpec.props.viewDirection as LPSAxisDir | undefined;\n return viewDir && getLPSAxisFromDir(viewDir) === ruler.viewAxis;\n });\n\n const viewConfigStore = useViewConfigStore();\n relevantViewIDs.forEach((viewID) => {\n viewConfigStore.updateSliceConfig(viewID, imageID, {\n slice: ruler.slice!,\n });\n });\n }\n\n // --- watch RulerTool for changes to apply --- //\n\n function updateFromWidgetState(\n this: _This,\n event: {\n id: string;\n update: RulerStateUpdate;\n }\n ) {\n const { id, update } = event;\n const patch: Partial<Ruler> = {};\n\n if ('firstPoint' in update) {\n patch.firstPoint = update.firstPoint;\n }\n if ('secondPoint' in update) {\n patch.secondPoint = update.secondPoint;\n }\n if ('interactionState' in update) {\n patch.interactionState = update.interactionState;\n }\n\n updateRulerInternal.call(this, id, patch);\n }\n\n let cleanup: Function;\n\n function initialize(this: _This) {\n const update = updateFromWidgetState.bind(this);\n this.$rulers.events.on('widgetUpdate', update);\n cleanup = () => this.$rulers.events.off('widgetUpdate', update);\n }\n\n function uninitialize(this: _This) {\n cleanup();\n }\n\n // --- tool activation --- //\n\n function activateTool() {\n return true;\n }\n\n function deactivateTool(this: _This) {\n removeActiveRuler.call(this);\n }\n\n function serialize(state: StateFile) {\n const rulersInState = state.manifest.tools.rulers;\n\n rulerIDs.value.forEach((rulerID) => {\n const ruler = rulers.value[rulerID];\n rulersInState.push(ruler);\n });\n }\n\n function deserialize(this: _This, manifest: Manifest) {\n const rulersInState = manifest.tools.rulers;\n\n rulersInState.forEach((ruler) => {\n addNewRuler.call(this, ruler);\n });\n }\n\n return {\n rulerIDs,\n rulers,\n activeRulerID,\n lengthByID,\n getVTKFactory,\n\n initialize,\n uninitialize,\n\n activateTool,\n deactivateTool,\n\n addNewRuler,\n addNewRulerFromViewEvent,\n removeActiveRuler,\n removeRuler,\n updateRuler,\n serialize,\n deserialize,\n jumpToRuler,\n };\n});\n","import { Manifest, StateFile } from '@/src/io/state-file/schema';\nimport { defineStore } from 'pinia';\nimport { useCropStore } from './crop';\nimport { useCrosshairsToolStore } from './crosshairs';\nimport { usePaintToolStore } from './paint';\nimport { useRulerStore } from './rulers';\nimport { Tools } from './types';\n\ninterface State {\n currentTool: Tools;\n}\n\nexport interface IToolStore {\n activateTool: () => boolean;\n deactivateTool: () => void;\n}\n\nfunction getStore(tool: Tools): IToolStore | null {\n if (tool === Tools.Ruler) {\n return useRulerStore();\n }\n if (tool === Tools.Paint) {\n return usePaintToolStore();\n }\n if (tool === Tools.Crosshairs) {\n return useCrosshairsToolStore();\n }\n return null;\n}\n\n/**\n * Returns true if the tool is ready to be\n * activated. By default, a tool without a\n * store setup() will be activated.\n */\nfunction setupTool(tool: Tools) {\n const store = getStore(tool);\n if (store) {\n return store.activateTool();\n }\n return true;\n}\n\nfunction teardownTool(tool: Tools) {\n const store = getStore(tool);\n if (store) {\n store.deactivateTool();\n }\n}\n\nexport const useToolStore = defineStore('tool', {\n state: (): State => ({\n currentTool: Tools.WindowLevel,\n }),\n actions: {\n setCurrentTool(tool: Tools) {\n if (!setupTool(tool)) {\n return;\n }\n teardownTool(this.currentTool);\n this.currentTool = tool;\n },\n serialize(state: StateFile) {\n const { tools } = state.manifest;\n const rulerStore = useRulerStore();\n const crosshairsStore = useCrosshairsToolStore();\n const paintStore = usePaintToolStore();\n const cropStore = useCropStore();\n\n rulerStore.serialize(state);\n crosshairsStore.serialize(state);\n paintStore.serialize(state);\n cropStore.serialize(state);\n\n tools.current = this.currentTool;\n },\n deserialize(\n manifest: Manifest,\n labelmapIDMap: Record<string, string>,\n dataIDMap: Record<string, string>\n ) {\n const { tools } = manifest;\n const rulerStore = useRulerStore();\n const crosshairsStore = useCrosshairsToolStore();\n const paintStore = usePaintToolStore();\n const cropStore = useCropStore();\n\n rulerStore.deserialize(manifest);\n crosshairsStore.deserialize(manifest);\n paintStore.deserialize(manifest, labelmapIDMap);\n cropStore.deserialize(manifest, dataIDMap);\n this.currentTool = tools.current;\n },\n },\n});\n","\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n ref,\n toRefs,\n watch,\n} from '@vue/composition-api';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport { useViewConfigStore } from '@/src/store/view-configs';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport vtkMouseRangeManipulator from '@kitware/vtk.js/Interaction/Manipulators/MouseRangeManipulator';\nimport { CreateElement, RenderContext } from 'vue';\nimport { useViewStore } from '@/src/store/views';\nimport { defaultWindowLevelConfig } from '@/src/store/view-configs/windowing';\n\nfunction computeStep(min: number, max: number) {\n return Math.min(max - min, 1) / 256;\n}\n\nconst PROPS = {\n viewId: {\n type: String,\n required: true,\n },\n} as const;\n\nconst WindowLevelTool = defineComponent({\n name: 'WindowLevelTool',\n props: PROPS,\n setup(props) {\n const { viewId: viewID } = toRefs(props);\n const viewConfigStore = useViewConfigStore();\n const viewStore = useViewStore();\n const { currentImageID } = useCurrentImage();\n\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView2DProxy>(viewID.value)!\n );\n\n const windowConfigDefaults = defaultWindowLevelConfig();\n const wlConfig = computed(() =>\n currentImageID.value !== null\n ? viewConfigStore.getWindowingConfig(\n viewID.value,\n currentImageID.value\n )!\n : null\n );\n\n const wwRange = computed(() => ({\n min: 1e-12, // ensure we don't hit zero and jump to white\n max:\n wlConfig.value !== null\n ? wlConfig.value.max - wlConfig.value.min\n : windowConfigDefaults.max,\n step:\n wlConfig.value !== null\n ? computeStep(wlConfig.value.min, wlConfig.value.max)\n : computeStep(windowConfigDefaults.min, windowConfigDefaults.max),\n default:\n wlConfig.value !== null\n ? wlConfig.value.width\n : windowConfigDefaults.width,\n }));\n const wlRange = computed(() => ({\n min:\n wlConfig.value !== null ? wlConfig.value.min : windowConfigDefaults.min,\n max:\n wlConfig.value !== null ? wlConfig.value.max : windowConfigDefaults.max,\n step:\n wlConfig.value !== null\n ? computeStep(wlConfig.value.min, wlConfig.value.max)\n : computeStep(windowConfigDefaults.min, windowConfigDefaults.max),\n default:\n wlConfig.value !== null\n ? wlConfig.value.level\n : windowConfigDefaults.level,\n }));\n\n const vertVal = ref(0);\n const horizVal = ref(0);\n\n watch(vertVal, (ww) => {\n if (currentImageID.value !== null) {\n viewConfigStore.updateWindowingConfig(\n viewID.value,\n currentImageID.value,\n {\n width: ww,\n }\n );\n }\n });\n watch(horizVal, (wl) => {\n if (currentImageID.value !== null) {\n viewConfigStore.updateWindowingConfig(\n viewID.value,\n currentImageID.value,\n {\n level: wl,\n }\n );\n }\n });\n\n const rangeManipulator = vtkMouseRangeManipulator.newInstance({\n button: 1,\n scrollEnabled: false,\n });\n\n watch(\n viewProxy,\n (curViewProxy, oldViewProxy) => {\n if (oldViewProxy) {\n const istyle = oldViewProxy.getInteractorStyle2D();\n istyle.removeMouseManipulator(rangeManipulator);\n }\n\n if (curViewProxy) {\n // assumed to be vtkInteractorStyleManipulator\n const istyle = viewProxy.value.getInteractorStyle2D();\n istyle.addMouseManipulator(rangeManipulator);\n }\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n // for some reason, VtkTwoView.onBeforeUnmount is being\n // invoked before this onBeforeUnmount during HMR.\n if (!viewProxy.value.isDeleted()) {\n const istyle = viewProxy.value.getInteractorStyle2D();\n istyle.removeMouseManipulator(rangeManipulator);\n }\n });\n\n function updateManipulator() {\n rangeManipulator.removeAllListeners();\n const vertRange = wwRange.value;\n const horizRange = wlRange.value;\n\n rangeManipulator.setVerticalListener(\n vertRange.min,\n vertRange.max,\n vertRange.step,\n () => vertVal.value,\n (v) => {\n vertVal.value = v;\n }\n );\n\n rangeManipulator.setHorizontalListener(\n horizRange.min,\n horizRange.max,\n horizRange.step,\n () => horizVal.value,\n (v) => {\n horizVal.value = v;\n }\n );\n }\n\n watch(\n () => [wwRange.value, wlRange.value],\n ([ww, wl]) => {\n vertVal.value = ww.default;\n horizVal.value = wl.default;\n updateManipulator();\n },\n { immediate: true }\n );\n\n return () => null;\n },\n});\n\nexport default {\n functional: true,\n render(h: CreateElement, ctx: RenderContext<typeof PROPS>) {\n const toolStore = useToolStore();\n const active = computed(() => toolStore.currentTool === Tools.WindowLevel);\n // TODO vue 3 does away with VNodeData, so\n // remove the props key\n return active.value ? h(WindowLevelTool, { props: ctx.props }) : [];\n },\n};\n","var render, staticRenderFns\nimport script from \"./WindowLevelTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./WindowLevelTool.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render, staticRenderFns\nimport script from \"./SliceScrollTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./SliceScrollTool.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render, staticRenderFns\nimport script from \"./MouseManipulatorTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./MouseManipulatorTool.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render, staticRenderFns\nimport script from \"./PanTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./PanTool.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render, staticRenderFns\nimport script from \"./ZoomTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./ZoomTool.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render, staticRenderFns\nimport script from \"./RulerWidget2D.vue?vue&type=script&lang=ts&\"\nexport * from \"./RulerWidget2D.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./WindowLevelTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./WindowLevelTool.vue?vue&type=script&lang=ts&\"","\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n ref,\n toRefs,\n watch,\n} from '@vue/composition-api';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport vtkMouseRangeManipulator from '@kitware/vtk.js/Interaction/Manipulators/MouseRangeManipulator';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { useViewConfigStore } from '@/src/store/view-configs';\nimport { useViewStore } from '@/src/store/views';\nimport { defaultSliceConfig } from '@/src/store/view-configs/slicing';\n\nexport default defineComponent({\n name: 'SliceScrollTool',\n props: {\n viewId: {\n type: String,\n required: true,\n },\n },\n setup(props) {\n const { viewId: viewID } = toRefs(props);\n const viewConfigStore = useViewConfigStore();\n const viewStore = useViewStore();\n const { currentImageID } = useCurrentImage();\n\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView2DProxy>(viewID.value)!\n );\n\n const sliceConfigDefault = defaultSliceConfig();\n const sliceConfig = computed(() =>\n currentImageID.value !== null\n ? viewConfigStore.getSliceConfig(viewID.value, currentImageID.value)!\n : null\n );\n const sliceRange = computed(() => ({\n min:\n sliceConfig.value !== null\n ? sliceConfig.value.min\n : sliceConfigDefault.min,\n max:\n sliceConfig.value !== null\n ? sliceConfig.value.max\n : sliceConfigDefault.max,\n step: 1,\n default:\n sliceConfig.value !== null\n ? sliceConfig.value.slice\n : sliceConfigDefault.slice,\n }));\n\n const scrollVal = ref(0);\n\n const rangeManipulator = vtkMouseRangeManipulator.newInstance({\n button: -1, // don't bind to any buttons\n scrollEnabled: true,\n });\n\n watch(\n viewProxy,\n (curViewProxy, oldViewProxy) => {\n if (oldViewProxy) {\n const istyle = oldViewProxy.getInteractorStyle2D();\n istyle.removeMouseManipulator(rangeManipulator);\n }\n\n if (curViewProxy) {\n // assumed to be vtkInteractorStyleManipulator\n const istyle = viewProxy.value.getInteractorStyle2D();\n istyle.addMouseManipulator(rangeManipulator);\n }\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n // for some reason, VtkTwoView.onBeforeUnmount is being\n // invoked before this onBeforeUnmount during HMR.\n if (!viewProxy.value.isDeleted()) {\n const istyle = viewProxy.value.getInteractorStyle2D();\n istyle.removeMouseManipulator(rangeManipulator);\n }\n });\n\n function updateManipulator() {\n rangeManipulator.removeAllListeners();\n const range = sliceRange.value;\n\n rangeManipulator.setScrollListener(\n range.min,\n range.max,\n range.step,\n () => scrollVal.value,\n (slice) => {\n if (currentImageID.value !== null) {\n viewConfigStore.updateSliceConfig(\n viewID.value,\n currentImageID.value,\n { slice }\n );\n }\n }\n );\n }\n\n watch(\n sliceRange,\n (range) => {\n scrollVal.value = range.default;\n updateManipulator();\n },\n { immediate: true }\n );\n\n return () => null;\n },\n});\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SliceScrollTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SliceScrollTool.vue?vue&type=script&lang=ts&\"","\nimport {\n computed,\n defineComponent,\n PropType,\n onBeforeUnmount,\n toRefs,\n watch,\n} from '@vue/composition-api';\nimport { useViewStore } from '@/src/store/views';\n\nexport default defineComponent({\n name: 'MouseManipulatorTool',\n props: {\n // only useful for determining the kind of manipulator\n name: String,\n viewId: {\n type: String,\n required: true,\n },\n manipulatorClass: {\n type: Object,\n required: true,\n },\n options: {\n type: Array as PropType<Array<any>>,\n default: () => [],\n },\n },\n setup(props) {\n const { viewId: viewID, options } = toRefs(props);\n\n const viewStore = useViewStore();\n const viewProxy = computed(() => viewStore.getViewProxy(viewID.value)!);\n\n const intStyle = computed(() => {\n return viewProxy.value.isA('vtkView2DProxy')\n ? viewProxy.value.getInteractorStyle2D()\n : viewProxy.value.getInteractorStyle3D();\n });\n\n const manipulators: any[] = [];\n\n function updateStyle(\n style: any,\n newManipulators: any[],\n oldManipulators: any[]\n ) {\n if (style !== null) {\n oldManipulators.forEach((m) => style.removeMouseManipulator(m));\n newManipulators.forEach((m) => style.addMouseManipulator(m));\n }\n }\n\n watch(\n options,\n (newOptions) => {\n // Maintain the size of manipulators array equal to options array.\n while (manipulators.length > newOptions.length) {\n const m = manipulators.pop();\n intStyle.value.removeMouseManipulator(m);\n m.delete();\n }\n\n const oldManipulators = Array.from(manipulators);\n\n for (let i = manipulators.length; i < newOptions.length; ++i) {\n manipulators.push(props.manipulatorClass.newInstance(newOptions[i]));\n }\n\n newOptions.forEach((opt, idx) => {\n if ('button' in opt) {\n manipulators[idx].setButton(opt.button);\n }\n manipulators[idx].setShift(!!opt.shift);\n manipulators[idx].setControl(!!opt.control);\n });\n\n updateStyle(intStyle.value, manipulators, oldManipulators);\n },\n { immediate: true }\n );\n\n watch(\n intStyle,\n (curIntStyle, oldIntStyle) => {\n manipulators.forEach((m) => {\n if (oldIntStyle) {\n oldIntStyle.removeMouseManipulator(m);\n }\n if (curIntStyle) {\n curIntStyle.addMouseManipulator(m);\n }\n });\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n if (!viewProxy.value.isDeleted()) {\n manipulators.forEach((m) => intStyle.value.removeMouseManipulator(m));\n }\n });\n\n return () => null;\n },\n});\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MouseManipulatorTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MouseManipulatorTool.vue?vue&type=script&lang=ts&\"","\nimport { CreateElement, RenderContext } from 'vue';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport vtkMouseCameraTrackballPanManipulator from '@kitware/vtk.js/Interaction/Manipulators/MouseCameraTrackballPanManipulator';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport MouseManipulatorTool from './MouseManipulatorTool.vue';\n\ninterface Props {\n viewProxy: vtkViewProxy;\n}\n\nexport default {\n functional: true,\n render(h: CreateElement, ctx: RenderContext<Props>) {\n const toolStore = useToolStore();\n const toolOptions = [];\n toolOptions.push({ button: 2 });\n toolOptions.push({ button: 1, shift: true });\n if (toolStore.currentTool === Tools.Pan) {\n // Additionally enable left-button-only action if Pan tool is active\n toolOptions.push({ button: 1 });\n }\n\n return h(MouseManipulatorTool, {\n props: {\n ...ctx.props,\n name: 'PanTool',\n manipulatorClass: vtkMouseCameraTrackballPanManipulator,\n options: toolOptions,\n },\n });\n },\n};\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PanTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PanTool.vue?vue&type=script&lang=ts&\"","\nimport { CreateElement, RenderContext } from 'vue';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport vtkMouseCameraTrackballZoomToMouseManipulator from '@kitware/vtk.js/Interaction/Manipulators/MouseCameraTrackballZoomToMouseManipulator';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport MouseManipulatorTool from './MouseManipulatorTool.vue';\n\ninterface Props {\n viewProxy: vtkViewProxy;\n}\n\nexport default {\n functional: true,\n render(h: CreateElement, ctx: RenderContext<Props>) {\n const toolStore = useToolStore();\n const toolOptions = [];\n toolOptions.push({ button: 3, flipDirection: true });\n toolOptions.push({ button: 1, control: true, flipDirection: true });\n if (toolStore.currentTool === Tools.Zoom) {\n // Additionally enable left-button-only action if Zoom tool is active\n toolOptions.push({ button: 1, flipDirection: true });\n }\n\n return h(MouseManipulatorTool, {\n props: {\n ...ctx.props,\n name: 'ZoomTool',\n manipulatorClass: vtkMouseCameraTrackballZoomToMouseManipulator,\n options: toolOptions,\n },\n });\n },\n};\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ZoomTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ZoomTool.vue?vue&type=script&lang=ts&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overlay-no-events\"},[_c('svg',{staticClass:\"overlay-no-events\"},_vm._l((_vm.rulers),function(ruler){return _c('RulerSVG2D',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.slice === ruler.slice),expression:\"slice === ruler.slice\"}],key:ruler.id,attrs:{\"view-id\":_vm.viewId,\"point1\":ruler.firstPoint,\"point2\":ruler.secondPoint,\"color\":ruler.color,\"length\":ruler.length}})}),1),_c('div',_vm._l((_vm.rulers),function(ruler){return _c('RulerWidget2D',{key:ruler.id,attrs:{\"ruler-id\":ruler.id,\"slice\":_vm.slice,\"view-id\":_vm.viewId,\"view-direction\":_vm.viewDirection,\"focused\":ruler.focused,\"widget-manager\":_vm.widgetManager},on:{\"contextmenu\":function($event){return _vm.openContextMenu(ruler.id, $event)}}})}),1),_c('v-menu',{attrs:{\"position-x\":_vm.contextMenu.x,\"position-y\":_vm.contextMenu.y,\"absolute\":\"\",\"offset-y\":\"\",\"close-on-click\":\"\",\"close-on-content-click\":\"\"},model:{value:(_vm.contextMenu.show),callback:function ($$v) {_vm.$set(_vm.contextMenu, \"show\", $$v)},expression:\"contextMenu.show\"}},[_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-list-item',{on:{\"click\":_vm.deleteRulerFromContextMenu}},[_c('v-list-item-title',[_vm._v(\"Delete\")])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport { useRulerStore } from '@/src/store/tools/rulers';\nimport { vtkRulerViewWidget } from '@/src/vtk/RulerWidget';\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n onMounted,\n PropType,\n ref,\n toRefs,\n watch,\n watchEffect,\n} from '@vue/composition-api';\nimport vtkPlaneManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { updatePlaneManipulatorFor2DView } from '@/src/utils/manipulators';\nimport { vtkSubscription } from '@kitware/vtk.js/interfaces';\nimport { getCSSCoordinatesFromEvent } from '@/src/utils/vtk-helpers';\nimport { LPSAxisDir } from '@/src/types/lps';\n\nexport default defineComponent({\n name: 'RulerWidget2D',\n props: {\n rulerId: {\n type: String,\n required: true,\n },\n widgetManager: {\n type: Object as PropType<vtkWidgetManager>,\n required: true,\n },\n viewId: {\n type: String,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n slice: {\n type: Number,\n required: true,\n },\n focused: Boolean,\n },\n setup(props, { emit }) {\n const {\n rulerId: rulerIDRef,\n widgetManager: widgetManagerRef,\n viewDirection,\n focused,\n slice,\n } = toRefs(props);\n const rulerStore = useRulerStore();\n const factoryRef = computed(() =>\n rulerStore.getVTKFactory(rulerIDRef.value)\n );\n const widgetRef = ref<vtkRulerViewWidget | null>(null);\n const rulerRef = computed(() => rulerStore.rulers[rulerIDRef.value]);\n\n onMounted(() => {\n if (!factoryRef.value) {\n throw new Error(\n `No widget exists for ruler with ID ${rulerIDRef.value}`\n );\n }\n const widgetManager = widgetManagerRef.value;\n const factory = factoryRef.value;\n\n widgetRef.value = widgetManager.addWidget(factory) as vtkRulerViewWidget;\n });\n\n // --- right click handling --- //\n\n let rightClickSub: vtkSubscription | null = null;\n\n onMounted(() => {\n rightClickSub = widgetRef.value!.onRightClickEvent((eventData) => {\n const coords = getCSSCoordinatesFromEvent(eventData);\n if (coords) {\n emit('contextmenu', coords);\n }\n });\n });\n\n onBeforeUnmount(() => {\n if (rightClickSub) {\n rightClickSub.unsubscribe();\n rightClickSub = null;\n }\n });\n\n // --- manipulator --- //\n\n const manipulator = vtkPlaneManipulator.newInstance();\n\n onMounted(() => {\n widgetRef.value!.setManipulator(manipulator);\n });\n\n const { currentImageMetadata } = useCurrentImage();\n\n watchEffect(() => {\n updatePlaneManipulatorFor2DView(\n manipulator,\n viewDirection.value,\n rulerRef.value.slice ?? slice.value,\n currentImageMetadata.value\n );\n });\n\n // --- focus --- //\n\n watchEffect(() => {\n const widgetManager = widgetManagerRef.value;\n const widget = widgetRef.value;\n if (focused.value) {\n widgetManager.grabFocus(widget!);\n } else {\n // TODO unfocus the specific widget; necessary?\n }\n });\n\n onBeforeUnmount(() => {\n const widgetManager = widgetManagerRef.value;\n const widget = widgetRef.value;\n widgetManager.removeWidget(widget!);\n });\n\n // --- visibility --- //\n\n watch(\n () => {\n const rulerSlice = rulerRef.value.slice;\n const curSlice = slice.value;\n return !Number.isInteger(rulerSlice) || rulerSlice === curSlice;\n },\n (visible) => {\n widgetRef.value!.setVisibility(visible);\n }\n );\n\n onMounted(() => {\n // hide handle visibility\n widgetRef.value!.setHandleVisibility(false);\n widgetManagerRef.value.renderWidgets();\n });\n\n return () => null;\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RulerWidget2D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RulerWidget2D.vue?vue&type=script&lang=ts&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('g',{ref:\"containerEl\"},[(_vm.first && _vm.second)?_c('line',{attrs:{\"x1\":_vm.first.x,\"y1\":_vm.first.y,\"x2\":_vm.second.x,\"y2\":_vm.second.y,\"stroke\":_vm.color,\"stroke-width\":\"1\"}}):_vm._e(),(_vm.first)?_c('circle',{attrs:{\"cx\":_vm.first.x,\"cy\":_vm.first.y,\"stroke\":_vm.color,\"stroke-width\":\"1\",\"fill\":\"transparent\",\"r\":10 / _vm.devicePixelRatio}}):_vm._e(),(_vm.second)?_c('circle',{staticClass:\"handle\",attrs:{\"cx\":_vm.second.x,\"cy\":_vm.second.y,\"stroke\":_vm.color,\"stroke-width\":\"1\",\"fill\":\"transparent\",\"r\":10 / _vm.devicePixelRatio}}):_vm._e(),(_vm.second)?_c('text',{attrs:{\"x\":_vm.second.x,\"y\":_vm.second.y,\"dx\":_vm.textdx,\"dy\":_vm.textdy,\"text-anchor\":_vm.anchor,\"stroke-width\":\"0.75\",\"stroke\":\"black\",\"fill\":_vm.color,\"font-size\":(_vm.textSize + \"px\"),\"font-weight\":\"bold\"}},[_vm._v(\" \"+_vm._s(_vm.rulerLength)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { useResizeObserver } from '@/src/composables/useResizeObserver';\nimport { useVTKCallback } from '@/src/composables/useVTKCallback';\nimport { useViewStore } from '@/src/store/views';\nimport { worldToSVG } from '@/src/utils/vtk-helpers';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport {\n PropType,\n computed,\n defineComponent,\n toRefs,\n unref,\n ref,\n watch,\n} from '@vue/composition-api';\n\ntype SVGPoint = {\n x: number;\n y: number;\n};\n\nexport default defineComponent({\n props: {\n point1: Array as PropType<Array<number>>,\n point2: Array as PropType<Array<number>>,\n color: String,\n length: Number,\n viewId: {\n type: String,\n required: true,\n },\n textOffset: {\n type: Number,\n default: 8,\n },\n textSize: {\n type: Number,\n default: 14,\n },\n },\n setup(props) {\n const {\n viewId: viewID,\n point1,\n point2,\n textOffset,\n length,\n } = toRefs(props);\n const firstPoint = ref<SVGPoint | null>();\n const secondPoint = ref<SVGPoint | null>();\n\n const viewStore = useViewStore();\n\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView2DProxy>(viewID.value)!\n );\n\n const updatePoints = () => {\n const viewRenderer = viewProxy.value.getRenderer();\n const pt1 = unref(point1) as Vector3 | undefined;\n const pt2 = unref(point2) as Vector3 | undefined;\n if (pt1) {\n const point2D = worldToSVG(pt1, viewRenderer);\n if (point2D) {\n firstPoint.value = {\n x: point2D[0],\n y: point2D[1],\n };\n }\n }\n if (pt2) {\n const point2D = worldToSVG(pt2, viewRenderer);\n if (point2D) {\n secondPoint.value = {\n x: point2D[0],\n y: point2D[1],\n };\n }\n }\n };\n\n const cameraOnModified = useVTKCallback(\n computed(() => viewProxy.value.getCamera().onModified)\n );\n cameraOnModified(updatePoints);\n\n watch([viewProxy, point1, point2], updatePoints, {\n deep: true,\n immediate: true,\n });\n\n const textProperties = computed(() => {\n const first = unref(firstPoint);\n const second = unref(secondPoint);\n const offset = textOffset.value;\n if (!first || !second) {\n return null;\n }\n if (second.x > first.x) {\n return { dx: offset, dy: -offset, anchor: 'start' };\n }\n return { dx: -offset, dy: -offset, anchor: 'end' };\n });\n\n // --- resize --- //\n\n const containerEl = ref<Element | null>(null);\n\n useResizeObserver(containerEl, () => {\n updatePoints();\n });\n\n return {\n devicePixelRatio,\n textdx: computed(() => textProperties.value?.dx ?? 0),\n textdy: computed(() => textProperties.value?.dy ?? 0),\n anchor: computed(() => textProperties.value?.anchor ?? 'start'),\n first: firstPoint,\n second: secondPoint,\n rulerLength: computed(() => length?.value?.toFixed(2) ?? ''),\n containerEl,\n };\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RulerSVG2D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RulerSVG2D.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RulerSVG2D.vue?vue&type=template&id=2f8db33c&scoped=true&\"\nimport script from \"./RulerSVG2D.vue?vue&type=script&lang=ts&\"\nexport * from \"./RulerSVG2D.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./RulerSVG2D.vue?vue&type=style&index=0&id=2f8db33c&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2f8db33c\",\n null\n \n)\n\nexport default component.exports","import { vtkSubscription } from '@kitware/vtk.js/interfaces';\nimport macro from '@kitware/vtk.js/macro';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport { InteractionState, RulerPointWidgetState } from './state';\n\nexport function shouldIgnoreEvent(e: any) {\n return e.altKey || e.controlKey || e.shiftKey;\n}\n\nexport default function widgetBehavior(publicAPI: any, model: any) {\n model.classHierarchy.push('vtkRulerWidgetProp');\n\n const superClass = { ...publicAPI };\n\n const subscriptions: vtkSubscription[] = [];\n let dragging: RulerPointWidgetState | null = null;\n\n // support setting per-view widget manipulators\n macro.setGet(publicAPI, model, ['manipulator']);\n // support forwarding events\n macro.event(publicAPI, model, 'RightClickEvent');\n\n publicAPI.setFirstPoint = (coord: Vector3) => {\n const point = model.widgetState.getFirstPoint();\n point.setOrigin(coord);\n };\n\n publicAPI.setSecondPoint = (coord: Vector3) => {\n const point = model.widgetState.getSecondPoint();\n point.setOrigin(coord);\n };\n\n /**\n * Places or drags a point.\n */\n publicAPI.handleLeftButtonPress = (eventData: any) => {\n if (!model.manipulator || shouldIgnoreEvent(eventData)) {\n return macro.VOID;\n }\n\n const intState = model.widgetState.getInteractionState();\n\n // in order to place points, we should be...\n if (\n // focused\n model.hasFocus &&\n // not be settled\n intState !== InteractionState.Settled\n ) {\n const worldCoords = model.manipulator.handleEvent(\n eventData,\n model._apiSpecificRenderWindow\n );\n if (worldCoords.length) {\n if (intState === InteractionState.PlacingFirst) {\n publicAPI.setFirstPoint(worldCoords);\n model.widgetState.setInteractionState(InteractionState.PlacingSecond);\n } else if (intState === InteractionState.PlacingSecond) {\n publicAPI.setSecondPoint(worldCoords);\n model.widgetState.setInteractionState(InteractionState.Settled);\n }\n publicAPI.invokeInteractionEvent();\n return macro.EVENT_ABORT;\n }\n }\n\n // widget is considered settled, so see if we\n // are trying to drag a point.\n if (model.activeState?.getActive() && model.pickable) {\n dragging = model.activeState;\n model._apiSpecificRenderWindow.setCursor('grabbing');\n model._interactor.requestAnimation(publicAPI);\n publicAPI.invokeStartInteractionEvent();\n return macro.EVENT_ABORT;\n }\n\n return macro.VOID;\n };\n\n /**\n * Moves a point around.\n */\n publicAPI.handleMouseMove = (eventData: any) => {\n const intState = model.widgetState.getInteractionState();\n\n if (model.hasFocus && intState === InteractionState.Settled) {\n publicAPI.loseFocus();\n return macro.VOID;\n }\n\n if (\n dragging || // moving an existing point\n intState !== InteractionState.Settled // placing a point\n ) {\n const worldCoords = model.manipulator.handleEvent(\n eventData,\n model._apiSpecificRenderWindow\n );\n\n if (worldCoords.length) {\n if (dragging) {\n dragging.setOrigin(worldCoords);\n } else if (intState === InteractionState.PlacingFirst) {\n model.widgetState.getFirstPoint().setVisible(true);\n publicAPI.setFirstPoint(worldCoords);\n } else if (intState === InteractionState.PlacingSecond) {\n model.widgetState.getSecondPoint().setVisible(true);\n publicAPI.setSecondPoint(worldCoords);\n }\n publicAPI.invokeInteractionEvent();\n }\n\n return macro.EVENT_ABORT;\n }\n\n return macro.VOID;\n };\n\n /**\n * Finishes dragging\n */\n publicAPI.handleLeftButtonRelease = (eventData: any) => {\n if (dragging) {\n const worldCoords = model.manipulator.handleEvent(\n eventData,\n model._apiSpecificRenderWindow\n );\n if (worldCoords.length) {\n dragging.setOrigin(worldCoords);\n }\n\n dragging = null;\n model._apiSpecificRenderWindow.setCursor('pointer');\n model.widgetState.deactivate();\n model._interactor.cancelAnimation(publicAPI);\n publicAPI.invokeEndInteractionEvent();\n // model._widgetManager.enablePicking();\n // model._interactor.render();\n }\n };\n\n publicAPI.handleRightButtonPress = (eventData: any) => {\n if (\n shouldIgnoreEvent(eventData) ||\n model.widgetState.getInteractionState() !== InteractionState.Settled || // ignore when still placing\n !model.activeState?.getActive() || // ignore when no selected state\n model.hasFocus || // ignore when focused\n dragging // ignore when dragging\n ) {\n return macro.VOID;\n }\n publicAPI.invokeRightClickEvent(eventData);\n return macro.EVENT_ABORT;\n };\n\n publicAPI.grabFocus = () => {\n if (\n !model.hasFocus &&\n // only allow focus if placing points\n model.widgetState.getInteractionState() !== InteractionState.Settled\n ) {\n model.hasFocus = true;\n // render the (invisible) point handles\n model._interactor.requestAnimation(publicAPI);\n publicAPI.invokeStartInteractionEvent();\n }\n };\n\n publicAPI.loseFocus = () => {\n if (model.hasFocus) {\n model._interactor.cancelAnimation(publicAPI);\n publicAPI.invokeEndInteractionEvent();\n }\n model.hasFocus = false;\n // model._widgetManager.enablePicking();\n // model._interactor.render();\n };\n\n publicAPI.delete = () => {\n superClass.delete();\n while (subscriptions.length) {\n subscriptions.pop()!.unsubscribe();\n }\n };\n}\n","import macro from '@kitware/vtk.js/macro';\nimport vtkAbstractWidgetFactory from '@kitware/vtk.js/Widgets/Core/AbstractWidgetFactory';\nimport vtkPlanePointManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport vtkSphereHandleRepresentation from '@kitware/vtk.js/Widgets/Representations/SphereHandleRepresentation';\nimport { distance2BetweenPoints } from '@kitware/vtk.js/Common/Core/Math';\n\nimport widgetBehavior from './behavior';\nimport stateGenerator from './state';\n\nexport { shouldIgnoreEvent } from './behavior';\n\n// ----------------------------------------------------------------------------\n// Factory\n// ----------------------------------------------------------------------------\n\nfunction vtkRulerWidget(publicAPI, model) {\n model.classHierarchy.push('vtkRulerWidget');\n\n // --- Widget Requirement ---------------------------------------------------\n\n // model.methodsToLink = [\n // 'activeScaleFactor',\n // 'activeColor',\n // 'useActiveColor',\n // 'glyphResolution',\n // 'defaultScale',\n // 'text',\n // 'textStateIndex',\n // ];\n\n publicAPI.getRepresentationsForViewType = () => [\n {\n builder: vtkSphereHandleRepresentation,\n labels: ['points'],\n initialValues: {\n scaleInPixels: true,\n },\n },\n ];\n\n publicAPI.getLength = () => {\n const first = model.widgetState.getFirstPoint().getOrigin();\n const second = model.widgetState.getSecondPoint().getOrigin();\n if (!first || !second) {\n return 0;\n }\n return Math.sqrt(distance2BetweenPoints(first, second));\n };\n\n // Default manipulator\n model.manipulator = vtkPlanePointManipulator.newInstance();\n}\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkAbstractWidgetFactory.extend(publicAPI, model, {\n ...initialValues,\n behavior: widgetBehavior,\n widgetState: stateGenerator(),\n });\n macro.get(publicAPI, model, ['manipulator']);\n\n vtkRulerWidget(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkRulerWidget');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n computed,\n defineComponent,\n PropType,\n reactive,\n toRefs,\n watch,\n} from '@vue/composition-api';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport { useRulerStore } from '@/src/store/tools/rulers';\nimport { getLPSAxisFromDir } from '@/src/utils/lps';\nimport RulerWidget2D from '@/src/components/tools/ruler/RulerWidget2D.vue';\nimport RulerSVG2D from '@/src/components/tools/ruler/RulerSVG2D.vue';\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport { EVENT_ABORT, VOID } from '@kitware/vtk.js/macros';\nimport { shouldIgnoreEvent } from '@/src/vtk/RulerWidget';\nimport { useViewStore } from '@/src/store/views';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport { Vector2 } from '@kitware/vtk.js/types';\nimport { LPSAxisDir } from '@/src/types/lps';\nimport { useVTKCallback } from '@/src/composables/useVTKCallback';\n\nexport default defineComponent({\n name: 'RulerTool',\n props: {\n viewId: {\n type: String,\n required: true,\n },\n slice: {\n type: Number,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n widgetManager: {\n type: Object as PropType<vtkWidgetManager>,\n required: true,\n },\n },\n components: {\n RulerWidget2D,\n RulerSVG2D,\n },\n setup(props) {\n const { viewId: viewID, viewDirection } = toRefs(props);\n const viewStore = useViewStore();\n const toolStore = useToolStore();\n const rulerStore = useRulerStore();\n\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView2DProxy>(viewID.value)!\n );\n\n const { currentImageID } = useCurrentImage();\n const active = computed(() => toolStore.currentTool === Tools.Ruler);\n const activeRulerID = computed(() => rulerStore.activeRulerID);\n const viewAxis = computed(() => getLPSAxisFromDir(viewDirection.value));\n\n // --- context menu --- //\n\n const contextMenu = reactive({\n show: false,\n x: 0,\n y: 0,\n forRulerID: '',\n });\n\n const openContextMenu = (rulerID: string, displayXY: Vector2) => {\n [contextMenu.x, contextMenu.y] = displayXY;\n contextMenu.show = true;\n contextMenu.forRulerID = rulerID;\n };\n\n const deleteRulerFromContextMenu = () => {\n rulerStore.removeRuler(contextMenu.forRulerID);\n };\n\n // --- ruler lifecycle --- //\n\n const deleteActiveRuler = () => {\n rulerStore.removeActiveRuler();\n };\n\n const startNewRuler = (eventData: any) => {\n if (!active.value || contextMenu.show || shouldIgnoreEvent(eventData)) {\n return VOID;\n }\n rulerStore.addNewRulerFromViewEvent(eventData, viewID.value);\n return EVENT_ABORT;\n };\n\n // We don't create a ruler until we receive a click, so\n // the button press listener must be here rather than in\n // the widget itself.\n // We may support configuring which mouse button triggers this tool\n // in the future.\n const onLeftButtonPress = useVTKCallback(\n computed(() => viewProxy.value.getInteractor().onLeftButtonPress)\n );\n onLeftButtonPress(startNewRuler);\n\n // delete active ruler if slice changes\n watch(\n () => props.slice,\n () => {\n deleteActiveRuler();\n }\n );\n\n // --- ruler data --- //\n\n const currentRulers = computed(() => {\n const { rulers: rulerByID, lengthByID } = rulerStore;\n const curImageID = currentImageID.value;\n const isToolActive = active.value;\n const curViewAxis = viewAxis.value;\n const curActiveRulerID = activeRulerID.value;\n\n return rulerStore.rulerIDs\n .map((id) => ({ id, ruler: rulerByID[id] }))\n .filter(({ ruler }) => {\n // only show rulers for the current image and the current view\n return (\n ruler.imageID === curImageID &&\n (!ruler.viewAxis || ruler.viewAxis === curViewAxis)\n );\n })\n .map(({ id, ruler }) => {\n return {\n id,\n firstPoint: ruler.firstPoint,\n secondPoint: ruler.secondPoint,\n color: ruler.color,\n slice: ruler.slice,\n length: lengthByID[id],\n focused: isToolActive && curActiveRulerID === id,\n };\n });\n });\n\n return {\n rulers: currentRulers,\n contextMenu,\n openContextMenu,\n deleteRulerFromContextMenu,\n };\n },\n});\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RulerTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RulerTool.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RulerTool.vue?vue&type=template&id=6654b00b&scoped=true&\"\nimport script from \"./RulerTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./RulerTool.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=6654b00b&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6654b00b\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\ninstallComponents(component, {VList,VListItem,VListItemTitle,VMenu})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overlay-no-events\"},[(_vm.active)?_c('PaintWidget2D',{attrs:{\"slice\":_vm.slice,\"view-id\":_vm.viewId,\"view-direction\":_vm.viewDirection,\"widget-manager\":_vm.widgetManager}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render, staticRenderFns\nimport script from \"./PaintWidget2D.vue?vue&type=script&lang=ts&\"\nexport * from \"./PaintWidget2D.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n onMounted,\n onUnmounted,\n PropType,\n ref,\n toRefs,\n watchEffect,\n} from '@vue/composition-api';\nimport vtkPlaneManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport { getLPSAxisFromDir } from '@/src/utils/lps';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { updatePlaneManipulatorFor2DView } from '@/src/utils/manipulators';\nimport { vtkSubscription } from '@kitware/vtk.js/interfaces';\nimport { usePaintToolStore } from '@/src/store/tools/paint';\nimport { vtkPaintViewWidget } from '@/src/vtk/PaintWidget';\nimport { useViewStore } from '@/src/store/views';\nimport { PaintWidgetState } from '@/src/vtk/PaintWidget/state';\nimport { vec3 } from 'gl-matrix';\nimport { manageVTKSubscription } from '@/src/composables/manageVTKSubscription';\nimport { LPSAxisDir } from '@/src/types/lps';\n\nexport default defineComponent({\n name: 'PaintWidget2D',\n props: {\n widgetManager: {\n type: Object as PropType<vtkWidgetManager>,\n required: true,\n },\n viewId: {\n type: String,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n slice: {\n type: Number,\n required: true,\n },\n },\n setup(props) {\n const {\n widgetManager: widgetManagerRef,\n viewDirection,\n slice,\n viewId: viewID,\n } = toRefs(props);\n\n const paintStore = usePaintToolStore();\n const factory = paintStore.getWidgetFactory();\n\n const viewStore = useViewStore();\n const viewProxyRef = computed(() => viewStore.getViewProxy(viewID.value));\n\n const widgetRef = ref<vtkPaintViewWidget>();\n\n const { currentImageMetadata } = useCurrentImage();\n const viewAxis = computed(() => getLPSAxisFromDir(viewDirection.value));\n const viewAxisIndex = computed(\n () => currentImageMetadata.value.lpsOrientation[viewAxis.value]\n );\n\n const worldPointToIndex = (worldPoint: vec3) => {\n const { worldToIndex } = currentImageMetadata.value;\n const indexPoint = vec3.create();\n vec3.transformMat4(indexPoint, worldPoint, worldToIndex);\n return indexPoint;\n };\n\n onMounted(() => {\n const widgetManager = widgetManagerRef.value;\n widgetRef.value = widgetManager.addWidget(factory) as vtkPaintViewWidget;\n\n if (!widgetRef.value) {\n throw new Error('[PaintWidget2D] failed to create view widget');\n }\n });\n\n // --- widget representation config --- //\n\n watchEffect(() => {\n const widget = widgetRef.value!;\n const metadata = currentImageMetadata.value;\n const slicingIndex = metadata.lpsOrientation[viewAxis.value];\n if (widget) {\n widget.setSlicingIndex(slicingIndex);\n widget.setIndexToWorld(metadata.indexToWorld);\n widget.setWorldToIndex(metadata.worldToIndex);\n }\n });\n\n // --- interaction --- //\n\n const subs: vtkSubscription[] = [];\n\n onMounted(() => {\n const widget = widgetRef.value!;\n\n subs.push(\n widget.onStartInteractionEvent(() => {\n // start stroke\n const state = widget.getWidgetState() as PaintWidgetState;\n // StartInteraction cannot occur if origin is null.\n const indexPoint = worldPointToIndex(state.getBrush().getOrigin()!);\n paintStore.startStroke(indexPoint, viewAxisIndex.value);\n }),\n widget.onInteractionEvent(() => {\n // register stroke\n const state = widget.getWidgetState() as PaintWidgetState;\n const indexPoint = worldPointToIndex(state.getBrush().getOrigin()!);\n paintStore.placeStrokePoint(indexPoint, viewAxisIndex.value);\n }),\n widget.onEndInteractionEvent(() => {\n // end stroke\n const state = widget.getWidgetState() as PaintWidgetState;\n const indexPoint = worldPointToIndex(state.getBrush().getOrigin()!);\n paintStore.endStroke(indexPoint, viewAxisIndex.value);\n })\n );\n });\n\n onUnmounted(() => {\n while (subs.length) {\n subs.pop()!.unsubscribe();\n }\n });\n\n // --- manipulator --- //\n\n const manipulator = vtkPlaneManipulator.newInstance();\n\n onMounted(() => {\n widgetRef.value!.setManipulator(manipulator);\n });\n\n watchEffect(() => {\n updatePlaneManipulatorFor2DView(\n manipulator,\n viewDirection.value,\n slice.value,\n currentImageMetadata.value\n );\n });\n\n // --- visibility --- //\n\n onMounted(() => {\n widgetRef.value!.setVisibility(false);\n });\n\n manageVTKSubscription(\n viewProxyRef.value!.getInteractor().onMouseEnter(() => {\n const widget = widgetRef.value;\n if (widget) {\n paintStore.setSliceAxis(viewAxisIndex.value);\n widget.setVisibility(true);\n }\n })\n );\n\n manageVTKSubscription(\n viewProxyRef.value!.getInteractor().onMouseLeave(() => {\n const widget = widgetRef.value;\n if (widget) {\n widget.setVisibility(false);\n }\n })\n );\n\n // --- focus and rendering --- //\n\n onMounted(() => {\n const widgetManager = widgetManagerRef.value;\n widgetManager.renderWidgets();\n widgetManager.grabFocus(widgetRef.value!);\n });\n\n onBeforeUnmount(() => {\n widgetManagerRef.value.removeWidget(widgetRef.value!);\n widgetManagerRef.value.releaseFocus();\n });\n\n return () => null;\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PaintWidget2D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PaintWidget2D.vue?vue&type=script&lang=ts&\"","\n\n\n\n\n\n\n\n\n\n\n\n\nimport { computed, defineComponent, PropType } from '@vue/composition-api';\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport { usePaintToolStore } from '@/src/store/tools/paint';\nimport { LPSAxisDir } from '@/src/types/lps';\nimport PaintWidget2D from './paint/PaintWidget2D.vue';\n\nexport default defineComponent({\n name: 'PaintTool',\n props: {\n viewId: {\n type: String,\n required: true,\n },\n slice: {\n type: Number,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n widgetManager: {\n type: Object as PropType<vtkWidgetManager>,\n required: true,\n },\n },\n components: {\n PaintWidget2D,\n },\n setup() {\n const paintStore = usePaintToolStore();\n const active = computed(() => paintStore.isActive);\n\n return {\n active,\n };\n },\n});\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PaintTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PaintTool.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./PaintTool.vue?vue&type=template&id=0c176b9e&scoped=true&\"\nimport script from \"./PaintTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./PaintTool.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=0c176b9e&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0c176b9e\",\n null\n \n)\n\nexport default component.exports","import vtkAbstractRepresentationProxy from '@kitware/vtk.js/Proxy/Core/AbstractRepresentationProxy';\nimport { computed, Ref, watch } from '@vue/composition-api';\nimport { useViewStore } from '../store/views';\nimport { vtkLPSViewProxy } from '../types/vtk-types';\n\ninterface Scene {\n baseImage?: Ref<string | null>;\n labelmaps?: Ref<string[]>;\n models?: Ref<string[]>;\n}\n\ntype RepProxy = vtkAbstractRepresentationProxy;\n\nexport function useSceneBuilder<\n BaseImageType extends RepProxy = RepProxy,\n LabelMapType extends RepProxy = RepProxy,\n ModelType extends RepProxy = RepProxy\n>(viewID: Ref<string>, sceneIDs: Scene) {\n const viewStore = useViewStore();\n const viewProxy = computed(() =>\n viewStore.getViewProxy<vtkLPSViewProxy>(viewID.value)\n );\n\n const baseImageRep = computed(() => {\n const _viewID = viewID.value;\n if (sceneIDs.baseImage) {\n const imageID = sceneIDs.baseImage.value;\n if (imageID) {\n return viewStore.getDataRepresentationForView<BaseImageType>(\n imageID,\n _viewID\n );\n }\n }\n return null;\n });\n\n const labelmapReps = computed(() => {\n const _viewID = viewID.value;\n if (sceneIDs.labelmaps) {\n const labelmapIDs = sceneIDs.labelmaps.value;\n if (labelmapIDs) {\n return labelmapIDs\n .map((id) =>\n viewStore.getDataRepresentationForView<LabelMapType>(id, _viewID)\n )\n .filter(Boolean) as LabelMapType[];\n }\n }\n return [];\n });\n\n const modelReps = computed(() => {\n const _viewID = viewID.value;\n if (sceneIDs.models) {\n const modelIDs = sceneIDs.models.value;\n if (modelIDs) {\n return modelIDs\n .map((id) =>\n viewStore.getDataRepresentationForView<ModelType>(id, _viewID)\n )\n .filter(Boolean) as ModelType[];\n }\n }\n return [];\n });\n\n watch(\n [viewProxy, baseImageRep, labelmapReps, modelReps],\n ([view, baseRep, lmReps, mReps]) => {\n if (!view) {\n throw new Error('[useSceneBuilder] No view available');\n }\n\n view.removeAllRepresentations();\n\n if (baseRep) {\n // we control the color mapping range manually\n baseRep.setRescaleOnColorBy(false);\n view.addRepresentation(baseRep);\n }\n lmReps.forEach((rep) => view.addRepresentation(rep));\n mReps.forEach((rep) => view.addRepresentation(rep));\n\n // TODO not sure why I need this, but might as well keep\n // the renderer up to date.\n // For reference, this doesn't get invoked when resetting the\n // camera with a supplied bounds, so we manually invoke it here.\n view.getRenderer().computeVisiblePropBounds();\n view.render();\n },\n { deep: true, immediate: true }\n );\n\n return { baseImageRep, labelmapReps, modelReps };\n}\n","import { manageVTKSubscription } from '@src/composables/manageVTKSubscription';\nimport { Ref } from '@vue/composition-api';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport { useViewConfigStore } from '../store/view-configs';\nimport { CameraConfig } from '../store/view-configs/types';\n\nexport function usePersistCameraConfig(\n viewID: Ref<string>,\n dataID: Ref<string | null>,\n viewProxy: Ref<vtkViewProxy>,\n ...toPersist: (keyof CameraConfig)[]\n) {\n const viewConfigStore = useViewConfigStore();\n let persistCameraConfig = true;\n\n // We setup this list of functions to avoid if and indexOf in the onModified\n // call.\n const persist: (() => void)[] = [];\n\n if (toPersist.indexOf('position') > -1) {\n persist.push(() => {\n if (dataID.value !== null && persistCameraConfig) {\n viewConfigStore.updateCameraConfig(viewID.value, dataID.value, {\n position: viewProxy.value.getCamera().getPosition(),\n });\n }\n });\n }\n if (toPersist.indexOf('viewUp') > -1) {\n persist.push(() => {\n if (dataID.value !== null && persistCameraConfig) {\n viewConfigStore.updateCameraConfig(viewID.value, dataID.value, {\n viewUp: viewProxy.value.getCamera().getViewUp(),\n });\n }\n });\n }\n if (toPersist.indexOf('focalPoint') > -1) {\n persist.push(() => {\n if (dataID.value !== null && persistCameraConfig) {\n viewConfigStore.updateCameraConfig(viewID.value, dataID.value, {\n focalPoint: viewProxy.value.getCamera().getFocalPoint(),\n });\n }\n });\n }\n if (toPersist.indexOf('directionOfProjection') > -1) {\n persist.push(() => {\n if (dataID.value !== null && persistCameraConfig) {\n viewConfigStore.updateCameraConfig(viewID.value, dataID.value, {\n directionOfProjection: viewProxy.value\n .getCamera()\n .getDirectionOfProjection(),\n });\n }\n });\n }\n if (toPersist.indexOf('parallelScale') > -1) {\n persist.push(() => {\n if (dataID.value !== null && persistCameraConfig) {\n viewConfigStore.updateCameraConfig(viewID.value, dataID.value, {\n parallelScale: viewProxy.value.getCamera().getParallelScale(),\n });\n }\n });\n }\n\n manageVTKSubscription(\n viewProxy.value.getCamera().onModified(() => {\n persist.forEach((persistFunc) => persistFunc());\n })\n );\n\n function blockPersistingCameraConfig(func: () => void) {\n persistCameraConfig = false;\n try {\n func();\n } finally {\n persistCameraConfig = true;\n }\n }\n\n function restoreCameraConfig(cameraConfig: CameraConfig) {\n blockPersistingCameraConfig(() => {\n toPersist.forEach((key: keyof CameraConfig) => {\n // Parallel scale\n if (key === 'parallelScale' && cameraConfig.parallelScale) {\n viewProxy.value\n .getCamera()\n .setParallelScale(cameraConfig.parallelScale);\n }\n // Position\n else if (key === 'position' && cameraConfig.position) {\n const { position } = cameraConfig;\n viewProxy.value\n .getCamera()\n .setPosition(position[0], position[1], position[2]);\n }\n // Focal point\n else if (key === 'focalPoint' && cameraConfig.focalPoint) {\n const { focalPoint } = cameraConfig;\n viewProxy.value\n .getCamera()\n .setFocalPoint(focalPoint[0], focalPoint[1], focalPoint[2]);\n viewProxy.value\n .getInteractorStyle2D()\n .setCenterOfRotation([...focalPoint]);\n viewProxy.value\n .getInteractorStyle3D()\n .setCenterOfRotation([...focalPoint]);\n }\n // Direction of projection\n else if (\n key === 'directionOfProjection' &&\n cameraConfig.directionOfProjection\n ) {\n const { directionOfProjection } = cameraConfig;\n viewProxy.value\n .getCamera()\n .setDirectionOfProjection(\n directionOfProjection[0],\n directionOfProjection[1],\n directionOfProjection[2]\n );\n }\n // View up\n else if (key === 'viewUp' && cameraConfig.viewUp) {\n const { viewUp } = cameraConfig;\n viewProxy.value\n .getCamera()\n .setViewUp(viewUp[0], viewUp[1], viewUp[2]);\n }\n });\n });\n }\n\n return { restoreCameraConfig };\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.active)?_c('div',{staticClass:\"overlay-no-events\"},[_c('svg',{staticClass:\"overlay-no-events\"},[_c('CrosshairSVG2D',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isVisible),expression:\"isVisible\"}],attrs:{\"view-id\":_vm.viewId,\"position\":_vm.position}})],1),_c('CrosshairsWidget2D',{attrs:{\"slice\":_vm.slice,\"view-id\":_vm.viewId,\"view-direction\":_vm.viewDirection,\"widget-manager\":_vm.widgetManager}})],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render, staticRenderFns\nimport script from \"./CrosshairsWidget2D.vue?vue&type=script&lang=ts&\"\nexport * from \"./CrosshairsWidget2D.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { vtkObject } from '@kitware/vtk.js/interfaces';\nimport vtkAbstractRepresentationProxy from '@kitware/vtk.js/Proxy/Core/AbstractRepresentationProxy';\nimport vtkProxyManager from '@kitware/vtk.js/Proxy/Core/ProxyManager';\nimport vtkSourceProxy from '@kitware/vtk.js/Proxy/Core/SourceProxy';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport vtkProxyObject from '../types/vtk-types';\n\n// mapped in proxy.js\nexport enum ViewProxyType {\n Volume = 'View3D',\n Slice = 'View2D',\n}\n\n/**\n * Wrapper around the vtkProxyManager, since we don't need some of\n * its complexities.\n */\nexport default class ProxyWrapper {\n private viewProxies: Map<string, vtkViewProxy>;\n private dataProxies: Map<string, vtkSourceProxy<vtkObject>>;\n private proxyManager: vtkProxyManager;\n\n constructor(proxyManager: vtkProxyManager) {\n this.viewProxies = new Map();\n this.dataProxies = new Map();\n this.proxyManager = proxyManager;\n }\n\n delete() {\n const deleteProxy = (proxy: vtkProxyObject) =>\n this.proxyManager.deleteProxy(proxy);\n\n this.viewProxies.forEach(deleteProxy);\n this.dataProxies.forEach(deleteProxy);\n }\n\n createView(id: string, type: ViewProxyType) {\n if (this.viewProxies.has(id)) {\n throw new Error('Cannot create a view with the same ID');\n }\n\n const proxy = this.proxyManager.createProxy<vtkViewProxy>('Views', type, {\n name: type,\n });\n\n this.viewProxies.set(id, proxy);\n return proxy;\n }\n\n getView<T extends vtkViewProxy>(id: string) {\n return <T | null>this.viewProxies.get(id);\n }\n\n removeView(id: string) {\n const proxy = this.viewProxies.get(id);\n if (proxy) {\n this.proxyManager.deleteProxy(proxy);\n this.viewProxies.delete(id);\n }\n }\n\n addData<T extends vtkObject>(id: string, data: T) {\n if (this.dataProxies.has(id)) {\n return;\n }\n const proxy = this.proxyManager.createProxy<vtkSourceProxy<T>>(\n 'Sources',\n 'TrivialProducer'\n );\n proxy.setInputData(data);\n this.dataProxies.set(id, proxy);\n }\n\n getData<T extends vtkObject>(id: string) {\n return <vtkSourceProxy<T> | null>(this.dataProxies.get(id) ?? null);\n }\n\n getDataRepresentationForView<T extends vtkAbstractRepresentationProxy>(\n dataID: string,\n viewID: string\n ): T | null {\n const dataProxy = this.dataProxies.get(dataID);\n const viewProxy = this.viewProxies.get(viewID);\n if (!dataProxy || !viewProxy) {\n return null;\n }\n\n return this.proxyManager.getRepresentation(dataProxy, viewProxy);\n }\n}\n","\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport {\n defineComponent,\n onBeforeUnmount,\n onMounted,\n PropType,\n ref,\n toRefs,\n watchEffect,\n} from '@vue/composition-api';\nimport vtkPlaneManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport { LPSAxisDir } from '@/src/types/lps';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { updatePlaneManipulatorFor2DView } from '@/src/utils/manipulators';\nimport { vtkCrosshairsViewWidget } from '@/src/vtk/CrosshairsWidget';\nimport { useCrosshairsToolStore } from '@/src/store/tools/crosshairs';\n\nexport default defineComponent({\n name: 'CrosshairsWidget2D',\n props: {\n widgetManager: {\n type: Object as PropType<vtkWidgetManager>,\n required: true,\n },\n viewId: {\n type: String,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n slice: {\n type: Number,\n required: true,\n },\n },\n setup(props) {\n const {\n widgetManager: widgetManagerRef,\n viewDirection,\n slice,\n } = toRefs(props);\n\n const crosshairsStore = useCrosshairsToolStore();\n const factory = crosshairsStore.getWidgetFactory();\n\n const widgetRef = ref<vtkCrosshairsViewWidget>();\n\n const { currentImageMetadata } = useCurrentImage();\n onMounted(() => {\n const widgetManager = widgetManagerRef.value;\n widgetRef.value = widgetManager.addWidget(\n factory\n ) as vtkCrosshairsViewWidget;\n\n if (!widgetRef.value) {\n throw new Error('[PaintWidget2D] failed to create view widget');\n }\n });\n\n // --- manipulator --- //\n\n const manipulator = vtkPlaneManipulator.newInstance();\n\n onMounted(() => {\n widgetRef.value!.setManipulator(manipulator);\n });\n\n watchEffect(() => {\n updatePlaneManipulatorFor2DView(\n manipulator,\n viewDirection.value,\n slice.value,\n currentImageMetadata.value\n );\n });\n\n // --- visibility --- //\n\n onMounted(() => {\n widgetRef.value!.setVisibility(true);\n });\n\n // --- focus and rendering --- //\n\n onMounted(() => {\n const widgetManager = widgetManagerRef.value;\n widgetManager.renderWidgets();\n });\n\n onBeforeUnmount(() => {\n widgetManagerRef.value.removeWidget(widgetRef.value!);\n });\n\n return () => null;\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CrosshairsWidget2D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CrosshairsWidget2D.vue?vue&type=script&lang=ts&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('g',{ref:\"containerEl\"},[(_vm.x != null && _vm.y != null)?_c('line',{attrs:{\"x1\":_vm.x,\"y1\":\"0%\",\"x2\":_vm.x,\"y2\":_vm.y - 8,\"stroke\":\"yellow\",\"stroke-width\":\"1\"}}):_vm._e(),(_vm.x != null && _vm.y != null)?_c('line',{attrs:{\"x1\":_vm.x,\"y1\":_vm.y + 8,\"x2\":_vm.x,\"y2\":\"100%\",\"stroke\":\"yellow\",\"stroke-width\":\"1\"}}):_vm._e(),(_vm.x != null && _vm.y != null)?_c('line',{attrs:{\"x1\":\"0%\",\"y1\":_vm.y,\"x2\":_vm.x - 8,\"y2\":_vm.y,\"stroke\":\"yellow\",\"stroke-width\":\"1\"}}):_vm._e(),(_vm.x != null && _vm.y != null)?_c('line',{attrs:{\"x1\":_vm.x + 8,\"y1\":_vm.y,\"x2\":\"100%\",\"y2\":_vm.y,\"stroke\":\"yellow\",\"stroke-width\":\"1\"}}):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { useResizeObserver } from '@/src/composables/useResizeObserver';\nimport { useVTKCallback } from '@/src/composables/useVTKCallback';\nimport { useViewStore } from '@/src/store/views';\nimport { worldToSVG } from '@/src/utils/vtk-helpers';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport {\n PropType,\n defineComponent,\n toRefs,\n unref,\n ref,\n watchEffect,\n computed,\n} from '@vue/composition-api';\n\ntype SVGPoint = {\n x: number;\n y: number;\n};\n\nexport default defineComponent({\n props: {\n position: Array as PropType<Array<number>>,\n viewId: {\n type: String,\n required: true,\n },\n },\n setup(props) {\n const { viewId: viewID, position } = toRefs(props);\n const position2D = ref<SVGPoint>();\n\n const viewStore = useViewStore();\n\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView2DProxy>(viewID.value)!\n );\n\n const updatePoints = () => {\n const viewRenderer = viewProxy.value.getRenderer();\n const pt = unref(position) as Vector3 | undefined;\n if (pt) {\n const point2D = worldToSVG(pt, viewRenderer);\n if (point2D) {\n position2D.value = {\n x: point2D[0],\n y: point2D[1],\n };\n }\n }\n };\n\n const cameraOnModified = useVTKCallback(\n computed(() => viewProxy.value.getCamera().onModified)\n );\n cameraOnModified(updatePoints);\n\n watchEffect(updatePoints);\n\n // --- resize --- //\n\n const containerEl = ref<Element | null>(null);\n\n useResizeObserver(containerEl, () => {\n updatePoints();\n });\n\n return {\n devicePixelRatio,\n x: computed(() => position2D.value?.x),\n y: computed(() => position2D.value?.y),\n containerEl,\n };\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CrosshairSVG2D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CrosshairSVG2D.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./CrosshairSVG2D.vue?vue&type=template&id=4a5c02a8&scoped=true&\"\nimport script from \"./CrosshairSVG2D.vue?vue&type=script&lang=ts&\"\nexport * from \"./CrosshairSVG2D.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./CrosshairSVG2D.vue?vue&type=style&index=0&id=4a5c02a8&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4a5c02a8\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { storeToRefs } from 'pinia';\nimport {\n computed,\n defineComponent,\n PropType,\n toRefs,\n} from '@vue/composition-api';\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport { getLPSAxisFromDir } from '@/src/utils/lps';\nimport { LPSAxisDir } from '@/src/types/lps';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport { useCrosshairsToolStore } from '@/src/store/tools/crosshairs';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { clampValue } from '@/src/utils';\nimport CrosshairsWidget2D from './crosshairs/CrosshairsWidget2D.vue';\nimport CrosshairSVG2D from './crosshairs/CrosshairSVG2D.vue';\n\nexport default defineComponent({\n name: 'CrosshairsTool',\n props: {\n viewId: {\n type: String,\n required: true,\n },\n slice: {\n type: Number,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n widgetManager: {\n type: Object as PropType<vtkWidgetManager>,\n required: true,\n },\n },\n components: {\n CrosshairsWidget2D,\n CrosshairSVG2D,\n },\n setup(props) {\n const { viewDirection, slice } = toRefs(props);\n\n const toolStore = useToolStore();\n const { position, imagePosition } = storeToRefs(useCrosshairsToolStore());\n\n const { currentImageMetadata } = useCurrentImage();\n const active = computed(() => toolStore.currentTool === Tools.Crosshairs);\n const isVisible = computed(() => {\n const { lpsOrientation, dimensions } = currentImageMetadata.value;\n const axis = getLPSAxisFromDir(viewDirection.value);\n const index = lpsOrientation[axis];\n // Since the image rectangle is inflated by 0.5,\n // clamp to the allowed range for the slice.\n const crosshairsSlice = clampValue(\n imagePosition.value[index],\n 0,\n dimensions[index] - 1\n );\n return Math.round(crosshairsSlice) === slice.value;\n });\n\n return {\n active,\n position,\n isVisible,\n };\n },\n});\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CrosshairsTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CrosshairsTool.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./CrosshairsTool.vue?vue&type=template&id=146cad60&scoped=true&\"\nimport script from \"./CrosshairsTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./CrosshairsTool.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=146cad60&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"146cad60\",\n null\n \n)\n\nexport default component.exports","import vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport { computed, ref, unref, watch } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\nimport { ViewProxyType } from '../core/proxies';\nimport { useViewStore } from '../store/views';\nimport { useVTKCallback } from './useVTKCallback';\n\nexport function useViewProxy<T extends vtkViewProxy = vtkViewProxy>(\n id: MaybeRef<string>,\n type: MaybeRef<ViewProxyType>\n) {\n const viewStore = useViewStore();\n\n const container = ref<HTMLElement | null>(null);\n\n const setContainer = (el: HTMLElement | null | undefined) => {\n container.value = el ?? null;\n };\n\n const viewProxy = computed<T>(() =>\n viewStore.createOrGetViewProxy(unref(id), unref(type))\n );\n\n watch(viewProxy, (curViewProxy, oldViewProxy) => {\n oldViewProxy.setContainer(null);\n curViewProxy.setContainer(container.value);\n });\n\n watch(container, (curContainer) => {\n viewProxy.value.setContainer(curContainer);\n // setContainer doesn't call modified\n viewProxy.value.modified();\n });\n\n return {\n viewProxy,\n setContainer,\n };\n}\n\nfunction onViewProxyModified<T extends vtkViewProxy = vtkViewProxy>(\n viewProxy: MaybeRef<T>,\n callback: () => void\n) {\n const onModified = useVTKCallback(\n computed(() => unref(viewProxy).onModified)\n );\n onModified(callback);\n}\n\nexport function useViewProxyMounted<T extends vtkViewProxy = vtkViewProxy>(\n viewProxy: MaybeRef<T>,\n callback: () => void\n) {\n const mounted = ref(false);\n\n onViewProxyModified(viewProxy, () => {\n mounted.value = !!unref(viewProxy).getContainer();\n });\n\n watch(\n mounted,\n (m) => {\n if (m) callback();\n },\n { immediate: true }\n );\n}\n\nexport function useViewProxyUnmounted<T extends vtkViewProxy = vtkViewProxy>(\n viewProxy: MaybeRef<T>,\n callback: () => void\n) {\n const mounted = ref(false);\n\n onViewProxyModified(viewProxy, () => {\n mounted.value = !!unref(viewProxy).getContainer();\n });\n\n watch(\n mounted,\n (m, prev) => {\n if (prev && !m) callback();\n },\n { immediate: true }\n );\n}\n","import vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';\nimport { CaptureOn } from '@kitware/vtk.js/Widgets/Core/WidgetManager/Constants';\nimport { computed, onUnmounted, Ref, watch } from '@vue/composition-api';\nimport { useViewProxyMounted, useViewProxyUnmounted } from './useViewProxy';\n\nexport function useWidgetManager(viewProxy: Ref<vtkViewProxy>) {\n const widgetManager = computed(() => {\n const wm = vtkWidgetManager.newInstance({\n pickingEnabled: false,\n useSvgLayer: false,\n captureOn: CaptureOn.MOUSE_MOVE,\n });\n return wm;\n });\n\n useViewProxyMounted(viewProxy, () => {\n widgetManager.value.setRenderer(viewProxy.value.getRenderer());\n widgetManager.value.enablePicking();\n });\n\n useViewProxyUnmounted(viewProxy, () => {\n widgetManager.value.disablePicking();\n });\n\n watch(widgetManager, (curWM, oldWM) => {\n if (curWM) {\n curWM.setRenderer(viewProxy.value.getRenderer());\n curWM.enablePicking();\n }\n if (oldWM) {\n oldWM.delete();\n }\n });\n\n onUnmounted(() => {\n widgetManager.value.delete();\n });\n\n return { widgetManager };\n}\n","import { ref, Ref, UnwrapRef, watch } from '@vue/composition-api';\nimport { WatchOptions } from 'vue';\n\n/**\n * immediate: sync from sync state to valueRef immediately.\n */\ntype SyncOptions = {\n immediate: boolean;\n watchOptions?: WatchOptions;\n};\n\n/**\n * Only tested on primitive values.\n */\nexport function createPrimitiveSyncContext<T, K>(initialState: T) {\n const states = new Map<K, Ref<UnwrapRef<T>>>();\n const usage = new Map<K, number>();\n\n const register = (key: K, valueRef: Ref<T>, options?: SyncOptions) => {\n if (!states.has(key)) {\n states.set(key, ref(initialState));\n }\n const state = states.get(key)!;\n usage.set(key, 1 + (usage.get(key) ?? 0));\n\n const stopTo = watch(\n valueRef,\n (newValue) => {\n if (newValue !== state.value) {\n state.value = newValue as UnwrapRef<T>;\n }\n },\n {\n flush: 'sync',\n immediate: true,\n ...options?.watchOptions,\n }\n );\n\n const stopFrom = watch(\n state,\n (newState) => {\n if (newState !== valueRef.value) {\n /* eslint-disable-next-line no-param-reassign */\n valueRef.value = newState as T;\n }\n },\n {\n flush: 'sync',\n immediate: true,\n ...options?.watchOptions,\n }\n );\n\n return () => {\n stopTo();\n stopFrom();\n\n usage.set(key, usage.get(key)! - 1);\n if (usage.get(key) === 0) {\n usage.delete(key);\n states.delete(key);\n }\n };\n };\n\n const useSync = (key: Ref<K>, valueRef: Ref<T>, options?: SyncOptions) => {\n let cleanup: (() => void) | null = null;\n watch(\n key,\n (newKey) => {\n if (cleanup) cleanup();\n cleanup = register(newKey, valueRef, options);\n },\n {\n flush: 'sync',\n immediate: true,\n }\n );\n };\n\n return useSync;\n}\n","import { WindowLevelConfig } from '@/src/store/view-configs/types';\nimport {\n computed,\n Ref,\n triggerRef,\n WritableComputedRef,\n} from '@vue/composition-api';\nimport { createPrimitiveSyncContext } from './createPrimitiveSyncContext';\n\nfunction generateComputed(\n source: WritableComputedRef<WindowLevelConfig | null>,\n prop: keyof WindowLevelConfig\n) {\n return computed({\n get: () => source.value?.[prop] || null,\n set: (newValue) => {\n if (source.value && newValue != null) {\n /* eslint-disable no-param-reassign */\n source.value = {\n ...source.value,\n [prop]: newValue,\n };\n }\n },\n });\n}\n\nconst useLevelSync = createPrimitiveSyncContext<number | null, string | null>(\n 0\n);\nconst useWidthSync = createPrimitiveSyncContext<number | null, string | null>(\n 0\n);\n\nexport function useWindowingSync(\n dataID: Ref<string | null>,\n source: WritableComputedRef<WindowLevelConfig | null>\n) {\n const level = generateComputed(source, 'level');\n const width = generateComputed(source, 'width');\n\n // not 100% sure why, but this triggers tracking.\n triggerRef(level);\n triggerRef(width);\n\n useLevelSync(dataID, level);\n useWidthSync(dataID, width);\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{staticClass:\"overlay-no-events\"},[(_vm.active && _vm.viewType === '2D')?_c('crop-2D',{attrs:{\"view-id\":_vm.viewId}}):_vm._e(),(_vm.active && _vm.viewType === '3D')?_c('crop-3D',{attrs:{\"view-id\":_vm.viewId}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('g',[(_vm.ax1.lines != null)?[_c('crop-2D-line-handle',{attrs:{\"line\":_vm.ax1.lines.lowerLine,\"out-of-bounds\":_vm.ax1.lines.outOfBounds},on:{\"pointerdown\":function($event){return _vm.onPointerDown(_vm.ax1.name, 0, $event)},\"pointermove\":_vm.onPointerMove,\"pointerup\":_vm.onPointerUp}}),_c('crop-2D-line-handle',{attrs:{\"line\":_vm.ax1.lines.upperLine,\"out-of-bounds\":_vm.ax1.lines.outOfBounds},on:{\"pointerdown\":function($event){return _vm.onPointerDown(_vm.ax1.name, 1, $event)},\"pointermove\":_vm.onPointerMove,\"pointerup\":_vm.onPointerUp}})]:_vm._e(),(_vm.ax2.lines != null)?[_c('crop-2D-line-handle',{attrs:{\"line\":_vm.ax2.lines.lowerLine,\"out-of-bounds\":_vm.ax2.lines.outOfBounds},on:{\"pointerdown\":function($event){return _vm.onPointerDown(_vm.ax2.name, 0, $event)},\"pointermove\":_vm.onPointerMove,\"pointerup\":_vm.onPointerUp}}),_c('crop-2D-line-handle',{attrs:{\"line\":_vm.ax2.lines.upperLine,\"out-of-bounds\":_vm.ax2.lines.outOfBounds},on:{\"pointerdown\":function($event){return _vm.onPointerDown(_vm.ax2.name, 1, $event)},\"pointermove\":_vm.onPointerMove,\"pointerup\":_vm.onPointerUp}})]:_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { Vector3 } from '@kitware/vtk.js/types';\nimport { computed } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\nimport { useViewConfigStore } from '../store/view-configs';\nimport { getLPSAxisFromDir } from '../utils/lps';\nimport { useCurrentImage } from './useCurrentImage';\n\n/**\n * Returns information about the current slice.\n *\n * axisName: the name of the axis\n * axisIndex: corresponding index in an LPS coordinate array\n * number: slice value\n * planeNormal: slice plane normal\n * planeOrigin: slice plane origin\n * @param viewID\n */\nexport function useCurrentSlice(viewID: MaybeRef<string | null>) {\n const viewConfigStore = useViewConfigStore();\n const currentImage = useCurrentImage();\n const { currentImageMetadata } = currentImage;\n const sliceConfig = viewConfigStore.getComputedSliceConfig(\n viewID,\n currentImage.currentImageID\n );\n return computed(() => {\n const config = sliceConfig.value;\n const { lpsOrientation } = currentImageMetadata.value;\n if (config) {\n const axis = getLPSAxisFromDir(config.axisDirection);\n const planeOrigin = [0, 0, 0] as Vector3;\n planeOrigin[lpsOrientation[axis]] = config.slice;\n return {\n axisName: axis,\n axisIndex: lpsOrientation[axis],\n number: config.slice,\n planeNormal: lpsOrientation[config.axisDirection] as Vector3,\n planeOrigin,\n };\n }\n return null;\n });\n}\n","import vtkOpenGLRenderWindow from '@kitware/vtk.js/Rendering/OpenGL/RenderWindow';\nimport vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';\nimport { Vector2, Vector3 } from '@kitware/vtk.js/types';\nimport { computed, ref, unref, watchEffect } from '@vue/composition-api';\nimport { MaybeRef, useResizeObserver } from '@vueuse/core';\nimport { vec3 } from 'gl-matrix';\nimport { useVTKCallback } from './useVTKCallback';\nimport { computeWorldToDisplay } from '../utils/vtk-helpers';\n\ntype MaybeCoords = Vector3 | vec3 | null | undefined;\ntype MaybeMultiCoords = Vector3[] | vec3[] | null | undefined;\ntype MaybeRenderer = vtkRenderer | null | undefined;\n\n/**\n * Returns a reactive vtkOpenGLRenderWindow container ref.\n *\n * @param view\n * @returns\n */\nexport function useVTKViewContainer(\n view: MaybeRef<vtkOpenGLRenderWindow | null | undefined>\n) {\n const container = ref<HTMLElement | null>(null);\n\n const update = () => {\n container.value = unref(view)?.getContainer() ?? null;\n };\n\n const onModified = useVTKCallback(computed(() => unref(view)?.onModified));\n onModified(update);\n update();\n\n return container;\n}\n\n/**\n * Transforms a list of world coordinates into display coordinates.\n *\n * @param worldCoords\n * @param renderer\n * @returns\n */\nexport function useVTKMultiWorldToDisplay(\n worldCoords: MaybeRef<MaybeMultiCoords>,\n renderer: MaybeRef<MaybeRenderer>\n) {\n const displayCoords = ref<Vector2[]>([]);\n const view = computed(\n () =>\n unref(renderer)\n ?.getRenderWindow()\n ?.getViews()?.[0] as vtkOpenGLRenderWindow\n );\n const container = useVTKViewContainer(view);\n\n const update = () => {\n const coords = unref(worldCoords);\n const ren = unref(renderer);\n\n if (coords == null || !ren) {\n return;\n }\n\n displayCoords.value = coords.map((xyz) => {\n const disp = computeWorldToDisplay(xyz as Vector3, ren)!;\n // convert from canvas space to display space\n return [\n disp[0] / devicePixelRatio,\n disp[1] / devicePixelRatio,\n ] as Vector2;\n }) as Vector2[];\n };\n\n const cameraOnModified = useVTKCallback(\n computed(() => unref(renderer)?.getActiveCamera().onModified)\n );\n\n useResizeObserver(container, update);\n watchEffect(update);\n cameraOnModified(update);\n update();\n\n return displayCoords;\n}\n\n/**\n * Transforms a single world coordinate into a display coordinate.\n *\n * @param worldCoords\n * @param renderer\n * @returns\n */\nexport function useVTKWorldToDisplay(\n worldCoords: MaybeRef<MaybeCoords>,\n renderer: MaybeRef<MaybeRenderer>\n) {\n const manyCoords = computed(() => {\n const c = unref(worldCoords);\n if (c != null) {\n return [c];\n }\n return null;\n });\n\n const displayCoords = useVTKMultiWorldToDisplay(manyCoords, renderer);\n return computed(() => {\n if (displayCoords.value.length === 1) {\n return displayCoords.value[0];\n }\n return null;\n });\n}\n\n/**\n * Transforms a list of world coordinates into SVG coordinates.\n *\n * @param worldCoords\n * @param renderer\n * @returns\n */\nexport function useVTKMultiWorldToSVG(\n worldCoords: MaybeRef<MaybeMultiCoords>,\n renderer: MaybeRef<MaybeRenderer>\n) {\n const displayCoords = useVTKMultiWorldToDisplay(worldCoords, renderer);\n const svgCoords = computed(() => {\n const disp = displayCoords.value;\n const ren = unref(renderer);\n const view = ren?.getRenderWindow()?.getViews()?.[0];\n if (ren && view) {\n const [, height] = view.getViewportSize(ren);\n return disp.map((xy) => {\n // flip Y axis\n return [xy[0], height / devicePixelRatio - xy[1]];\n });\n }\n return null;\n });\n\n return svgCoords;\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('g',[_c('line',{attrs:{\"x1\":_vm.line.startEdge[0],\"y1\":_vm.line.startEdge[1],\"x2\":_vm.line.startCrop[0],\"y2\":_vm.line.startCrop[1],\"stroke-width\":2 + _vm.focusWidth,\"stroke-dasharray\":\"6\",\"stroke-linecap\":\"square\",\"stroke\":\"rgba(200, 255, 0, 0.5)\"}}),_c('line',{attrs:{\"x1\":_vm.line.startCrop[0],\"y1\":_vm.line.startCrop[1],\"x2\":_vm.line.endCrop[0],\"y2\":_vm.line.endCrop[1],\"stroke-width\":2 + _vm.focusWidth,\"stroke-dasharray\":_vm.outOfBounds ? 6 : 'none',\"stroke-linecap\":\"butt\",\"stroke\":\"rgb(200, 255, 0)\"}}),_c('line',{attrs:{\"x1\":_vm.line.endCrop[0],\"y1\":_vm.line.endCrop[1],\"x2\":_vm.line.endEdge[0],\"y2\":_vm.line.endEdge[1],\"stroke-width\":2 + _vm.focusWidth,\"stroke-dasharray\":\"6\",\"stroke-linecap\":\"square\",\"stroke\":\"rgba(200, 255, 0, 0.5)\"}}),_c('line',_vm._g({ref:\"grabLineEl\",staticClass:\"pointer-events-all\",style:({ cursor: _vm.cursor }),attrs:{\"x1\":_vm.line.startEdge[0],\"y1\":_vm.line.startEdge[1],\"x2\":_vm.line.endEdge[0],\"y2\":_vm.line.endEdge[1],\"fill\":\"none\",\"stroke-opacity\":\"0\",\"stroke-dasharray\":\"none\",\"stroke-width\":Number(_vm.$attrs['stroke-width'] || 0) + _vm.clickWidth || 0},on:{\"pointerenter\":function($event){return _vm.onHover(true)},\"pointerleave\":function($event){return _vm.onHover(false)},\"pointerdown\":function($event){return _vm.onPointer(true, $event)},\"pointerup\":function($event){return _vm.onPointer(false, $event)}}},_vm.$listeners))])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport { defineComponent, PropType, ref } from '@vue/composition-api';\nimport { CropLine } from './types';\n\nexport default defineComponent({\n props: {\n line: {\n required: true,\n type: Object as PropType<CropLine<number[]>>,\n },\n clickWidth: {\n default: 20,\n type: Number,\n },\n outOfBounds: {\n default: false,\n type: Boolean,\n },\n },\n setup() {\n const cursor = ref('grab');\n const grabLineEl = ref<Element | null>(null);\n const focusWidth = ref(0);\n\n const onPointer = (down: boolean, ev: PointerEvent) => {\n if (down) {\n grabLineEl.value?.setPointerCapture(ev.pointerId);\n } else {\n grabLineEl.value?.releasePointerCapture(ev.pointerId);\n }\n cursor.value = down ? 'grabbing' : 'grab';\n };\n\n const onHover = (hover: boolean) => {\n focusWidth.value = hover ? 2 : 0;\n };\n\n return {\n onPointer,\n onHover,\n cursor,\n grabLineEl,\n focusWidth,\n };\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Crop2DLineHandle.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Crop2DLineHandle.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Crop2DLineHandle.vue?vue&type=template&id=5b82f04e&scoped=true&\"\nimport script from \"./Crop2DLineHandle.vue?vue&type=script&lang=ts&\"\nexport * from \"./Crop2DLineHandle.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/utils.css?vue&type=style&index=0&id=5b82f04e&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5b82f04e\",\n null\n \n)\n\nexport default component.exports","\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { useCurrentSlice } from '@/src/composables/useCurrentSlice';\nimport { useVTKMultiWorldToSVG } from '@/src/composables/useVTKWorldToDisplay';\nimport { ImageMetadata } from '@/src/store/datasets-images';\nimport { useCropStore } from '@/src/store/tools/crop';\nimport { useViewStore } from '@/src/store/views';\nimport { LPSAxis, LPSBounds, LPSPoint } from '@/src/types/lps';\nimport { createLPSBounds, createLPSPoint, LPSAxes } from '@/src/utils/lps';\nimport { intersectMouseEventWithPlane } from '@/src/utils/vtk-helpers';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';\nimport { Vector2, Vector3 } from '@kitware/vtk.js/types';\nimport {\n computed,\n ComputedRef,\n DeepReadonly,\n defineComponent,\n ref,\n Ref,\n toRefs,\n} from '@vue/composition-api';\nimport { vec3 } from 'gl-matrix';\nimport Crop2DLineHandle from './Crop2DLineHandle.vue';\nimport { CropLines } from './types';\n\nfunction computeCropLines(\n viewID: Ref<string | null>,\n cropAxis: Ref<LPSAxis | null>,\n cropPlanes: DeepReadonly<Ref<Record<LPSAxis, number[]>>>,\n boundary: Ref<Record<LPSAxis, number[]>>\n): ComputedRef<CropLines<LPSPoint> | null> {\n const currentSlice = useCurrentSlice(viewID);\n\n return computed(() => {\n // pre-check reactivity\n const viewIDVal = viewID.value;\n const cropAxisVal = cropAxis.value;\n const cropPlanesVal = cropPlanes.value;\n const boundaryVal = boundary.value;\n const sliceInfo = currentSlice.value;\n\n if (!viewIDVal || !cropAxisVal || !sliceInfo) {\n return null;\n }\n\n const sliceAxis = sliceInfo.axisName;\n const [perpAxis] = LPSAxes.filter(\n (ax) => ax !== cropAxisVal && ax !== sliceAxis\n );\n const cropRange = cropPlanesVal[cropAxisVal];\n const perpRange = cropPlanesVal[perpAxis];\n const perpBoundary = boundaryVal[perpAxis];\n\n const sliceCropRange = cropPlanesVal[sliceAxis];\n const slice = sliceInfo.number;\n const outOfBounds = slice < sliceCropRange[0] || sliceCropRange[1] < slice;\n\n const getLineSegments = (index: number) => {\n const startEdge = createLPSPoint();\n const startCrop = createLPSPoint();\n const endCrop = createLPSPoint();\n const endEdge = createLPSPoint();\n\n startEdge[cropAxisVal] = cropRange[index];\n startCrop[cropAxisVal] = cropRange[index];\n endCrop[cropAxisVal] = cropRange[index];\n endEdge[cropAxisVal] = cropRange[index];\n\n [startEdge[perpAxis], endEdge[perpAxis]] = perpBoundary;\n [startCrop[perpAxis], endCrop[perpAxis]] = perpRange;\n\n return { startEdge, startCrop, endCrop, endEdge };\n };\n\n return {\n lowerLine: getLineSegments(0),\n upperLine: getLineSegments(1),\n outOfBounds,\n };\n });\n}\n\nfunction cropLinesToSVGDisplay(\n cropLines: Ref<CropLines<LPSPoint> | null>,\n imageMetadata: Ref<ImageMetadata>,\n renderer: Ref<vtkRenderer>\n): ComputedRef<CropLines<number[]> | null> {\n // gather points\n const worldPoints = computed(() => {\n const lines = cropLines.value;\n const { lpsOrientation, indexToWorld } = imageMetadata.value;\n if (!lines) {\n return null;\n }\n return [\n lines.lowerLine.startEdge,\n lines.lowerLine.startCrop,\n lines.lowerLine.endCrop,\n lines.lowerLine.endEdge,\n lines.upperLine.startEdge,\n lines.upperLine.startCrop,\n lines.upperLine.endCrop,\n lines.upperLine.endEdge,\n ].map((indexLPSPoint) => {\n const indexPt = [0, 0, 0] as vec3;\n indexPt[lpsOrientation.Sagittal] = indexLPSPoint.Sagittal;\n indexPt[lpsOrientation.Coronal] = indexLPSPoint.Coronal;\n indexPt[lpsOrientation.Axial] = indexLPSPoint.Axial;\n\n const out = [0, 0, 0] as vec3;\n vec3.transformMat4(out, indexPt, indexToWorld);\n return out as Vector3;\n });\n });\n\n // transform points to svg\n const svgPoints = useVTKMultiWorldToSVG(worldPoints, renderer);\n\n // create a new CropLines with SVG points\n return computed(() => {\n const lines = cropLines.value;\n const points = svgPoints.value;\n if (!lines || !points?.length) {\n return null;\n }\n\n return {\n lowerLine: {\n startEdge: points[0],\n startCrop: points[1],\n endCrop: points[2],\n endEdge: points[3],\n },\n upperLine: {\n startEdge: points[4],\n startCrop: points[5],\n endCrop: points[6],\n endEdge: points[7],\n },\n outOfBounds: lines.outOfBounds,\n };\n });\n}\n\nfunction useDragging({\n mouseEventToLPSPoint,\n getCropEdgePos,\n setCropEdgePos,\n}: {\n mouseEventToLPSPoint: (ev: PointerEvent) => LPSPoint | null;\n getCropEdgePos: (axis: LPSAxis, lowerUpper: 0 | 1) => number;\n setCropEdgePos: (axis: LPSAxis, lowerUpper: 0 | 1, pos: number) => void;\n}) {\n const activeAxis = ref<LPSAxis | null>();\n const activeEdge = ref<0 | 1 | null>();\n const initialPointerIndex = ref<LPSPoint>(createLPSPoint());\n const initialCrop = ref<number>(0);\n\n const onPointerDown = (\n ax: LPSAxis,\n selectedCropEdge: 0 | 1,\n ev: PointerEvent\n ) => {\n // ev -> world -> index -> LPSPoint -> save as starting index\n // save the starting axis edge value\n const initialPoint = mouseEventToLPSPoint(ev);\n if (!initialPoint) return;\n\n initialPointerIndex.value = initialPoint;\n initialCrop.value = getCropEdgePos(ax, selectedCropEdge);\n activeAxis.value = ax;\n activeEdge.value = selectedCropEdge;\n };\n\n const onPointerMove = (ev: PointerEvent) => {\n if (activeAxis.value == null || activeEdge.value == null) {\n return;\n }\n const axis = activeAxis.value;\n\n const point = mouseEventToLPSPoint(ev);\n if (!point) return;\n\n // calc delta along ax from starting pos via startingIndex\n // apply delta to starting axis edge value\n const delta = point[axis] - initialPointerIndex.value[axis];\n setCropEdgePos(axis, activeEdge.value, initialCrop.value + delta);\n };\n\n const onPointerUp = () => {\n activeAxis.value = null;\n activeEdge.value = null;\n };\n\n return {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n };\n}\n\nexport default defineComponent({\n props: {\n viewId: {\n required: true,\n type: String,\n },\n },\n components: {\n Crop2DLineHandle,\n },\n setup(props) {\n const { viewId: viewID } = toRefs(props);\n\n const viewStore = useViewStore();\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView2DProxy>(viewID.value)!\n );\n const renderer = computed(() => viewProxy.value?.getRenderer());\n\n const {\n currentImageExtent: imageExtent,\n currentImageID,\n currentImageMetadata,\n } = useCurrentImage();\n const currentSlice = useCurrentSlice(viewID);\n const currentSlicingAxis = computed(\n () => currentSlice.value?.axisName ?? null\n );\n\n const cropStore = useCropStore();\n const cropPlanes = computed((): DeepReadonly<LPSBounds> => {\n const imageID = currentImageID.value;\n if (imageID && imageID in cropStore.croppingByImageID) {\n return cropStore.croppingByImageID[imageID];\n }\n return createLPSBounds();\n });\n\n const inPlaneAxes = computed(() =>\n LPSAxes.filter(\n (ax) => currentSlicingAxis.value && ax !== currentSlicingAxis.value\n )\n );\n const ax1 = computed(() => inPlaneAxes.value[0] ?? null);\n const ax2 = computed(() => inPlaneAxes.value[1] ?? null);\n\n // crop lines in image space\n const ax1Lines = computeCropLines(viewID, ax1, cropPlanes, imageExtent);\n const ax2Lines = computeCropLines(viewID, ax2, cropPlanes, imageExtent);\n\n // crop lines in display space\n const ax1SVGLines = cropLinesToSVGDisplay(\n ax1Lines,\n currentImageMetadata,\n renderer\n );\n const ax2SVGLines = cropLinesToSVGDisplay(\n ax2Lines,\n currentImageMetadata,\n renderer\n );\n\n const { onPointerDown, onPointerMove, onPointerUp } = useDragging({\n mouseEventToLPSPoint(ev: PointerEvent) {\n const ren = renderer.value;\n if (!ren) return null;\n\n const sliceInfo = currentSlice.value;\n if (!sliceInfo) return null;\n\n const { lpsOrientation, worldToIndex } = currentImageMetadata.value;\n const coord = intersectMouseEventWithPlane(\n ev,\n ren,\n sliceInfo.planeOrigin,\n sliceInfo.planeNormal\n );\n if (!coord) return null;\n\n // convert from world to index\n vec3.transformMat4(coord, coord, worldToIndex);\n\n const point = createLPSPoint();\n point.Sagittal = coord[lpsOrientation.Sagittal];\n point.Coronal = coord[lpsOrientation.Coronal];\n point.Axial = coord[lpsOrientation.Axial];\n\n return point;\n },\n getCropEdgePos(axis: LPSAxis, lowerUpper: 0 | 1) {\n return cropPlanes.value[axis][lowerUpper];\n },\n setCropEdgePos(axis: LPSAxis, lowerUpper: 0 | 1, pos: number) {\n if (!currentImageID.value) return;\n\n // enforce cropping edge bounds\n const planes = cropPlanes.value;\n const [lower, upper] = planes[axis];\n const [min, max] = imageExtent.value[axis];\n const newPlanes: Vector2 = [lower, upper];\n if (lowerUpper === 0) {\n newPlanes[0] = Math.max(min, Math.min(pos, upper));\n } else if (lowerUpper === 1) {\n newPlanes[1] = Math.max(lower, Math.min(pos, max));\n }\n\n cropStore.setCroppingForAxis(currentImageID.value, axis, newPlanes);\n },\n });\n\n return {\n ax1: computed(() => ({\n name: ax1.value,\n lines: ax1SVGLines.value,\n })),\n ax2: computed(() => ({\n name: ax2.value,\n lines: ax2SVGLines.value,\n })),\n onPointerDown,\n onPointerMove,\n onPointerUp,\n };\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Crop2D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Crop2D.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Crop2D.vue?vue&type=template&id=305c9c1c&scoped=true&\"\nimport script from \"./Crop2D.vue?vue&type=script&lang=ts&\"\nexport * from \"./Crop2D.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=305c9c1c&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"305c9c1c\",\n null\n \n)\n\nexport default component.exports","\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { useVTKCallback } from '@/src/composables/useVTKCallback';\nimport { VTKThreeViewWidgetManager } from '@/src/constants';\nimport { useCropStore } from '@/src/store/tools/crop';\nimport { LPSCroppingPlanes } from '@/src/store/tools/types';\nimport { useViewStore } from '@/src/store/views';\nimport { arrayEquals } from '@/src/utils';\nimport { getAxisBounds, LPSAxes } from '@/src/utils/lps';\nimport vtkLPSView3DProxy from '@/src/vtk/LPSView3DProxy';\nimport { Bounds } from '@kitware/vtk.js/types';\nimport vtkImageCroppingWidget, {\n ImageCroppingWidgetState,\n vtkImageCroppingViewWidget,\n} from '@kitware/vtk.js/Widgets/Widgets3D/ImageCroppingWidget';\nimport {\n computed,\n DeepReadonly,\n defineComponent,\n inject,\n onBeforeUnmount,\n onMounted,\n ref,\n toRefs,\n watch,\n} from '@vue/composition-api';\n\nfunction isValidCroppingPlanes(planes: LPSCroppingPlanes) {\n return (\n planes.Sagittal[0] <= planes.Sagittal[1] &&\n planes.Coronal[0] <= planes.Coronal[1] &&\n planes.Axial[0] <= planes.Axial[1]\n );\n}\n\nfunction lpsPlanesEqual(a: LPSCroppingPlanes, b: LPSCroppingPlanes) {\n return (\n a.Axial[0] === b.Axial[0] &&\n a.Axial[1] === b.Axial[1] &&\n a.Sagittal[0] === b.Sagittal[0] &&\n a.Sagittal[1] === b.Sagittal[1] &&\n a.Coronal[0] === b.Coronal[0] &&\n a.Coronal[1] === b.Coronal[1]\n );\n}\n\nexport default defineComponent({\n props: {\n viewId: {\n type: String,\n required: true,\n },\n },\n\n setup(props) {\n const { viewId: viewID } = toRefs(props);\n\n const widgetManager = inject(VTKThreeViewWidgetManager);\n if (!widgetManager) {\n throw new Error('Crop3D component cannot access the 2D widget manager.');\n }\n\n const viewStore = useViewStore();\n const viewProxy = computed(\n () => viewStore.getViewProxy<vtkLPSView3DProxy>(viewID.value)!\n );\n\n const cropStore = useCropStore();\n const { currentImageID, currentImageMetadata } = useCurrentImage();\n const croppingPlanes = computed(() => {\n const imageID = currentImageID.value;\n if (imageID && imageID in cropStore.croppingByImageID) {\n return cropStore.croppingByImageID[imageID];\n }\n return null;\n });\n\n const factory = vtkImageCroppingWidget.newInstance();\n const state = factory.getWidgetState() as ImageCroppingWidgetState;\n\n factory.setEdgeHandlesEnabled(false);\n factory.setFaceHandlesEnabled(true);\n factory.setCornerHandlesEnabled(true);\n\n const widget = ref<vtkImageCroppingViewWidget>();\n\n watch(widgetManager, (wm, oldWm) => {\n if (oldWm) {\n oldWm.removeWidget(factory);\n }\n if (wm) {\n widget.value = wm.addWidget(factory) as vtkImageCroppingViewWidget;\n }\n });\n\n onMounted(() => {\n if (widgetManager.value) {\n widget.value = widgetManager.value.addWidget(\n factory\n ) as vtkImageCroppingViewWidget;\n\n // update representation to not be as 3D\n widget.value.getRepresentations().forEach((rep) => {\n rep.getActors().forEach((actor) => {\n actor.getProperty().setAmbient(1);\n });\n });\n\n // show widget\n viewProxy.value.render();\n }\n });\n\n onBeforeUnmount(() => {\n if (widgetManager.value) {\n widgetManager.value.removeWidget(factory);\n }\n });\n\n watch(\n currentImageMetadata,\n (metadata) => {\n state.setWorldToIndexT(metadata.worldToIndex);\n state.setIndexToWorldT(metadata.indexToWorld);\n state.placeWidget(metadata.worldBounds);\n },\n { immediate: true }\n );\n\n const applyPlanes = (lpsPlanes: DeepReadonly<LPSCroppingPlanes>) => {\n const { lpsOrientation: dirs } = currentImageMetadata.value;\n // LPSCroppingPlanes -> Bounds\n const planes = [0, 0, 0, 0, 0, 0] as Bounds;\n LPSAxes.forEach((axis) => {\n [planes[dirs[axis] * 2], planes[dirs[axis] * 2 + 1]] = lpsPlanes[axis];\n });\n\n // prevent infinite loops\n if (!arrayEquals(planes, state.getCroppingPlanes().getPlanes())) {\n state.getCroppingPlanes().setPlanes(planes);\n }\n // render any changes\n viewProxy.value.render();\n };\n\n watch(\n croppingPlanes,\n (lpsPlanes) => {\n if (lpsPlanes) {\n applyPlanes(lpsPlanes);\n }\n },\n { immediate: true }\n );\n\n const onPlanesUpdated = useVTKCallback(\n state.getCroppingPlanes().onModified\n );\n\n onPlanesUpdated(() => {\n const imageID = currentImageID.value;\n if (!imageID) return;\n\n // Bounds -> LPSCroppingPlanes\n const planes = state.getCroppingPlanes().getPlanes();\n const { lpsOrientation } = currentImageMetadata.value;\n const lpsPlanes: LPSCroppingPlanes = {\n Sagittal: getAxisBounds(planes, 'Sagittal', lpsOrientation),\n Coronal: getAxisBounds(planes, 'Coronal', lpsOrientation),\n Axial: getAxisBounds(planes, 'Axial', lpsOrientation),\n };\n\n // avoid updates if equal\n const planesFromStore = croppingPlanes.value;\n if (\n planesFromStore &&\n lpsPlanesEqual(lpsPlanes, planesFromStore as LPSCroppingPlanes)\n ) {\n return;\n }\n\n if (isValidCroppingPlanes(lpsPlanes)) {\n cropStore.setCropping(imageID, lpsPlanes);\n } else if (planesFromStore) {\n applyPlanes(planesFromStore);\n }\n });\n\n return () => null;\n },\n});\n","var render, staticRenderFns\nimport script from \"./Crop3D.vue?vue&type=script&lang=ts&\"\nexport * from \"./Crop3D.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Crop3D.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Crop3D.vue?vue&type=script&lang=ts&\"","\nimport { useViewStore } from '@/src/store/views';\nimport { computed, defineComponent, toRefs, watch } from '@vue/composition-api';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { useCropStore } from '@/src/store/tools/crop';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport Crop2D from './crop/Crop2D.vue';\nimport Crop3D from './crop/Crop3D.vue';\n\nexport default defineComponent({\n props: {\n viewId: {\n type: String,\n required: true,\n },\n },\n components: {\n Crop2D,\n Crop3D,\n },\n setup(props) {\n const { viewId: viewID } = toRefs(props);\n\n const { currentImageID } = useCurrentImage();\n const cropStore = useCropStore();\n const toolStore = useToolStore();\n\n const active = computed(() => toolStore.currentTool === Tools.Crop);\n\n watch(\n currentImageID,\n (imageID) => {\n if (imageID && !(imageID in cropStore.croppingByImageID)) {\n cropStore.resetCropping(imageID);\n }\n },\n { immediate: true }\n );\n\n const viewType = computed(() => {\n const viewStore = useViewStore();\n return viewStore.viewSpecs[viewID.value].viewType;\n });\n\n return {\n active,\n viewType,\n };\n },\n});\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CropTool.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CropTool.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./CropTool.vue?vue&type=template&id=1e99b971&scoped=true&\"\nimport script from \"./CropTool.vue?vue&type=script&lang=ts&\"\nexport * from \"./CropTool.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=1e99b971&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1e99b971\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n computed,\n defineComponent,\n onBeforeMount,\n onBeforeUnmount,\n onMounted,\n PropType,\n provide,\n ref,\n toRefs,\n watch,\n watchEffect,\n} from '@vue/composition-api';\nimport { vec3 } from 'gl-matrix';\nimport { onKeyStroke } from '@vueuse/core';\n\nimport { useResizeToFit } from '@src/composables/useResizeToFit';\nimport vtkLPSView2DProxy from '@src/vtk/LPSView2DProxy';\nimport vtkIJKSliceRepresentationProxy from '@src/vtk/IJKSliceRepresentationProxy';\nimport { manageVTKSubscription } from '@src/composables/manageVTKSubscription';\nimport SliceSlider from '@src/components/SliceSlider.vue';\nimport ViewOverlayGrid from '@src/components/ViewOverlayGrid.vue';\nimport { useResizeObserver } from '../composables/useResizeObserver';\nimport { useOrientationLabels } from '../composables/useOrientationLabels';\nimport { getLPSAxisFromDir } from '../utils/lps';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport { useCameraOrientation } from '../composables/useCameraOrientation';\nimport WindowLevelTool from './tools/WindowLevelTool.vue';\nimport SliceScrollTool from './tools/SliceScrollTool.vue';\nimport PanTool from './tools/PanTool.vue';\nimport ZoomTool from './tools/ZoomTool.vue';\nimport RulerTool from './tools/RulerTool.vue';\nimport PaintTool from './tools/PaintTool.vue';\nimport { useSceneBuilder } from '../composables/useSceneBuilder';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport { useLabelmapStore } from '../store/datasets-labelmaps';\nimport vtkLabelMapSliceRepProxy from '../vtk/LabelMapSliceRepProxy';\nimport { usePaintToolStore } from '../store/tools/paint';\nimport { useViewConfigStore } from '../store/view-configs';\nimport { usePersistCameraConfig } from '../composables/usePersistCameraConfig';\nimport CrosshairsTool from './tools/CrosshairsTool.vue';\nimport { LPSAxisDir } from '../types/lps';\nimport { ViewProxyType } from '../core/proxies';\nimport { useViewProxy } from '../composables/useViewProxy';\nimport { useWidgetManager } from '../composables/useWidgetManager';\nimport { CameraConfig } from '../store/view-configs/types';\nimport { defaultSliceConfig } from '../store/view-configs/slicing';\nimport { useWindowingSync } from '../composables/sync/useWindowingSync';\nimport CropTool from './tools/CropTool.vue';\nimport { VTKTwoViewWidgetManager } from '../constants';\n\nconst SLICE_OFFSET_KEYS: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -1,\n ArrowDown: 1,\n} as const;\n\nexport default defineComponent({\n name: 'VtkTwoView',\n props: {\n id: {\n type: String,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n viewUp: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n },\n components: {\n SliceSlider,\n ViewOverlayGrid,\n WindowLevelTool,\n SliceScrollTool,\n PanTool,\n ZoomTool,\n RulerTool,\n PaintTool,\n CrosshairsTool,\n CropTool,\n },\n setup(props) {\n const viewConfigStore = useViewConfigStore();\n const paintStore = usePaintToolStore();\n\n const { id: viewID, viewDirection, viewUp } = toRefs(props);\n\n const vtkContainerRef = ref<HTMLElement>();\n\n const viewAxis = computed(() => getLPSAxisFromDir(viewDirection.value));\n\n // --- computed vars --- //\n\n const {\n currentImageData: curImageData,\n currentImageID: curImageID,\n currentImageMetadata: curImageMetadata,\n isImageLoading,\n } = useCurrentImage();\n\n const dicomStore = useDICOMStore();\n\n const sliceConfigDefaults = defaultSliceConfig();\n const sliceConfig = computed(() =>\n curImageID.value !== null\n ? viewConfigStore.getSliceConfig(viewID.value, curImageID.value)!\n : null\n );\n const currentSlice = computed(() =>\n sliceConfig.value !== null\n ? sliceConfig.value.slice\n : sliceConfigDefaults.slice\n );\n const sliceMin = computed(() =>\n sliceConfig.value !== null\n ? sliceConfig.value.min\n : sliceConfigDefaults.min\n );\n const sliceMax = computed(() =>\n sliceConfig.value !== null\n ? sliceConfig.value.max\n : sliceConfigDefaults.max\n );\n\n const wlConfig = computed({\n get: () => {\n const _viewID = viewID.value;\n const imageID = curImageID.value;\n if (imageID !== null) {\n return viewConfigStore.getWindowingConfig(_viewID, imageID) ?? null;\n }\n return null;\n },\n set: (newValue) => {\n const imageID = curImageID.value;\n if (imageID !== null && newValue != null) {\n viewConfigStore.updateWindowingConfig(\n viewID.value,\n imageID,\n newValue\n );\n }\n },\n });\n\n const windowWidth = computed(() => wlConfig.value?.width);\n const windowLevel = computed(() => wlConfig.value?.level);\n const dicomInfo = computed(() => {\n if (\n curImageID.value !== null &&\n curImageID.value in dicomStore.imageIDToVolumeKey\n ) {\n const volumeKey = dicomStore.imageIDToVolumeKey[curImageID.value];\n const volumeInfo = dicomStore.volumeInfo[volumeKey];\n const studyKey = dicomStore.volumeStudy[volumeKey];\n const studyInfo = dicomStore.studyInfo[studyKey];\n const patientKey = dicomStore.studyPatient[studyKey];\n const patientInfo = dicomStore.patientInfo[patientKey];\n\n const patientID = patientInfo.PatientID;\n const studyID = studyInfo.StudyID;\n const studyDescription = studyInfo.StudyDescription;\n const seriesNumber = volumeInfo.SeriesNumber;\n const seriesDescription = volumeInfo.SeriesDescription;\n\n return {\n patientID,\n studyID,\n studyDescription,\n seriesNumber,\n seriesDescription,\n };\n }\n\n return null;\n });\n\n const sliceDomain = computed(() => {\n const { lpsOrientation, dimensions } = curImageMetadata.value;\n const ijkIndex = lpsOrientation[viewAxis.value];\n const dimMax = dimensions[ijkIndex];\n\n return {\n min: 0,\n max: dimMax - 1,\n };\n });\n\n // --- setters --- //\n\n const setSlice = (slice: number) => {\n if (curImageID.value !== null) {\n viewConfigStore.updateSliceConfig(viewID.value, curImageID.value, {\n slice,\n });\n }\n };\n\n // --- view proxy setup --- //\n\n const { viewProxy, setContainer: setViewProxyContainer } =\n useViewProxy<vtkLPSView2DProxy>(viewID, ViewProxyType.Slice);\n\n onBeforeMount(() => {\n // do this before mount, as the ManipulatorTools run onMounted\n // before this component does.\n viewProxy.value.getInteractorStyle2D().removeAllManipulators();\n });\n\n onMounted(() => {\n setViewProxyContainer(vtkContainerRef.value);\n viewProxy.value.setOrientationAxesVisibility(false);\n });\n\n onBeforeUnmount(() => {\n setViewProxyContainer(null);\n });\n\n // --- Slicing setup --- //\n\n watchEffect(() => {\n const ijkIndex = curImageMetadata.value.lpsOrientation[viewAxis.value];\n viewProxy.value.setSlicingMode('IJK'[ijkIndex]);\n });\n\n watch(\n [viewID, curImageID, viewDirection],\n () => {\n if (\n curImageID.value &&\n !viewConfigStore.getSliceConfig(viewID.value, curImageID.value)\n ) {\n viewConfigStore.updateSliceConfig(viewID.value, curImageID.value, {\n ...sliceDomain.value,\n axisDirection: viewDirection.value,\n });\n viewConfigStore.resetSlice(viewID.value, curImageID.value);\n }\n },\n { immediate: true, deep: true }\n );\n\n // --- arrows change slice --- //\n\n const { currentImageID } = useCurrentImage();\n\n const hover = ref(false);\n const onKeyDown = (event: KeyboardEvent) => {\n if (!currentImageID.value || !hover.value) return;\n\n const sliceOffset = SLICE_OFFSET_KEYS[event.key] ?? 0;\n if (sliceOffset) {\n viewConfigStore.updateSliceConfig(viewID.value, currentImageID.value, {\n slice: currentSlice.value + sliceOffset,\n });\n\n event.stopPropagation();\n }\n };\n onKeyStroke(Object.keys(SLICE_OFFSET_KEYS), onKeyDown);\n\n // --- resizing --- //\n\n useResizeObserver(vtkContainerRef, () => viewProxy.value.resize());\n\n // --- widget manager --- //\n\n const { widgetManager } = useWidgetManager(viewProxy);\n provide(VTKTwoViewWidgetManager, widgetManager);\n\n // --- window/level setup --- //\n\n watch(\n curImageData,\n (imageData, oldImageData) => {\n if (imageData && imageData !== oldImageData) {\n // TODO listen to changes in point data\n const range = imageData.getPointData().getScalars().getRange();\n if (\n curImageID.value !== null &&\n !viewConfigStore.getWindowingConfig(viewID.value, curImageID.value)\n ) {\n viewConfigStore.updateWindowingConfig(\n viewID.value,\n curImageID.value,\n {\n min: range[0],\n max: range[1],\n }\n );\n viewConfigStore.resetWindowLevel(viewID.value, curImageID.value);\n }\n }\n },\n {\n immediate: true,\n }\n );\n\n // --- sync windowing parameters --- //\n\n useWindowingSync(curImageID, wlConfig);\n\n // --- scene setup --- //\n\n const labelmapStore = useLabelmapStore();\n\n const labelmapIDs = computed(() => {\n return labelmapStore.idList.filter(\n (id) => labelmapStore.parentImage[id] === curImageID.value\n );\n });\n\n const { baseImageRep, labelmapReps } = useSceneBuilder<\n vtkIJKSliceRepresentationProxy,\n vtkLabelMapSliceRepProxy\n >(viewID, {\n baseImage: curImageID,\n labelmaps: labelmapIDs,\n });\n\n // --- camera setup --- //\n\n const { cameraDirVec, cameraUpVec } = useCameraOrientation(\n viewDirection,\n viewUp,\n curImageMetadata\n );\n const { resizeToFit, ignoreResizeToFitTracking, resetResizeToFitTracking } =\n useResizeToFit(viewProxy.value.getCamera(), false);\n\n const resizeToFitScene = () =>\n ignoreResizeToFitTracking(() => {\n // resize to fit\n const lookAxis =\n curImageMetadata.value.lpsOrientation[\n getLPSAxisFromDir(viewDirection.value)\n ];\n const upAxis =\n curImageMetadata.value.lpsOrientation[\n getLPSAxisFromDir(viewUp.value)\n ];\n const dimsWithSpacing = curImageMetadata.value.dimensions.map(\n (d, i) => d * curImageMetadata.value.spacing[i]\n );\n viewProxy.value.resizeToFit(lookAxis, upAxis, dimsWithSpacing);\n resetResizeToFitTracking();\n });\n\n const resetCamera = () => {\n const bounds = curImageMetadata.value.worldBounds;\n const center = [\n (bounds[0] + bounds[1]) / 2,\n (bounds[2] + bounds[3]) / 2,\n (bounds[4] + bounds[5]) / 2,\n ] as vec3;\n\n // do not track resizeToFit state\n ignoreResizeToFitTracking(() => {\n viewProxy.value.updateCamera(\n cameraDirVec.value,\n cameraUpVec.value,\n center\n );\n viewProxy.value.resetCamera(bounds);\n });\n\n resizeToFitScene();\n\n viewProxy.value.render();\n };\n\n manageVTKSubscription(\n viewProxy.value.onResize(() => {\n if (resizeToFit.value) {\n resizeToFitScene();\n }\n })\n );\n\n // if we re-enable resizeToFit, reset the camera\n watch(resizeToFit, () => {\n if (resizeToFit.value) {\n resetCamera();\n }\n });\n\n const { restoreCameraConfig } = usePersistCameraConfig(\n viewID,\n curImageID,\n viewProxy,\n 'parallelScale',\n 'position',\n 'focalPoint',\n 'viewUp'\n );\n\n watch(\n [curImageID, cameraDirVec, cameraUpVec],\n () => {\n let cameraConfig: CameraConfig | undefined;\n if (curImageID.value !== null) {\n cameraConfig = viewConfigStore.getCameraConfig(\n viewID.value,\n curImageID.value\n );\n }\n\n // If we have a save camera configuration restore it\n if (cameraConfig) {\n restoreCameraConfig(cameraConfig);\n\n viewProxy.value.getRenderer().resetCameraClippingRange();\n viewProxy.value.render();\n\n // Prevent resize\n resizeToFit.value = false;\n } else if (resizeToFit.value) {\n resetCamera();\n } else {\n // this will trigger a resetCamera() call\n resizeToFit.value = true;\n }\n },\n { immediate: true, deep: true }\n );\n\n // --- viewport orientation/camera labels --- //\n\n const { top: topLabel, left: leftLabel } = useOrientationLabels(viewProxy);\n\n // --- apply windowing and slice configs --- //\n\n watchEffect(() => {\n if (sliceConfig.value === null || wlConfig.value === null) {\n return;\n }\n\n const { slice } = sliceConfig.value;\n const { width, level } = wlConfig.value;\n const rep = baseImageRep.value;\n if (rep) {\n rep.setSlice(slice);\n rep.setWindowWidth(width);\n rep.setWindowLevel(level);\n }\n labelmapReps.value.forEach((lmRep) => {\n lmRep.setSlice(slice);\n });\n\n viewProxy.value.render();\n });\n\n // --- apply labelmap opacity --- //\n\n watchEffect(() => {\n const { labelmapOpacity } = paintStore;\n labelmapReps.value.forEach((lmRep) => {\n lmRep.setOpacity(labelmapOpacity);\n });\n });\n\n return {\n vtkContainerRef,\n viewID,\n viewProxy,\n viewAxis,\n active: true,\n slice: currentSlice,\n sliceMin,\n sliceMax,\n windowWidth,\n windowLevel,\n topLabel,\n leftLabel,\n isImageLoading,\n setSlice,\n widgetManager,\n dicomInfo,\n enableResizeToFit() {\n resizeToFit.value = true;\n },\n hover,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VtkTwoView.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VtkTwoView.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VtkTwoView.vue?vue&type=template&id=69a77c16&scoped=true&\"\nimport script from \"./VtkTwoView.vue?vue&type=script&lang=ts&\"\nexport * from \"./VtkTwoView.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=69a77c16&prod&scoped=true&lang=css&\"\nimport style1 from \"@/src/components/styles/utils.css?vue&type=style&index=1&id=69a77c16&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"69a77c16\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VDivider,VIcon,VList,VListItem,VListItemContent,VListItemTitle,VMenu,VProgressCircular,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"vtk-container-wrapper vtk-three-container\"},[_c('div',{staticClass:\"vtk-container\",class:_vm.active ? 'active' : ''},[_c('div',{staticClass:\"vtk-sub-container\"},[_c('div',{ref:\"vtkContainerRef\",staticClass:\"vtk-view\"})]),_c('div',{staticClass:\"overlay-no-events tool-layer\"},[_c('crop-tool',{attrs:{\"view-id\":_vm.viewID}}),_c('pan-tool',{attrs:{\"view-id\":_vm.viewID}})],1),_c('view-overlay-grid',{staticClass:\"overlay-no-events view-annotations\",scopedSlots:_vm._u([{key:\"top-left\",fn:function(){return [_c('div',{staticClass:\"annotation-cell\"},[_c('v-tooltip',{attrs:{\"bottom\":\"\",\"transition\":\"slide-x-transition\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({staticClass:\"pointer-events-all\",attrs:{\"dark\":\"\",\"x-small\":\"\",\"icon\":\"\"},on:{\"click\":_vm.resetCamera}},'v-btn',attrs,false),on),[_c('v-icon',{staticClass:\"py-1\",attrs:{\"small\":\"\"}},[_vm._v(\"mdi-camera-flip-outline\")])],1)]}}])},[_c('span',[_vm._v(\"Reset camera\")])]),_c('span',{staticClass:\"ml-3\"},[_vm._v(_vm._s(_vm.topLeftLabel))])],1)]},proxy:true}])}),_c('transition',{attrs:{\"name\":\"loading\"}},[(_vm.isImageLoading)?_c('div',{staticClass:\"overlay-no-events loading\"},[_c('div',[_vm._v(\"Loading the image\")]),_c('div',[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"color\":\"blue\"}})],1)]):_vm._e()])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { inject } from '@vue/composition-api';\nimport vtkProxyManager from '@kitware/vtk.js/Proxy/Core/ProxyManager';\n\nconst defaultKey = 'ProxyManager';\n\nexport function withProxyManager(cb: (pxm: vtkProxyManager) => void) {\n const pxm = inject<vtkProxyManager>('ProxyManager');\n return pxm ? cb(pxm) : null;\n}\n\nexport function useProxyManager(key = defaultKey) {\n return inject<vtkProxyManager>(key ?? defaultKey);\n}\n","import vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport { computed, ref, unref } from '@vue/composition-api';\nimport { MaybeRef } from '@vueuse/core';\nimport { useVTKCallback } from './useVTKCallback';\n\nexport function isViewAnimating(viewProxy: MaybeRef<vtkViewProxy>) {\n const isAnimating = ref(false);\n\n const onStartAnimation = useVTKCallback(\n computed(() => unref(viewProxy).getInteractor().onStartAnimation)\n );\n const onEndAnimation = useVTKCallback(\n computed(() => unref(viewProxy).getInteractor().onEndAnimation)\n );\n\n onStartAnimation(() => {\n isAnimating.value = true;\n });\n\n onEndAnimation(() => {\n isAnimating.value = false;\n });\n\n return isAnimating;\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n onMounted,\n PropType,\n provide,\n ref,\n toRefs,\n watch,\n} from '@vue/composition-api';\nimport { vec3 } from 'gl-matrix';\n\nimport vtkVolumeRepresentationProxy from '@kitware/vtk.js/Proxy/Representations/VolumeRepresentationProxy';\nimport vtkLookupTableProxy from '@kitware/vtk.js/Proxy/Core/LookupTableProxy';\nimport vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\nimport vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport { getDiagonalLength } from '@kitware/vtk.js/Common/DataModel/BoundingBox';\nimport { Vector3 } from '@kitware/vtk.js/types';\n\nimport { useProxyManager } from '@/src/composables/proxyManager';\nimport ViewOverlayGrid from '@src/components/ViewOverlayGrid.vue';\nimport { useResizeObserver } from '../composables/useResizeObserver';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport { useCameraOrientation } from '../composables/useCameraOrientation';\nimport vtkLPSView3DProxy from '../vtk/LPSView3DProxy';\nimport { useSceneBuilder } from '../composables/useSceneBuilder';\nimport { useViewConfigStore } from '../store/view-configs';\nimport { usePersistCameraConfig } from '../composables/usePersistCameraConfig';\nimport { useModelStore } from '../store/datasets-models';\nimport { LPSAxisDir } from '../types/lps';\nimport { useViewProxy } from '../composables/useViewProxy';\nimport { ViewProxyType } from '../core/proxies';\nimport { CameraConfig } from '../store/view-configs/types';\nimport {\n DEFAULT_AMBIENT,\n DEFAULT_DIFFUSE,\n DEFAULT_SPECULAR,\n} from '../store/view-configs/volume-coloring';\nimport { getShiftedOpacityFromPreset } from '../utils/vtk-helpers';\nimport CropTool from './tools/CropTool.vue';\nimport PanTool from './tools/PanTool.vue';\nimport { useWidgetManager } from '../composables/useWidgetManager';\nimport { VTKThreeViewWidgetManager } from '../constants';\nimport { useCropStore } from '../store/tools/crop';\nimport { isViewAnimating } from '../composables/isViewAnimating';\n\nexport default defineComponent({\n props: {\n id: {\n type: String,\n required: true,\n },\n viewDirection: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n viewUp: {\n type: String as PropType<LPSAxisDir>,\n required: true,\n },\n },\n components: {\n ViewOverlayGrid,\n CropTool,\n PanTool,\n },\n setup(props) {\n const modelStore = useModelStore();\n const proxyManager = useProxyManager()!;\n const viewConfigStore = useViewConfigStore();\n\n const { id: viewID, viewDirection, viewUp } = toRefs(props);\n\n const vtkContainerRef = ref<HTMLElement>();\n\n // --- computed vars --- //\n\n const {\n currentImageID: curImageID,\n currentImageMetadata: curImageMetadata,\n currentImageData,\n isImageLoading,\n } = useCurrentImage();\n\n // --- view proxy setup --- //\n\n const { viewProxy, setContainer: setViewProxyContainer } =\n useViewProxy<vtkLPSView3DProxy>(viewID, ViewProxyType.Volume);\n\n onMounted(() => {\n viewProxy.value.setOrientationAxesVisibility(true);\n viewProxy.value.setOrientationAxesType('cube');\n viewProxy.value.setBackground([0, 0, 0, 0]);\n setViewProxyContainer(vtkContainerRef.value);\n });\n\n onBeforeUnmount(() => {\n setViewProxyContainer(null);\n viewProxy.value.setContainer(null);\n });\n\n useResizeObserver(vtkContainerRef, () => viewProxy.value.resize());\n\n // --- scene setup --- //\n\n const { baseImageRep } = useSceneBuilder<vtkVolumeRepresentationProxy>(\n viewID,\n {\n baseImage: curImageID,\n models: computed(() => modelStore.idList),\n }\n );\n\n // --- picking --- //\n\n // disables picking for crop control and more\n watch(\n baseImageRep,\n (rep) => {\n if (rep) {\n rep.getVolumes().forEach((volume) => volume.setPickable(false));\n }\n },\n { immediate: true }\n );\n\n // --- widget manager --- //\n\n const { widgetManager } = useWidgetManager(viewProxy);\n provide(VTKThreeViewWidgetManager, widgetManager);\n\n // --- camera setup --- //\n\n const { cameraUpVec, cameraDirVec } = useCameraOrientation(\n viewDirection,\n viewUp,\n curImageMetadata\n );\n\n const resetCamera = () => {\n const bounds = curImageMetadata.value.worldBounds;\n const center = [\n (bounds[0] + bounds[1]) / 2,\n (bounds[2] + bounds[3]) / 2,\n (bounds[4] + bounds[5]) / 2,\n ] as vec3;\n\n viewProxy.value.updateCamera(\n cameraDirVec.value,\n cameraUpVec.value,\n center\n );\n viewProxy.value.resetCamera();\n viewProxy.value.render();\n };\n\n watch(\n [baseImageRep, cameraDirVec, cameraUpVec],\n () => {\n let cameraConfig: CameraConfig | undefined;\n if (curImageID.value !== null) {\n cameraConfig = viewConfigStore.getCameraConfig(\n viewID.value,\n curImageID.value\n );\n }\n\n // We don't want to reset the camera if we have a config we are restoring\n if (!cameraConfig) {\n resetCamera();\n }\n },\n {\n immediate: true,\n deep: true,\n }\n );\n\n const { restoreCameraConfig } = usePersistCameraConfig(\n viewID,\n curImageID,\n viewProxy,\n 'position',\n 'focalPoint',\n 'directionOfProjection',\n 'viewUp'\n );\n\n watch(curImageID, () => {\n // See if we have a camera configuration to restore\n let cameraConfig = null;\n if (curImageID.value !== null) {\n cameraConfig = viewConfigStore.getCameraConfig(\n viewID.value,\n curImageID.value\n );\n }\n\n if (cameraConfig) {\n restoreCameraConfig(cameraConfig);\n\n viewProxy.value.getRenderer().resetCameraClippingRange();\n viewProxy.value.render();\n }\n });\n\n // --- coloring setup --- //\n\n const volumeColorConfig = viewConfigStore.getComputedVolumeColorConfig(\n viewID,\n curImageID\n );\n\n watch(\n [viewID, curImageID],\n () => {\n if (\n curImageID.value &&\n currentImageData.value &&\n !volumeColorConfig.value\n ) {\n viewConfigStore.resetToDefaultColoring(\n viewID.value,\n curImageID.value,\n currentImageData.value\n );\n }\n },\n { immediate: true }\n );\n\n // --- CVR parameters --- //\n\n const cvrParams = computed(() => volumeColorConfig.value?.cvr);\n const isAnimating = isViewAnimating(viewProxy);\n\n watch(\n [cvrParams, baseImageRep, isAnimating],\n ([params, rep, animating]) => {\n const image = rep?.getInputDataSet() as vtkImageData | null | undefined;\n if (!rep || !image || !params) {\n return;\n }\n\n // disable CVR while animating for smoother interaction\n const enabled = params.enabled && !animating;\n\n const renderer = viewProxy.value.getRenderer();\n const mapper = rep.getMapper() as vtkVolumeMapper;\n const volume = rep.getVolumes()[0];\n const property = volume.getProperty();\n\n const volumeBounds = volume.getBounds();\n const center = [\n (volumeBounds[0] + volumeBounds[1]) / 2,\n (volumeBounds[2] + volumeBounds[3]) / 2,\n (volumeBounds[4] + volumeBounds[5]) / 2,\n ] as Vector3;\n\n if (renderer.getLights().length === 0) {\n renderer.createLight();\n }\n const light = renderer.getLights()[0];\n if (enabled) {\n light.setFocalPoint(...center);\n light.setColor(1, 1, 1);\n light.setIntensity(1);\n light.setConeAngle(90);\n light.setPositional(true);\n renderer.setTwoSidedLighting(false);\n if (params.lightFollowsCamera) {\n light.setLightTypeToHeadLight();\n renderer.updateLightsGeometryToFollowCamera();\n } else {\n light.setLightTypeToSceneLight();\n }\n } else {\n light.setPositional(false);\n }\n\n mapper.setMaximumSamplesPerRay(2000);\n\n const dims = image.getDimensions();\n const spacing = image.getSpacing();\n const spatialDiagonal = vec3.length(\n vec3.fromValues(\n dims[0] * spacing[0],\n dims[1] * spacing[1],\n dims[2] * spacing[2]\n )\n );\n\n let sampleDistance = (1.5 * vec3.length(spacing)) / 10;\n if (\n spatialDiagonal / sampleDistance >\n mapper.getMaximumSamplesPerRay()\n ) {\n sampleDistance =\n spatialDiagonal / (mapper.getMaximumSamplesPerRay() - 1);\n }\n mapper.setSampleDistance(animating ? 0.75 : sampleDistance);\n mapper.setGlobalIlluminationReach(enabled ? 0.5 : 0);\n\n property.setShade(true);\n property.setScalarOpacityUnitDistance(\n 0,\n getDiagonalLength(image.getBounds()) /\n Math.max(...image.getDimensions())\n );\n property.setUseGradientOpacity(0, !enabled);\n property.setGradientOpacityMinimumValue(0, 0.0);\n const dataRange = image.getPointData().getScalars().getRange();\n property.setGradientOpacityMaximumValue(\n 0,\n (dataRange[1] - dataRange[0]) * 0.01\n );\n property.setGradientOpacityMinimumOpacity(0, 0.0);\n property.setGradientOpacityMinimumOpacity(0, 1.0);\n\n if (enabled && params.useVolumetricScatteringBlending) {\n mapper.setVolumetricScatteringBlending(\n params.volumetricScatteringBlending\n );\n } else {\n mapper.setVolumetricScatteringBlending(0);\n }\n\n // Local ambient occlusion\n if (enabled && params.useLocalAmbientOcclusion) {\n mapper.setLocalAmbientOcclusion(true);\n mapper.setLAOKernelSize(params.laoKernelSize);\n mapper.setLAOKernelRadius(params.laoKernelRadius);\n } else {\n mapper.setLocalAmbientOcclusion(false);\n mapper.setLAOKernelSize(0);\n mapper.setLAOKernelRadius(0);\n }\n\n // do not toggle these parameters when animating\n property.setAmbient(params.enabled ? params.ambient : DEFAULT_AMBIENT);\n property.setDiffuse(params.enabled ? params.diffuse : DEFAULT_DIFFUSE);\n property.setSpecular(\n params.enabled ? params.specular : DEFAULT_SPECULAR\n );\n\n if (!animating) {\n viewProxy.value.render();\n }\n },\n { deep: true, immediate: true }\n );\n\n // --- coloring --- //\n\n const colorBy = computed(() => volumeColorConfig.value?.colorBy);\n const colorTransferFunction = computed(\n () => volumeColorConfig.value?.transferFunction\n );\n const opacityFunction = computed(\n () => volumeColorConfig.value?.opacityFunction\n );\n\n watch(\n [baseImageRep, colorBy, colorTransferFunction, opacityFunction],\n () => {\n if (\n !baseImageRep.value ||\n !colorBy.value ||\n !colorTransferFunction.value ||\n !opacityFunction.value\n ) {\n return;\n }\n\n const rep = baseImageRep.value;\n\n const { arrayName, location } = colorBy.value;\n const ctFunc = colorTransferFunction.value;\n const opFunc = opacityFunction.value;\n\n const lut = proxyManager.getLookupTable(arrayName);\n lut.setMode(vtkLookupTableProxy.Mode.Preset);\n lut.setPresetName(ctFunc.preset);\n lut.setDataRange(...ctFunc.mappingRange);\n\n const pwf = proxyManager.getPiecewiseFunction(arrayName);\n pwf.setMode(opFunc.mode);\n pwf.setDataRange(...opFunc.mappingRange);\n\n switch (opFunc.mode) {\n case vtkPiecewiseFunctionProxy.Mode.Gaussians:\n pwf.setGaussians(opFunc.gaussians);\n break;\n case vtkPiecewiseFunctionProxy.Mode.Points: {\n const opacityPoints = getShiftedOpacityFromPreset(\n opFunc.preset,\n opFunc.mappingRange,\n opFunc.shift\n );\n if (opacityPoints) {\n pwf.setPoints(opacityPoints);\n }\n break;\n }\n case vtkPiecewiseFunctionProxy.Mode.Nodes:\n pwf.setNodes(opFunc.nodes);\n break;\n default:\n }\n\n if (rep) {\n rep.setColorBy(arrayName, location);\n }\n\n // Need to trigger a render for when we are restoring from a state file\n viewProxy.value.render();\n },\n { immediate: true, deep: true }\n );\n\n // --- cropping planes --- //\n\n const cropStore = useCropStore();\n const croppingPlanes = cropStore.getComputedVTKPlanes(curImageID);\n\n watch(\n croppingPlanes,\n (planes) => {\n const mapper = baseImageRep.value?.getMapper();\n if (planes && mapper) {\n mapper.removeAllClippingPlanes();\n planes.forEach((plane) => mapper.addClippingPlane(plane));\n mapper.modified();\n viewProxy.value.render();\n }\n },\n { immediate: true }\n );\n\n // --- template vars --- //\n\n return {\n vtkContainerRef,\n viewID,\n active: false,\n topLeftLabel: computed(\n () => colorTransferFunction.value?.preset.replace(/-/g, ' ') ?? ''\n ),\n isImageLoading,\n resetCamera,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VtkThreeView.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VtkThreeView.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VtkThreeView.vue?vue&type=template&id=34f948e5&scoped=true&\"\nimport script from \"./VtkThreeView.vue?vue&type=script&lang=ts&\"\nexport * from \"./VtkThreeView.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/vtk-view.css?vue&type=style&index=0&id=34f948e5&prod&scoped=true&lang=css&\"\nimport style1 from \"@/src/components/styles/utils.css?vue&type=style&index=1&id=34f948e5&prod&scoped=true&lang=css&\"\nimport style2 from \"./VtkThreeView.vue?vue&type=style&index=2&id=34f948e5&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"34f948e5\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VIcon,VProgressCircular,VTooltip})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n computed,\n defineComponent,\n PropType,\n toRefs,\n} from '@vue/composition-api';\nimport { Component } from 'vue';\nimport { storeToRefs } from 'pinia';\nimport VtkTwoView from './VtkTwoView.vue';\nimport VtkThreeView from './VtkThreeView.vue';\nimport { Layout, LayoutDirection } from '../types/layout';\nimport { useViewStore } from '../store/views';\nimport { ViewType } from '../types/views';\n\nconst TYPE_TO_COMPONENT: Record<ViewType, Component> = {\n '2D': VtkTwoView,\n '3D': VtkThreeView,\n};\n\nexport default defineComponent({\n name: 'LayoutGrid',\n props: {\n layout: {\n type: Object as PropType<Layout>,\n required: true,\n },\n },\n setup(props) {\n const { layout } = toRefs(props);\n const viewStore = useViewStore();\n const { viewSpecs } = storeToRefs(viewStore);\n\n const flexFlow = computed(() => {\n return layout.value.direction === LayoutDirection.H\n ? 'flex-column'\n : 'flex-row';\n });\n\n const items = computed(() => {\n const viewIDToSpecs = viewSpecs.value;\n return layout.value.items.map((item) => {\n if (typeof item === 'string') {\n const spec = viewIDToSpecs[item];\n return {\n type: 'view',\n id: item,\n component: TYPE_TO_COMPONENT[spec.viewType],\n props: spec.props,\n };\n }\n return {\n type: 'layout',\n ...item,\n };\n });\n });\n\n return {\n items,\n flexFlow,\n };\n },\n});\n","\nimport {\n set,\n del,\n defineComponent,\n reactive,\n computed,\n} from '@vue/composition-api';\nimport ImageListCard from '@/src/components/ImageListCard.vue';\nimport { SAMPLE_DATA } from '../config';\nimport {\n convertSuccessResultToDataSelection,\n useDatasetStore,\n} from '../store/datasets';\nimport { useMessageStore } from '../store/messages';\nimport { SampleDataset } from '../types';\nimport { useImageStore } from '../store/datasets-images';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport { fetchFile } from '../utils/fetch';\n\nenum ProgressState {\n Pending,\n Error,\n Done,\n}\n\ninterface Progress {\n [name: string]: {\n state: ProgressState;\n progress: number;\n };\n}\n\nexport default defineComponent({\n components: {\n ImageListCard,\n },\n setup() {\n const datasetStore = useDatasetStore();\n const status = reactive<{ progress: Progress }>({\n progress: {},\n });\n // URL -> data ID\n const loaded = reactive<{\n urlToID: Record<string, string>;\n idToURL: Record<string, string>;\n }>({\n urlToID: {},\n idToURL: {},\n });\n\n const clearLoadedStatus = (id: string) => {\n const url = loaded.idToURL[id];\n if (url) {\n del(loaded.idToURL, id);\n del(loaded.urlToID, url);\n }\n };\n\n const imageStore = useImageStore();\n imageStore.$onAction(({ name, args, after }) => {\n if (name === 'deleteData') {\n after(() => {\n const [id] = args;\n clearLoadedStatus(id as string);\n });\n }\n });\n\n const dicomStore = useDICOMStore();\n dicomStore.$onAction(({ name, args, after }) => {\n if (name === 'deleteVolume') {\n after(() => {\n const [key] = args;\n clearLoadedStatus(key as string);\n });\n }\n });\n\n async function downloadSample(sample: SampleDataset) {\n const progress = (percent: number) => {\n // TODO set/del doesn't exist in vue 3\n set(status.progress, sample.name, {\n state: ProgressState.Pending,\n progress: percent * 100,\n });\n };\n try {\n progress(Infinity);\n\n const sampleFile = await fetchFile(sample.url, sample.filename, {\n progress,\n });\n status.progress[sample.name].state = ProgressState.Done;\n\n if (sampleFile) {\n const [loadResult] = await datasetStore.loadFiles([sampleFile]);\n if (loadResult?.loaded) {\n const selection = convertSuccessResultToDataSelection(loadResult);\n if (selection) {\n const id =\n selection.type === 'image'\n ? selection.dataID\n : selection.volumeKey;\n set(loaded.idToURL, id, sample.url);\n set(loaded.urlToID, sample.url, id);\n }\n datasetStore.setPrimarySelection(selection);\n }\n }\n } catch (error) {\n status.progress[sample.name].state = ProgressState.Error;\n const messageStore = useMessageStore();\n messageStore.addError('Failed to load sample data', error as Error);\n } finally {\n del(status.progress, sample.name);\n }\n }\n\n const samples = computed(() =>\n SAMPLE_DATA.map((sample) => {\n const isDone =\n status.progress[sample.name]?.state === ProgressState.Done;\n const isError =\n status.progress[sample.name]?.state === ProgressState.Error;\n const isLoaded = !!loaded.urlToID[sample.url];\n const progress =\n isDone || isLoaded\n ? 100\n : Math.floor(status.progress[sample.name]?.progress);\n return {\n ...sample,\n isDownloading: sample.name in status.progress,\n isDone,\n isError,\n isLoaded,\n indeterminate: progress === Infinity,\n progress,\n };\n })\n );\n\n return {\n samples,\n downloadSample,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./LayoutGrid.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./LayoutGrid.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./LayoutGrid.vue?vue&type=template&id=6d50c96d&scoped=true&\"\nimport script from \"./LayoutGrid.vue?vue&type=script&lang=ts&\"\nexport * from \"./LayoutGrid.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/utils.css?vue&type=style&index=0&id=6d50c96d&prod&scoped=true&lang=css&\"\nimport style1 from \"./LayoutGrid.vue?vue&type=style&index=1&id=6d50c96d&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6d50c96d\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"fill-height d-flex flex-column\"},[_c('div',{attrs:{\"id\":\"module-switcher\"}},[(_vm.$vuetify.breakpoint.mobile)?_c('v-btn',{attrs:{\"icon\":\"\",\"id\":\"close-btn\"},on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('v-icon',[_vm._v(\"mdi-arrow-left\")])],1):_vm._e(),_c('v-tabs',{attrs:{\"id\":\"module-switcher-tabs\",\"icons-and-text\":\"\",\"show-arrows\":true},model:{value:(_vm.selectedModuleIndex),callback:function ($$v) {_vm.selectedModuleIndex=$$v},expression:\"selectedModuleIndex\"}},_vm._l((_vm.Modules),function(item){return _c('v-tab',{key:item.name,staticClass:\"pl-1 pr-1\"},[_c('div',{staticClass:\"tab-content\"},[_c('span',{staticClass:\"mb-0 mt-1 module-text\"},[_vm._v(_vm._s(item.name))]),_c('v-icon',[_vm._v(\"mdi-\"+_vm._s(item.icon))])],1)])}),1)],1),_c('div',{attrs:{\"id\":\"module-container\"}},[_c('v-tabs-items',{staticClass:\"fill-height\",attrs:{\"touchless\":\"\"},model:{value:(_vm.selectedModuleIndex),callback:function ($$v) {_vm.selectedModuleIndex=$$v},expression:\"selectedModuleIndex\"}},_vm._l((_vm.Modules),function(mod){return _c('v-tab-item',{key:mod.name,staticClass:\"fill-height\"},[_c(mod.component,{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.Modules[_vm.selectedModuleIndex] === mod),expression:\"Modules[selectedModuleIndex] === mod\"}],key:mod.name,tag:\"component\"})],1)}),1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mx-2 fill-height\",attrs:{\"id\":\"data-module\"}},[_c('div',{attrs:{\"id\":\"data-panels\"}},[_c('v-expansion-panels',{attrs:{\"multiple\":\"\",\"accordion\":\"\",\"value\":_vm.openPanels}},[(_vm.hasAnonymousImages)?_c('v-expansion-panel',{key:\"anonymousImages\",on:{\"change\":function($event){return _vm.handlePanelChange(_vm.ANONYMOUS_DATA_KEY)}}},[_c('v-expansion-panel-header',[_c('v-icon',{staticClass:\"collection-header-icon\"},[_vm._v(\"mdi-image\")]),_c('span',[_vm._v(\"Anonymous\")])],1),_c('v-expansion-panel-content',[_c('image-data-browser')],1)],1):_vm._e(),_vm._l((_vm.patients),function(patient){return _c('v-expansion-panel',{key:patient.key,on:{\"change\":function($event){return _vm.handlePanelChange(patient.key)}}},[_c('v-expansion-panel-header',[_c('div',{staticClass:\"patient-header\"},[_c('v-icon',{staticClass:\"collection-header-icon\"},[_vm._v(\"mdi-account\")]),_c('span',{staticClass:\"patient-header-name\",attrs:{\"title\":patient.name}},[_vm._v(\" \"+_vm._s(patient.name)+\" \")]),_c('v-spacer'),_c('v-menu',{attrs:{\"offset-x\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({staticClass:\"mr-3\",attrs:{\"icon\":\"\",\"small\":\"\"},on:{\"click\":function($event){$event.stopPropagation();}}},'v-btn',attrs,false),on),[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"mdi-dots-vertical\")])],1)]}}],null,true)},[_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-list-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.deletePatient(patient.key)}}},[_c('v-list-item-title',[_vm._v(\"Delete Patient\")])],1)],1)],1)],1)]),_c('v-expansion-panel-content',[_c('patient-browser',{attrs:{\"patient-key\":patient.key}})],1)],1)}),_c('v-expansion-panel',{key:\"sampleData\",on:{\"change\":function($event){return _vm.handlePanelChange(_vm.SAMPLE_DATA_KEY)}}},[_c('v-expansion-panel-header',[_c('v-icon',{staticClass:\"collection-header-icon\"},[_vm._v(\"mdi-card-bulleted\")]),_c('span',[_vm._v(\"Sample Data\")])],1),_c('v-expansion-panel-content',[_c('sample-data-browser')],1)],1)],2)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',_vm._l((_vm.samples),function(sample){return _c('image-list-card',{key:sample.name,attrs:{\"disabled\":sample.isDownloading || sample.isLoaded,\"title\":sample.name,\"image-url\":sample.image,\"image-size\":100},on:{\"click\":function($event){return _vm.downloadSample(sample)}},scopedSlots:_vm._u([(sample.isDownloading || sample.isLoaded)?{key:\"image-overlay\",fn:function(){return [_c('v-row',{staticClass:\"fill-height ma-0\",attrs:{\"align\":\"center\",\"justify\":\"center\"}},[_c('v-progress-circular',{attrs:{\"color\":\"white\",\"indeterminate\":sample.indeterminate && !sample.isDone,\"value\":sample.progress}},[(sample.isDone || sample.isLoaded)?_c('v-icon',{attrs:{\"small\":\"\",\"color\":\"white\"}},[_vm._v(\"mdi-check\")]):(sample.isError)?_c('v-icon',{attrs:{\"small\":\"\",\"color\":\"white\"}},[_vm._v(\" mdi-alert-circle \")]):(!sample.indeterminate)?_c('span',{staticClass:\"caption text--white\"},[_vm._v(\" \"+_vm._s(sample.progress)+\" \")]):_vm._e()],1)],1)]},proxy:true}:null],null,true)},[_c('div',{staticClass:\"body-2 font-weight-bold text-no-wrap text-truncate\"},[_vm._v(\" \"+_vm._s(sample.name)+\" \")]),_c('div',{staticClass:\"body-2 mt-2\"},[_vm._v(_vm._s(sample.description))])])}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-hover',{scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar hover = ref.hover;\nreturn [_c('v-card',_vm._g({class:{\n 'image-list-card-hover': !_vm.disabled && hover,\n 'image-list-card-active': !_vm.disabled && _vm.active,\n },attrs:{\"disabled\":_vm.disabled,\"outlined\":\"\",\"ripple\":!_vm.disabled}},_vm.disabled ? {} : _vm.$listeners),[_c('v-container',[_c('v-row',{staticClass:\"flex-nowrap\",attrs:{\"no-gutters\":\"\"}},[(_vm.selectable)?_c('v-col',{staticClass:\"d-flex align-center\",attrs:{\"cols\":\"1\"}},[_c('v-checkbox',{key:_vm.id,attrs:{\"value\":_vm.inputValue,\"input-value\":_vm.value,\"disabled\":_vm.disabled},on:{\"click\":function($event){$event.stopPropagation();},\"change\":_vm.onChange}})],1):_vm._e(),_c('v-col',{staticClass:\"image-container flex-grow-0\",style:({ maxWidth: (_vm.imageSize + \"px\") }),attrs:{\"cols\":\"4\"}},[_c('v-img',{attrs:{\"contain\":\"\",\"height\":(_vm.imageSize + \"px\"),\"width\":(_vm.imageSize + \"px\"),\"src\":_vm.imageUrl}}),_c('v-overlay',{attrs:{\"absolute\":\"\",\"value\":_vm.$slots['image-overlay']}},[_vm._t(\"image-overlay\")],2)],1),_c('v-col',{attrs:{\"cols\":7}},[_c('div',{staticClass:\"ml-2\"},[_vm._t(\"default\")],2)])],1)],1)],1)]}}],null,true)})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { defineComponent } from '@vue/composition-api';\n\nexport default defineComponent({\n name: 'ImageListCard',\n props: {\n active: Boolean,\n imageSize: {\n type: Number,\n default: 80,\n },\n imageUrl: {\n type: String,\n },\n selectable: {\n type: Boolean,\n default: false,\n },\n id: String,\n value: Array,\n inputValue: String,\n disabled: Boolean,\n },\n\n setup(props, { emit }) {\n const onChange = (event: any) => {\n emit('input', event);\n };\n\n return {\n onChange,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageListCard.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageListCard.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ImageListCard.vue?vue&type=template&id=b20fde34&scoped=true&\"\nimport script from \"./ImageListCard.vue?vue&type=script&lang=ts&\"\nexport * from \"./ImageListCard.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./ImageListCard.vue?vue&type=style&index=0&id=b20fde34&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b20fde34\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VHover } from 'vuetify/lib/components/VHover';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VRow } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VCard,VCheckbox,VCol,VContainer,VHover,VImg,VOverlay,VRow})\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SampleDataBrowser.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SampleDataBrowser.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SampleDataBrowser.vue?vue&type=template&id=f56cbf4c&\"\nimport script from \"./SampleDataBrowser.vue?vue&type=script&lang=ts&\"\nexport * from \"./SampleDataBrowser.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./SampleDataBrowser.vue?vue&type=style&index=0&id=f56cbf4c&prod&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VRow } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VIcon,VProgressCircular,VRow})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.images.length === 0)?_c('div',{staticClass:\"text-center\"},[_vm._v(\"No images loaded\")]):_vm._e(),_c('v-container',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.images.length),expression:\"images.length\"}],staticClass:\"pa-0\"},[_c('v-row',{attrs:{\"no-gutters\":\"\",\"justify\":\"space-between\"}},[_c('v-col',{attrs:{\"cols\":\"6\",\"align-self\":\"center\"}},[_c('v-checkbox',{staticClass:\"ml-3 align-center justify-center\",attrs:{\"indeterminate\":_vm.selectedSome && !_vm.selectedAll,\"label\":\"Select All\"},model:{value:(_vm.selectedAll),callback:function ($$v) {_vm.selectedAll=$$v},expression:\"selectedAll\"}})],1),_c('v-col',{staticClass:\"d-flex justify-end\",attrs:{\"cols\":\"6\",\"align-self\":\"center\"}},[_c('v-tooltip',{attrs:{\"left\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({attrs:{\"icon\":\"\",\"disabled\":!_vm.selectedSome},on:{\"click\":function($event){$event.stopPropagation();return _vm.removeSelection.apply(null, arguments)}}},'v-btn',attrs,false),on),[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)]}}])},[_vm._v(\" Delete selected \")])],1)],1)],1),_c('item-group',{attrs:{\"value\":_vm.primarySelection,\"testFunction\":_vm.selectionEquals},on:{\"change\":_vm.setPrimarySelection}},_vm._l((_vm.images),function(image){return _c('groupable-item',{key:image.id,attrs:{\"value\":image.selectionKey},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar select = ref.select;\nreturn [_c('image-list-card',{attrs:{\"selectable\":\"\",\"active\":active,\"title\":image.name,\"image-url\":(_vm.thumbnails[image.cacheKey] || {}).imageURI || '',\"image-size\":100,\"id\":image.id,\"inputValue\":image.id},on:{\"click\":select},model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_c('div',{staticClass:\"text-body-2 font-weight-bold text-no-wrap text-truncate\"},[_vm._v(\" \"+_vm._s(image.name)+\" \")]),_c('div',{staticClass:\"caption\"},[_vm._v(\"Dims: (\"+_vm._s(image.dimensions.join(', '))+\")\")]),_c('div',{staticClass:\"caption\"},[_vm._v(\"Spacing: (\"+_vm._s(image.spacing.join(', '))+\")\")])])]}}],null,true)})}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render, staticRenderFns\nimport script from \"./ItemGroup.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemGroup.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render, staticRenderFns\nimport script from \"./GroupableItem.vue?vue&type=script&lang=js&\"\nexport * from \"./GroupableItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export enum ThumbnailSlice {\n First,\n Middle,\n Last,\n}\n","<script>\n/**\n * This is meant as a smaller, more specific version of\n * vuetify's v-item-group + v-item.\n */\nexport default {\n name: 'ItemGroup',\n provide() {\n return {\n group: {\n selectItem: this.selectItem,\n isSelected: this.isSelected,\n },\n };\n },\n props: {\n value: {\n type: null,\n required: false,\n },\n mandatory: {\n type: Boolean,\n default: false,\n },\n testFunction: {\n type: Function,\n required: false,\n },\n },\n model: {\n prop: 'value',\n event: 'change',\n },\n data() {\n return {\n internalValue: null,\n };\n },\n watch: {\n value(v) {\n if (v !== this.internalValue) {\n this.internalValue = v;\n }\n },\n },\n mounted() {\n this.internalValue = this.value;\n },\n render(h) {\n return h(\n 'div',\n { props: this.$attrs, on: this.$listeners },\n this.$slots.default\n );\n },\n methods: {\n selectItem(itemValue) {\n if (!(this.mandatory && !itemValue)) {\n this.internalValue = itemValue;\n this.$emit('change', this.internalValue);\n }\n },\n isSelected(valueToTest) {\n if (this.internalValue === null || this.internalValue === undefined) {\n return false;\n }\n if (this.testFunction) {\n return this.testFunction(valueToTest, this.internalValue);\n }\n return valueToTest === this.internalValue;\n },\n },\n};\n</script>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ItemGroup.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ItemGroup.vue?vue&type=script&lang=js&\"","<script>\nexport default {\n name: 'GroupableItem',\n inject: ['group'],\n props: {\n value: { required: true },\n },\n render() {\n const nodes = this.$scopedSlots.default({\n active: this.group.isSelected(this.value),\n select: this.select,\n toggle: this.toggle,\n });\n // always return first node, if any.\n return nodes[0];\n },\n methods: {\n select() {\n this.group.selectItem(this.value);\n },\n toggle() {\n if (this.group.isSelected(this.value)) {\n this.group.selectItem(null);\n } else {\n this.group.selectItem(this.value);\n }\n },\n },\n};\n</script>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./GroupableItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./GroupableItem.vue?vue&type=script&lang=js&\"","import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport { TypedArray } from '@kitware/vtk.js/types';\nimport { ThumbnailSlice } from '.';\n\nfunction scalarImageToImageData(\n values: TypedArray,\n width: number,\n height: number,\n scaleMin: number,\n scaleMax: number\n) {\n const im = new ImageData(width, height);\n const arr32 = new Uint32Array(im.data.buffer);\n // scale to 1 unsigned byte\n const factor = 255 / (scaleMax - scaleMin);\n for (let i = 0; i < values.length; i += 1) {\n const byte = Math.floor((values[i] - scaleMin) * factor);\n // ABGR order\n // eslint-disable-next-line no-bitwise\n arr32[i] = (255 << 24) | (byte << 16) | (byte << 8) | byte;\n }\n\n return im;\n}\n\n/**\n * Generates a thumbnail given an image data.\n *\n * Assumption: image is comprised of single-component scalars\n */\nfunction generateThumbnail(\n imageData: vtkImageData,\n axis: 0 | 1 | 2 = 2,\n whichSlice = ThumbnailSlice.Middle\n) {\n const scalars = imageData.getPointData().getScalars();\n const data = scalars.getData() as TypedArray;\n const dataRange = scalars.getRange();\n const dims = imageData.getDimensions();\n\n // ThumbnailSlice.First\n let slice = 0;\n if (whichSlice === ThumbnailSlice.Middle) {\n slice = Math.floor(dims[axis] / 2);\n } else if (whichSlice === ThumbnailSlice.Last) {\n slice = dims[axis] - 1;\n }\n\n let sliceData: TypedArray;\n let width: number;\n let height: number;\n\n if (axis === 0) {\n // work-around for typing data.constructor.\n // data is not necessarily of type Uint8Array.\n sliceData = new (<Uint8ArrayConstructor>data.constructor)(\n dims[1] * dims[2]\n );\n [, width, height] = dims;\n for (let k = 0; k < dims[2]; k++) {\n for (let j = 0; j < dims[1]; j++) {\n const index = slice + j * dims[0] + k * dims[0] * dims[1];\n const offset = k * dims[1] + j;\n sliceData[offset] = data[index];\n }\n }\n } else if (axis === 1) {\n sliceData = new (<Uint8ArrayConstructor>data.constructor)(\n dims[0] * dims[2]\n );\n [width, , height] = dims;\n for (let k = 0; k < dims[2]; k++) {\n for (let i = 0; i < dims[0]; i++) {\n const index = i + slice * dims[0] + k * dims[0] * dims[1];\n const offset = k * dims[0] + i;\n sliceData[offset] = data[index];\n }\n }\n } else if (axis === 2) {\n [width, height] = dims;\n const skip = dims[0] * dims[1];\n const sliceOffset = slice * skip;\n sliceData = Array.isArray(data)\n ? data.slice(sliceOffset, sliceOffset + skip)\n : data.subarray(sliceOffset, sliceOffset + skip);\n }\n\n return scalarImageToImageData(\n sliceData!,\n width!,\n height!,\n dataRange[0],\n dataRange[1]\n );\n}\n\nexport function createVTKImageThumbnailer() {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n const resizeCanvas = document.createElement('canvas');\n const resizeContext = resizeCanvas.getContext('2d');\n\n if (!ctx || !resizeContext) {\n throw new Error('[thumbnailer] Failed to create a 2D context');\n }\n return {\n generate(\n imageData: vtkImageData,\n axis: 0 | 1 | 2 = 2,\n whichSlice = ThumbnailSlice.Middle\n ) {\n return generateThumbnail(imageData, axis, whichSlice);\n },\n imageDataToDataURI(\n im: ImageData,\n resizeWidth: number,\n resizeHeight: number\n ) {\n canvas.width = im.width;\n canvas.height = im.height;\n ctx.putImageData(im, 0, 0);\n\n let { width, height } = im;\n if (im.width > im.height) {\n width = resizeWidth;\n height *= resizeWidth / im.width;\n } else {\n height = resizeHeight;\n width *= resizeHeight / im.height;\n }\n\n resizeCanvas.width = width;\n resizeCanvas.height = height;\n resizeContext.clearRect(0, 0, width, height);\n resizeContext.scale(width / im.width, height / im.height);\n resizeContext.drawImage(canvas, 0, 0);\n // jpegs are smaller than pngs\n return resizeCanvas.toDataURL('image/jpeg');\n },\n };\n}\n","import {\n computed,\n Ref,\n ref,\n UnwrapRefSimple,\n watch,\n} from '@vue/composition-api';\n\nexport function useMultiSelection<T = string>(allItems: Ref<T[]>) {\n const selected = ref<T[]>([]);\n const selectedAll = ref(false);\n const selectedSome = computed(() => selected.value.length > 0);\n\n watch(selected, () => {\n selectedAll.value =\n selected.value.length > 0 &&\n selected.value.length === allItems.value.length;\n });\n\n watch(selectedAll, (yn) => {\n if (yn) {\n selected.value = allItems.value as UnwrapRefSimple<T[]>;\n } else {\n selected.value = [];\n }\n });\n\n return { selected, selectedAll, selectedSome };\n}\n","\nimport {\n computed,\n defineComponent,\n set,\n del,\n reactive,\n watch,\n} from '@vue/composition-api';\nimport ItemGroup from '@/src/components/ItemGroup.vue';\nimport GroupableItem from '@/src/components/GroupableItem.vue';\nimport ImageListCard from '@/src/components/ImageListCard.vue';\nimport { createVTKImageThumbnailer } from '@/src/core/thumbnailers/vtk-image';\nimport { useImageStore } from '../store/datasets-images';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport {\n DataSelection,\n selectionEquals,\n useDatasetStore,\n} from '../store/datasets';\nimport { useMultiSelection } from '../composables/useMultiSelection';\n\nfunction imageCacheKey(dataID: string) {\n return `image-${dataID}`;\n}\n\nexport default defineComponent({\n components: {\n ItemGroup,\n GroupableItem,\n ImageListCard,\n },\n setup() {\n const imageStore = useImageStore();\n const dicomStore = useDICOMStore();\n const dataStore = useDatasetStore();\n\n const primarySelection = computed(() => dataStore.primarySelection);\n\n const nonDICOMImages = computed(() =>\n imageStore.idList.filter((id) => !(id in dicomStore.imageIDToVolumeKey))\n );\n\n const images = computed(() => {\n const { metadata } = imageStore;\n return nonDICOMImages.value.map((id) => ({\n id,\n cacheKey: imageCacheKey(id),\n // for UI selection\n selectionKey: {\n type: 'image',\n dataID: id,\n } as DataSelection,\n name: metadata[id].name,\n dimensions: metadata[id].dimensions,\n spacing: [...metadata[id].spacing].map((s) => s.toFixed(2)),\n }));\n });\n\n // --- thumbnails --- //\n\n type Thumbnail = {\n imageURI: string;\n aspectRatio: number;\n };\n const thumbnails = reactive<Record<string, Thumbnail>>({});\n const thumbnailer = createVTKImageThumbnailer();\n\n watch(\n nonDICOMImages,\n (imageIDs) => {\n imageIDs.forEach(async (id) => {\n const cacheKey = imageCacheKey(id);\n if (!(cacheKey in thumbnails)) {\n const imageData = imageStore.dataIndex[id];\n const canvasIM = thumbnailer.generate(imageData);\n const imageURI = thumbnailer.imageDataToDataURI(canvasIM, 100, 100);\n const dims = imageData.getDimensions();\n const aspectRatio = dims[0] / dims[1];\n set(thumbnails, cacheKey, { imageURI, aspectRatio });\n }\n });\n\n // delete old thumbnails\n const idLookup = new Set(imageIDs.map((id) => imageCacheKey(id)));\n Object.keys(thumbnails).forEach((cacheKey) => {\n if (!idLookup.has(cacheKey)) {\n del(thumbnails, cacheKey);\n }\n });\n },\n { immediate: true, deep: true }\n );\n\n // --- selection --- //\n\n const { selected, selectedAll, selectedSome } =\n useMultiSelection(nonDICOMImages);\n\n function removeSelection() {\n selected.value.forEach((id) => {\n imageStore.deleteData(id);\n });\n selected.value = [];\n }\n\n return {\n selected,\n selectedAll,\n selectedSome,\n removeSelection,\n images,\n thumbnails,\n primarySelection,\n selectionEquals,\n setPrimarySelection: (sel: DataSelection) => {\n dataStore.setPrimarySelection(sel);\n },\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageDataBrowser.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ImageDataBrowser.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ImageDataBrowser.vue?vue&type=template&id=64c1e8f4&\"\nimport script from \"./ImageDataBrowser.vue?vue&type=script&lang=ts&\"\nexport * from \"./ImageDataBrowser.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VCheckbox,VCol,VContainer,VIcon,VRow,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('item-group',{attrs:{\"value\":_vm.primarySelection,\"testFunction\":_vm.selectionEquals},on:{\"change\":_vm.setPrimarySelection}},[_c('v-container',{staticClass:\"pa-0\"},[_c('v-row',{staticClass:\"mb-2\",attrs:{\"no-gutters\":\"\",\"justify\":\"space-between\"}},[_c('v-col',{attrs:{\"cols\":\"6\",\"align-self\":\"center\"}},[_c('v-checkbox',{staticClass:\"ml-3 align-center justify-center\",attrs:{\"indeterminate\":_vm.selectedSome && !_vm.selectedAll,\"label\":\"Select All Studies\",\"dense\":\"\",\"hide-details\":\"\"},model:{value:(_vm.selectedAll),callback:function ($$v) {_vm.selectedAll=$$v},expression:\"selectedAll\"}})],1),_c('v-col',{staticClass:\"d-flex justify-end mt-2\",attrs:{\"cols\":\"6\",\"align-self\":\"center\"}},[_c('v-tooltip',{attrs:{\"left\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({attrs:{\"icon\":\"\",\"small\":\"\",\"disabled\":!_vm.selectedSome},on:{\"click\":function($event){$event.stopPropagation();return _vm.removeSelectedStudies.apply(null, arguments)}}},'v-btn',attrs,false),on),[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)]}}])},[_vm._v(\" Delete selected \")])],1)],1)],1),_c('v-expansion-panels',{attrs:{\"id\":\"patient-data-studies\",\"accordion\":\"\",\"multiple\":\"\",\"value\":_vm.openPanels}},_vm._l((_vm.studies),function(study){return _c('v-expansion-panel',{key:study.StudyInstanceUID,staticClass:\"patient-data-study-panel\",on:{\"change\":function($event){return _vm.handlePanelChange(study.StudyInstanceUID)}}},[_c('v-expansion-panel-header',{staticClass:\"pl-3 no-select\",attrs:{\"color\":\"#1976fa0a\",\"title\":study.StudyDate}},[_c('div',{staticClass:\"study-header\"},[_c('div',{staticClass:\"study-header-title\"},[_c('v-checkbox',{key:study.StudyInstanceUID,attrs:{\"dense\":\"\",\"value\":study.StudyInstanceUID},on:{\"click\":function($event){$event.stopPropagation();}},model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}}),_c('v-icon',{staticClass:\"mb-2\"},[_vm._v(\"mdi-folder-table\")]),_c('div',{staticClass:\"ml-2 overflow-hidden text-no-wrap\"},[_c('div',{staticClass:\"text-subtitle-2 text-truncate\",attrs:{\"title\":study.title}},[_vm._v(\" \"+_vm._s(study.title)+\" \")]),(study.StudyDescription)?_c('div',{staticClass:\"text-caption text-truncate\"},[_vm._v(\" \"+_vm._s(study.StudyDate)+\" \")]):_vm._e()])],1),_c('div',{staticClass:\"d-flex flex-column align-center justify-end mx-2\"},[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('div',_vm._g({staticClass:\"d-flex flex-row align-center mr-2\"},on),[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"mdi-folder-open\")]),_c('span',{staticClass:\"text-caption text--secondary text-no-wrap\"},[_vm._v(\" : \"+_vm._s(study.volumeKeys.length)+\" \")])],1)]}}],null,true)},[_vm._v(\" Total series in study \")])],1)])]),_c('v-expansion-panel-content',[_c('patient-study-volume-browser',{attrs:{\"volume-keys\":study.volumeKeys}})],1)],1)}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',{staticClass:\"pa-0\"},[_c('v-row',{attrs:{\"no-gutters\":\"\",\"justify\":\"space-between\"}},[_c('v-col',{attrs:{\"cols\":\"6\",\"align-self\":\"center\"}},[_c('v-checkbox',{staticClass:\"ml-3 align-center justify-center\",attrs:{\"indeterminate\":_vm.selectedSome && !_vm.selectedAll,\"label\":\"Select All\",\"dense\":\"\",\"hide-details\":\"\"},model:{value:(_vm.selectedAll),callback:function ($$v) {_vm.selectedAll=$$v},expression:\"selectedAll\"}})],1),_c('v-col',{staticClass:\"d-flex justify-end mt-2\",attrs:{\"cols\":\"6\",\"align-self\":\"center\"}},[_c('v-tooltip',{attrs:{\"left\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('v-btn',_vm._g(_vm._b({attrs:{\"icon\":\"\",\"small\":\"\",\"disabled\":!_vm.selectedSome},on:{\"click\":function($event){$event.stopPropagation();return _vm.removeSelectedDICOMVolumes.apply(null, arguments)}}},'v-btn',attrs,false),on),[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)]}}])},[_vm._v(\" Delete selected \")])],1)],1),_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-col',[_c('div',{staticClass:\"my-2 volume-list\"},_vm._l((_vm.volumes),function(volume){return _c('groupable-item',{key:volume.info.VolumeID,attrs:{\"value\":volume.selectionKey},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar select = ref.select;\nreturn [_c('v-card',{class:{\n 'volume-card': true,\n 'volume-card-active': active,\n },attrs:{\"outlined\":\"\",\"ripple\":\"\",\"min-height\":\"180px\",\"min-width\":\"180px\",\"title\":volume.info.SeriesDescription},on:{\"click\":select}},[_c('v-row',{staticClass:\"pa-0\",attrs:{\"no-gutters\":\"\",\"justify\":\"center\"}},[_c('div',[_c('v-img',{attrs:{\"contain\":\"\",\"max-height\":\"150px\",\"max-width\":\"150px\",\"src\":(_vm.thumbnailCache || {})[volume.cacheKey] || ''},scopedSlots:_vm._u([{key:\"placeholder\",fn:function(){return [_c('v-row',{staticClass:\"fill-height ma-0\",attrs:{\"align\":\"center\",\"justify\":\"center\"}},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"color\":\"grey lighten-5\"}})],1)]},proxy:true}],null,true)},[_c('v-overlay',{staticClass:\"thumbnail-overlay\",attrs:{\"absolute\":\"\",\"value\":true,\"opacity\":\"0\"}},[_c('div',{staticClass:\"d-flex flex-column fill-height\"},[_c('v-row',{attrs:{\"no-gutters\":\"\",\"justify\":\"end\",\"align-content\":\"start\"}},[_c('v-checkbox',{key:volume.info.VolumeID,attrs:{\"value\":volume.key,\"dense\":\"\"},on:{\"click\":function($event){$event.stopPropagation();}},model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}})],1),_c('v-spacer'),_c('v-row',{attrs:{\"no-gutters\":\"\",\"justify\":\"start\",\"align\":\"end\"}},[_c('div',{staticClass:\"mb-1 ml-1 text-caption\"},[_vm._v(\" [\"+_vm._s(volume.info.NumberOfSlices)+\"] \")])])],1)])],1)],1)]),_c('v-card-text',{staticClass:\"text--primary text-caption text-center series-desc mt-n3\"},[_c('div',{staticClass:\"text-ellipsis\"},[_vm._v(\" \"+_vm._s(volume.info.SeriesDescription || '(no description)')+\" \")])])],1)]}}],null,true)})}),1)])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport {\n computed,\n defineComponent,\n del,\n reactive,\n set,\n toRefs,\n watch,\n} from '@vue/composition-api';\nimport Image from 'itk-wasm/dist/core/Image';\nimport type { PropType } from '@vue/composition-api';\nimport GroupableItem from '@/src/components/GroupableItem.vue';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport {\n DataSelection,\n selectionEquals,\n useDatasetStore,\n} from '../store/datasets';\nimport { useMultiSelection } from '../composables/useMultiSelection';\nimport { useMessageStore } from '../store/messages';\n\nconst canvas = document.createElement('canvas');\n\nfunction dicomCacheKey(volKey: string) {\n return `dicom-${volKey}`;\n}\n\n// Assume itkImage type is Uint8Array\nfunction itkImageToURI(itkImage: Image) {\n const [width, height] = itkImage.size;\n const im = new ImageData(width, height);\n const arr32 = new Uint32Array(im.data.buffer);\n const itkBuf = itkImage.data;\n if (!itkBuf) {\n return '';\n }\n\n for (let i = 0; i < itkBuf.length; i += 1) {\n const byte = itkBuf[i] as number;\n // ABGR order\n // eslint-disable-next-line no-bitwise\n arr32[i] = (255 << 24) | (byte << 16) | (byte << 8) | byte;\n }\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.putImageData(im, 0, 0);\n return canvas.toDataURL('image/png');\n }\n return '';\n}\n\nasync function generateDICOMThumbnail(\n dicomStore: ReturnType<typeof useDICOMStore>,\n volumeKey: string\n) {\n if (volumeKey in dicomStore.volumeInfo) {\n const info = dicomStore.volumeInfo[volumeKey];\n const middleSlice = Math.ceil(Number(info.NumberOfSlices) / 2);\n const thumb = (await dicomStore.getVolumeSlice(\n volumeKey,\n middleSlice,\n true\n )) as Image;\n\n return thumb;\n }\n return null;\n}\n\nexport default defineComponent({\n name: 'PatientBrowser',\n props: {\n volumeKeys: {\n type: Array as PropType<Array<string>>,\n required: true,\n },\n },\n components: {\n GroupableItem,\n },\n setup(props) {\n const { volumeKeys } = toRefs(props);\n const dicomStore = useDICOMStore();\n const dataStore = useDatasetStore();\n\n const volumes = computed(() => {\n const { volumeInfo } = dicomStore;\n return volumeKeys.value.map((volumeKey) => ({\n key: volumeKey,\n // for thumbnailing\n cacheKey: dicomCacheKey(volumeKey),\n info: volumeInfo[volumeKey],\n // for UI selection\n selectionKey: {\n type: 'dicom',\n volumeKey,\n } as DataSelection,\n }));\n });\n\n // --- thumbnails --- //\n\n const thumbnailCache = reactive<Record<string, string>>({});\n\n watch(\n volumeKeys,\n (keys) => {\n keys.forEach(async (key) => {\n const cacheKey = dicomCacheKey(key);\n if (cacheKey in thumbnailCache) {\n return;\n }\n\n try {\n const thumb = await generateDICOMThumbnail(dicomStore, key);\n if (thumb !== null) {\n const encodedImage = itkImageToURI(thumb);\n set(thumbnailCache, cacheKey, encodedImage);\n }\n } catch (err) {\n if (err instanceof Error) {\n const messageStore = useMessageStore();\n messageStore.addError('Failed to generate thumbnails', {\n details: `${err}. More details can be found in the developer's console.`,\n });\n }\n }\n });\n\n // deletion case\n const lookup = new Set(keys.map((key) => dicomCacheKey(key)));\n Object.keys(thumbnailCache).forEach((key) => {\n if (!lookup.has(key)) {\n del(thumbnailCache, key);\n }\n });\n },\n { immediate: true, deep: true }\n );\n\n // --- selection --- //\n\n const { selected, selectedAll, selectedSome } =\n useMultiSelection(volumeKeys);\n\n const removeSelectedDICOMVolumes = () => {\n selected.value.forEach(async (volumeKey) => {\n dicomStore.deleteVolume(volumeKey);\n });\n\n selected.value = [];\n };\n\n return {\n selected,\n selectedAll,\n selectedSome,\n thumbnailCache,\n volumes,\n removeSelectedDICOMVolumes,\n selectionEquals,\n setPrimarySelection: (sel: DataSelection) => {\n dataStore.setPrimarySelection(sel);\n },\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PatientStudyVolumeBrowser.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PatientStudyVolumeBrowser.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./PatientStudyVolumeBrowser.vue?vue&type=template&id=35919dbc&scoped=true&\"\nimport script from \"./PatientStudyVolumeBrowser.vue?vue&type=script&lang=ts&\"\nexport * from \"./PatientStudyVolumeBrowser.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./PatientStudyVolumeBrowser.vue?vue&type=style&index=0&id=35919dbc&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"35919dbc\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VCard,VCardText,VCheckbox,VCol,VContainer,VIcon,VImg,VOverlay,VProgressCircular,VRow,VSpacer,VTooltip})\n","import { computed, ref, Ref, watch } from '@vue/composition-api';\n\nexport interface Panel {\n key: string;\n isOpen: boolean;\n}\n\nexport function usePanels(keys: Ref<Set<string>>) {\n const panels = ref<Panel[]>([]);\n\n watch(\n keys,\n (newKeys, oldKeys) => {\n // remove deleted\n panels.value = panels.value.filter(({ key }) => newKeys.has(key));\n\n const addedKeys = [...newKeys].filter((key) => !oldKeys?.has(key));\n // order in temporal created order, not template order. See https://github.com/vuetifyjs/vuetify/issues/11225\n panels.value = [\n ...panels.value,\n ...addedKeys.map((key) => ({ key, isOpen: true })),\n ];\n },\n // flush: 'post' keeps panels open when deleting patients\n // because panels.value has the same number panels in v-expansion-panels after flush\n { flush: 'post', immediate: true }\n );\n\n const handlePanelChange = (changeKey: string) => {\n const panel = panels.value.find(({ key }) => key === changeKey);\n panel!.isOpen = !panel!.isOpen;\n };\n\n const openPanels: Ref<number[]> = computed(() => {\n return panels.value\n .map(({ isOpen }, idx) => ({ isOpen, idx }))\n .filter(({ isOpen }) => isOpen)\n .map(({ idx }) => idx);\n });\n\n return { handlePanelChange, openPanels };\n}\n","\nimport { computed, defineComponent, ref, toRefs } from '@vue/composition-api';\nimport type { Ref } from '@vue/composition-api';\nimport ItemGroup from '@/src/components/ItemGroup.vue';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport {\n DataSelection,\n DICOMSelection,\n selectionEquals,\n useDatasetStore,\n} from '../store/datasets';\nimport { useMultiSelection } from '../composables/useMultiSelection';\nimport PatientStudyVolumeBrowser from './PatientStudyVolumeBrowser.vue';\nimport { usePanels } from '../composables/usePanels';\n\nexport default defineComponent({\n name: 'PatientBrowser',\n props: {\n patientKey: {\n type: String,\n required: true,\n },\n },\n components: {\n ItemGroup,\n PatientStudyVolumeBrowser,\n },\n setup(props) {\n const { patientKey } = toRefs(props);\n\n const selectedSeries: Ref<DICOMSelection[]> = ref([]);\n\n const dicomStore = useDICOMStore();\n const dataStore = useDatasetStore();\n\n const primarySelection = computed(() => dataStore.primarySelection);\n\n const studies = computed(() => {\n const selPatient = patientKey.value;\n const { patientStudies, studyInfo, studyVolumes } = dicomStore;\n return patientStudies[selPatient].map((studyKey) => {\n const info = studyInfo[studyKey];\n return {\n ...info,\n key: studyKey,\n title:\n info.StudyDescription || info.StudyDate || info.StudyInstanceUID,\n volumeKeys: studyVolumes[studyKey].sort(),\n };\n });\n });\n\n const studyKeys = computed(() => studies.value.map((study) => study.key));\n const studyKeysSet = computed(() => new Set(studyKeys.value));\n\n const { handlePanelChange, openPanels } = usePanels(studyKeysSet);\n\n // --- selection --- //\n\n const { selected, selectedAll, selectedSome } =\n useMultiSelection(studyKeys);\n\n const removeSelectedStudies = () => {\n selected.value.forEach(async (study) => {\n dicomStore.deleteStudy(study);\n });\n selected.value = [];\n\n // Handle the case where we are deleting the selected study\n // if (selected.value.indexOf(selectedStudy.value) !== -1) {\n // dataStore.setPrimarySelection(null);\n // }\n };\n\n return {\n selected,\n selectedAll,\n selectedSome,\n selectedSeries,\n primarySelection,\n removeSelectedStudies,\n studies,\n selectionEquals,\n setPrimarySelection: (sel: DataSelection) => {\n dataStore.setPrimarySelection(sel);\n },\n openPanels,\n handlePanelChange,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PatientBrowser.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PatientBrowser.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./PatientBrowser.vue?vue&type=template&id=552e9e25&scoped=true&\"\nimport script from \"./PatientBrowser.vue?vue&type=script&lang=ts&\"\nexport * from \"./PatientBrowser.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./PatientBrowser.vue?vue&type=style&index=0&id=552e9e25&prod&lang=css&\"\nimport style1 from \"./PatientBrowser.vue?vue&type=style&index=1&id=552e9e25&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"552e9e25\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VExpansionPanel } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelContent } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelHeader } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanels } from 'vuetify/lib/components/VExpansionPanel';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VCheckbox,VCol,VContainer,VExpansionPanel,VExpansionPanelContent,VExpansionPanelHeader,VExpansionPanels,VIcon,VRow,VTooltip})\n","\nimport { computed, defineComponent, watch } from '@vue/composition-api';\nimport SampleDataBrowser from './SampleDataBrowser.vue';\nimport ImageDataBrowser from './ImageDataBrowser.vue';\nimport PatientBrowser from './PatientBrowser.vue';\nimport { useDICOMStore } from '../store/datasets-dicom';\nimport { useImageStore } from '../store/datasets-images';\nimport { usePanels } from '../composables/usePanels';\n\nconst SAMPLE_DATA_KEY = 'sampleData';\nconst ANONYMOUS_DATA_KEY = 'anonymousData';\n\nexport default defineComponent({\n name: 'DataBrowser',\n components: {\n SampleDataBrowser,\n ImageDataBrowser,\n PatientBrowser,\n },\n setup() {\n const dicomStore = useDICOMStore();\n const imageStore = useImageStore();\n\n // TODO show patient ID in parens if there is a name conflict\n const patients = computed(() =>\n Object.entries(dicomStore.patientInfo)\n .map(([key, info]) => ({\n key,\n name: info.PatientName,\n info,\n }))\n .sort((a, b) => (a.name < b.name ? -1 : 1))\n );\n\n const hasAnonymousImages = computed(\n () =>\n imageStore.idList.filter((id) => !(id in dicomStore.imageIDToVolumeKey))\n .length > 0\n );\n\n const panelKeys = computed(\n () =>\n new Set([\n SAMPLE_DATA_KEY,\n ...(hasAnonymousImages.value ? [ANONYMOUS_DATA_KEY] : []),\n ...patients.value.map((study) => study.key),\n ])\n );\n\n const { handlePanelChange, openPanels } = usePanels(panelKeys);\n\n // Collapse Sample Data after loading data\n watch(panelKeys, (newSet, oldSet) => {\n // Sample Data panel index always 0\n if (newSet.size > oldSet.size && openPanels.value.includes(0)) {\n handlePanelChange(SAMPLE_DATA_KEY);\n }\n });\n\n return {\n openPanels,\n patients,\n deletePatient: dicomStore.deletePatient,\n hasAnonymousImages,\n handlePanelChange,\n SAMPLE_DATA_KEY,\n ANONYMOUS_DATA_KEY,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DataBrowser.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DataBrowser.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./DataBrowser.vue?vue&type=template&id=b1dc2080&scoped=true&\"\nimport script from \"./DataBrowser.vue?vue&type=script&lang=ts&\"\nexport * from \"./DataBrowser.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./DataBrowser.vue?vue&type=style&index=0&id=b1dc2080&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b1dc2080\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VExpansionPanel } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelContent } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelHeader } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanels } from 'vuetify/lib/components/VExpansionPanel';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VExpansionPanel,VExpansionPanelContent,VExpansionPanelHeader,VExpansionPanels,VIcon,VList,VListItem,VListItemTitle,VMenu,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overflow-y-auto mx-2 fill-height\"},[(_vm.hasCurrentImage)?[_c('volume-rendering'),_c('v-expansion-panels',{attrs:{\"multiple\":\"\",\"accordion\":\"\",\"value\":[1]}},[_c('v-expansion-panel',[_c('v-expansion-panel-header',[_c('v-icon',{staticClass:\"flex-grow-0 mr-4\"},[_vm._v(\"mdi-palette\")]),_vm._v(\" Color Presets \")],1),_c('v-expansion-panel-content',[_c('volume-presets')],1)],1),_c('v-expansion-panel',[_c('v-expansion-panel-header',[_c('v-icon',{staticClass:\"flex-grow-0 mr-4\"},[_vm._v(\"mdi-cube-scan\")]),_vm._v(\" Cinematic Rendering \")],1),_c('v-expansion-panel-content',[_c('volume-properties')],1)],1)],1)]:[_c('div',{staticClass:\"text-center pt-12 text-subtitle-1\"},[_vm._v(\"No image selected\")])]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mx-2\"},[_c('div',{ref:\"editorContainerRef\",staticClass:\"mt-4\"},[_c('div',{ref:\"pwfEditorRef\"})]),(!!_vm.cvrParams)?_c('div',[_c('v-slider',{attrs:{\"label\":\"Ambient\",\"min\":\"0\",\"max\":\"1\",\"step\":\"0.1\",\"dense\":\"\",\"hide-details\":\"\",\"thumb-label\":\"\",\"value\":_vm.cvrParams.ambient},on:{\"change\":function($event){return _vm.setCVRParam('ambient', $event)}}}),_c('v-slider',{attrs:{\"label\":\"Diffuse\",\"min\":\"0\",\"max\":\"2\",\"step\":\"0.1\",\"dense\":\"\",\"hide-details\":\"\",\"thumb-label\":\"\",\"value\":_vm.cvrParams.diffuse},on:{\"change\":function($event){return _vm.setCVRParam('diffuse', $event)}}}),_c('v-switch',{attrs:{\"label\":\"Light follows camera\",\"dense\":\"\",\"hide-details\":\"\",\"input-value\":_vm.cvrParams.lightFollowsCamera},on:{\"change\":function($event){return _vm.setCVRParam('lightFollowsCamera', !!$event)}}}),_c('v-divider',{staticClass:\"my-8\"}),_c('v-row',{staticClass:\"my-4\"},[_c('v-btn-toggle',{attrs:{\"mandatory\":\"\"},on:{\"change\":_vm.selectLightingMode},model:{value:(_vm.lightingModel),callback:function ($$v) {_vm.lightingModel=$$v},expression:\"lightingModel\"}},_vm._l((Object.values(_vm.LIGHTING_MODELS)),function(model){return _c('v-btn',{key:model},[_vm._v(\" \"+_vm._s(model)+\" \")])}),1)],1),(_vm.vsbEnabled)?_c('v-slider',{attrs:{\"label\":\"Scatter Blending\",\"min\":\"0\",\"max\":\"1\",\"step\":\"0.05\",\"dense\":\"\",\"hide-details\":\"\",\"thumb-label\":\"\",\"value\":_vm.cvrParams.volumetricScatteringBlending},on:{\"change\":function($event){return _vm.setCVRParam('volumetricScatteringBlending', $event)}}}):_vm._e(),(_vm.laoEnabled)?_c('v-slider',{attrs:{\"label\":\"LAO Kernel Size\",\"min\":\"2\",\"max\":\"10\",\"step\":\"1\",\"dense\":\"\",\"hide-details\":\"\",\"thumb-label\":\"\",\"value\":_vm.cvrParams.laoKernelSize},on:{\"change\":function($event){return _vm.setCVRParam('laoKernelSize', $event)}}}):_vm._e(),(_vm.laoEnabled)?_c('v-slider',{attrs:{\"label\":\"LAO Kernel Radius\",\"min\":_vm.cvrParams.laoKernelSize * 2,\"max\":_vm.cvrParams.laoKernelSize * 2 + 10,\"step\":\"1\",\"dense\":\"\",\"hide-details\":\"\",\"thumb-label\":\"\",\"value\":_vm.cvrParams.laoKernelRadius},on:{\"change\":function($event){return _vm.setCVRParam('laoKernelRadius', $event)}}}):_vm._e()],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport { computed, defineComponent, ref, watch } from '@vue/composition-api';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport { useViewConfigStore } from '../store/view-configs';\nimport { CVRConfig } from '../types/views';\n\nconst TARGET_VIEW_ID = '3D';\n\nconst LIGHTING_MODELS = {\n standard: 'Standard',\n hybrid: 'Hybrid',\n lao: 'Ambient Occlusion',\n};\n\nexport default defineComponent({\n name: 'VolumeRendering',\n setup() {\n const viewConfigStore = useViewConfigStore();\n\n const { currentImageID } = useCurrentImage();\n\n const volumeColorConfig = viewConfigStore.getComputedVolumeColorConfig(\n TARGET_VIEW_ID,\n currentImageID\n );\n\n watch(volumeColorConfig, () => {\n const imageID = currentImageID.value;\n if (imageID && !volumeColorConfig.value) {\n // creates a default color config\n viewConfigStore.updateVolumeColorConfig(TARGET_VIEW_ID, imageID, {});\n }\n });\n\n // --- CVR --- //\n\n const cvrParams = computed(() => volumeColorConfig.value?.cvr);\n\n const setCVRParam = (key: keyof CVRConfig, value: any) => {\n if (!currentImageID.value) return;\n viewConfigStore.updateVolumeCVRParameters(\n TARGET_VIEW_ID,\n currentImageID.value,\n {\n [key]: value,\n }\n );\n };\n\n const laoEnabled = computed(\n () => !!cvrParams.value?.useLocalAmbientOcclusion\n );\n const vsbEnabled = computed(\n () => !!cvrParams.value?.useVolumetricScatteringBlending\n );\n\n const lightingModel = ref(2); // LAO is default\n const selectLightingMode = (buttonIdx: number) => {\n if (buttonIdx === 0) {\n setCVRParam('useVolumetricScatteringBlending', false);\n setCVRParam('useLocalAmbientOcclusion', false);\n } else if (buttonIdx === 1) {\n setCVRParam('useVolumetricScatteringBlending', true);\n setCVRParam('useLocalAmbientOcclusion', false);\n } else if (buttonIdx === 2) {\n setCVRParam('useVolumetricScatteringBlending', false);\n setCVRParam('useLocalAmbientOcclusion', true);\n }\n };\n\n return {\n cvrParams,\n laoEnabled,\n vsbEnabled,\n setCVRParam,\n LIGHTING_MODELS,\n selectLightingMode,\n lightingModel,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolumeProperties.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolumeProperties.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VolumeProperties.vue?vue&type=template&id=a43e2b5a&\"\nimport script from \"./VolumeProperties.vue?vue&type=script&lang=ts&\"\nexport * from \"./VolumeProperties.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VBtnToggle } from 'vuetify/lib/components/VBtnToggle';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSlider } from 'vuetify/lib/components/VSlider';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\ninstallComponents(component, {VBtn,VBtnToggle,VDivider,VRow,VSlider,VSwitch})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overflow-hidden\"},[_c('div',{ref:\"editorContainerRef\",staticClass:\"mt-4 pwf-editor\"},[_c('div',{ref:\"pwfEditorRef\"})]),_c('div',[_c('color-function-slider',{attrs:{\"dense\":\"\",\"hide-details\":\"\",\"min\":_vm.fullMappingRange[0],\"max\":_vm.fullMappingRange[1],\"step\":_vm.colorSliderStep,\"rgb-points\":_vm.rgbPoints,\"value\":_vm.mappingRange},on:{\"input\":_vm.onColorMappingUpdate,\"change\":_vm.onColorMappingFinalize}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import macro from '@kitware/vtk.js/macro';\nimport vtkPiecewiseGaussianWidget from '@kitware/vtk.js/Interaction/Widgets/PiecewiseGaussianWidget';\n\nexport const Mode = {\n Gaussians: 1,\n Points: 2,\n};\n\nexport const ADJUST_POSITION_CURSOR = '-webkit-grab';\n\n/**\n * Samples a piecewise linear function at regular intervals in [0,1].\n * The first and last values are set to zero, since the output\n * is used for vtkPiecewiseGaussianWidget.drawChart().\n *\n * Assumes normalized x/y coordinate points.\n */\n\nexport function samplePiecewiseLinear(points, shift = 0, samples = 256) {\n const filledPoints = [...points];\n // set endpoints to drop to 0\n filledPoints.push([points[0][0], 0]);\n filledPoints.push([points[points.length - 1][0], 0]);\n\n const sampledPoints = [];\n let pi = 0;\n let p1 = filledPoints[0]; // left\n let p2 = filledPoints[1]; // right\n let slope = (p2[1] - p1[1]) / (p2[0] - p1[0]);\n for (let i = 0; i < samples; i += 1) {\n const sx = i / (samples - 1) - shift; // sample x\n if (i < samples - 1) {\n while (sx > p2[0] && pi < filledPoints.length - 2) {\n pi += 1;\n // extraneous work if this loop goes over more than once,\n // which only happens if sx > 0 on first iteration (aka shift < 0)\n p1 = filledPoints[pi];\n p2 = filledPoints[pi + 1];\n if (Math.abs(p2[0] - p1[0]) < 1e-8) {\n slope = Infinity * Math.sign(p2[1] - p1[1]);\n } else {\n slope = (p2[1] - p1[1]) / (p2[0] - p1[0]);\n }\n }\n if (slope === Infinity) {\n sampledPoints.push(1);\n } else if (slope === -Infinity) {\n sampledPoints.push(0);\n } else {\n sampledPoints.push(slope * (sx - p1[0]) + p1[1]);\n }\n }\n }\n return sampledPoints;\n}\n\n// ----------------------------------------------------------------------------\n// vtkPiecewiseWidget methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPiecewiseWidget(publicAPI, model) {\n model.classHierarchy.push('vtkPiecewiseWidget');\n\n const superClass = { ...publicAPI };\n\n model.pwMode = Mode.Gaussians;\n model.opacityPoints = [];\n model.opacityPointShift = 0;\n\n publicAPI.setGaussiansMode = () => {\n model.pwMode = Mode.Gaussians;\n };\n\n publicAPI.setPointsMode = () => {\n // clear gaussians so we don't keep this ref around\n model.gaussians = [];\n model.pwMode = Mode.Points;\n };\n\n publicAPI.isModeGaussians = () => model.pwMode === Mode.Gaussians;\n publicAPI.isModePoints = () => model.pwMode === Mode.Points;\n publicAPI.getMode = () => model.pwMode;\n\n publicAPI.shiftPosition = (coords, meta) => {\n model.opacityPointShift =\n meta.originalOpacityPointShift + coords[0] - meta.originalXY[0];\n return true;\n };\n\n publicAPI.onHover = (x, y) => {\n if (publicAPI.isModeGaussians()) {\n return superClass.onHover(x, y);\n }\n model.canvas.style.cursor = ADJUST_POSITION_CURSOR;\n return true;\n };\n\n publicAPI.onClick = (x, y) => {\n if (publicAPI.isModeGaussians()) {\n return superClass.onClick(x, y);\n }\n return undefined;\n };\n\n publicAPI.onDown = (x, y) => {\n if (publicAPI.isModeGaussians()) {\n return superClass.onDown(x, y);\n }\n\n if (!model.mouseIsDown) {\n publicAPI.invokeAnimation(true);\n }\n\n const mouseCoords = vtkPiecewiseGaussianWidget.normalizeCoordinates(\n x,\n y,\n model.graphArea\n );\n\n model.mouseIsDown = true;\n model.activeGaussian = -1;\n model.dragAction = {\n originalXY: mouseCoords,\n originalOpacityPointShift: model.opacityPointShift,\n };\n\n return true;\n };\n\n publicAPI.onDrag = (x, y) => {\n if (publicAPI.isModeGaussians()) {\n return superClass.onDrag(x, y);\n }\n\n const normCoords = vtkPiecewiseGaussianWidget.normalizeCoordinates(\n x,\n y,\n model.graphArea\n );\n if (publicAPI.shiftPosition(normCoords, model.dragAction)) {\n model.opacities = samplePiecewiseLinear(\n model.opacityPoints,\n model.opacityPointShift\n );\n publicAPI.invokeOpacityChange(publicAPI, true);\n }\n\n publicAPI.modified();\n return true;\n };\n\n publicAPI.setOpacityPoints = (points, shift = 0) => {\n if (publicAPI.isModePoints()) {\n // deep copy\n model.opacityPoints = points.map((p) => [p[0], p[1]]);\n model.opacityPointShift = shift;\n\n model.opacities = samplePiecewiseLinear(\n model.opacityPoints,\n model.opacityPointShift\n );\n publicAPI.modified();\n }\n };\n\n publicAPI.getEffectiveOpacityPoints = () =>\n model.opacityPoints.map((p) => [p[0] + model.opacityPointShift, p[1]]);\n\n publicAPI.render = () => {\n if (publicAPI.isModePoints()) {\n model.activeGaussian = -1;\n model.selectedGaussian = -1;\n }\n superClass.render();\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkPiecewiseGaussianWidget.extend(publicAPI, model, initialValues);\n\n macro.setGet(publicAPI, model, ['opacityPoints', 'opacityPointShift']);\n\n // Object specific methods\n vtkPiecewiseWidget(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkPiecewiseWidget');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","<script>\nimport { VRangeSlider } from 'vuetify/lib';\n\nconst DEFAULT_TRACK_COLOR = 'rgba(128, 128, 128, 0.2)';\nconst CLASS_COLOR_FUNCTION = 'volview__color-function';\nconst CLASS_COLOR_FUNCTION_MIDDLE = `${CLASS_COLOR_FUNCTION}_middle`;\n\nexport default VRangeSlider.extend({\n name: 'color-function-slider',\n props: {\n rgbPoints: Array,\n range: Array,\n },\n computed: {\n startBackgroundColor() {\n if (!this.rgbPoints) {\n return DEFAULT_TRACK_COLOR;\n }\n const [r, g, b] = this.rgbPoints.slice(1, 4).map((c) => c * 255);\n return `rgb(${r}, ${g}, ${b})`;\n },\n filledBackgroundColor() {\n if (!this.rgbPoints) {\n return DEFAULT_TRACK_COLOR;\n }\n const rangeMax = this.rgbPoints[this.rgbPoints.length - 4];\n const rangeMin = this.rgbPoints[0];\n const width = rangeMax - rangeMin;\n const colorStops = [];\n for (let i = 0; i < this.rgbPoints.length; i += 4) {\n const [r, g, b] = [\n this.rgbPoints[i + 1] * 255,\n this.rgbPoints[i + 2] * 255,\n this.rgbPoints[i + 3] * 255,\n ];\n const stop = ((this.rgbPoints[i] - rangeMin) / width) * 100; // in percent\n colorStops.push(`rgba(${r}, ${g}, ${b}) ${stop.toFixed(2)}%`);\n }\n return `linear-gradient(to right, ${colorStops.join(', ')})`;\n },\n endBackgroundColor() {\n if (!this.rgbPoints) {\n return DEFAULT_TRACK_COLOR;\n }\n const end = this.rgbPoints.length;\n const [r, g, b] = this.rgbPoints.slice(end - 3).map((c) => c * 255);\n return `rgb(${r}, ${g}, ${b})`;\n },\n },\n methods: {\n // override\n onSliderMouseDown(e) {\n if (e.target.classList.contains(CLASS_COLOR_FUNCTION_MIDDLE)) {\n this._middleDragStart = this.parseMouseMove(e);\n } else {\n this._middleDragStart = null;\n }\n VRangeSlider.options.methods.onSliderMouseDown.call(this, e);\n },\n // override\n onSliderClick() {\n // do nothing on click\n },\n // override\n onMouseMove(e) {\n const value = this.parseMouseMove(e);\n\n if (e.type === 'mousemove') {\n this.thumbPressed = true;\n }\n\n if (this._middleDragStart != null) {\n const delta = value - this._middleDragStart;\n this.applyRangeDelta(delta);\n } else {\n if (this.activeThumb === null) {\n this.activeThumb = this.getIndexOfClosestValue(\n this.internalValue,\n value\n );\n }\n\n this.setInternalValue(value);\n }\n },\n // override\n genTrackContainer() {\n const children = [];\n\n const padding = this.isDisabled ? 10 : 0;\n const sections = [\n {\n class: `v-slider__track-background ${CLASS_COLOR_FUNCTION}`,\n styles: [0, this.inputWidth[0], 0, -padding],\n extraStyles: {\n background: this.startBackgroundColor,\n },\n },\n {\n class: `v-slider__track-background ${CLASS_COLOR_FUNCTION} ${CLASS_COLOR_FUNCTION_MIDDLE}`,\n styles: [\n this.inputWidth[0],\n Math.abs(this.inputWidth[1] - this.inputWidth[0]),\n padding,\n padding * -2,\n ],\n extraStyles: {\n background: this.filledBackgroundColor,\n },\n },\n {\n class: `v-slider__track-background ${CLASS_COLOR_FUNCTION}`,\n styles: [\n this.inputWidth[1],\n Math.abs(100 - this.inputWidth[1]),\n padding,\n -padding,\n ],\n extraStyles: {\n background: this.endBackgroundColor,\n },\n },\n ];\n\n if (this.$vuetify.rtl) sections.reverse();\n\n children.push(\n ...sections.map((section) =>\n this.$createElement('div', {\n ...this.setBackgroundColor(section.color, {\n staticClass: section.class,\n style: {\n ...this.getTrackStyle(...section.styles),\n ...section.extraStyles,\n },\n }),\n on: section.events,\n })\n )\n );\n\n return this.$createElement(\n 'div',\n {\n staticClass: 'v-slider__track-container',\n ref: 'track',\n },\n children\n );\n },\n applyRangeDelta(delta) {\n // this.oldValue is from VRangeSlider::onSliderMouseDown\n let [low, high] = this.oldValue;\n // assumption: min <= low < high <= max\n if (low + delta < this.min) {\n high -= low - this.min;\n low = this.min;\n } else if (high + delta > this.max) {\n low += this.max - high;\n high = this.max;\n } else {\n low += delta;\n high += delta;\n }\n this.internalValue = [low, high];\n },\n },\n});\n</script>\n\n<style scoped>\n.v-slider--horizontal .v-slider__track-container {\n height: 80%;\n display: flex;\n align-items: center;\n}\n\n.volview__color-function_middle:hover {\n cursor: grab;\n}\n</style>\n","var render, staticRenderFns\nimport script from \"./ColorFunctionSlider.vue?vue&type=script&lang=js&\"\nexport * from \"./ColorFunctionSlider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ColorFunctionSlider.vue?vue&type=style&index=0&id=1ab874a0&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1ab874a0\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ColorFunctionSlider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ColorFunctionSlider.vue?vue&type=script&lang=js&\"","import vtkGenericRenderWindow from '@kitware/vtk.js/Rendering/Misc/GenericRenderWindow';\nimport vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\nimport vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\nimport vtkLookupTableProxy from '@kitware/vtk.js/Proxy/Core/LookupTableProxy';\nimport { vec3 } from 'gl-matrix';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport vtkVolumeProperty from '@kitware/vtk.js/Rendering/Core/VolumeProperty';\nimport { getDiagonalLength } from '@kitware/vtk.js/Common/DataModel/BoundingBox';\n\nexport function createRenderingPipeline() {\n const actor = vtkVolume.newInstance();\n const mapper = vtkVolumeMapper.newInstance();\n const property = actor.getProperty();\n const cfun = vtkColorTransferFunction.newInstance();\n const ofun = vtkPiecewiseFunction.newInstance();\n property.setRGBTransferFunction(0, cfun);\n property.setScalarOpacity(0, ofun);\n actor.setMapper(mapper);\n return {\n actor,\n mapper,\n property,\n cfun,\n ofun,\n };\n}\n\nfunction updateRenderingProperty(\n prop: vtkVolumeProperty,\n mapper: vtkVolumeMapper,\n image: vtkImageData\n) {\n const scalars = image.getPointData().getScalars();\n const dataRange = scalars.getRange();\n\n const sampleDistance =\n 0.7 *\n Math.sqrt(\n image\n .getSpacing()\n .map((v) => v * v)\n .reduce((a, b) => a + b, 0)\n );\n mapper.setSampleDistance(sampleDistance * 2 ** (0.4 * 3.0 - 1.5));\n\n prop.setScalarOpacityUnitDistance(\n 0,\n getDiagonalLength(image.getBounds()) / Math.max(...image.getDimensions())\n );\n prop.setGradientOpacityMinimumValue(0, 0);\n prop.setGradientOpacityMaximumValue(0, (dataRange[1] - dataRange[0]) * 0.05);\n // - Use shading based on gradient\n prop.setShade(true);\n prop.setUseGradientOpacity(0, true);\n // - generic good default\n prop.setGradientOpacityMinimumOpacity(0, 0.0);\n prop.setGradientOpacityMaximumOpacity(0, 1.0);\n prop.setAmbient(0.2);\n prop.setDiffuse(0.7);\n prop.setSpecular(0.3);\n prop.setSpecularPower(8.0);\n}\n\nexport function createVolumeThumbnailer(size: number) {\n const container = document.createElement('div');\n container.style.width = `${size}px`;\n container.style.height = `${size}px`;\n\n const scene = vtkGenericRenderWindow.newInstance({\n listenWindowResize: false,\n background: [0.2, 0.3, 0.4],\n });\n scene.setContainer(container);\n\n const pipeline = createRenderingPipeline();\n const { actor, mapper } = pipeline;\n const renderer = scene.getRenderer();\n\n // wrap with proxies for easier usage\n const opacityFuncProxy = vtkPiecewiseFunctionProxy.newInstance({\n piecewiseFunction: pipeline.ofun,\n });\n const colorTransferFuncProxy = vtkLookupTableProxy.newInstance({\n lookupTable: pipeline.cfun,\n });\n\n return {\n scene,\n pipeline,\n opacityFuncProxy,\n colorTransferFuncProxy,\n setInputImage(image: vtkImageData | null) {\n if (image) {\n mapper.setInputData(image);\n updateRenderingProperty(actor.getProperty(), mapper, image);\n if (!renderer.hasViewProp(actor)) {\n renderer.addVolume(actor);\n }\n } else {\n renderer.removeVolume(actor);\n }\n },\n resetCameraWithOrientation(direction: Vector3, up: Vector3) {\n const image = mapper.getInputData() as vtkImageData | null;\n if (image) {\n const camera = renderer.getActiveCamera();\n const bounds = image.getBounds();\n const center = [\n (bounds[0] + bounds[1]) / 2,\n (bounds[2] + bounds[3]) / 2,\n (bounds[4] + bounds[5]) / 2,\n ] as Vector3;\n\n const position = vec3.clone(center) as Vector3;\n vec3.sub(position, position, direction);\n camera.setFocalPoint(...center);\n camera.setPosition(...position);\n camera.setDirectionOfProjection(...direction);\n camera.setViewUp(...up);\n renderer.resetCamera();\n // ensure correct lighting post camera manip\n renderer.updateLightsGeometryToFollowCamera();\n }\n },\n };\n}\n","import {\n del,\n onBeforeUnmount,\n reactive,\n ref,\n set,\n watch,\n} from '@vue/composition-api';\nimport vtkLookupTableProxy from '@kitware/vtk.js/Proxy/Core/LookupTableProxy';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\nimport vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport { createVolumeThumbnailer } from '../core/thumbnailers/volume-thumbnailer';\nimport { useCameraOrientation } from './useCameraOrientation';\nimport { useImageStore } from '../store/datasets-images';\nimport { InitViewIDs, InitViewSpecs } from '../config';\nimport { useCurrentImage } from './useCurrentImage';\nimport {\n getColorFunctionRangeFromPreset,\n getOpacityRangeFromPreset,\n} from '../utils/vtk-helpers';\nimport { PresetNameList } from '../vtk/ColorMaps';\n\nfunction resetOpacityFunction(\n pwfProxy: vtkPiecewiseFunctionProxy,\n dataRange: [number, number],\n presetName: string\n) {\n // reset pwf proxy range\n pwfProxy.setDataRange(...dataRange);\n\n const preset = vtkColorMaps.getPresetByName(presetName);\n if (preset.OpacityPoints) {\n const OpacityPoints = preset.OpacityPoints as number[];\n const points = [];\n for (let i = 0; i < OpacityPoints.length; i += 2) {\n points.push([OpacityPoints[i], OpacityPoints[i + 1]]);\n }\n\n const [xmin, xmax] = dataRange;\n const width = xmax - xmin;\n const pointsNormalized = points.map(([x, y]) => [(x - xmin) / width, y]);\n\n pwfProxy.setMode(vtkPiecewiseFunctionProxy.Mode.Points);\n pwfProxy.setPoints(pointsNormalized);\n } else {\n pwfProxy.setMode(vtkPiecewiseFunctionProxy.Mode.Gaussians);\n pwfProxy.setGaussians(vtkPiecewiseFunctionProxy.Defaults.Gaussians);\n }\n}\n\nexport function useVolumeThumbnailing(thumbnailSize: number) {\n const thumbnails = reactive<Record<string, Record<string, string>>>({});\n const thumbnailer = createVolumeThumbnailer(thumbnailSize);\n const currentThumbnails = ref<Record<string, string>>({});\n\n const { currentImageMetadata, currentImageID, currentImageData } =\n useCurrentImage();\n\n // same as 3D view\n const { cameraDirVec, cameraUpVec } = useCameraOrientation(\n InitViewSpecs[InitViewIDs.Three].props.viewDirection,\n InitViewSpecs[InitViewIDs.Three].props.viewUp,\n currentImageMetadata\n );\n\n // used to interrupt a thumbnailing cycle if\n // doThumbnailing is called again\n let interruptSentinel = Symbol('interrupt');\n\n async function doThumbnailing(imageID: string, image: vtkImageData) {\n const localSentinel = Symbol('interrupt');\n interruptSentinel = localSentinel;\n\n thumbnailer.setInputImage(image);\n const imageDataRange = image.getPointData().getScalars().getRange();\n\n async function helper(presetName: string) {\n // bail if a new thumbnail process has started\n if (interruptSentinel !== localSentinel) {\n return;\n }\n\n // sanity check; did the current image change\n if (imageID !== currentImageID.value) {\n return;\n }\n\n if (!(imageID in thumbnails)) {\n set(thumbnails, imageID, {});\n }\n\n if (presetName in thumbnails[imageID]) {\n return;\n }\n\n const opRange = getOpacityRangeFromPreset(presetName);\n resetOpacityFunction(\n thumbnailer.opacityFuncProxy,\n opRange || imageDataRange,\n presetName\n );\n\n thumbnailer.colorTransferFuncProxy.setMode(\n vtkLookupTableProxy.Mode.Preset\n );\n thumbnailer.colorTransferFuncProxy.setPresetName(presetName);\n const ctRange = getColorFunctionRangeFromPreset(presetName);\n thumbnailer.colorTransferFuncProxy.setDataRange(\n ...(ctRange || imageDataRange)\n );\n\n thumbnailer.resetCameraWithOrientation(\n cameraDirVec.value as Vector3,\n cameraUpVec.value as Vector3\n );\n\n const renWin = thumbnailer.scene.getRenderWindow();\n renWin.render();\n const imageURL = await renWin.captureImages()[0];\n if (imageURL) {\n set(thumbnails[imageID], presetName, imageURL);\n }\n }\n\n PresetNameList.reduce(\n (promise, presetName) => promise.then(() => helper(presetName)),\n Promise.resolve()\n );\n }\n\n // workaround for computed not properly working on deeply reactive objects\n // in vue 2.\n watch(\n thumbnails,\n () => {\n if (currentImageID.value) {\n currentThumbnails.value = thumbnails[currentImageID.value];\n }\n },\n { deep: true }\n );\n\n // force thumbnailing to stop\n onBeforeUnmount(() => {\n interruptSentinel = Symbol('unmount');\n });\n\n // trigger thumbnailing\n watch(\n currentImageID,\n (imageID) => {\n if (imageID) {\n doThumbnailing(imageID, currentImageData.value!);\n }\n },\n { immediate: true }\n );\n\n // delete thumbnails if an image is deleted\n const imageStore = useImageStore();\n imageStore.$onAction(({ name, args, after }) => {\n if (name === 'deleteData') {\n const [id] = args as [string];\n if (id in thumbnails) {\n after(() => del(thumbnails, id));\n }\n }\n });\n\n return { currentThumbnails };\n}\n","\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n ref,\n watch,\n watchEffect,\n} from '@vue/composition-api';\nimport { PresetNameList } from '@/src/vtk/ColorMaps';\nimport vtkPiecewiseWidget from '@/src/vtk/PiecewiseWidget';\nimport { vtkSubscription } from '@kitware/vtk.js/interfaces';\nimport vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport { useResizeObserver } from '../composables/useResizeObserver';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport ColorFunctionSlider from './ColorFunctionSlider.vue';\nimport { useVTKCallback } from '../composables/useVTKCallback';\nimport { useViewConfigStore } from '../store/view-configs';\nimport {\n getColorFunctionRangeFromPreset,\n getShiftedOpacityFromPreset,\n} from '../utils/vtk-helpers';\nimport { useVolumeThumbnailing } from '../composables/useVolumeThumbnailing';\nimport { useViewProxy } from '../composables/useViewProxy';\nimport { ViewProxyType } from '../core/proxies';\n\nconst WIDGET_WIDTH = 250;\nconst WIDGET_HEIGHT = 150;\nconst THUMBNAIL_SIZE = 80;\nconst TARGET_VIEW_ID = '3D';\n\nexport default defineComponent({\n name: 'VolumeRendering',\n components: {\n ColorFunctionSlider,\n },\n setup() {\n const viewConfigStore = useViewConfigStore();\n const editorContainerRef = ref<HTMLElement | null>(null);\n const pwfEditorRef = ref<HTMLElement | null>(null);\n\n let recurseGuard = false;\n\n const { currentImageID, currentImageData } = useCurrentImage();\n\n const volumeColorConfig = viewConfigStore.getComputedVolumeColorConfig(\n TARGET_VIEW_ID,\n currentImageID\n );\n\n watch(volumeColorConfig, () => {\n const imageID = currentImageID.value;\n if (imageID && !volumeColorConfig.value) {\n // creates a default color config\n viewConfigStore.updateVolumeColorConfig(TARGET_VIEW_ID, imageID, {});\n }\n });\n\n const colorTransferFunctionRef = computed(\n () => volumeColorConfig.value?.transferFunction\n );\n const opacityFunction = computed(\n () => volumeColorConfig.value?.opacityFunction\n );\n\n // --- piecewise color function editor --- //\n\n const pwfWidget = vtkPiecewiseWidget.newInstance({\n numberOfBins: 256,\n size: [WIDGET_WIDTH, WIDGET_HEIGHT],\n });\n pwfWidget.updateStyle({\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n histogramColor: 'rgba(100, 100, 100, 0.5)',\n strokeColor: 'rgb(0, 0, 0)',\n activeColor: 'rgb(255, 255, 255)',\n handleColor: 'rgb(50, 150, 50)',\n buttonDisableFillColor: 'rgba(255, 255, 255, 0.5)',\n buttonDisableStrokeColor: 'rgba(0, 0, 0, 0.5)',\n buttonStrokeColor: 'rgba(0, 0, 0, 1)',\n buttonFillColor: 'rgba(255, 255, 255, 1)',\n strokeWidth: 2,\n activeStrokeWidth: 3,\n buttonStrokeWidth: 1.5,\n handleWidth: 3,\n iconSize: 0,\n padding: 10,\n });\n\n const colorTransferFunc = vtkColorTransferFunction.newInstance();\n pwfWidget.setColorTransferFunction(colorTransferFunc);\n\n const pwfSubscriptions: vtkSubscription[] = [];\n\n onBeforeUnmount(() => {\n while (pwfSubscriptions.length) {\n pwfSubscriptions.pop()!.unsubscribe();\n }\n });\n\n function updateOpacityFunc() {\n if (recurseGuard || !currentImageID.value) {\n return;\n }\n recurseGuard = true;\n\n const { mode } = opacityFunction.value ?? {};\n if (mode === vtkPiecewiseFunctionProxy.Mode.Gaussians) {\n viewConfigStore.updateVolumeOpacityFunction(\n TARGET_VIEW_ID,\n currentImageID.value,\n {\n mode,\n gaussians: pwfWidget.getGaussians(),\n }\n );\n } else if (mode === vtkPiecewiseFunctionProxy.Mode.Points) {\n viewConfigStore.updateVolumeOpacityFunction(\n TARGET_VIEW_ID,\n currentImageID.value,\n {\n mode,\n shift: pwfWidget.getOpacityPointShift(),\n }\n );\n }\n\n pwfWidget.render();\n\n recurseGuard = false;\n }\n\n const onWidgetOpacityChange = useVTKCallback(pwfWidget.onOpacityChange);\n onWidgetOpacityChange(updateOpacityFunc);\n\n // trigger 3D view animations when updating the opacity widget\n const { viewProxy } = useViewProxy(TARGET_VIEW_ID, ViewProxyType.Volume);\n let animationRequested = false;\n\n const request3DAnimation = () => {\n if (!animationRequested) {\n animationRequested = true;\n viewProxy.value.getInteractor().requestAnimation(pwfWidget);\n }\n };\n\n const cancel3DAnimation = () => {\n animationRequested = false;\n viewProxy.value\n .getInteractor()\n .cancelAnimation(pwfWidget, true /* skipWarning */);\n };\n\n const onWidgetAnimation = useVTKCallback(pwfWidget.onAnimation);\n onWidgetAnimation((animating: boolean) => {\n if (animating) {\n request3DAnimation();\n } else {\n cancel3DAnimation();\n }\n });\n\n // handles edge case where component unmounts while widget is animating\n onBeforeUnmount(() => {\n cancel3DAnimation();\n });\n\n useResizeObserver(editorContainerRef, (entry) => {\n const { width } = entry.contentRect;\n if (width > 0) {\n pwfWidget.setSize(width, WIDGET_HEIGHT);\n }\n pwfWidget.render();\n });\n\n // mounted the pwf widget container\n watchEffect(() => {\n if (pwfEditorRef.value) {\n pwfWidget.setContainer(pwfEditorRef.value);\n pwfWidget.bindMouseListeners();\n }\n });\n\n onBeforeUnmount(() => {\n pwfWidget.unbindMouseListeners();\n pwfWidget.setContainer(null);\n });\n\n watch(\n currentImageData,\n (image) => {\n if (image) {\n const scalars = image.getPointData().getScalars();\n pwfWidget.setDataArray(scalars.getData());\n pwfWidget.render();\n }\n },\n { immediate: true }\n );\n\n // update pwf widget when lut changes\n watch(\n colorTransferFunctionRef,\n (func) => {\n if (func) {\n const { preset: name, mappingRange } = func;\n const preset = vtkColorMaps.getPresetByName(name);\n colorTransferFunc.applyColorMap(preset);\n colorTransferFunc.setMappingRange(...mappingRange);\n // force modification when mapping range is the same\n colorTransferFunc.modified();\n }\n },\n { immediate: true }\n );\n\n const onTFModified = useVTKCallback(colorTransferFunc.onModified);\n onTFModified(() => pwfWidget.render());\n\n // update pwf widget when opacity function changes\n watch(\n opacityFunction,\n (opFunc) => {\n if (!opFunc) return;\n\n if (opFunc.mode === vtkPiecewiseFunctionProxy.Mode.Gaussians) {\n pwfWidget.setGaussiansMode();\n pwfWidget.setGaussians(opFunc.gaussians);\n } else if (opFunc.mode === vtkPiecewiseFunctionProxy.Mode.Points) {\n pwfWidget.setPointsMode();\n // get non-shifted points for the widget\n const points = getShiftedOpacityFromPreset(\n opFunc.preset,\n opFunc.mappingRange,\n 0\n );\n pwfWidget.setOpacityPoints(points, opFunc.shift);\n }\n },\n { immediate: true }\n );\n\n // -- thumbnailing -- //\n\n const { currentThumbnails } = useVolumeThumbnailing(THUMBNAIL_SIZE);\n\n // --- selection and updates --- //\n\n const selectedPreset = computed(\n () => colorTransferFunctionRef.value?.preset || null\n );\n const hasCurrentImage = computed(() => !!currentImageData.value);\n\n // the data range, if any\n const imageDataRange = computed((): [number, number] => {\n const image = currentImageData.value;\n if (image) {\n return image.getPointData().getScalars().getRange();\n }\n return [0, 1];\n });\n const effectiveMappingRange = computed(\n () =>\n getColorFunctionRangeFromPreset(selectedPreset.value || '') ||\n imageDataRange.value\n );\n\n const selectPreset = (name: string) => {\n if (!currentImageID.value) return;\n viewConfigStore.setVolumeColorPreset(\n TARGET_VIEW_ID,\n currentImageID.value,\n name\n );\n };\n\n const rgbPoints = computed(\n () =>\n vtkColorMaps.getPresetByName(colorTransferFunctionRef.value!.preset)\n ?.RGBPoints\n );\n\n const updateColorMappingRange = (range: [number, number]) => {\n const { mappingRange } = colorTransferFunctionRef.value ?? {};\n // guard against infinite loops\n if (\n currentImageID.value &&\n mappingRange &&\n (Math.abs(range[0] - mappingRange[0]) > 1e-6 ||\n Math.abs(range[1] - mappingRange[1]) > 1e-6)\n ) {\n viewConfigStore.updateVolumeColorTransferFunction(\n TARGET_VIEW_ID,\n currentImageID.value,\n {\n mappingRange: range,\n }\n );\n }\n };\n\n const onColorMappingUpdate = (range: [number, number]) => {\n request3DAnimation();\n updateColorMappingRange(range);\n };\n\n const onColorMappingFinalize = () => {\n cancel3DAnimation();\n };\n\n return {\n editorContainerRef,\n pwfEditorRef,\n thumbnails: currentThumbnails,\n hasCurrentImage,\n preset: selectedPreset,\n fullMappingRange: effectiveMappingRange,\n mappingRange: computed(\n () => colorTransferFunctionRef.value!.mappingRange\n ),\n colorSliderStep: computed(() => {\n const [low, high] = imageDataRange.value;\n const width = high - low;\n const step = Math.min(1, width / 256);\n return step > 1 ? Math.round(step) : step;\n }),\n presetList: PresetNameList,\n size: THUMBNAIL_SIZE,\n rgbPoints,\n selectPreset,\n onColorMappingUpdate,\n onColorMappingFinalize,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolumeRendering.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolumeRendering.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VolumeRendering.vue?vue&type=template&id=195bbede&scoped=true&\"\nimport script from \"./VolumeRendering.vue?vue&type=script&lang=ts&\"\nexport * from \"./VolumeRendering.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./VolumeRendering.vue?vue&type=style&index=0&id=195bbede&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"195bbede\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overflow-x-visible mx-2\"},[_c('item-group',{staticClass:\"container\",attrs:{\"value\":_vm.preset},on:{\"change\":_vm.selectPreset}},[_c('v-row',{attrs:{\"no-gutters\":\"\",\"justify\":\"center\"}},_vm._l((_vm.presetList),function(preset){return _c('groupable-item',{key:preset,attrs:{\"value\":preset},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar select = ref.select;\nreturn [_c('v-col',{class:{\n 'thumbnail-container': true,\n blue: active,\n },attrs:{\"cols\":\"4\"},on:{\"click\":select}},[_c('v-img',{attrs:{\"src\":_vm.thumbnails[preset] || '',\"contain\":\"\",\"aspect-ratio\":\"1\"}},[_c('v-overlay',{staticClass:\"thumbnail-overlay\",attrs:{\"absolute\":\"\",\"value\":true,\"opacity\":\"0.3\"}},[_vm._v(\" \"+_vm._s(preset.replace(/-/g, ' '))+\" \")])],1)],1)]}}],null,true)})}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport { computed, defineComponent, watch } from '@vue/composition-api';\nimport { PresetNameList } from '@/src/vtk/ColorMaps';\nimport vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport ItemGroup from '@/src/components/ItemGroup.vue';\nimport GroupableItem from '@/src/components/GroupableItem.vue';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport { useViewConfigStore } from '../store/view-configs';\nimport { getColorFunctionRangeFromPreset } from '../utils/vtk-helpers';\nimport { useVolumeThumbnailing } from '../composables/useVolumeThumbnailing';\n\nconst THUMBNAIL_SIZE = 80;\nconst TARGET_VIEW_ID = '3D';\n\nexport default defineComponent({\n name: 'VolumePresets',\n components: {\n ItemGroup,\n GroupableItem,\n },\n setup() {\n const viewConfigStore = useViewConfigStore();\n\n const { currentImageID, currentImageData } = useCurrentImage();\n\n const volumeColorConfig = viewConfigStore.getComputedVolumeColorConfig(\n TARGET_VIEW_ID,\n currentImageID\n );\n\n watch(volumeColorConfig, () => {\n const imageID = currentImageID.value;\n if (imageID && !volumeColorConfig.value) {\n // creates a default color config\n viewConfigStore.updateVolumeColorConfig(TARGET_VIEW_ID, imageID, {});\n }\n });\n\n const colorTransferFunctionRef = computed(\n () => volumeColorConfig.value?.transferFunction\n );\n\n const { currentThumbnails } = useVolumeThumbnailing(THUMBNAIL_SIZE);\n\n // --- selection and updates --- //\n\n const selectedPreset = computed(\n () => colorTransferFunctionRef.value?.preset || null\n );\n const hasCurrentImage = computed(() => !!currentImageData.value);\n\n // the data range, if any\n const imageDataRange = computed((): [number, number] => {\n const image = currentImageData.value;\n if (image) {\n return image.getPointData().getScalars().getRange();\n }\n return [0, 1];\n });\n const effectiveMappingRange = computed(\n () =>\n getColorFunctionRangeFromPreset(selectedPreset.value || '') ||\n imageDataRange.value\n );\n\n const selectPreset = (name: string) => {\n if (!currentImageID.value) return;\n viewConfigStore.setVolumeColorPreset(\n TARGET_VIEW_ID,\n currentImageID.value,\n name\n );\n };\n\n const rgbPoints = computed(\n () =>\n vtkColorMaps.getPresetByName(colorTransferFunctionRef.value!.preset)\n ?.RGBPoints\n );\n\n const updateColorMappingRange = (range: [number, number]) => {\n const { mappingRange } = colorTransferFunctionRef.value ?? {};\n // guard against infinite loops\n if (\n currentImageID.value &&\n mappingRange &&\n (Math.abs(range[0] - mappingRange[0]) > 1e-6 ||\n Math.abs(range[1] - mappingRange[1]) > 1e-6)\n ) {\n viewConfigStore.updateVolumeColorTransferFunction(\n TARGET_VIEW_ID,\n currentImageID.value,\n {\n mappingRange: range,\n }\n );\n }\n };\n\n return {\n thumbnails: currentThumbnails,\n hasCurrentImage,\n preset: selectedPreset,\n fullMappingRange: effectiveMappingRange,\n mappingRange: computed(\n () => colorTransferFunctionRef.value!.mappingRange\n ),\n presetList: PresetNameList,\n size: THUMBNAIL_SIZE,\n rgbPoints,\n selectPreset,\n updateColorMappingRange,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolumePresets.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolumePresets.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VolumePresets.vue?vue&type=template&id=199b2ff4&scoped=true&\"\nimport script from \"./VolumePresets.vue?vue&type=script&lang=ts&\"\nexport * from \"./VolumePresets.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./VolumePresets.vue?vue&type=style&index=0&id=199b2ff4&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"199b2ff4\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VRow } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VCol,VImg,VOverlay,VRow})\n","\nimport { computed, defineComponent } from '@vue/composition-api';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport VolumeProperties from './VolumeProperties.vue';\nimport VolumeRendering from './VolumeRendering.vue';\nimport VolumePresets from './VolumePresets.vue';\n\nexport default defineComponent({\n components: { VolumeRendering, VolumePresets, VolumeProperties },\n setup() {\n const { currentImageData } = useCurrentImage();\n const hasCurrentImage = computed(() => !!currentImageData.value);\n return {\n hasCurrentImage,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RenderingModule.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./RenderingModule.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RenderingModule.vue?vue&type=template&id=aa44276e&\"\nimport script from \"./RenderingModule.vue?vue&type=script&lang=ts&\"\nexport * from \"./RenderingModule.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VExpansionPanel } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelContent } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelHeader } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanels } from 'vuetify/lib/components/VExpansionPanel';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VExpansionPanel,VExpansionPanelContent,VExpansionPanelHeader,VExpansionPanels,VIcon})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"overflow-y-auto mx-2 fill-height\"},[_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-subheader',{staticClass:\"annot-subheader\"},[_vm._v(\"Measurements\")]),_c('measurements-list'),_c('v-subheader',{staticClass:\"annot-subheader\"},[_vm._v(\"Labelmaps\")]),_c('labelmap-list')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.measurements.length)?_c('v-list',{attrs:{\"dense\":\"\"}},_vm._l((_vm.measurements),function(mm){return _c('v-list-item',{key:mm.id,attrs:{\"two-line\":\"\"}},[(mm.type === 'ruler')?[_c('v-menu',{attrs:{\"offset-x\":\"\",\"close-on-content-click\":false},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nvar attrs = ref.attrs;\nreturn [_c('div',_vm._g(_vm._b({staticClass:\"color-dot clickable mr-3\",style:({ backgroundColor: mm.data.color })},'div',attrs,false),on))]}}],null,true)},[_c('v-color-picker',{attrs:{\"value\":mm.data.color,\"hide-inputs\":\"\"},on:{\"input\":function($event){return _vm.updateColor(mm.type, mm.id, $event)}}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"Ruler (ID = \"+_vm._s(mm.id)+\")\")]),_c('v-list-item-subtitle',[_vm._v(\" Length: \"+_vm._s(mm.data.length.toFixed(2))+\"mm \")])],1),_c('v-list-item-action',[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticClass:\"mr-2\",attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.jumpTo(mm.type, mm.id)}}},on),[_c('v-icon',[_vm._v(\"mdi-target\")])],1)]}}],null,true)},[_vm._v(\" Reveal slice \")]),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.remove(mm.type, mm.id)}}},on),[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)]}}],null,true)},[_vm._v(\" Delete \")])],1)],1)]:_vm._e()],2)}),1):_c('div',{staticClass:\"caption empty-state\"},[_vm._v(\"No measurements yet\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { computed, defineComponent } from '@vue/composition-api';\nimport { useCurrentImage } from '../composables/useCurrentImage';\nimport { useRulerStore } from '../store/tools/rulers';\n\ninterface Measurement {\n id: string;\n type: 'ruler';\n imageID: string | null;\n data: any;\n}\n\nexport default defineComponent({\n name: 'MeasurementsList',\n setup() {\n const rulerStore = useRulerStore();\n const { currentImageID } = useCurrentImage();\n\n const measurements = computed(() => {\n const imageID = currentImageID.value;\n return rulerStore.rulerIDs\n .map((id) => {\n const ruler = rulerStore.rulers[id];\n return {\n id,\n type: 'ruler',\n imageID: ruler.imageID,\n data: {\n length: rulerStore.lengthByID[id],\n color: ruler.color,\n },\n } as Measurement;\n })\n .filter((mm) => mm.imageID === imageID);\n });\n\n function remove(type: Measurement['type'], id: string) {\n if (type === 'ruler') {\n rulerStore.removeRuler(id);\n }\n }\n\n function jumpTo(type: Measurement['type'], id: string) {\n if (type === 'ruler') {\n rulerStore.jumpToRuler(id);\n }\n }\n\n function updateColor(type: Measurement['type'], id: string, color: string) {\n if (type === 'ruler') {\n rulerStore.updateRuler(id, { color });\n }\n }\n\n return {\n measurements,\n remove,\n jumpTo,\n updateColor,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MeasurementsList.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MeasurementsList.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MeasurementsList.vue?vue&type=template&id=503d9874&scoped=true&\"\nimport script from \"./MeasurementsList.vue?vue&type=script&lang=ts&\"\nexport * from \"./MeasurementsList.vue?vue&type=script&lang=ts&\"\nimport style0 from \"@/src/components/styles/utils.css?vue&type=style&index=0&prod&lang=css&\"\nimport style1 from \"./MeasurementsList.vue?vue&type=style&index=1&id=503d9874&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"503d9874\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VColorPicker } from 'vuetify/lib/components/VColorPicker';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VColorPicker,VIcon,VList,VListItem,VListItemAction,VListItemContent,VListItemSubtitle,VListItemTitle,VMenu,VRow,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.labelmaps.length)?_c('v-list',{attrs:{\"dense\":\"\"}},_vm._l((_vm.labelmaps),function(lm){return _c('v-list-item',{key:lm.id,attrs:{\"two-line\":\"\"}},[_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"Labelmap (ID = \"+_vm._s(lm.id)+\")\")])],1)],1)}),1):_c('div',{staticClass:\"caption empty-state\"},[_vm._v(\"No labelmaps yet\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { computed, defineComponent } from '@vue/composition-api';\nimport { useLabelmapStore } from '../store/datasets-labelmaps';\n\nexport default defineComponent({\n name: 'LabelmapList',\n setup() {\n const labelmapStore = useLabelmapStore();\n\n const labelmaps = computed(() =>\n labelmapStore.idList.map((id) => ({ id }))\n );\n\n return {\n labelmaps,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./LabelmapList.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./LabelmapList.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./LabelmapList.vue?vue&type=template&id=cf8d15aa&scoped=true&\"\nimport script from \"./LabelmapList.vue?vue&type=script&lang=ts&\"\nexport * from \"./LabelmapList.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./LabelmapList.vue?vue&type=style&index=0&id=cf8d15aa&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"cf8d15aa\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\ninstallComponents(component, {VList,VListItem,VListItemContent,VListItemTitle})\n","\nimport { defineComponent } from '@vue/composition-api';\nimport MeasurementsList from './MeasurementsList.vue';\nimport LabelmapList from './LabelmapList.vue';\n\nexport default defineComponent({\n components: {\n MeasurementsList,\n LabelmapList,\n },\n setup() {},\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./AnnotationsModule.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./AnnotationsModule.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./AnnotationsModule.vue?vue&type=template&id=7729a320&scoped=true&\"\nimport script from \"./AnnotationsModule.vue?vue&type=script&lang=ts&\"\nexport * from \"./AnnotationsModule.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./AnnotationsModule.vue?vue&type=style&index=0&id=7729a320&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7729a320\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VList,VSubheader})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { defineComponent, ref } from '@vue/composition-api';\n\nimport DataBrowser from './DataBrowser.vue';\nimport RenderingModule from './RenderingModule.vue';\nimport AnnotationsModule from './AnnotationsModule.vue';\n\nexport const Modules = [\n {\n name: 'Data',\n icon: 'database',\n component: DataBrowser,\n },\n {\n name: 'Annotations',\n icon: 'pencil',\n component: AnnotationsModule,\n },\n {\n name: 'Rendering',\n icon: 'cube',\n component: RenderingModule,\n },\n // {\n // name: 'AI',\n // icon: 'robot-outline',\n // component: null,\n // },\n];\n\nexport default defineComponent({\n name: 'ModulePanel',\n setup() {\n const selectedModuleIndex = ref(0);\n\n return {\n selectedModuleIndex,\n Modules,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ModulePanel.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ModulePanel.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ModulePanel.vue?vue&type=template&id=0f9521c0&scoped=true&\"\nimport script from \"./ModulePanel.vue?vue&type=script&lang=ts&\"\nexport * from \"./ModulePanel.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./ModulePanel.vue?vue&type=style&index=0&id=0f9521c0&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0f9521c0\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VTab } from 'vuetify/lib/components/VTabs';\nimport { VTabItem } from 'vuetify/lib/components/VTabs';\nimport { VTabs } from 'vuetify/lib/components/VTabs';\nimport { VTabsItems } from 'vuetify/lib/components/VTabs';\ninstallComponents(component, {VBtn,VIcon,VTab,VTabItem,VTabs,VTabsItems})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',_vm._g(_vm._b({on:{\"dragover\":function($event){$event.preventDefault();return _vm.onDragOver.apply(null, arguments)},\"dragleave\":_vm.onDragLeave,\"drop\":function($event){$event.preventDefault();return _vm.onDrop.apply(null, arguments)}}},'div',_vm.$attrs,false),_vm.$listeners),[_vm._t(\"default\",null,{\"dragHover\":_vm.dragHover})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n v-on:dragover.prevent=\"onDragOver\"\n v-on:dragleave=\"onDragLeave\"\n v-on:drop.prevent=\"onDrop\"\n v-bind=\"$attrs\"\n v-on=\"$listeners\"\n >\n <slot :dragHover=\"dragHover\" />\n </div>\n</template>\n\n<script>\nasync function readAllDirEntries(dirEntry) {\n const reader = dirEntry.createReader();\n const allEntries = [];\n let entries = [];\n do {\n // eslint-disable-next-line no-await-in-loop\n entries = await new Promise((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n allEntries.push(...entries);\n } while (entries.length);\n return allEntries;\n}\n\nasync function entryToFile(fileEntry) {\n return new Promise((resolve, reject) => {\n fileEntry.file(resolve, reject);\n });\n}\n\nasync function readAllFiles(entries) {\n const toProcess = [...entries];\n const fileEntries = [];\n while (toProcess.length) {\n const entry = toProcess.shift();\n if (entry.isFile) {\n fileEntries.push(entry);\n } else {\n // eslint-disable-next-line no-await-in-loop\n toProcess.push(...(await readAllDirEntries(entry)));\n }\n }\n return Promise.all(fileEntries.map(entryToFile));\n}\n\nexport default {\n name: 'DragAndDrop',\n props: {\n enabled: Boolean,\n },\n data() {\n return {\n dragHover: false,\n };\n },\n methods: {\n onDragOver(ev) {\n if (this.enabled) {\n ev.preventDefault();\n\n const { types } = ev.dataTransfer;\n if (\n types && types instanceof Array\n ? types.indexOf('Files') !== -1\n : 'Files' in types\n ) {\n this.dragHover = true;\n if (this.dragTimeout !== null) {\n window.clearTimeout(this.dragTimeout);\n this.dragTimeout = null;\n }\n }\n }\n },\n onDragLeave() {\n if (this.enabled) {\n this.dragTimeout = window.setTimeout(() => {\n this.dragHover = false;\n this.dragTimeout = null;\n }, 50);\n }\n },\n async onDrop(ev) {\n if (this.enabled) {\n this.dragHover = false;\n if (ev.dataTransfer.items) {\n const entries = [...ev.dataTransfer.items].map((item) => {\n const getAsEntry = item.webkitGetAsEntry || item.getAsEntry;\n return getAsEntry.call(item);\n });\n const files = await readAllFiles(entries);\n this.$emit('drop', files);\n } else {\n this.$emit('drop', Array.from(ev.dataTransfer.files));\n }\n }\n },\n },\n created() {\n // used to debounce dragover\n this.dragTimeout = null;\n },\n};\n</script>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DragAndDrop.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DragAndDrop.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DragAndDrop.vue?vue&type=template&id=2df2f292&\"\nimport script from \"./DragAndDrop.vue?vue&type=script&lang=js&\"\nexport * from \"./DragAndDrop.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',[_c('v-card-title',{staticClass:\"d-flex flex-row justify-center\"},[_c('vol-view-full-logo')],1),_c('v-card-text',[_c('p',{attrs:{\"align\":\"center\"}},[_c('img',{staticStyle:{\"width\":\"200px\"},attrs:{\"src\":require(\"../assets/KitwareHeadAndNeck.jpg\"),\"alt\":\"Head and neck CT rendering\",\"align\":\"center\"}}),_c('br')]),_c('p',[_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://volview.kitware.com/\"}},[_vm._v(\" VolView \")]),_vm._v(\" is an open-source web application developed at \"),_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://kitware.com/\"}},[_vm._v(\" Kitware \")]),_vm._v(\" for visualizing and annotating medical images. It key features include: \")]),_c('ul',[_c('li',[_vm._v(\"Fast: Drag-and-drop DICOM files for quick viewing\")]),_c('li',[_vm._v(\" Beautiful: Cinematic volume rendering to generate high-quality 3D visualizations \")]),_c('li',[_vm._v(\" Friendly: Familiar radiological image visualization and annotation tools \")]),_c('li',[_vm._v(\" Secure: Your data stays on your machine. No cloud services or data servers are used. \")])]),_c('br'),_vm._v(\" VolView is freely available for research, educational, and commercial applications. It is built using a variety of open-source toolks created by Kitware, such as \"),_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://github.com/InsightSoftwareConsortium/itk-wasm/\"}},[_vm._v(\" itk-wasm \")]),_vm._v(\" for DICOM I/O and image processing, and \"),_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://github.com/Kitware/vtk-js\"}},[_vm._v(\" vtk.js \")]),_vm._v(\" for in-browser scientific visualization. \"),_c('br'),_c('br'),_vm._v(\" Want help customizing VolView or creating a new web-based visualization application? \"),_c('a',{attrs:{\"rel-\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://www.kitware.com/contact/project/\"}},[_vm._v(\"Contact Kitware!\")]),_c('br'),_c('br'),_vm._v(\" VolView source code: \"),_c('ul',[_c('li',[_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://github.com/Kitware/VolView\"}},[_vm._v(\" https://github.com/Kitware/VolView \")])])]),_c('br'),_vm._v(\" VolView bug reports and feature requests: \"),_c('ul',[_c('li',[_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://github.com/Kitware/VolView/issues\"}},[_vm._v(\" https://github.com/Kitware/VolView/issues \")])])]),_c('br'),_vm._v(\" This work was funded, in part, by the NIH via NIBIB and NIGMS R01EB021396, NIBIB R01EB014955, NCI R01CA220681, and NINDS R42NS086295 \"),_c('br'),_c('br'),_vm._v(\" Sample data provided by the following sources: \"),_c('ul',[_c('li',[_vm._v(\" PROSTATEx Challenge Data: Geert Litjens, Oscar Debats, Jelle Barentsz, Nico Karssemeijer, and Henkjan Huisman. \\\"ProstateX Challenge data\\\", The Cancer Imaging Archive (2017). DOI: 10.7937/K9TCIA.2017.MURS5CL (\"),_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"https://wiki.cancerimagingarchive.net/pages/viewpage.action?pageId=23691656\"}},[_vm._v(\"TCIA\")]),_vm._v(\") \")]),_c('li',[_vm._v(\" MRA Head and Neck: Test case 98890234 from the \\\"Patient Contributed Image Repository\\\" (\"),_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"http://www.pcir.org/researchers/98890234_20030505_MR.html\"}},[_vm._v(\"PCIR.org\")]),_vm._v(\") \")]),_c('li',[_vm._v(\" 3D ultrasound of a fetus: Sample data from \"),_c('a',{attrs:{\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"href\":\"http://tomovision.comi\"}},[_vm._v(\"tomovision.com\")])])])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"width\":\"362\",\"height\":\"46\",\"viewBox\":\"0 0 362 46\",\"fill\":\"none\",\"xmlns\":\"http://www.w3.org/2000/svg\"}},[_c('g',{attrs:{\"clip-path\":\"url(#clip0_137_135)\"}},[_c('path',{attrs:{\"d\":\"M217.55 26.6132C217.498 26.6912 217.447 26.7951 217.37 26.8731C216.06 28.64 213.364 29.3676 210 28.8999C209.846 28.8739 209.692 28.8479 209.537 28.8219C207.509 28.4841 205.3 27.7306 203.092 26.6132C201.782 25.9377 200.472 25.1062 199.214 24.1447C197.853 23.1054 196.621 21.988 195.568 20.7928C193.898 18.9479 192.666 16.9991 191.87 15.1282C190.56 12.0361 190.56 9.28175 191.844 7.48883C193.154 5.7219 195.722 5.04631 198.932 5.54001C200.524 5.77387 202.27 6.31954 204.068 7.12505C205.84 7.93057 207.663 8.99592 209.435 10.3471C212.979 13.0235 215.649 16.2715 217.087 19.3377C218.474 22.2479 218.654 24.8463 217.55 26.6132Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M217.55 26.6132C217.498 26.6912 217.447 26.7951 217.37 26.8731C216.06 28.64 213.364 29.3676 210 28.8998C209.846 28.8739 209.692 28.8479 209.537 28.8219C207.663 28.4321 205.506 27.7306 203.092 26.6132C201.782 25.9376 200.473 25.1061 199.214 24.1447C197.853 23.1054 196.621 21.988 195.568 20.7928C193 16.5054 193.539 11.1786 195.08 9.48961C196.954 7.41087 201.243 6.94315 207.945 11.4904C213.852 15.492 218.089 23.2613 217.55 26.6132Z\",\"fill\":\"black\",\"fill-opacity\":\"0.15\"}}),_c('path',{attrs:{\"d\":\"M214.442 22.2479C214.442 22.7416 214.34 23.1833 214.16 23.5731C214.108 23.703 214.031 23.8329 213.929 23.9628C213.518 24.5345 212.85 24.8983 211.951 25.0801C211.053 25.262 209.974 25.2101 208.767 24.9762C206.353 24.5085 203.58 23.2353 201.14 21.4164C201.115 21.3904 201.063 21.3644 201.037 21.3384C198.675 19.5195 196.877 17.3109 195.876 15.2581C194.849 13.1534 194.772 11.3085 195.619 10.1652C196.441 9.02188 198.213 8.68409 200.498 9.1518C202.784 9.61952 205.429 10.8927 207.843 12.7376C210.257 14.5825 212.26 16.8172 213.415 18.9219C214.108 20.1431 214.442 21.2864 214.442 22.2479Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M214.16 23.5731C214.108 23.7031 214.031 23.833 213.929 23.9629C213.518 24.5346 212.85 24.8983 211.951 25.0802C211.053 25.2621 209.974 25.2102 208.767 24.9763C206.353 24.5086 203.58 23.2353 201.14 21.4165C201.114 21.3905 201.063 21.3645 201.037 21.3385C198.187 18.4542 198.059 13.855 199.214 12.5558C200.524 11.3865 202.835 11.4125 207.072 14.2708C210.616 16.6873 213.877 21.1826 214.16 23.5731Z\",\"fill\":\"black\",\"fill-opacity\":\"0.15\"}}),_c('path',{attrs:{\"d\":\"M210.616 21.4944C210.436 21.7282 210.128 21.8841 209.666 21.9621C209.204 22.0141 208.613 21.9881 207.92 21.8062C206.559 21.4684 204.915 20.6889 203.374 19.5196C201.834 18.3503 200.652 17.0251 199.985 15.8038C199.651 15.2062 199.471 14.6605 199.394 14.1928C199.343 13.7251 199.42 13.4133 199.599 13.1794C199.779 12.9456 200.062 12.7637 200.524 12.7117C200.96 12.6597 201.525 12.6857 202.193 12.8416C202.835 12.9975 203.58 13.2834 204.324 13.6731C205.069 14.0629 205.865 14.5566 206.61 15.1542C208.151 16.3235 209.383 17.6487 210.102 18.844C210.462 19.4416 210.667 19.9873 210.744 20.455C210.847 20.9487 210.77 21.2865 210.616 21.4944Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M211.309 21.8061C211.078 22.4038 210.847 22.8455 210.462 23.3912C208.151 26.5093 203.323 26.951 199.933 24.3786C196.543 21.8061 195.67 16.999 197.956 13.8809C198.418 13.3093 198.752 12.9195 199.291 12.4778C199.188 12.5557 199.111 12.6337 199.034 12.7376C198.701 13.1794 198.624 13.725 198.701 14.2967C198.778 14.8683 199.009 15.5179 199.368 16.1675C200.087 17.4668 201.346 18.8959 202.963 20.1172C204.581 21.3384 206.302 22.1699 207.791 22.5077C208.536 22.6896 209.229 22.7416 209.794 22.6636C210.385 22.5857 210.898 22.3518 211.232 21.9101C211.258 21.9101 211.284 21.8581 211.309 21.8061Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M214.879 24.0148C214.571 24.9502 213.441 26.6652 212.747 27.4447C209.101 32.3558 201.448 33.2132 195.953 29.0558C190.483 24.9762 189.482 16.6873 193.128 11.7502C193.693 10.9967 194.643 9.80143 195.465 9.09985C195.285 9.25576 195.105 9.43765 194.951 9.64552C193.821 11.1786 194.078 13.4132 195.131 15.6219C196.21 17.8565 198.136 20.1951 200.627 22.092C201.885 23.0534 203.22 23.8589 204.581 24.4825C205.942 25.1062 207.303 25.5739 208.562 25.8077C209.846 26.0676 211.027 26.1195 212.054 25.9117C213.081 25.7038 213.954 25.2621 214.545 24.4825C214.699 24.3266 214.802 24.1707 214.879 24.0148Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M218.577 26.4054C218.012 27.9385 216.959 29.8353 215.495 31.5503C209.589 38.3582 199.368 39.6314 192.024 34.0448C184.705 28.5101 182.985 18.3503 187.787 10.633C188.865 8.89203 190.945 6.83928 192.178 5.95581C192.152 5.98179 191.459 6.6314 191.176 7.02116C189.61 9.15187 189.738 12.296 191.099 15.466C192.46 18.6881 195.08 22.066 198.701 24.8204C200.524 26.1975 202.424 27.2889 204.324 28.1204C206.225 28.9519 208.125 29.4716 209.871 29.7314C213.364 30.1991 216.445 29.5235 218.012 27.3928C218.243 27.081 218.448 26.7432 218.577 26.4054Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M217.832 18.9739C216.317 15.7779 213.544 12.4259 209.923 9.67158C206.328 6.91725 202.424 5.22828 199.06 4.70859C197.853 4.5267 196.672 4.50072 195.619 4.63064C195.568 4.63064 195.516 4.63064 195.491 4.65662C195.337 4.68261 195.157 4.70859 195.003 4.73458C194.977 4.73458 194.951 4.73458 194.9 4.76056C194.797 4.78654 194.695 4.81253 194.618 4.83851C194.515 4.8645 194.438 4.89048 194.361 4.91647C194.284 4.94245 194.207 4.96843 194.13 4.99442C193.385 5.22828 192.717 5.59206 192.127 6.05977C191.767 6.31962 191.459 6.63143 191.176 7.02119C189.61 9.1519 189.738 12.296 191.099 15.4661C192.46 18.6881 195.08 22.0661 198.701 24.8204C200.524 26.1976 202.424 27.2889 204.324 28.1204C206.225 28.9519 208.125 29.4716 209.871 29.7314C213.364 30.1991 216.445 29.5236 218.012 27.3928C218.243 27.107 218.423 26.7692 218.577 26.4314C219.527 24.3527 219.116 21.6763 217.832 18.9739ZM217.55 26.6133C217.498 26.6913 217.447 26.7952 217.37 26.8732C216.06 28.6401 213.364 29.3676 210 28.8999C209.846 28.8739 209.692 28.848 209.537 28.822C207.509 28.4842 205.3 27.7306 203.092 26.6133C201.782 25.9377 200.473 25.1062 199.214 24.1448C197.853 23.1054 196.621 21.9881 195.568 20.7928C193.899 18.948 192.666 16.9991 191.87 15.1283C190.56 12.0362 190.56 9.28182 191.844 7.48891C193.154 5.72198 195.722 5.04639 198.932 5.54009C200.524 5.77395 202.27 6.31962 204.068 7.12513C205.84 7.93064 207.663 8.99599 209.435 10.3472C212.979 13.0236 215.649 16.2716 217.087 19.3377C218.474 22.248 218.654 24.8464 217.55 26.6133Z\",\"fill\":\"white\"}}),_c('path',{attrs:{\"d\":\"M214.16 18.5061C212.953 16.2975 210.873 13.9589 208.382 12.062C205.891 10.1652 203.143 8.84 200.704 8.3463C198.88 7.95654 197.16 8.03449 195.927 8.78803C195.901 8.78803 195.876 8.81402 195.876 8.81402C195.876 8.81402 195.85 8.81402 195.85 8.84C195.799 8.86599 195.747 8.89197 195.722 8.94394C195.645 8.99591 195.568 9.07386 195.491 9.12583C195.311 9.28173 195.131 9.46362 194.977 9.6715C193.847 11.2046 194.104 13.4392 195.157 15.6479C196.235 17.8825 198.161 20.2211 200.652 22.118C201.911 23.0794 203.246 23.8849 204.607 24.5085C205.968 25.1321 207.329 25.5998 208.587 25.8337C209.871 26.0935 211.053 26.1455 212.08 25.9376C213.107 25.7298 213.98 25.288 214.571 24.5085C214.673 24.3786 214.776 24.2227 214.853 24.0668C215.675 22.5077 215.238 20.4809 214.16 18.5061ZM213.929 23.9628C213.518 24.5345 212.85 24.8983 211.951 25.0802C211.053 25.262 209.974 25.2101 208.767 24.9762C206.353 24.5085 203.58 23.2353 201.14 21.4164C198.726 19.5975 196.877 17.3369 195.876 15.2581C194.849 13.1534 194.772 11.3085 195.619 10.1652C196.441 9.02189 198.213 8.6841 200.498 9.15181C202.784 9.61953 205.429 10.8928 207.843 12.7376C210.256 14.5825 212.259 16.8172 213.415 18.9219C214.108 20.1691 214.442 21.3124 214.442 22.2739C214.442 22.9235 214.288 23.4951 213.929 23.9628Z\",\"fill\":\"white\"}}),_c('path',{attrs:{\"fill-rule\":\"evenodd\",\"clip-rule\":\"evenodd\",\"d\":\"M211.515 20.351C211.412 19.7793 211.155 19.1297 210.77 18.4801C210 17.1809 208.716 15.7778 207.098 14.5565C205.506 13.3352 203.837 12.4778 202.398 12.14C201.679 11.9581 201.012 11.9061 200.447 11.9841C200.01 12.036 199.599 12.2179 199.291 12.4778C199.189 12.5557 199.111 12.6337 199.034 12.7376C198.701 13.1793 198.624 13.725 198.701 14.2967C198.778 14.8683 199.009 15.5179 199.368 16.1675C200.087 17.4667 201.346 18.8959 202.963 20.1171C204.581 21.3384 206.302 22.1699 207.791 22.5077C208.536 22.6896 209.229 22.7415 209.794 22.6636C210.385 22.5856 210.899 22.3518 211.232 21.91C211.258 21.8581 211.284 21.8321 211.309 21.7801C211.54 21.3904 211.592 20.8707 211.515 20.351ZM210.616 21.4943C210.436 21.7281 210.128 21.8841 209.666 21.962C209.204 22.014 208.613 21.988 207.92 21.8061C206.559 21.4683 204.915 20.6888 203.374 19.5195C201.834 18.3502 200.652 17.025 199.985 15.8037C199.651 15.2061 199.471 14.6604 199.394 14.1927C199.343 13.725 199.42 13.4132 199.599 13.1793C199.779 12.9455 200.062 12.7636 200.524 12.7116C200.96 12.6596 201.525 12.6856 202.193 12.8415C202.835 12.9974 203.58 13.2833 204.324 13.673C205.069 14.0628 205.865 14.5565 206.61 15.1541C208.151 16.3234 209.383 17.6486 210.102 18.8439C210.462 19.4415 210.667 19.9872 210.744 20.4549C210.847 20.9486 210.77 21.2864 210.616 21.4943Z\",\"fill\":\"white\"}})]),_c('path',{attrs:{\"d\":\"M246.292 9.76333H243.172L235.252 31.1633L227.372 9.76333H224.252L233.692 35.0433H236.852L246.292 9.76333ZM261.251 25.4033C261.251 29.8033 260.131 32.6033 255.691 32.6033C251.251 32.6033 250.091 29.8033 250.091 25.4033C250.091 21.0033 251.251 18.2033 255.691 18.2033C260.131 18.2033 261.251 21.0033 261.251 25.4033ZM255.691 35.3633C261.771 35.3633 264.171 31.2833 264.171 25.4033C264.171 19.4033 261.891 15.4433 255.691 15.4433C249.571 15.4433 247.171 19.5233 247.171 25.4033C247.171 31.4033 249.451 35.3633 255.691 35.3633ZM268.747 29.6833C268.747 33.8433 270.827 35.2833 273.587 35.2833C274.627 35.2833 275.427 35.1233 275.947 34.8833L275.547 32.2433C275.107 32.4433 274.507 32.5233 273.827 32.5233C272.467 32.5233 271.667 31.8833 271.667 29.2433V7.76333H268.747V29.6833Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M299.261 9.76333H296.141L288.221 31.1633L280.341 9.76333H277.221L286.661 35.0433H289.821L299.261 9.76333ZM302.505 35.0433H305.425V15.7633H302.505V35.0433ZM302.065 9.16333C302.065 10.2033 302.905 11.0433 303.985 11.0433C305.025 11.0433 305.865 10.2033 305.865 9.16333C305.865 8.12333 305.025 7.24333 303.985 7.24333C302.905 7.24333 302.065 8.08333 302.065 9.16333ZM326.615 23.8833C326.615 18.2833 323.615 15.4433 318.535 15.4433C312.215 15.4433 310.175 19.8833 310.175 25.4433C310.175 32.2833 313.295 35.3633 319.455 35.3633C321.815 35.3633 324.095 34.8833 325.975 34.0433L325.535 31.2833C324.095 32.0433 321.735 32.6033 319.495 32.6033C315.495 32.6033 313.135 30.8033 313.135 26.7233V26.5633H326.295C326.535 25.7233 326.615 24.6833 326.615 23.8833ZM313.135 23.8433C313.135 19.6833 315.215 18.0433 318.455 18.0433C321.735 18.0433 323.815 19.7233 323.815 23.8433V24.0833H313.135V23.8433ZM332.648 15.7633H329.648L336.368 35.0433H339.368L344.608 20.2833L349.848 35.0433H352.848L359.568 15.7633H356.568L351.328 31.0833L346.088 15.7633H343.128L337.888 31.0833L332.648 15.7633Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M8.87229 5.59206L0.781128 14.7137L2.74742 16.9885L13.3699 5.00647H10.1831C9.68593 5.00647 9.2113 5.20917 8.87229 5.59206Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M15.0876 5.59206L3.85486 18.2497L5.82115 20.5245L19.5852 5.00647H16.3984C15.9012 5.00647 15.404 5.20917 15.0876 5.59206Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M25.7778 5.00647H22.6137C22.1165 5.00647 21.6193 5.23169 21.2802 5.59206L6.90601 21.8083L19.879 36.8308C20.218 37.2137 20.6926 37.4389 21.2124 37.4389H24.3314L10.8386 21.8308L25.7778 5.00647Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M12.059 37.4389L0.781128 24.3983V28.9479L7.60663 36.8307C7.94565 37.2136 8.42027 37.4389 8.94009 37.4389H12.059Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M18.2065 37.4389L0.781128 17.2812V21.8308L13.7541 36.8308C14.0931 37.2137 14.5677 37.4389 15.0876 37.4389H18.2065Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M31.2925 7.37134H34.2532V35.029H31.2925V7.37134ZM43.2936 15.4794H47.068L38.9316 24.7137L47.8816 35.0065H44.1073L35.1573 24.7137L43.2936 15.4794Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M51.6786 6.85327C52.7408 6.85327 53.5996 7.75417 53.5996 8.79021C53.5996 9.84877 52.7408 10.7046 51.6786 10.7046C50.5711 10.7046 49.7349 9.84877 49.7349 8.79021C49.7349 7.70913 50.5937 6.85327 51.6786 6.85327ZM50.1869 15.4794H53.1476V35.0289H50.1869V15.4794Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M57.6453 10.2091H60.606V15.4794H68.4486V18.2722H60.606V28.1596C60.606 31.5154 62.1203 32.5289 64.3804 32.5289C66.0077 32.5289 67.7253 32.1235 68.8554 31.6055L69.3074 34.3983C67.9965 34.9614 66.2111 35.3217 64.3804 35.3217C60.4252 35.3217 57.6227 33.4974 57.6227 28.137V10.2091H57.6453Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M79.0032 31.0199L84.337 15.4794H87.343L92.6768 30.9974L97.988 15.4794H101.039L94.2137 35.0289H91.1625L85.8287 20.074L80.4949 35.0289H77.4437L70.6182 15.4794H73.6694L79.0032 31.0199Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M117.109 34.2182C115.278 34.8713 112.385 35.3443 109.673 35.3443C104.949 35.3443 101.83 33.7677 101.83 29.3533C101.83 24.9839 104.972 23.3173 110.283 23.3173H114.148V21.4029C114.148 18.7227 112.272 17.8668 109.176 17.8668C106.893 17.8668 105.017 18.2722 103.797 18.7227L103.345 15.9975C104.927 15.547 106.915 15.1416 109.289 15.1416C113.764 15.1416 117.109 16.7632 117.109 21.6281V34.2182ZM114.148 25.6596H110.328C106.712 25.6596 104.791 26.5605 104.791 29.3083C104.791 32.056 106.712 32.7993 109.582 32.7993C111.006 32.7993 112.882 32.6416 114.148 32.2362V25.6596Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M121.651 16.2902C122.962 15.6821 125.403 15.1866 127.799 15.1866C129.336 15.1866 130.647 15.3443 131.709 15.6821L131.144 18.4299C130.534 18.1821 129.313 17.9794 127.889 17.9794C126.217 17.9794 125.335 18.1821 124.635 18.4975V35.0065H121.674V16.2902H121.651Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M148.931 26.4253H135.528V26.583C135.528 30.7271 137.924 32.5515 141.992 32.5515C144.275 32.5515 146.671 31.9884 148.14 31.2226L148.592 34.0154C146.671 34.8713 144.365 35.3442 141.97 35.3442C135.709 35.3442 132.522 32.2136 132.522 25.2992C132.522 19.6686 134.602 15.1641 141.02 15.1641C146.196 15.1641 149.247 18.0469 149.247 23.7226C149.247 24.5334 149.157 25.5695 148.931 26.4253ZM135.528 23.9253H146.399V23.6776C146.399 19.5109 144.275 17.7992 140.953 17.7992C137.653 17.7992 135.551 19.4659 135.551 23.6776V23.9253H135.528Z\",\"fill\":\"#0068C7\"}}),_c('line',{attrs:{\"x1\":\"170.559\",\"y1\":\"0.935669\",\"x2\":\"170.559\",\"y2\":\"42.4279\",\"stroke\":\"#CACACA\"}}),_c('defs',[_c('clipPath',{attrs:{\"id\":\"clip0_137_135\"}},[_c('rect',{attrs:{\"width\":\"34\",\"height\":\"33\",\"fill\":\"white\",\"transform\":\"translate(185.09 4.55261)\"}})])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template svg>\n <svg\n width=\"362\"\n height=\"46\"\n viewBox=\"0 0 362 46\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#clip0_137_135)\">\n <path\n d=\"M217.55 26.6132C217.498 26.6912 217.447 26.7951 217.37 26.8731C216.06 28.64 213.364 29.3676 210 28.8999C209.846 28.8739 209.692 28.8479 209.537 28.8219C207.509 28.4841 205.3 27.7306 203.092 26.6132C201.782 25.9377 200.472 25.1062 199.214 24.1447C197.853 23.1054 196.621 21.988 195.568 20.7928C193.898 18.9479 192.666 16.9991 191.87 15.1282C190.56 12.0361 190.56 9.28175 191.844 7.48883C193.154 5.7219 195.722 5.04631 198.932 5.54001C200.524 5.77387 202.27 6.31954 204.068 7.12505C205.84 7.93057 207.663 8.99592 209.435 10.3471C212.979 13.0235 215.649 16.2715 217.087 19.3377C218.474 22.2479 218.654 24.8463 217.55 26.6132Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M217.55 26.6132C217.498 26.6912 217.447 26.7951 217.37 26.8731C216.06 28.64 213.364 29.3676 210 28.8998C209.846 28.8739 209.692 28.8479 209.537 28.8219C207.663 28.4321 205.506 27.7306 203.092 26.6132C201.782 25.9376 200.473 25.1061 199.214 24.1447C197.853 23.1054 196.621 21.988 195.568 20.7928C193 16.5054 193.539 11.1786 195.08 9.48961C196.954 7.41087 201.243 6.94315 207.945 11.4904C213.852 15.492 218.089 23.2613 217.55 26.6132Z\"\n fill=\"black\"\n fill-opacity=\"0.15\"\n />\n <path\n d=\"M214.442 22.2479C214.442 22.7416 214.34 23.1833 214.16 23.5731C214.108 23.703 214.031 23.8329 213.929 23.9628C213.518 24.5345 212.85 24.8983 211.951 25.0801C211.053 25.262 209.974 25.2101 208.767 24.9762C206.353 24.5085 203.58 23.2353 201.14 21.4164C201.115 21.3904 201.063 21.3644 201.037 21.3384C198.675 19.5195 196.877 17.3109 195.876 15.2581C194.849 13.1534 194.772 11.3085 195.619 10.1652C196.441 9.02188 198.213 8.68409 200.498 9.1518C202.784 9.61952 205.429 10.8927 207.843 12.7376C210.257 14.5825 212.26 16.8172 213.415 18.9219C214.108 20.1431 214.442 21.2864 214.442 22.2479Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M214.16 23.5731C214.108 23.7031 214.031 23.833 213.929 23.9629C213.518 24.5346 212.85 24.8983 211.951 25.0802C211.053 25.2621 209.974 25.2102 208.767 24.9763C206.353 24.5086 203.58 23.2353 201.14 21.4165C201.114 21.3905 201.063 21.3645 201.037 21.3385C198.187 18.4542 198.059 13.855 199.214 12.5558C200.524 11.3865 202.835 11.4125 207.072 14.2708C210.616 16.6873 213.877 21.1826 214.16 23.5731Z\"\n fill=\"black\"\n fill-opacity=\"0.15\"\n />\n <path\n d=\"M210.616 21.4944C210.436 21.7282 210.128 21.8841 209.666 21.9621C209.204 22.0141 208.613 21.9881 207.92 21.8062C206.559 21.4684 204.915 20.6889 203.374 19.5196C201.834 18.3503 200.652 17.0251 199.985 15.8038C199.651 15.2062 199.471 14.6605 199.394 14.1928C199.343 13.7251 199.42 13.4133 199.599 13.1794C199.779 12.9456 200.062 12.7637 200.524 12.7117C200.96 12.6597 201.525 12.6857 202.193 12.8416C202.835 12.9975 203.58 13.2834 204.324 13.6731C205.069 14.0629 205.865 14.5566 206.61 15.1542C208.151 16.3235 209.383 17.6487 210.102 18.844C210.462 19.4416 210.667 19.9873 210.744 20.455C210.847 20.9487 210.77 21.2865 210.616 21.4944Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M211.309 21.8061C211.078 22.4038 210.847 22.8455 210.462 23.3912C208.151 26.5093 203.323 26.951 199.933 24.3786C196.543 21.8061 195.67 16.999 197.956 13.8809C198.418 13.3093 198.752 12.9195 199.291 12.4778C199.188 12.5557 199.111 12.6337 199.034 12.7376C198.701 13.1794 198.624 13.725 198.701 14.2967C198.778 14.8683 199.009 15.5179 199.368 16.1675C200.087 17.4668 201.346 18.8959 202.963 20.1172C204.581 21.3384 206.302 22.1699 207.791 22.5077C208.536 22.6896 209.229 22.7416 209.794 22.6636C210.385 22.5857 210.898 22.3518 211.232 21.9101C211.258 21.9101 211.284 21.8581 211.309 21.8061Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M214.879 24.0148C214.571 24.9502 213.441 26.6652 212.747 27.4447C209.101 32.3558 201.448 33.2132 195.953 29.0558C190.483 24.9762 189.482 16.6873 193.128 11.7502C193.693 10.9967 194.643 9.80143 195.465 9.09985C195.285 9.25576 195.105 9.43765 194.951 9.64552C193.821 11.1786 194.078 13.4132 195.131 15.6219C196.21 17.8565 198.136 20.1951 200.627 22.092C201.885 23.0534 203.22 23.8589 204.581 24.4825C205.942 25.1062 207.303 25.5739 208.562 25.8077C209.846 26.0676 211.027 26.1195 212.054 25.9117C213.081 25.7038 213.954 25.2621 214.545 24.4825C214.699 24.3266 214.802 24.1707 214.879 24.0148Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M218.577 26.4054C218.012 27.9385 216.959 29.8353 215.495 31.5503C209.589 38.3582 199.368 39.6314 192.024 34.0448C184.705 28.5101 182.985 18.3503 187.787 10.633C188.865 8.89203 190.945 6.83928 192.178 5.95581C192.152 5.98179 191.459 6.6314 191.176 7.02116C189.61 9.15187 189.738 12.296 191.099 15.466C192.46 18.6881 195.08 22.066 198.701 24.8204C200.524 26.1975 202.424 27.2889 204.324 28.1204C206.225 28.9519 208.125 29.4716 209.871 29.7314C213.364 30.1991 216.445 29.5235 218.012 27.3928C218.243 27.081 218.448 26.7432 218.577 26.4054Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M217.832 18.9739C216.317 15.7779 213.544 12.4259 209.923 9.67158C206.328 6.91725 202.424 5.22828 199.06 4.70859C197.853 4.5267 196.672 4.50072 195.619 4.63064C195.568 4.63064 195.516 4.63064 195.491 4.65662C195.337 4.68261 195.157 4.70859 195.003 4.73458C194.977 4.73458 194.951 4.73458 194.9 4.76056C194.797 4.78654 194.695 4.81253 194.618 4.83851C194.515 4.8645 194.438 4.89048 194.361 4.91647C194.284 4.94245 194.207 4.96843 194.13 4.99442C193.385 5.22828 192.717 5.59206 192.127 6.05977C191.767 6.31962 191.459 6.63143 191.176 7.02119C189.61 9.1519 189.738 12.296 191.099 15.4661C192.46 18.6881 195.08 22.0661 198.701 24.8204C200.524 26.1976 202.424 27.2889 204.324 28.1204C206.225 28.9519 208.125 29.4716 209.871 29.7314C213.364 30.1991 216.445 29.5236 218.012 27.3928C218.243 27.107 218.423 26.7692 218.577 26.4314C219.527 24.3527 219.116 21.6763 217.832 18.9739ZM217.55 26.6133C217.498 26.6913 217.447 26.7952 217.37 26.8732C216.06 28.6401 213.364 29.3676 210 28.8999C209.846 28.8739 209.692 28.848 209.537 28.822C207.509 28.4842 205.3 27.7306 203.092 26.6133C201.782 25.9377 200.473 25.1062 199.214 24.1448C197.853 23.1054 196.621 21.9881 195.568 20.7928C193.899 18.948 192.666 16.9991 191.87 15.1283C190.56 12.0362 190.56 9.28182 191.844 7.48891C193.154 5.72198 195.722 5.04639 198.932 5.54009C200.524 5.77395 202.27 6.31962 204.068 7.12513C205.84 7.93064 207.663 8.99599 209.435 10.3472C212.979 13.0236 215.649 16.2716 217.087 19.3377C218.474 22.248 218.654 24.8464 217.55 26.6133Z\"\n fill=\"white\"\n />\n <path\n d=\"M214.16 18.5061C212.953 16.2975 210.873 13.9589 208.382 12.062C205.891 10.1652 203.143 8.84 200.704 8.3463C198.88 7.95654 197.16 8.03449 195.927 8.78803C195.901 8.78803 195.876 8.81402 195.876 8.81402C195.876 8.81402 195.85 8.81402 195.85 8.84C195.799 8.86599 195.747 8.89197 195.722 8.94394C195.645 8.99591 195.568 9.07386 195.491 9.12583C195.311 9.28173 195.131 9.46362 194.977 9.6715C193.847 11.2046 194.104 13.4392 195.157 15.6479C196.235 17.8825 198.161 20.2211 200.652 22.118C201.911 23.0794 203.246 23.8849 204.607 24.5085C205.968 25.1321 207.329 25.5998 208.587 25.8337C209.871 26.0935 211.053 26.1455 212.08 25.9376C213.107 25.7298 213.98 25.288 214.571 24.5085C214.673 24.3786 214.776 24.2227 214.853 24.0668C215.675 22.5077 215.238 20.4809 214.16 18.5061ZM213.929 23.9628C213.518 24.5345 212.85 24.8983 211.951 25.0802C211.053 25.262 209.974 25.2101 208.767 24.9762C206.353 24.5085 203.58 23.2353 201.14 21.4164C198.726 19.5975 196.877 17.3369 195.876 15.2581C194.849 13.1534 194.772 11.3085 195.619 10.1652C196.441 9.02189 198.213 8.6841 200.498 9.15181C202.784 9.61953 205.429 10.8928 207.843 12.7376C210.256 14.5825 212.259 16.8172 213.415 18.9219C214.108 20.1691 214.442 21.3124 214.442 22.2739C214.442 22.9235 214.288 23.4951 213.929 23.9628Z\"\n fill=\"white\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M211.515 20.351C211.412 19.7793 211.155 19.1297 210.77 18.4801C210 17.1809 208.716 15.7778 207.098 14.5565C205.506 13.3352 203.837 12.4778 202.398 12.14C201.679 11.9581 201.012 11.9061 200.447 11.9841C200.01 12.036 199.599 12.2179 199.291 12.4778C199.189 12.5557 199.111 12.6337 199.034 12.7376C198.701 13.1793 198.624 13.725 198.701 14.2967C198.778 14.8683 199.009 15.5179 199.368 16.1675C200.087 17.4667 201.346 18.8959 202.963 20.1171C204.581 21.3384 206.302 22.1699 207.791 22.5077C208.536 22.6896 209.229 22.7415 209.794 22.6636C210.385 22.5856 210.899 22.3518 211.232 21.91C211.258 21.8581 211.284 21.8321 211.309 21.7801C211.54 21.3904 211.592 20.8707 211.515 20.351ZM210.616 21.4943C210.436 21.7281 210.128 21.8841 209.666 21.962C209.204 22.014 208.613 21.988 207.92 21.8061C206.559 21.4683 204.915 20.6888 203.374 19.5195C201.834 18.3502 200.652 17.025 199.985 15.8037C199.651 15.2061 199.471 14.6604 199.394 14.1927C199.343 13.725 199.42 13.4132 199.599 13.1793C199.779 12.9455 200.062 12.7636 200.524 12.7116C200.96 12.6596 201.525 12.6856 202.193 12.8415C202.835 12.9974 203.58 13.2833 204.324 13.673C205.069 14.0628 205.865 14.5565 206.61 15.1541C208.151 16.3234 209.383 17.6486 210.102 18.8439C210.462 19.4415 210.667 19.9872 210.744 20.4549C210.847 20.9486 210.77 21.2864 210.616 21.4943Z\"\n fill=\"white\"\n />\n </g>\n <path\n d=\"M246.292 9.76333H243.172L235.252 31.1633L227.372 9.76333H224.252L233.692 35.0433H236.852L246.292 9.76333ZM261.251 25.4033C261.251 29.8033 260.131 32.6033 255.691 32.6033C251.251 32.6033 250.091 29.8033 250.091 25.4033C250.091 21.0033 251.251 18.2033 255.691 18.2033C260.131 18.2033 261.251 21.0033 261.251 25.4033ZM255.691 35.3633C261.771 35.3633 264.171 31.2833 264.171 25.4033C264.171 19.4033 261.891 15.4433 255.691 15.4433C249.571 15.4433 247.171 19.5233 247.171 25.4033C247.171 31.4033 249.451 35.3633 255.691 35.3633ZM268.747 29.6833C268.747 33.8433 270.827 35.2833 273.587 35.2833C274.627 35.2833 275.427 35.1233 275.947 34.8833L275.547 32.2433C275.107 32.4433 274.507 32.5233 273.827 32.5233C272.467 32.5233 271.667 31.8833 271.667 29.2433V7.76333H268.747V29.6833Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M299.261 9.76333H296.141L288.221 31.1633L280.341 9.76333H277.221L286.661 35.0433H289.821L299.261 9.76333ZM302.505 35.0433H305.425V15.7633H302.505V35.0433ZM302.065 9.16333C302.065 10.2033 302.905 11.0433 303.985 11.0433C305.025 11.0433 305.865 10.2033 305.865 9.16333C305.865 8.12333 305.025 7.24333 303.985 7.24333C302.905 7.24333 302.065 8.08333 302.065 9.16333ZM326.615 23.8833C326.615 18.2833 323.615 15.4433 318.535 15.4433C312.215 15.4433 310.175 19.8833 310.175 25.4433C310.175 32.2833 313.295 35.3633 319.455 35.3633C321.815 35.3633 324.095 34.8833 325.975 34.0433L325.535 31.2833C324.095 32.0433 321.735 32.6033 319.495 32.6033C315.495 32.6033 313.135 30.8033 313.135 26.7233V26.5633H326.295C326.535 25.7233 326.615 24.6833 326.615 23.8833ZM313.135 23.8433C313.135 19.6833 315.215 18.0433 318.455 18.0433C321.735 18.0433 323.815 19.7233 323.815 23.8433V24.0833H313.135V23.8433ZM332.648 15.7633H329.648L336.368 35.0433H339.368L344.608 20.2833L349.848 35.0433H352.848L359.568 15.7633H356.568L351.328 31.0833L346.088 15.7633H343.128L337.888 31.0833L332.648 15.7633Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M8.87229 5.59206L0.781128 14.7137L2.74742 16.9885L13.3699 5.00647H10.1831C9.68593 5.00647 9.2113 5.20917 8.87229 5.59206Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M15.0876 5.59206L3.85486 18.2497L5.82115 20.5245L19.5852 5.00647H16.3984C15.9012 5.00647 15.404 5.20917 15.0876 5.59206Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M25.7778 5.00647H22.6137C22.1165 5.00647 21.6193 5.23169 21.2802 5.59206L6.90601 21.8083L19.879 36.8308C20.218 37.2137 20.6926 37.4389 21.2124 37.4389H24.3314L10.8386 21.8308L25.7778 5.00647Z\"\n fill=\"#3EAE2B\"\n />\n <path\n d=\"M12.059 37.4389L0.781128 24.3983V28.9479L7.60663 36.8307C7.94565 37.2136 8.42027 37.4389 8.94009 37.4389H12.059Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M18.2065 37.4389L0.781128 17.2812V21.8308L13.7541 36.8308C14.0931 37.2137 14.5677 37.4389 15.0876 37.4389H18.2065Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M31.2925 7.37134H34.2532V35.029H31.2925V7.37134ZM43.2936 15.4794H47.068L38.9316 24.7137L47.8816 35.0065H44.1073L35.1573 24.7137L43.2936 15.4794Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M51.6786 6.85327C52.7408 6.85327 53.5996 7.75417 53.5996 8.79021C53.5996 9.84877 52.7408 10.7046 51.6786 10.7046C50.5711 10.7046 49.7349 9.84877 49.7349 8.79021C49.7349 7.70913 50.5937 6.85327 51.6786 6.85327ZM50.1869 15.4794H53.1476V35.0289H50.1869V15.4794Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M57.6453 10.2091H60.606V15.4794H68.4486V18.2722H60.606V28.1596C60.606 31.5154 62.1203 32.5289 64.3804 32.5289C66.0077 32.5289 67.7253 32.1235 68.8554 31.6055L69.3074 34.3983C67.9965 34.9614 66.2111 35.3217 64.3804 35.3217C60.4252 35.3217 57.6227 33.4974 57.6227 28.137V10.2091H57.6453Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M79.0032 31.0199L84.337 15.4794H87.343L92.6768 30.9974L97.988 15.4794H101.039L94.2137 35.0289H91.1625L85.8287 20.074L80.4949 35.0289H77.4437L70.6182 15.4794H73.6694L79.0032 31.0199Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M117.109 34.2182C115.278 34.8713 112.385 35.3443 109.673 35.3443C104.949 35.3443 101.83 33.7677 101.83 29.3533C101.83 24.9839 104.972 23.3173 110.283 23.3173H114.148V21.4029C114.148 18.7227 112.272 17.8668 109.176 17.8668C106.893 17.8668 105.017 18.2722 103.797 18.7227L103.345 15.9975C104.927 15.547 106.915 15.1416 109.289 15.1416C113.764 15.1416 117.109 16.7632 117.109 21.6281V34.2182ZM114.148 25.6596H110.328C106.712 25.6596 104.791 26.5605 104.791 29.3083C104.791 32.056 106.712 32.7993 109.582 32.7993C111.006 32.7993 112.882 32.6416 114.148 32.2362V25.6596Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M121.651 16.2902C122.962 15.6821 125.403 15.1866 127.799 15.1866C129.336 15.1866 130.647 15.3443 131.709 15.6821L131.144 18.4299C130.534 18.1821 129.313 17.9794 127.889 17.9794C126.217 17.9794 125.335 18.1821 124.635 18.4975V35.0065H121.674V16.2902H121.651Z\"\n fill=\"#0068C7\"\n />\n <path\n d=\"M148.931 26.4253H135.528V26.583C135.528 30.7271 137.924 32.5515 141.992 32.5515C144.275 32.5515 146.671 31.9884 148.14 31.2226L148.592 34.0154C146.671 34.8713 144.365 35.3442 141.97 35.3442C135.709 35.3442 132.522 32.2136 132.522 25.2992C132.522 19.6686 134.602 15.1641 141.02 15.1641C146.196 15.1641 149.247 18.0469 149.247 23.7226C149.247 24.5334 149.157 25.5695 148.931 26.4253ZM135.528 23.9253H146.399V23.6776C146.399 19.5109 144.275 17.7992 140.953 17.7992C137.653 17.7992 135.551 19.4659 135.551 23.6776V23.9253H135.528Z\"\n fill=\"#0068C7\"\n />\n <line\n x1=\"170.559\"\n y1=\"0.935669\"\n x2=\"170.559\"\n y2=\"42.4279\"\n stroke=\"#CACACA\"\n />\n <defs>\n <clipPath id=\"clip0_137_135\">\n <rect\n width=\"34\"\n height=\"33\"\n fill=\"white\"\n transform=\"translate(185.09 4.55261)\"\n />\n </clipPath>\n </defs>\n </svg>\n</template>\n\n<script>\nexport default {\n name: 'volview-full-logo',\n};\n</script>\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolViewFullLogo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./VolViewFullLogo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VolViewFullLogo.vue?vue&type=template&id=3185f010&svg=true&\"\nimport script from \"./VolViewFullLogo.vue?vue&type=script&lang=js&\"\nexport * from \"./VolViewFullLogo.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <v-card>\n <v-card-title class=\"d-flex flex-row justify-center\">\n <vol-view-full-logo />\n </v-card-title>\n <v-card-text>\n <p align=\"center\">\n <img\n src=\"../assets/KitwareHeadAndNeck.jpg\"\n alt=\"Head and neck CT rendering\"\n style=\"width: 200px\"\n align=\"center\"\n /><br />\n </p>\n <p>\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://volview.kitware.com/\"\n >\n VolView\n </a>\n is an open-source web application developed at\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://kitware.com/\"\n >\n Kitware\n </a>\n for visualizing and annotating medical images. It key features include:\n </p>\n\n <ul>\n <li>Fast: Drag-and-drop DICOM files for quick viewing</li>\n <li>\n Beautiful: Cinematic volume rendering to generate high-quality 3D\n visualizations\n </li>\n <li>\n Friendly: Familiar radiological image visualization and annotation\n tools\n </li>\n <li>\n Secure: Your data stays on your machine. No cloud services or data\n servers are used.\n </li>\n </ul>\n <br />\n VolView is freely available for research, educational, and commercial\n applications. It is built using a variety of open-source toolks created by\n Kitware, such as\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://github.com/InsightSoftwareConsortium/itk-wasm/\"\n >\n itk-wasm\n </a>\n for DICOM I/O and image processing, and\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://github.com/Kitware/vtk-js\"\n >\n vtk.js\n </a>\n for in-browser scientific visualization.\n <br />\n <br />\n Want help customizing VolView or creating a new web-based visualization\n application?\n <a\n rel-=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://www.kitware.com/contact/project/\"\n >Contact Kitware!</a\n >\n <br />\n <br />\n VolView source code:\n <ul>\n <li>\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://github.com/Kitware/VolView\"\n >\n https://github.com/Kitware/VolView\n </a>\n </li>\n </ul>\n <br />\n VolView bug reports and feature requests:\n <ul>\n <li>\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://github.com/Kitware/VolView/issues\"\n >\n https://github.com/Kitware/VolView/issues\n </a>\n </li>\n </ul>\n <br />\n This work was funded, in part, by the NIH via NIBIB and NIGMS R01EB021396,\n NIBIB R01EB014955, NCI R01CA220681, and NINDS R42NS086295\n <br />\n <br />\n Sample data provided by the following sources:\n <ul>\n <li>\n PROSTATEx Challenge Data: Geert Litjens, Oscar Debats, Jelle Barentsz,\n Nico Karssemeijer, and Henkjan Huisman. \"ProstateX Challenge data\",\n The Cancer Imaging Archive (2017). DOI: 10.7937/K9TCIA.2017.MURS5CL\n (<a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"https://wiki.cancerimagingarchive.net/pages/viewpage.action?pageId=23691656\"\n >TCIA</a\n >)\n </li>\n <li>\n MRA Head and Neck: Test case 98890234 from the \"Patient Contributed\n Image Repository\" (<a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"http://www.pcir.org/researchers/98890234_20030505_MR.html\"\n >PCIR.org</a\n >)\n </li>\n <li>\n 3D ultrasound of a fetus: Sample data from\n <a\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n href=\"http://tomovision.comi\"\n >tomovision.com</a\n >\n </li>\n </ul>\n </v-card-text>\n </v-card>\n</template>\n\n<script>\nimport { defineComponent } from '@vue/composition-api';\nimport VolViewFullLogo from './icons/VolViewFullLogo.vue';\n\nexport default defineComponent({\n name: 'AboutBox',\n components: {\n VolViewFullLogo,\n },\n});\n</script>\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./AboutBox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./AboutBox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AboutBox.vue?vue&type=template&id=6baa85d6&\"\nimport script from \"./AboutBox.vue?vue&type=script&lang=js&\"\nexport * from \"./AboutBox.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\ninstallComponents(component, {VCard,VCardText,VCardTitle})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('item-group',{staticClass:\"d-flex flex-column align-center\",attrs:{\"mandatory\":\"\",\"value\":_vm.currentTool},on:{\"change\":function($event){return _vm.setCurrentTool($event)}}},[_c('div',{staticClass:\"my-1 tool-separator\"}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.WindowLevel},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-circle-half-full\",\"name\":\"Window & Level\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":toggle}})]}}])}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.Pan},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-cursor-move\",\"name\":\"Pan\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":toggle}})]}}])}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.Zoom},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-magnify-plus-outline\",\"name\":\"Zoom\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":toggle}})]}}])}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.Crosshairs},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-crosshairs\",\"name\":\"Crosshairs\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":toggle}})]}}])}),_c('div',{staticClass:\"my-1 tool-separator\"}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.Paint},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('v-menu',{attrs:{\"offset-x\":\"\",\"close-on-content-click\":false,\"disabled\":!active},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar attrs = ref.attrs;\nvar on = ref.on;\nreturn [_c('div',[_c('tool-button',_vm._g(_vm._b({attrs:{\"size\":\"40\",\"icon\":\"mdi-brush\",\"name\":\"Paint\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":function($event){$event.stopPropagation();return toggle.apply(null, arguments)}}},'tool-button',attrs,false),on),[(active)?_c('v-icon',{staticClass:\"menu-more\",attrs:{\"size\":\"18\"}},[_vm._v(\" mdi-menu-right \")]):_vm._e()],1)],1)]}}],null,true),model:{value:(_vm.paintMenu),callback:function ($$v) {_vm.paintMenu=$$v},expression:\"paintMenu\"}},[_c('paint-controls')],1)]}}])}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.Ruler},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-ruler\",\"name\":\"Ruler\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":toggle}})]}}])}),_c('div',{staticClass:\"my-1 tool-separator\"}),_c('groupable-item',{attrs:{\"value\":_vm.Tools.Crop},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar active = ref.active;\nvar toggle = ref.toggle;\nreturn [_c('v-menu',{attrs:{\"offset-x\":\"\",\"open-on-hover\":\"\",\"close-on-content-click\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar attrs = ref.attrs;\nvar on = ref.on;\nreturn [_c('div',[_c('tool-button',_vm._g(_vm._b({attrs:{\"size\":\"40\",\"icon\":\"mdi-crop\",\"name\":\"Crop\",\"buttonClass\":['tool-btn', active ? 'tool-btn-selected' : ''],\"disabled\":_vm.noCurrentImage},on:{\"click\":function($event){$event.stopPropagation();return toggle.apply(null, arguments)}}},'tool-button',attrs,false),on),[(active)?_c('v-icon',{staticClass:\"menu-more\",attrs:{\"size\":\"18\"}},[_vm._v(\" mdi-menu-right \")]):_vm._e()],1)],1)]}}],null,true),model:{value:(_vm.cropMenu),callback:function ($$v) {_vm.cropMenu=$$v},expression:\"cropMenu\"}},[_c('crop-controls')],1)]}}])})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{attrs:{\"width\":\"350px\"}},[_c('v-container',[_c('v-row',{attrs:{\"no-gutters\":\"\",\"align\":\"center\"}},[_c('v-col',[_c('v-slider',{attrs:{\"value\":_vm.brushSize,\"dense\":\"\",\"hide-details\":\"\",\"label\":\"Size\",\"min\":\"1\",\"max\":\"50\"},on:{\"input\":_vm.setBrushSize},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('v-text-field',{staticClass:\"mt-n1 pt-0\",staticStyle:{\"width\":\"40px\"},attrs:{\"value\":_vm.brushSize,\"hide-details\":\"\",\"type\":\"number\",\"min\":\"1\",\"max\":\"50\"},on:{\"input\":_vm.setBrushSize}})]},proxy:true}])})],1)],1),_c('v-row',{attrs:{\"no-gutters\":\"\",\"align\":\"center\"}},[_c('v-col',[_c('v-slider',{attrs:{\"value\":_vm.opacity,\"dense\":\"\",\"hide-details\":\"\",\"label\":\"Opacity\",\"min\":\"0\",\"max\":\"1\",\"step\":\"0.01\"},on:{\"input\":_vm.setOpacity},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('v-text-field',{staticClass:\"mt-n1 pt-0\",staticStyle:{\"width\":\"40px\"},attrs:{\"value\":_vm.opacity,\"hide-details\":\"\",\"type\":\"number\",\"min\":\"0\",\"max\":\"1\",\"step\":\"0.1\"},on:{\"input\":_vm.setOpacity}})]},proxy:true}])})],1)],1),_c('v-row',{attrs:{\"no-gutters\":\"\",\"align\":\"center\"}},[_c('v-col',[_c('v-color-picker',{attrs:{\"hide-canvas\":\"\",\"hide-inputs\":\"\",\"hide-mode-switch\":\"\",\"hide-sliders\":\"\",\"show-swatches\":\"\",\"swatches\":_vm.swatches,\"value\":_vm.brushColor},on:{\"input\":_vm.setBrushColor}})],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * Converts an RGBA tuple to a hex string with alpha.\n *\n * Adds the prefix '#'.\n *\n * @param rgba a 4-tuple with components ranging from 0-255.\n */\nexport function rgbaToHexa(rgba: number[]) {\n const hexa = rgba.map((comp) => `0${comp.toString(16)}`.slice(-2));\n return `#${hexa.join('')}`;\n}\n\n/**\n *\n * @param hexa a hexa color in the format \"#AABBCCDD\"\n */\nexport function hexaToRGBA(hexa: string) {\n const rgba = [0, 0, 0, 0];\n for (let i = 0; i < 4; i++) {\n rgba[i] = Number.parseInt(hexa.substring(i + 1, i + 3), 16);\n }\n return rgba;\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { computed, defineComponent } from '@vue/composition-api';\nimport { LABELMAP_PALETTE } from '../config';\nimport { usePaintToolStore } from '../store/tools/paint';\nimport { rgbaToHexa } from '../utils/color';\n\n// generates both the swatches for v-color-picker and the color-to-value mapping\nfunction convertToSwatches(\n palette: typeof LABELMAP_PALETTE,\n width: number = 5\n) {\n const hexToValue: Record<string, number> = {};\n const swatches: string[][] = [];\n const entries = Object.entries(palette);\n while (entries.length) {\n const [value, rgba] = entries.shift()!;\n const hex = rgbaToHexa(rgba).toUpperCase();\n hexToValue[hex] = Number(value);\n\n let row = swatches[swatches.length - 1];\n if (!row || row.length === width) {\n row = [];\n swatches.push(row);\n }\n row.push(hex);\n }\n\n return { hexToValue, swatches };\n}\n\nexport default defineComponent({\n name: 'PaintControls',\n\n setup() {\n const paintStore = usePaintToolStore();\n\n const { hexToValue, swatches } = convertToSwatches(LABELMAP_PALETTE, 3);\n const brushColor = computed(() => {\n const value = paintStore.brushValue;\n if (value in LABELMAP_PALETTE) {\n return rgbaToHexa(LABELMAP_PALETTE[value]);\n }\n return null;\n });\n\n const setBrushColor = (color: string) => {\n const hexa = color.toUpperCase();\n if (hexa in hexToValue) {\n paintStore.setBrushValue(hexToValue[hexa]);\n }\n };\n\n const brushSize = computed(() => paintStore.brushSize);\n const setBrushSize = (size: number) => {\n paintStore.setBrushSize(Number(size));\n };\n\n const opacity = computed(() => paintStore.labelmapOpacity);\n const setOpacity = (op: number) => {\n paintStore.setLabelmapOpacity(Number(op));\n };\n\n return {\n brushSize,\n setBrushSize,\n swatches,\n brushColor,\n setBrushColor,\n opacity,\n setOpacity,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PaintControls.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./PaintControls.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./PaintControls.vue?vue&type=template&id=45995f9c&scoped=true&\"\nimport script from \"./PaintControls.vue?vue&type=script&lang=ts&\"\nexport * from \"./PaintControls.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./PaintControls.vue?vue&type=style&index=0&id=45995f9c&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"45995f9c\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VColorPicker } from 'vuetify/lib/components/VColorPicker';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSlider } from 'vuetify/lib/components/VSlider';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VCard,VCol,VColorPicker,VContainer,VRow,VSlider,VTextField})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{attrs:{\"dark\":\"\"}},[_c('tool-button',{attrs:{\"size\":\"40\",\"icon\":\"mdi-restore\",\"name\":\"Reset Crop\"},on:{\"click\":_vm.resetCrop}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport { defineComponent } from '@vue/composition-api';\nimport ToolButton from '@/src/components/ToolButton.vue';\nimport { useCurrentImage } from '@/src/composables/useCurrentImage';\nimport { useCropStore } from '@/src/store/tools/crop';\n\nexport default defineComponent({\n components: {\n ToolButton,\n },\n setup() {\n const { currentImageID } = useCurrentImage();\n const cropStore = useCropStore();\n\n const resetCrop = () => {\n const imageID = currentImageID.value;\n if (imageID) {\n cropStore.resetCropping(imageID);\n }\n };\n\n return {\n resetCrop,\n };\n },\n});\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CropControls.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CropControls.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./CropControls.vue?vue&type=template&id=60dc1253&\"\nimport script from \"./CropControls.vue?vue&type=script&lang=ts&\"\nexport * from \"./CropControls.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\ninstallComponents(component, {VCard})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { computed, defineComponent, ref } from '@vue/composition-api';\nimport { onKeyDown } from '@vueuse/core';\nimport { Tools } from '@/src/store/tools/types';\nimport ToolButton from './ToolButton.vue';\nimport ItemGroup from './ItemGroup.vue';\nimport GroupableItem from './GroupableItem.vue';\nimport { useDatasetStore } from '../store/datasets';\nimport { useToolStore } from '../store/tools';\nimport PaintControls from './PaintControls.vue';\nimport CropControls from './tools/crop/CropControls.vue';\n\nexport default defineComponent({\n components: {\n ToolButton,\n ItemGroup,\n GroupableItem,\n PaintControls,\n CropControls,\n },\n setup() {\n const dataStore = useDatasetStore();\n const toolStore = useToolStore();\n\n const noCurrentImage = computed(() => !dataStore.primaryDataset);\n const currentTool = computed(() => toolStore.currentTool);\n\n const paintMenu = ref(false);\n const cropMenu = ref(false);\n\n onKeyDown('Escape', () => {\n paintMenu.value = false;\n cropMenu.value = false;\n });\n\n return {\n currentTool,\n setCurrentTool: toolStore.setCurrentTool,\n noCurrentImage,\n Tools,\n paintMenu,\n cropMenu,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ToolStrip.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./ToolStrip.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ToolStrip.vue?vue&type=template&id=1dd60f2c&scoped=true&\"\nimport script from \"./ToolStrip.vue?vue&type=script&lang=ts&\"\nexport * from \"./ToolStrip.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./ToolStrip.vue?vue&type=style&index=0&id=1dd60f2c&prod&lang=css&\"\nimport style1 from \"./ToolStrip.vue?vue&type=style&index=1&id=1dd60f2c&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1dd60f2c\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\ninstallComponents(component, {VIcon,VMenu})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{staticClass:\"fill-height message-center\"},[_c('v-card-title',[_c('span',[_vm._v(\"Notifications\")]),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',{staticClass:\"content-container pt-4\"},[_c('div',{staticClass:\"action-bar ma-2\"},[_c('div',{staticClass:\"filter-bar\"},[_c('v-checkbox',{staticClass:\"px-2\",attrs:{\"hide-details\":\"\",\"label\":\"Error\"},model:{value:(_vm.showErrors),callback:function ($$v) {_vm.showErrors=$$v},expression:\"showErrors\"}}),_c('v-checkbox',{staticClass:\"px-2\",attrs:{\"hide-details\":\"\",\"label\":\"Warning\"},model:{value:(_vm.showWarnings),callback:function ($$v) {_vm.showWarnings=$$v},expression:\"showWarnings\"}}),_c('v-checkbox',{staticClass:\"px-2\",attrs:{\"hide-details\":\"\",\"label\":\"Info\"},model:{value:(_vm.showInfo),callback:function ($$v) {_vm.showInfo=$$v},expression:\"showInfo\"}})],1),_c('v-btn',{attrs:{\"color\":\"secondary\"},on:{\"click\":_vm.clearAll}},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-delete\")]),_c('span',[_vm._v(\"Clear All\")])],1)],1),_c('div',{ref:\"messageListEl\",staticClass:\"message-list ma-2\"},[_c('v-expansion-panels',{attrs:{\"accordion\":\"\",\"multiple\":\"\",\"hover\":\"\",\"value\":_vm.filteredMessages.map(function (_, i) { return i; })},on:{\"change\":_vm.scrollIfLast}},_vm._l((_vm.filteredMessages),function(msg){return _c('message-item',{key:msg.id,attrs:{\"message\":msg},on:{\"delete\":function($event){return _vm.deleteItem(msg.id)}}})}),1),(_vm.filteredMessages.length === 0)?[_c('div',{staticClass:\"empty\"},[_vm._v(\"No notifications to display\")])]:_vm._e()],2)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-expansion-panel',[_c('v-expansion-panel-header',{class:_vm.headerClass},[_c('div',{staticClass:\"header\"},[_c('span',[_vm._v(_vm._s(_vm.message.title))]),_c('v-btn',{staticClass:\"mr-3\",attrs:{\"icon\":\"\",\"small\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('delete')}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"mdi-delete\")])],1)],1)]),(_vm.message.options.details)?_c('v-expansion-panel-content',[_c('div',{staticClass:\"mt-4\"},[_c('pre',{staticClass:\"details\"},[_vm._v(_vm._s(_vm.message.options.details))])])]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport {\n computed,\n defineComponent,\n PropType,\n toRefs,\n} from '@vue/composition-api';\nimport { Message, MessageType } from '../store/messages';\n\nconst MessageTypeClass: Record<MessageType, string> = {\n [MessageType.Error]: 'error',\n [MessageType.Warning]: 'warn',\n [MessageType.Info]: 'info',\n [MessageType.Success]: '',\n};\n\nexport default defineComponent({\n props: {\n message: {\n type: Object as PropType<Message>,\n required: true,\n },\n },\n setup(props) {\n const { message } = toRefs(props);\n\n const headerClass = computed(() => {\n const type = MessageTypeClass[message.value.type];\n if (type?.length) {\n return `${type}-message`;\n }\n return '';\n });\n\n return {\n headerClass,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageItem.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageItem.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MessageItem.vue?vue&type=template&id=233f9698&scoped=true&\"\nimport script from \"./MessageItem.vue?vue&type=script&lang=ts&\"\nexport * from \"./MessageItem.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./MessageItem.vue?vue&type=style&index=0&id=233f9698&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"233f9698\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VExpansionPanel } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelContent } from 'vuetify/lib/components/VExpansionPanel';\nimport { VExpansionPanelHeader } from 'vuetify/lib/components/VExpansionPanel';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VBtn,VExpansionPanel,VExpansionPanelContent,VExpansionPanelHeader,VIcon})\n","\nimport { computed, defineComponent, ref } from '@vue/composition-api';\nimport { storeToRefs } from 'pinia';\nimport { MessageType, useMessageStore } from '../store/messages';\nimport MessageItem from './MessageItem.vue';\n\nfunction watchResize(\n element: Element,\n callback: (el: Element) => void,\n timeout = 10\n) {\n let timeoutID = -1;\n let observer: ResizeObserver;\n\n const refreshTimeout = (cb: Function) => {\n clearTimeout(timeoutID);\n timeoutID = setTimeout(cb, timeout);\n };\n\n const cleanup = () => {\n observer.disconnect();\n };\n\n observer = new ResizeObserver(() => {\n refreshTimeout(cleanup);\n callback(element);\n });\n\n observer.observe(element);\n}\n\nexport default defineComponent({\n components: {\n MessageItem,\n },\n setup() {\n const messageStore = useMessageStore();\n const { messages } = storeToRefs(messageStore);\n\n const showErrors = ref(true);\n const showWarnings = ref(true);\n const showInfo = ref(true);\n\n const filteredMessages = computed(() => {\n const show = {\n errors: showErrors.value,\n warnings: showWarnings.value,\n info: showInfo.value,\n };\n return messages.value.filter(\n (msg) =>\n (msg.type === MessageType.Error && show.errors) ||\n (msg.type === MessageType.Warning && show.warnings) ||\n (msg.type === MessageType.Info && show.info)\n );\n });\n\n function deleteItem(messageID: string) {\n messageStore.clearOne(messageID);\n }\n\n const messageListEl = ref<HTMLElement>();\n\n let cachedLast = -Infinity;\n function scrollIfLast(openPanels: number[]) {\n const last = Math.max(...openPanels);\n const listEl = messageListEl.value;\n if (\n last === messages.value.length - 1 &&\n // detect if the last panel is already expanded\n last !== cachedLast &&\n listEl?.firstElementChild\n ) {\n watchResize(listEl.firstElementChild, () => {\n const height = listEl.scrollHeight;\n listEl.scroll(0, height);\n });\n }\n cachedLast = last;\n }\n\n return {\n deleteItem,\n clearAll: messageStore.clearAll,\n scrollIfLast,\n messageListEl,\n showErrors,\n showWarnings,\n showInfo,\n filteredMessages,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageCenter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageCenter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MessageCenter.vue?vue&type=template&id=6f404126&scoped=true&\"\nimport script from \"./MessageCenter.vue?vue&type=script&lang=ts&\"\nexport * from \"./MessageCenter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./MessageCenter.vue?vue&type=style&index=0&id=6f404126&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6f404126\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VExpansionPanels } from 'vuetify/lib/components/VExpansionPanel';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardText,VCardTitle,VCheckbox,VExpansionPanels,VIcon,VSpacer})\n","import { createToastInterface } from 'vue-toastification';\n\nconst toast = createToastInterface({\n position: 'bottom-left',\n timeout: 3000,\n hideProgressBar: true,\n maxToasts: 3,\n transition: 'Vue-Toastification__fade',\n});\n\nexport const useToast = () => toast;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',[_vm._v(_vm._s(_vm.message))]),_vm._v(\"   \"),(_vm.detailsButton)?_c('v-btn',{attrs:{\"dark\":\"\",\"depressed\":\"\",\"small\":\"\",\"color\":\"#00000022\"}},[_vm._v(\" details \")]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\nimport { defineComponent } from '@vue/composition-api';\n\nexport default defineComponent({\n props: {\n message: String,\n detailsButton: Boolean,\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageNotificationContent.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageNotificationContent.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MessageNotificationContent.vue?vue&type=template&id=7cf50be8&\"\nimport script from \"./MessageNotificationContent.vue?vue&type=script&lang=ts&\"\nexport * from \"./MessageNotificationContent.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\ninstallComponents(component, {VBtn})\n","\nimport { defineComponent, del, watch } from '@vue/composition-api';\nimport { useToast } from '@/src/composables/useToast';\nimport { storeToRefs } from 'pinia';\nimport { ToastID } from 'vue-toastification/dist/types/src/types';\nimport { Message, MessageType, useMessageStore } from '../store/messages';\nimport MessageNotificationContent from './MessageNotificationContent.vue';\n\nconst TIMEOUT = 5000;\n\nexport default defineComponent({\n setup(props, { emit }) {\n const messageStore = useMessageStore();\n const { byID } = storeToRefs(messageStore);\n\n const toasts = {} as Record<string, ToastID>;\n\n const toast = useToast();\n type ToastMethod =\n | typeof toast.info\n | typeof toast.success\n | typeof toast.warning\n | typeof toast.error;\n\n const makeToastOptions = (msgID: string) => ({\n timeout: byID.value[msgID].options.persist ? (false as const) : TIMEOUT,\n closeOnClick: !byID.value[msgID].options.persist,\n onClick: () => emit('open-notifications'),\n onClose: () => {\n del(toasts, msgID);\n },\n });\n\n // remove toasts if the message is gone\n watch(byID, (msgLookup) => {\n Object.keys(toasts).forEach((msgID) => {\n if (!(msgID in msgLookup)) {\n toast.dismiss(toasts[msgID]);\n del(toasts, msgID);\n }\n });\n });\n\n messageStore.$onAction(({ name, args, after }) => {\n if (name === '_addMessage') {\n const message = args[0] as Omit<Message, 'id'>;\n after((msgID) => {\n if (!msgID) {\n return;\n }\n\n let toastMethod: ToastMethod = toast.info;\n let showDetailsButton = false;\n\n if (message.type === MessageType.Error) {\n toastMethod = toast.error;\n showDetailsButton = true;\n } else if (message.type === MessageType.Warning) {\n toastMethod = toast.warning;\n showDetailsButton = true;\n } else if (message.type === MessageType.Info) {\n toastMethod = toast.info;\n } else if (message.type === MessageType.Success) {\n toastMethod = toast.success;\n }\n\n toasts[msgID] = toastMethod(\n {\n component: MessageNotificationContent,\n props: {\n message: message.title,\n detailsButton: showDetailsButton,\n },\n },\n makeToastOptions(msgID)\n );\n });\n }\n });\n\n return () => null;\n },\n});\n","var render, staticRenderFns\nimport script from \"./MessageNotifications.vue?vue&type=script&lang=ts&\"\nexport * from \"./MessageNotifications.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageNotifications.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./MessageNotifications.vue?vue&type=script&lang=ts&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',[_c('v-card-title',[_vm._v(\" Settings \"),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',[_c('v-switch',{attrs:{\"label\":\"Enable Dark Theme\"},model:{value:(_vm.dark),callback:function ($$v) {_vm.dark=$$v},expression:\"dark\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{staticStyle:{\"enable-background\":\"new 0 0 200 200\"},attrs:{\"version\":\"1.1\",\"id\":\"Layer_3\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",\"x\":\"0px\",\"y\":\"0px\",\"viewBox\":\"0 0 200 200\",\"xml:space\":\"preserve\"}},[_c('g',[_c('g',[_c('path',{staticClass:\"st0\",attrs:{\"d\":\"M82.1,29.9L46.4,70.4L55,80.5l47-53.2H88C85.7,27.3,83.6,28.3,82.1,29.9z\"}}),_c('path',{staticClass:\"st0\",attrs:{\"d\":\"M109.6,29.9L59.9,86.1l8.7,10.1l60.9-68.9h-14.1C113.2,27.3,111.1,28.3,109.6,29.9z\"}}),_c('path',{staticClass:\"st0\",attrs:{\"d\":\"M157,27.3h-14c-2.2,0-4.4,1-5.9,2.6l-63.6,72l0,0l0,0l57.4,66.7c1.5,1.7,3.6,2.7,5.9,2.7h13.8L91,102\\n\\t\\t\\tL157,27.3z\"}}),_c('path',{staticClass:\"st1\",attrs:{\"d\":\"M96.3,171.3l-49.9-57.9v20.2l30.2,35c1.5,1.7,3.6,2.7,5.9,2.7H96.3z\"}}),_c('path',{staticClass:\"st1\",attrs:{\"d\":\"M123.5,171.3L46.4,81.8v20.2l57.4,66.6c1.5,1.7,3.6,2.7,5.9,2.7H123.5z\"}})])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template svg>\n <svg\n version=\"1.1\"\n id=\"Layer_3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 200 200\"\n style=\"enable-background: new 0 0 200 200\"\n xml:space=\"preserve\"\n >\n <g>\n <g>\n <path\n class=\"st0\"\n d=\"M82.1,29.9L46.4,70.4L55,80.5l47-53.2H88C85.7,27.3,83.6,28.3,82.1,29.9z\"\n />\n <path\n class=\"st0\"\n d=\"M109.6,29.9L59.9,86.1l8.7,10.1l60.9-68.9h-14.1C113.2,27.3,111.1,28.3,109.6,29.9z\"\n />\n <path\n class=\"st0\"\n d=\"M157,27.3h-14c-2.2,0-4.4,1-5.9,2.6l-63.6,72l0,0l0,0l57.4,66.7c1.5,1.7,3.6,2.7,5.9,2.7h13.8L91,102\n\t\t\tL157,27.3z\"\n />\n <path\n class=\"st1\"\n d=\"M96.3,171.3l-49.9-57.9v20.2l30.2,35c1.5,1.7,3.6,2.7,5.9,2.7H96.3z\"\n />\n <path\n class=\"st1\"\n d=\"M123.5,171.3L46.4,81.8v20.2l57.4,66.6c1.5,1.7,3.6,2.7,5.9,2.7H123.5z\"\n />\n </g>\n </g>\n </svg>\n</template>\n\n<script>\nexport default {\n name: 'kitware-logo',\n};\n</script>\n\n<style scoped>\n.st0 {\n fill: #3eae2b;\n}\n.st1 {\n fill: #0068c7;\n}\n</style>\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./KitwareLogoIcon.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./KitwareLogoIcon.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KitwareLogoIcon.vue?vue&type=template&id=5c130a7c&scoped=true&svg=true&\"\nimport script from \"./KitwareLogoIcon.vue?vue&type=script&lang=js&\"\nexport * from \"./KitwareLogoIcon.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KitwareLogoIcon.vue?vue&type=style&index=0&id=5c130a7c&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5c130a7c\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue';\nimport Vuetify from 'vuetify/lib';\nimport { useLocalStorage } from '@vueuse/core';\n\nimport KitwareMark from '@/src/components/icons/KitwareLogoIcon.vue';\n\nVue.use(Vuetify);\n\nconst store = useLocalStorage('dark', true);\n\nexport default new Vuetify({\n icons: {\n values: {\n kitwareMark: {\n component: KitwareMark,\n },\n },\n },\n theme: {\n dark: store.value,\n },\n breakpoint: {\n mobileBreakpoint: 'sm',\n },\n});\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { defineComponent, watchEffect } from '@vue/composition-api';\nimport { useLocalStorage } from '@vueuse/core';\nimport vuetify from '../plugins/vuetify';\n\nexport default defineComponent({\n setup() {\n const store = useLocalStorage<boolean>(\n 'dark',\n vuetify.framework.theme.dark ?? true\n );\n\n watchEffect(() => {\n vuetify.framework.theme.dark = store.value;\n });\n\n return {\n dark: store,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=311408e8&\"\nimport script from \"./Settings.vue?vue&type=script&lang=ts&\"\nexport * from \"./Settings.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\ninstallComponents(component, {VBtn,VCard,VCardText,VCardTitle,VIcon,VSpacer,VSwitch})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"width\":\"178\",\"height\":\"41\",\"viewBox\":\"0 0 178 41\",\"fill\":\"none\",\"xmlns\":\"http://www.w3.org/2000/svg\"}},[_c('g',{attrs:{\"clip-path\":\"url(#clip0_137_151)\"}},[_c('path',{attrs:{\"d\":\"M33.2403 22.3722C33.189 22.4501 33.1376 22.554 33.0606 22.632C31.7509 24.3989 29.0545 25.1265 25.6905 24.6588C25.5364 24.6328 25.3823 24.6068 25.2282 24.5808C23.1995 24.243 20.9911 23.4895 18.7826 22.3722C17.4729 21.6966 16.1633 20.8651 14.905 19.9037C13.5439 18.8643 12.3113 17.747 11.2584 16.5517C9.58926 14.7068 8.35663 12.758 7.56056 10.8871C6.25089 7.79499 6.25089 5.04066 7.53488 3.24774C8.84455 1.48082 11.4125 0.805225 14.6225 1.29893C16.2146 1.53278 17.9609 2.07845 19.7584 2.88396C21.5303 3.68948 23.3536 4.75483 25.1255 6.10601C28.6693 8.78239 31.34 12.0304 32.7781 15.0966C34.1648 18.0068 34.3445 20.6052 33.2403 22.3722Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M33.2404 22.3721C33.189 22.4501 33.1377 22.554 33.0606 22.632C31.7509 24.3989 29.0546 25.1265 25.6905 24.6588C25.5364 24.6328 25.3824 24.6068 25.2283 24.5808C23.3537 24.191 21.1966 23.4895 18.7827 22.3721C17.473 21.6966 16.1633 20.8651 14.905 19.9036C13.544 18.8643 12.3114 17.7469 11.2585 16.5517C8.69052 12.2643 9.2298 6.9375 10.7706 5.24852C12.6452 3.16978 16.9337 2.70206 23.6361 7.24931C29.5425 11.2509 33.7796 19.0202 33.2404 22.3721Z\",\"fill\":\"black\",\"fill-opacity\":\"0.15\"}}),_c('path',{attrs:{\"d\":\"M30.1331 18.0068C30.1331 18.5005 30.0304 18.9422 29.8506 19.332C29.7993 19.4619 29.7222 19.5918 29.6195 19.7217C29.2086 20.2934 28.541 20.6572 27.6422 20.8391C26.7434 21.021 25.6648 20.969 24.4579 20.7351C22.044 20.2674 19.2706 18.9942 16.831 17.1753C16.8053 17.1493 16.7539 17.1233 16.7283 17.0973C14.3657 15.2784 12.5681 13.0698 11.5666 11.017C10.5394 8.91229 10.4624 7.06741 11.3098 5.9241C12.1316 4.78079 13.9035 4.443 16.189 4.91071C18.4745 5.37843 21.1195 6.65166 23.5334 8.49654C25.9473 10.3414 27.9503 12.5761 29.1059 14.6808C29.7993 15.9021 30.1331 17.0454 30.1331 18.0068Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M29.8506 19.3321C29.7992 19.462 29.7222 19.5919 29.6195 19.7218C29.2086 20.2935 28.5409 20.6573 27.6421 20.8391C26.7433 21.021 25.6648 20.9691 24.4578 20.7352C22.0439 20.2675 19.2705 18.9943 16.831 17.1754C16.8053 17.1494 16.7539 17.1234 16.7282 17.0974C13.8778 14.2132 13.7494 9.61394 14.905 8.31473C16.2146 7.14544 18.5258 7.17142 22.763 10.0297C26.3068 12.4462 29.5681 16.9415 29.8506 19.3321Z\",\"fill\":\"black\",\"fill-opacity\":\"0.15\"}}),_c('path',{attrs:{\"d\":\"M26.3068 17.2533C26.1271 17.4871 25.8189 17.6431 25.3567 17.721C24.8944 17.773 24.3038 17.747 23.6105 17.5651C22.2494 17.2273 20.6059 16.4478 19.0651 15.2785C17.5243 14.1092 16.3431 12.784 15.6754 11.5627C15.3416 10.9651 15.1618 10.4194 15.0848 9.95171C15.0334 9.484 15.1105 9.17219 15.2902 8.93833C15.47 8.70447 15.7524 8.52258 16.2147 8.47061C16.6512 8.41864 17.2162 8.44463 17.8839 8.60053C18.5259 8.75644 19.2706 9.04227 20.0153 9.43203C20.76 9.82179 21.5561 10.3155 22.3008 10.9131C23.8416 12.0824 25.0742 13.4076 25.7932 14.6029C26.1528 15.2005 26.3582 15.7462 26.4352 16.2139C26.5379 16.7076 26.4609 17.0454 26.3068 17.2533Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M27.0001 17.565C26.769 18.1627 26.5379 18.6044 26.1527 19.1501C23.8415 22.2682 19.0137 22.7099 15.624 20.1375C12.2343 17.565 11.3612 12.758 13.6467 9.63984C14.1089 9.06819 14.4427 8.67843 14.982 8.23669C14.8793 8.31465 14.8022 8.3926 14.7252 8.49654C14.3914 8.93827 14.3143 9.48394 14.3914 10.0556C14.4684 10.6272 14.6995 11.2769 15.059 11.9265C15.7781 13.2257 17.0364 14.6548 18.6542 15.8761C20.272 17.0973 21.9926 17.9288 23.482 18.2666C24.2267 18.4485 24.9201 18.5005 25.485 18.4225C26.0757 18.3446 26.5893 18.1107 26.9231 17.669C26.9488 17.669 26.9745 17.617 27.0001 17.565Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M30.5696 19.7737C30.2615 20.7092 29.1316 22.4241 28.4382 23.2036C24.7917 28.1147 17.1391 28.9722 11.6436 24.8147C6.17386 20.7351 5.17235 12.4462 8.81888 7.50916C9.38383 6.75562 10.334 5.56034 11.1557 4.85876C10.976 5.01467 10.7962 5.19656 10.6421 5.40443C9.51223 6.93751 9.76903 9.17215 10.8219 11.3808C11.9004 13.6155 13.8264 15.954 16.3174 17.8509C17.5757 18.8123 18.911 19.6178 20.272 20.2414C21.6331 20.8651 22.9941 21.3328 24.2524 21.5666C25.5364 21.8265 26.7177 21.8784 27.7449 21.6706C28.7721 21.4627 29.6452 21.021 30.2358 20.2414C30.3899 20.0855 30.4926 19.9296 30.5696 19.7737Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M34.2675 22.1643C33.7025 23.6974 32.6497 25.5942 31.1859 27.3092C25.2796 34.1171 15.059 35.3903 7.71463 29.8037C0.395901 24.2691 -1.32464 14.1092 3.47747 6.39189C4.55602 4.65094 6.63608 2.59819 7.86871 1.71472C7.84303 1.74071 7.14968 2.39031 6.8672 2.78008C5.30074 4.91078 5.42913 8.05488 6.79016 11.225C8.15119 14.447 10.7705 17.825 14.3914 20.5793C16.2146 21.9565 18.1149 23.0478 20.0152 23.8793C21.9155 24.7108 23.8158 25.2305 25.5621 25.4903C29.0545 25.958 32.1361 25.2824 33.7026 23.1517C33.9337 22.8399 34.1391 22.5021 34.2675 22.1643Z\",\"fill\":\"#0068C7\"}}),_c('path',{attrs:{\"d\":\"M33.5228 14.7329C32.0077 11.5368 29.2343 8.18483 25.6135 5.4305C22.0183 2.67616 18.115 0.987188 14.7509 0.467503C13.544 0.285613 12.3627 0.259629 11.3098 0.38955C11.2585 0.38955 11.2071 0.38955 11.1814 0.415535C11.0274 0.441519 10.8476 0.467503 10.6935 0.493487C10.6679 0.493487 10.6422 0.493487 10.5908 0.519472C10.4881 0.545456 10.3854 0.57144 10.3083 0.597424C10.2056 0.623409 10.1286 0.649393 10.0515 0.675377C9.9745 0.701361 9.89746 0.727346 9.82042 0.75333C9.07571 0.987188 8.40803 1.35097 7.8174 1.81868C7.45788 2.07853 7.14973 2.39034 6.86725 2.7801C5.30078 4.91081 5.42918 8.0549 6.79021 11.225C8.15124 14.447 10.7706 17.825 14.3914 20.5793C16.2147 21.9565 18.115 23.0478 20.0153 23.8793C21.9156 24.7108 23.8159 25.2305 25.5621 25.4903C29.0546 25.9581 32.1361 25.2825 33.7026 23.1518C33.9337 22.8659 34.1135 22.5281 34.2675 22.1903C35.2177 20.1116 34.8068 17.4352 33.5228 14.7329ZM33.2404 22.3722C33.189 22.4502 33.1376 22.5541 33.0606 22.6321C31.7509 24.399 29.0546 25.1266 25.6905 24.6588C25.5364 24.6329 25.3824 24.6069 25.2283 24.5809C23.1996 24.2431 20.9911 23.4895 18.7827 22.3722C17.473 21.6966 16.1633 20.8651 14.905 19.9037C13.544 18.8644 12.3114 17.747 11.2585 16.5518C9.5893 14.7069 8.35667 12.7581 7.5606 10.8872C6.25093 7.79506 6.25093 5.04073 7.53492 3.24782C8.84459 1.48089 11.4126 0.805298 14.6225 1.299C16.2147 1.53286 17.9609 2.07853 19.7585 2.88404C21.5304 3.68955 23.3537 4.7549 25.1256 6.10609C28.6694 8.78246 31.3401 12.0305 32.7781 15.0966C34.1648 18.0069 34.3446 20.6053 33.2404 22.3722Z\",\"fill\":\"white\"}}),_c('path',{attrs:{\"d\":\"M29.8506 14.2651C28.6436 12.0564 26.5636 9.71781 24.0726 7.82096C21.5817 5.92411 18.834 4.59891 16.3944 4.10521C14.5711 3.71545 12.8506 3.7934 11.618 4.54694C11.5923 4.54694 11.5666 4.57293 11.5666 4.57293C11.5666 4.57293 11.5409 4.57293 11.5409 4.59891C11.4896 4.6249 11.4382 4.65088 11.4125 4.70285C11.3355 4.75482 11.2584 4.83277 11.1814 4.88474C11.0016 5.04065 10.8219 5.22254 10.6678 5.43041C9.5379 6.96348 9.79469 9.19813 10.8476 11.4068C11.9261 13.6414 13.8521 15.98 16.343 17.8769C17.6013 18.8383 18.9367 19.6438 20.2977 20.2674C21.6587 20.891 23.0198 21.3588 24.2781 21.5926C25.5621 21.8525 26.7433 21.9044 27.7705 21.6966C28.7977 21.4887 29.6708 21.0469 30.2615 20.2674C30.3642 20.1375 30.4669 19.9816 30.5439 19.8257C31.3657 18.2666 30.9291 16.2399 29.8506 14.2651ZM29.6195 19.7217C29.2086 20.2934 28.5409 20.6572 27.6421 20.8391C26.7433 21.021 25.6648 20.969 24.4578 20.7351C22.0439 20.2674 19.2705 18.9942 16.8309 17.1753C14.4171 15.3564 12.5681 13.0958 11.5666 11.017C10.5394 8.9123 10.4624 7.06742 11.3098 5.92411C12.1316 4.7808 13.9035 4.44301 16.189 4.91072C18.4745 5.37844 21.1195 6.65167 23.5334 8.49655C25.9473 10.3414 27.9503 12.5761 29.1059 14.6808C29.7992 15.928 30.1331 17.0714 30.1331 18.0328C30.1331 18.6824 29.979 19.254 29.6195 19.7217Z\",\"fill\":\"white\"}}),_c('path',{attrs:{\"fill-rule\":\"evenodd\",\"clip-rule\":\"evenodd\",\"d\":\"M27.2056 16.1099C27.1029 15.5382 26.8461 14.8886 26.4609 14.239C25.6905 12.9398 24.4065 11.5367 22.7887 10.3154C21.1965 9.09415 19.5274 8.23667 18.0893 7.89887C17.3703 7.71698 16.7026 7.66501 16.1376 7.74296C15.7011 7.79493 15.2902 7.97682 14.982 8.23667C14.8793 8.31462 14.8023 8.39257 14.7252 8.49651C14.3914 8.93824 14.3144 9.48391 14.3914 10.0556C14.4684 10.6272 14.6996 11.2768 15.0591 11.9264C15.7781 13.2256 17.0364 14.6548 18.6542 15.876C20.2721 17.0973 21.9926 17.9288 23.482 18.2666C24.2268 18.4485 24.9201 18.5004 25.4851 18.4225C26.0757 18.3445 26.5893 18.1107 26.9231 17.6689C26.9488 17.617 26.9745 17.591 27.0002 17.539C27.2313 17.1493 27.2826 16.6296 27.2056 16.1099ZM26.3068 17.2532C26.1271 17.4871 25.8189 17.643 25.3567 17.7209C24.8944 17.7729 24.3038 17.7469 23.6104 17.565C22.2494 17.2272 20.6059 16.4477 19.0651 15.2784C17.5243 14.1091 16.3431 12.7839 15.6754 11.5626C15.3416 10.965 15.1618 10.4193 15.0848 9.95163C15.0334 9.48391 15.1104 9.1721 15.2902 8.93824C15.47 8.70438 15.7524 8.52249 16.2147 8.47052C16.6512 8.41855 17.2162 8.44454 17.8839 8.60044C18.5259 8.75635 19.2706 9.04218 20.0153 9.43194C20.76 9.8217 21.5561 10.3154 22.3008 10.913C23.8416 12.0823 25.0742 13.4075 25.7932 14.6028C26.1527 15.2004 26.3582 15.7461 26.4352 16.2138C26.5379 16.7075 26.4609 17.0453 26.3068 17.2532Z\",\"fill\":\"white\"}})]),_c('path',{attrs:{\"d\":\"M61.9829 5.52224H58.8629L50.9429 26.9222L43.0629 5.52224H39.9429L49.3829 30.8022H52.5429L61.9829 5.52224ZM76.9417 21.1622C76.9417 25.5622 75.8217 28.3622 71.3817 28.3622C66.9417 28.3622 65.7817 25.5622 65.7817 21.1622C65.7817 16.7622 66.9417 13.9622 71.3817 13.9622C75.8217 13.9622 76.9417 16.7622 76.9417 21.1622ZM71.3817 31.1222C77.4617 31.1222 79.8617 27.0422 79.8617 21.1622C79.8617 15.1622 77.5817 11.2022 71.3817 11.2022C65.2617 11.2022 62.8617 15.2822 62.8617 21.1622C62.8617 27.1622 65.1417 31.1222 71.3817 31.1222ZM84.4373 25.4422C84.4373 29.6022 86.5173 31.0422 89.2773 31.0422C90.3173 31.0422 91.1173 30.8822 91.6373 30.6422L91.2373 28.0022C90.7973 28.2022 90.1973 28.2822 89.5173 28.2822C88.1573 28.2822 87.3573 27.6422 87.3573 25.0022V3.52224H84.4373V25.4422Z\",\"fill\":\"#3EAE2B\"}}),_c('path',{attrs:{\"d\":\"M114.952 5.52224H111.832L103.912 26.9222L96.0317 5.52224H92.9117L102.352 30.8022H105.512L114.952 5.52224ZM118.196 30.8022H121.116V11.5222H118.196V30.8022ZM117.756 4.92225C117.756 5.96224 118.596 6.80225 119.676 6.80225C120.716 6.80225 121.556 5.96224 121.556 4.92225C121.556 3.88224 120.716 3.00224 119.676 3.00224C118.596 3.00224 117.756 3.84225 117.756 4.92225ZM142.306 19.6422C142.306 14.0422 139.306 11.2022 134.226 11.2022C127.906 11.2022 125.866 15.6422 125.866 21.2022C125.866 28.0422 128.986 31.1222 135.146 31.1222C137.506 31.1222 139.786 30.6422 141.666 29.8022L141.226 27.0422C139.786 27.8022 137.426 28.3622 135.186 28.3622C131.186 28.3622 128.826 26.5622 128.826 22.4822V22.3222H141.986C142.226 21.4822 142.306 20.4422 142.306 19.6422ZM128.826 19.6022C128.826 15.4422 130.906 13.8022 134.146 13.8022C137.426 13.8022 139.506 15.4822 139.506 19.6022V19.8422H128.826V19.6022ZM148.339 11.5222H145.339L152.059 30.8022H155.059L160.299 16.0422L165.539 30.8022H168.539L175.259 11.5222H172.259L167.019 26.8422L161.779 11.5222H158.819L153.579 26.8422L148.339 11.5222Z\",\"fill\":\"#0068C7\"}}),_c('defs',[_c('clipPath',{attrs:{\"id\":\"clip0_137_151\"}},[_c('rect',{attrs:{\"width\":\"34\",\"height\":\"33\",\"fill\":\"white\",\"transform\":\"translate(0.781128 0.311523)\"}})])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./VolViewLogo.vue?vue&type=template&id=2bd85c4d&svg=true&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import JSZip from 'jszip';\nimport { saveAs } from 'file-saver';\nimport { useFileStore } from '@/src/store/datasets-files';\nimport { LayoutDirection } from '@/src/types/layout';\nimport { useViewStore } from '@/src/store/views';\nimport { useLabelmapStore } from '@/src/store/datasets-labelmaps';\nimport { useToolStore } from '@/src/store/tools';\nimport { Tools } from '@/src/store/tools/types';\nimport {\n useDatasetStore,\n makeFileFailureStatus,\n LoadResult,\n DataSelection,\n makeDICOMSelection,\n makeImageSelection,\n} from '../../store/datasets';\nimport { useDICOMStore } from '../../store/datasets-dicom';\nimport {\n ARCHIVE_FILE_TYPES,\n extractArchivesRecursively,\n retypeFile,\n} from '../io';\nimport { FileEntry } from '../types';\nimport { Manifest, ManifestSchema } from './schema';\n\nconst MANIFEST = 'manifest.json';\nconst VERSION = '0.0.1';\n\nexport async function save(fileName: string) {\n const datasetStore = useDatasetStore();\n const viewStore = useViewStore();\n const labelStore = useLabelmapStore();\n const toolStore = useToolStore();\n\n const zip = new JSZip();\n const manifest: Manifest = {\n version: VERSION,\n dataSets: [],\n labelMaps: [],\n tools: {\n rulers: [],\n crosshairs: {\n position: [0, 0, 0],\n },\n paint: {\n activeLabelmapID: null,\n brushSize: 8,\n brushValue: 1,\n labelmapOpacity: 1,\n },\n crop: {},\n current: Tools.WindowLevel,\n },\n layout: {\n direction: LayoutDirection.H,\n items: [],\n },\n views: [],\n };\n\n const stateFile = {\n zip,\n manifest,\n };\n\n await datasetStore.serialize(stateFile);\n viewStore.serialize(stateFile);\n await labelStore.serialize(stateFile);\n toolStore.serialize(stateFile);\n\n zip.file(MANIFEST, JSON.stringify(manifest));\n const content = await zip.generateAsync({ type: 'blob' });\n saveAs(content, fileName);\n}\n\nasync function restore(state: FileEntry[]): Promise<LoadResult[]> {\n const datasetStore = useDatasetStore();\n const dicomStore = useDICOMStore();\n const fileStore = useFileStore();\n const viewStore = useViewStore();\n const labelStore = useLabelmapStore();\n const toolStore = useToolStore();\n\n // First load the manifest\n const manifestFile = state.filter((entry) => entry.file.name === MANIFEST);\n if (manifestFile.length === 0) {\n return [makeFileFailureStatus(MANIFEST, 'State file is missing manifest')];\n }\n\n const manifestString = await manifestFile[0].file.text();\n const manifest = ManifestSchema.parse(JSON.parse(manifestString));\n const { dataSets } = manifest;\n\n // We restore the view first, so that the appropriate watchers are triggered\n // in the views as the data is loaded\n viewStore.setLayout(manifest.layout);\n\n // Mapping of the state file ID => new store ID\n const stateIDToStoreID: Record<string, string> = {};\n\n const statuses: LoadResult[] = [];\n\n // We load them sequentially to preserve the order\n for (const dataSet of dataSets) {\n const files = state\n .filter((entry) => entry.path === dataSet.path)\n .map((entry) => entry.file);\n\n const status = await datasetStore\n .deserialize(dataSet, files)\n .then((result) => {\n if (result.loaded) {\n stateIDToStoreID[dataSet.id] = result.dataID;\n fileStore.add(result.dataID, files);\n }\n\n return result;\n });\n\n statuses.push(status);\n }\n\n // Restore the primary selection\n if (manifest.primarySelection !== undefined) {\n const selectedID = stateIDToStoreID[manifest.primarySelection];\n let dataSelection: DataSelection | undefined;\n\n if (selectedID in dicomStore.volumeInfo) {\n dataSelection = makeDICOMSelection(selectedID);\n } else {\n dataSelection = makeImageSelection(selectedID);\n }\n\n datasetStore.setPrimarySelection(dataSelection);\n }\n\n // Restore the views\n viewStore.deserialize(manifest.views, stateIDToStoreID);\n\n // Restore the labelmaps\n const labelmapIDMap = await labelStore.deserialize(\n manifest,\n state,\n stateIDToStoreID\n );\n\n // Restore the tools\n toolStore.deserialize(manifest, labelmapIDMap, stateIDToStoreID);\n\n return new Promise<LoadResult[]>((resolve) => {\n resolve(statuses);\n });\n}\n\nexport async function loadState(stateFile: File) {\n const typedFile = await retypeFile(stateFile);\n const fileEntries = await extractArchivesRecursively([typedFile]);\n\n return restore(fileEntries);\n}\n\nexport async function isStateFile(file: File) {\n if (ARCHIVE_FILE_TYPES.has(file.type)) {\n const zip = await JSZip.loadAsync(file);\n\n return zip.file(MANIFEST) !== null;\n }\n\n return false;\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',[_c('v-card-title',[_vm._v(\" Saving Session State \"),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',[_c('v-form',{model:{value:(_vm.valid),callback:function ($$v) {_vm.valid=$$v},expression:\"valid\"}},[_c('v-text-field',{attrs:{\"hint\":\"The filename to use for the session state file.\",\"label\":\"Session State Filename\",\"rules\":[_vm.validFileName]},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.saveSession.apply(null, arguments)}},model:{value:(_vm.fileName),callback:function ($$v) {_vm.fileName=$$v},expression:\"fileName\"}})],1)],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"secondary\",\"disabled\":!_vm.valid},on:{\"click\":_vm.saveSession}},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-content-save-all\")]),_c('span',[_vm._v(\"Save\")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { defineComponent, ref } from '@vue/composition-api';\nimport { save } from '../io/state-file';\n\nconst DEFAULT_FILENAME = 'session.volview.zip';\n\nexport default defineComponent({\n setup(props, { emit }) {\n const fileName = ref(DEFAULT_FILENAME);\n const valid = ref(true);\n\n async function saveSession() {\n await save(fileName.value);\n emit('close');\n }\n\n function validFileName(name: string) {\n return name.trim().length > 0 || 'Required';\n }\n\n return {\n saveSession,\n fileName,\n validFileName,\n valid,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SaveSession.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./SaveSession.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SaveSession.vue?vue&type=template&id=c837f5c8&\"\nimport script from \"./SaveSession.vue?vue&type=script&lang=ts&\"\nexport * from \"./SaveSession.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VForm,VIcon,VSpacer,VTextField})\n","import { onBeforeUnmount, onMounted } from '@vue/composition-api';\nimport { useMessageStore } from '../store/messages';\n\nexport function useGlobalErrorHook() {\n const messageStore = useMessageStore();\n\n const onError = (event: ErrorEvent) => {\n messageStore.addError('Application error (click for details)', event.error);\n };\n\n onMounted(() => {\n window.addEventListener('error', onError);\n });\n\n onBeforeUnmount(() => {\n window.removeEventListener('error', onError);\n });\n}\n","import { vtkSubscription } from '@kitware/vtk.js/interfaces';\nimport { onBeforeUnmount } from '@vue/composition-api';\nimport { withProxyManager } from './proxyManager';\nimport vtkProxyObject from '../types/vtk-types';\n\nexport enum ProxyManagerEvent {\n ProxyCreated,\n ProxyModified,\n ProxyDeleted,\n ProxyRegistrationChange,\n}\n\nexport function onProxyManagerEvent(\n event: ProxyManagerEvent,\n cb: (proxyID: string, obj: vtkProxyObject | null) => void\n) {\n const subs: vtkSubscription[] = [];\n\n withProxyManager((proxyManager) => {\n const proxySubs = Object.create(null);\n\n subs.push(\n proxyManager.onProxyRegistrationChange((info) => {\n const { action, proxyId, proxy } = info;\n if (action === 'register') {\n if (event === ProxyManagerEvent.ProxyCreated) {\n cb(proxyId, proxy);\n }\n if (event === ProxyManagerEvent.ProxyModified) {\n proxySubs[proxyId] = proxy.onModified(() => cb(proxyId, proxy));\n }\n } else if (action === 'unregister') {\n if (proxyId in proxySubs) {\n proxySubs[proxyId].unsubscribe();\n delete proxySubs[proxyId];\n }\n if (event === ProxyManagerEvent.ProxyDeleted) {\n cb(proxyId, null);\n }\n }\n })\n );\n });\n\n onBeforeUnmount(() => {\n while (subs.length) {\n subs.pop()!.unsubscribe();\n }\n });\n}\n","import vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\nimport { useEventListener, useThrottleFn } from '@vueuse/core';\nimport { Messages } from '../constants';\nimport { useMessageStore } from '../store/messages';\nimport { onProxyManagerEvent, ProxyManagerEvent } from './onProxyManagerEvent';\n\nexport function useWebGLWatchdog() {\n const watchdogs = new Map<string, () => void>();\n\n const reportError = useThrottleFn(() => {\n const messageStore = useMessageStore();\n messageStore.addError(Messages.WebGLLost.title, Messages.WebGLLost.details);\n }, 100);\n\n onProxyManagerEvent(ProxyManagerEvent.ProxyCreated, (id, obj) => {\n if (!obj || !obj.isA('vtkViewProxy')) return;\n const view = obj as vtkViewProxy;\n // TODO getCanvas() typing\n const rw = view.getOpenglRenderWindow() as any;\n const canvas = rw.getCanvas() as HTMLCanvasElement;\n\n const cleanup = useEventListener(canvas, 'webglcontextlost', reportError);\n watchdogs.set(id, cleanup);\n });\n\n onProxyManagerEvent(ProxyManagerEvent.ProxyDeleted, (id) => {\n if (watchdogs.has(id)) {\n watchdogs.get(id)!();\n watchdogs.delete(id);\n }\n });\n}\n","import { TYPE } from 'vue-toastification';\nimport { useToast } from '@/src/composables/useToast';\nimport { ToastID } from 'vue-toastification/dist/types/src/types';\nimport { useMessageStore } from '../store/messages';\n\nexport function useAppLoadingNotifications() {\n const toast = useToast();\n const messageStore = useMessageStore();\n\n let loadingCount = 0;\n let toastID: ToastID | null = null;\n let error: Error | null = null;\n\n const resetState = () => {\n loadingCount = 0;\n toastID = null;\n error = null;\n };\n\n const _setError = (err: Error) => {\n error = err;\n };\n\n const startLoading = () => {\n loadingCount++;\n if (toastID === null) {\n toastID = toast.info('Loading datasets...', {\n timeout: false,\n closeButton: false,\n closeOnClick: false,\n });\n }\n };\n\n const stopLoading = () => {\n loadingCount--;\n if (loadingCount === 0 && toastID !== null) {\n if (error) {\n toast.dismiss(toastID);\n messageStore.addError('Some files failed to load', error);\n } else {\n toast.update(toastID, {\n content: 'Datasets loaded!',\n options: {\n type: TYPE.SUCCESS,\n timeout: 3000,\n closeButton: 'button',\n closeOnClick: true,\n },\n });\n }\n resetState();\n }\n };\n\n /**\n * Notifies of loading status until all function calls return.\n * @param fn function to call\n * @returns whatever fn returns.\n */\n const runAsLoading = async (fn: (setError: typeof _setError) => void) => {\n startLoading();\n try {\n return await fn(_setError);\n } finally {\n stopLoading();\n }\n };\n\n return {\n runAsLoading,\n };\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {\n computed,\n defineComponent,\n onBeforeUnmount,\n onMounted,\n Ref,\n ref,\n watch,\n} from '@vue/composition-api';\nimport { storeToRefs } from 'pinia';\nimport { UrlParams } from '@vueuse/core';\nimport vtkURLExtract from '@kitware/vtk.js/Common/Core/URLExtract';\n\nimport ResizableNavDrawer from './ResizableNavDrawer.vue';\nimport ToolButton from './ToolButton.vue';\nimport LayoutGrid from './LayoutGrid.vue';\nimport ModulePanel from './ModulePanel.vue';\nimport DragAndDrop from './DragAndDrop.vue';\nimport AboutBox from './AboutBox.vue';\nimport ToolStrip from './ToolStrip.vue';\nimport MessageCenter from './MessageCenter.vue';\nimport MessageNotifications from './MessageNotifications.vue';\nimport Settings from './Settings.vue';\nimport VolViewFullLogo from './icons/VolViewFullLogo.vue';\nimport VolViewLogo from './icons/VolViewLogo.vue';\nimport {\n useDatasetStore,\n convertSuccessResultToDataSelection,\n LoadResult,\n FileLoadSuccess,\n DICOMLoadSuccess,\n FileLoadFailure,\n DICOMLoadFailure,\n DataSelection,\n} from '../store/datasets';\nimport { useImageStore } from '../store/datasets-images';\nimport { useViewStore } from '../store/views';\nimport { MessageType, useMessageStore } from '../store/messages';\nimport { useRulerStore } from '../store/tools/rulers';\nimport { Layouts } from '../config';\nimport { isStateFile, loadState } from '../io/state-file';\nimport SaveSession from './SaveSession.vue';\nimport { useGlobalErrorHook } from '../composables/useGlobalErrorHook';\nimport { useWebGLWatchdog } from '../composables/useWebGLWatchdog';\nimport { useAppLoadingNotifications } from '../composables/useAppLoadingNotifications';\nimport { wrapInArray } from '../utils';\nimport { fetchFile } from '../utils/fetch';\n\nasync function loadFiles(files: FileList, setError: (err: Error) => void) {\n const dataStore = useDatasetStore();\n\n const loadFirstDataset = !dataStore.primarySelection;\n\n let statuses: LoadResult[] = [];\n let stateFile = false;\n try {\n // For now only support restoring from a single state files.\n stateFile = files.length === 1 && (await isStateFile(files[0]));\n if (stateFile) {\n statuses = await loadState(files[0]);\n } else {\n statuses = await dataStore.loadFiles(Array.from(files));\n }\n } catch (error) {\n setError(error as Error);\n return;\n }\n\n const loaded = statuses.filter((s) => s.loaded) as (\n | FileLoadSuccess\n | DICOMLoadSuccess\n )[];\n const errored = statuses.filter((s) => !s.loaded) as (\n | FileLoadFailure\n | DICOMLoadFailure\n )[];\n\n if (\n loaded.length &&\n !stateFile &&\n (loadFirstDataset || loaded.length === 1)\n ) {\n const selection = convertSuccessResultToDataSelection(loaded[0]);\n if (selection) {\n dataStore.setPrimarySelection(selection);\n }\n }\n\n if (errored.length) {\n const failedFilenames = errored.map((result) => {\n if (result.type === 'file') {\n return result.filename;\n }\n return 'DICOM files';\n });\n const failedError = new Error(\n `These files failed to load:\\n${failedFilenames.join('\\n')}`\n );\n\n setError(failedError);\n }\n}\n\nasync function loadRemoteFilesFromURLParams(\n params: UrlParams,\n setError: (err: Error) => void\n) {\n const dataStore = useDatasetStore();\n\n const urls = wrapInArray(params.urls);\n const names = wrapInArray(params.names ?? []);\n\n const fileResults = await Promise.allSettled(\n urls.map(async (url, index) => {\n const { pathname } = new URL(url);\n const name = names[index] || pathname.split('/').at(-1) || '';\n\n return fetchFile(url, name);\n })\n );\n\n const results = await Promise.allSettled(\n fileResults.map(async (fileResult) => {\n if (fileResult.status === 'fulfilled') {\n const loadResults = await dataStore.loadFiles([fileResult.value]);\n const errored = loadResults.find((s) => !s.loaded);\n if (errored) {\n // force the promise to error out\n throw new Error();\n }\n // only select the first dataset\n return loadResults[0];\n }\n throw fileResult.reason;\n })\n );\n\n const failedURLs: string[] = [];\n let selectDataID: DataSelection | null = null;\n\n results.forEach((res, index) => {\n if (res.status === 'fulfilled' && res.value.loaded && !selectDataID) {\n selectDataID = convertSuccessResultToDataSelection(res.value);\n } else if (res.status === 'rejected') {\n failedURLs.push(urls[index]);\n }\n });\n\n if (selectDataID) {\n dataStore.setPrimarySelection(selectDataID);\n }\n\n if (failedURLs.length) {\n setError(new Error(`These URLs failed to load:\\n${failedURLs.join('\\n')}`));\n }\n}\n\nexport default defineComponent({\n name: 'App',\n\n components: {\n ResizableNavDrawer,\n ToolButton,\n LayoutGrid,\n DragAndDrop,\n AboutBox,\n ToolStrip,\n ModulePanel,\n MessageCenter,\n MessageNotifications,\n VolViewFullLogo,\n VolViewLogo,\n Settings,\n SaveSession,\n },\n\n setup(props: {}, { root }) {\n const imageStore = useImageStore();\n const messageStore = useMessageStore();\n const viewStore = useViewStore();\n\n useGlobalErrorHook();\n useWebGLWatchdog();\n\n const { runAsLoading } = useAppLoadingNotifications();\n\n // --- layout --- //\n\n const layoutName: Ref<string> = ref('Quad View');\n const { layout: currentLayout } = storeToRefs(viewStore);\n\n watch(\n layoutName,\n () => {\n const layout = Layouts[layoutName.value] || [];\n viewStore.setLayout(layout);\n },\n {\n immediate: true,\n }\n );\n\n watch(currentLayout, () => {\n if (\n currentLayout.value?.name &&\n currentLayout.value.name !== layoutName.value\n ) {\n layoutName.value = currentLayout.value.name;\n }\n });\n\n // --- file handling --- //\n\n async function openFiles(files: FileList | null) {\n if (!files) {\n return;\n }\n\n runAsLoading((setError) => loadFiles(files, setError));\n }\n\n const fileEl = document.createElement('input');\n fileEl.setAttribute('type', 'file');\n fileEl.setAttribute('multiple', 'multiple');\n fileEl.setAttribute('accept', '*');\n fileEl.addEventListener('change', () => openFiles(fileEl.files));\n\n function userPromptFiles() {\n fileEl.value = '';\n fileEl.click();\n }\n\n // --- parse URL -- //\n\n const urlParams = vtkURLExtract.extractURLParameters() as UrlParams;\n\n onMounted(() => {\n if (!urlParams.urls) {\n return;\n }\n runAsLoading((setError) =>\n loadRemoteFilesFromURLParams(urlParams, setError)\n );\n });\n\n // --- store initialization -- //\n\n const rulerStore = useRulerStore();\n rulerStore.initialize();\n\n onBeforeUnmount(() => rulerStore.uninitialize());\n\n // --- template vars --- //\n\n const hasData = computed(() => imageStore.idList.length > 0);\n const messageCount = computed(() => messageStore.importantMessages.length);\n const messageBadgeColor = computed(() => {\n if (\n messageStore.importantMessages.find(\n (msg) => msg.type === MessageType.Error\n )\n ) {\n return 'error';\n }\n if (\n messageStore.importantMessages.find(\n (msg) => msg.type === MessageType.Warning\n )\n ) {\n return 'warning';\n }\n return 'primary';\n });\n\n return {\n aboutBoxDialog: ref(false),\n messageDialog: ref(false),\n settingsDialog: ref(false),\n saveDialog: ref(false),\n leftSideBar: ref(!root.$vuetify.breakpoint.mobile),\n messageCount,\n messageBadgeColor,\n layoutName,\n currentLayout,\n Layouts,\n userPromptFiles,\n openFiles,\n hasData,\n };\n },\n});\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=3c12b0de&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=ts&\"\nexport * from \"./App.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=3c12b0de&prod&lang=css&\"\nimport style1 from \"@/src/components/styles/utils.css?vue&type=style&index=1&prod&lang=css&\"\nimport style2 from \"./App.vue?vue&type=style&index=2&id=3c12b0de&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3c12b0de\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\nimport { VAppBar } from 'vuetify/lib/components/VAppBar';\nimport { VBadge } from 'vuetify/lib/components/VBadge';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VMain } from 'vuetify/lib/components/VMain';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VRadio } from 'vuetify/lib/components/VRadioGroup';\nimport { VRadioGroup } from 'vuetify/lib/components/VRadioGroup';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VToolbarTitle } from 'vuetify/lib/components/VToolbar';\ninstallComponents(component, {VApp,VAppBar,VBadge,VBtn,VCard,VCardText,VCol,VDialog,VIcon,VMain,VMenu,VOverlay,VRadio,VRadioGroup,VRow,VSpacer,VToolbarTitle})\n","import {\n runPipeline,\n TextStream,\n InterfaceTypes,\n readDICOMTags,\n readImageDICOMFileSeries,\n} from 'itk-wasm';\n\nexport interface TagSpec {\n name: string;\n tag: string;\n}\n\n// volume ID => file names\nexport type VolumesToFilesMap = Record<string, string[]>;\n\nexport class DICOMIO {\n private webWorker: any;\n private initializeCheck: Promise<void> | null;\n\n constructor() {\n this.webWorker = null;\n this.initializeCheck = null;\n }\n\n private async runTask(\n module: string,\n args: any[],\n inputs: any[],\n outputs: any[]\n ) {\n return runPipeline(this.webWorker, module, args, outputs, inputs);\n }\n\n /**\n * Helper that initializes the webworker.\n *\n * @async\n * @throws Error initialization failed\n */\n private async initialize() {\n if (!this.initializeCheck) {\n this.initializeCheck = new Promise<void>((resolve, reject) => {\n this.runTask('dicom', [], [], [])\n .then((result) => {\n if (result.webWorker) {\n this.webWorker = result.webWorker;\n resolve();\n } else {\n reject(new Error('Could not initialize webworker'));\n }\n })\n .catch(reject);\n });\n }\n\n return this.initializeCheck;\n }\n\n /**\n * Categorize files\n * @async\n * @param {File[]} files\n * @returns volumeID => file names mapping\n */\n async categorizeFiles(files: File[]): Promise<VolumesToFilesMap> {\n await this.initialize();\n\n const inputs = await Promise.all(\n files.map(async (file) => {\n const buffer = await file.arrayBuffer();\n return {\n type: InterfaceTypes.BinaryFile,\n data: {\n path: file.name,\n data: new Uint8Array(buffer),\n },\n };\n })\n );\n\n const args = [\n '--action',\n 'categorize',\n '--memory-io',\n '0',\n '--files',\n ...inputs.map((fd) => fd.data.path),\n ];\n\n const outputs = [{ type: InterfaceTypes.TextStream }];\n\n const result = await this.runTask(\n // module\n 'dicom',\n args,\n inputs,\n outputs\n );\n\n return JSON.parse((result.outputs[0].data as TextStream).data);\n }\n\n /**\n * Reads a list of tags out from a given file.\n *\n * @param {File} file\n * @param {[]Tag} tags\n */\n async readTags<T extends TagSpec[]>(\n file: File,\n tags: T\n ): Promise<Record<T[number]['name'], string>> {\n const tagsArgs = tags.map((t) => t.tag);\n\n const result = await readDICOMTags(this.webWorker, file, tagsArgs);\n const tagValues = result.tags;\n\n return tags.reduce((info, t) => {\n const { tag, name } = t;\n if (tagValues.has(tag)) {\n return { ...info, [name]: tagValues.get(tag) };\n }\n return info;\n }, {} as Record<T[number]['name'], string>);\n }\n\n /**\n * Retrieves a slice of a volume.\n * @async\n * @param {File} file containing the slice\n * @param {Boolean} asThumbnail cast image to unsigned char. Defaults to false.\n * @returns ItkImage\n */\n async getVolumeSlice(file: File, asThumbnail: boolean = false) {\n await this.initialize();\n\n const buffer = await file.arrayBuffer();\n\n const inputs = [\n {\n type: InterfaceTypes.BinaryFile,\n data: {\n path: file.name,\n data: new Uint8Array(buffer),\n },\n },\n ];\n\n const args = [\n '--action',\n 'getSliceImage',\n '--thumbnail',\n asThumbnail.toString(),\n '--file',\n file.name,\n '--memory-io',\n '0',\n ];\n\n const outputs = [{ type: InterfaceTypes.Image }];\n\n const result = await this.runTask(\n // module\n 'dicom',\n args,\n inputs,\n outputs\n );\n\n return result.outputs[0].data;\n }\n\n /**\n * Builds a volume for a set of files.\n * @async\n * @param {File[]} files the set of files to build volume from\n * @returns ItkImage\n */\n async buildVolume(files: File[]) {\n await this.initialize();\n\n const result = await readImageDICOMFileSeries(files);\n\n return result.image;\n }\n}\n","import vtkITKImageReader from '@kitware/vtk.js/IO/Misc/ITKImageReader';\nimport { readImageArrayBuffer } from 'itk-wasm';\nimport { FileReaderMap } from '.';\n\nimport { readFileAsArrayBuffer, ITK_IMAGE_EXTENSIONS } from './io';\nimport { stlReader, vtiReader, vtpReader } from './vtk/async';\n\nvtkITKImageReader.setReadImageArrayBufferFromITK(readImageArrayBuffer);\n\nasync function itkReader(file: File) {\n const fileBuffer = await readFileAsArrayBuffer(file);\n\n const reader = vtkITKImageReader.newInstance();\n reader.setFileName(file.name);\n try {\n await reader.parseAsArrayBuffer(fileBuffer);\n } catch (e) {\n // itkreader doesn't give us a meaningful error\n throw new Error('Failed to parse file');\n }\n\n return reader.getOutputData();\n}\n\n/**\n * Resets the file reader map to the default values.\n */\nexport function registerAllReaders(readerMap: FileReaderMap) {\n readerMap.set('vti', vtiReader);\n readerMap.set('vtp', vtpReader);\n readerMap.set('stl', stlReader);\n\n ITK_IMAGE_EXTENSIONS.forEach((ext) => {\n readerMap.set(ext, itkReader);\n });\n}\n","import { vec3 } from 'gl-matrix';\nimport macro from '@kitware/vtk.js/macro';\nimport vtkViewProxy from '@kitware/vtk.js/Proxy/Core/ViewProxy';\n\nexport function commonViewCustomizations(publicAPI, model) {\n const delayedRender = macro.debounce(model.renderWindow.render, 5);\n\n // override resize to avoid flickering from rendering later\n publicAPI.resize = () => {\n if (model.container) {\n const dims = model.container.getBoundingClientRect();\n if (dims.width === dims.height && dims.width === 0) {\n return;\n }\n const devicePixelRatio = window.devicePixelRatio || 1;\n const width = Math.max(10, Math.floor(devicePixelRatio * dims.width));\n const height = Math.max(10, Math.floor(devicePixelRatio * dims.height));\n model.openglRenderWindow.setSize(width, height);\n publicAPI.invokeResize({ width, height });\n publicAPI.render(true);\n }\n };\n\n // override render to not reset camera\n publicAPI.render = (blocking = true) => {\n model.orientationWidget.updateMarkerOrientation();\n if (blocking) {\n model.renderWindow.render();\n } else {\n delayedRender();\n }\n };\n\n // add helper function\n publicAPI.removeAllRepresentations = () => {\n model.representations.forEach((rep) => model.renderer.removeViewProp(rep));\n model.representations.length = 0;\n };\n\n publicAPI.updateCamera = (directionOfProjection, viewUp, focalPoint) => {\n const position = vec3.clone(focalPoint);\n vec3.sub(position, position, directionOfProjection);\n model.camera.setFocalPoint(...focalPoint);\n model.camera.setPosition(...position);\n model.camera.setDirectionOfProjection(...directionOfProjection);\n model.camera.setViewUp(...viewUp);\n };\n\n // disable the built-in corner annotations\n const { setContainer } = publicAPI;\n publicAPI.setContainer = (el) => {\n setContainer(el);\n model.cornerAnnotation.setContainer(null);\n };\n\n const { resetCamera } = publicAPI;\n publicAPI.resetCamera = (...args) => {\n resetCamera(args);\n model.renderer.updateLightsGeometryToFollowCamera();\n };\n}\n\nfunction vtkLPSView3DProxy(publicAPI, model) {\n model.classHierarchy.push('vtkLPSView3DProxy');\n commonViewCustomizations(publicAPI, model);\n}\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, initialValues);\n\n vtkViewProxy.extend(publicAPI, model, initialValues);\n\n vtkLPSView3DProxy(publicAPI, model);\n}\n\nexport const newInstance = macro.newInstance(extend, 'vtkLPSView3DProxy');\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macro';\nimport vtkView2DProxy from '@kitware/vtk.js/Proxy/Core/View2DProxy';\n\nimport { commonViewCustomizations } from '@/src/vtk/LPSView3DProxy';\n\nfunction vtkLPSView2DProxy(publicAPI, model) {\n model.classHierarchy.push('vtkLPSView2DProxy');\n const superClass = { ...publicAPI };\n\n commonViewCustomizations(publicAPI, model);\n\n // override; we will set the manipulator ourselves\n publicAPI.bindRepresentationToManipulator = () => {};\n\n // override reset camera to /just/ reset the camera\n publicAPI.resetCamera = (boundsToUse = null) => {\n model.renderer.resetCamera(boundsToUse);\n };\n\n // override addRepresentation\n publicAPI.addRepresentation = (rep) => {\n superClass.addRepresentation(rep);\n if (rep.setSlicingMode && model.slicingMode) {\n rep.setSlicingMode(model.slicingMode);\n }\n };\n\n // this basically ignores model.axis\n publicAPI.setSlicingMode = (mode) => {\n if (superClass.setSlicingMode(mode) && mode) {\n let count = model.representations.length;\n while (count--) {\n const rep = model.representations[count];\n if (rep.setSlicingMode) {\n rep.setSlicingMode(mode);\n }\n }\n }\n };\n\n publicAPI.resizeToFit = (lookAxis, viewUpAxis, dims) => {\n const [w, h] = model.openglRenderWindow.getSize();\n let bw;\n let bh;\n if (lookAxis === 0 && viewUpAxis === 1) {\n [, bh, bw] = dims;\n } else if (lookAxis === 0 && viewUpAxis === 2) {\n [, bw, bh] = dims;\n } else if (lookAxis === 1 && viewUpAxis === 0) {\n [bh, , bw] = dims;\n } else if (lookAxis === 1 && viewUpAxis === 2) {\n [bw, , bh] = dims;\n } else if (lookAxis === 2 && viewUpAxis === 0) {\n [bh, bw] = dims;\n } else if (lookAxis === 2 && viewUpAxis === 1) {\n [bw, bh] = dims;\n }\n\n const viewAspect = w / h;\n const boundsAspect = bw / bh;\n let scale = 0;\n if (viewAspect >= boundsAspect) {\n scale = bh / 2;\n } else {\n scale = bw / 2 / viewAspect;\n }\n\n model.camera.setParallelScale(scale);\n };\n}\n\nconst DEFAULT_VALUES = {\n slicingMode: null, // XYZIJK. Null means fallback to model.axis.\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, initialValues, DEFAULT_VALUES);\n\n // slicing mode overrides axis\n macro.setGet(publicAPI, model, ['slicingMode']);\n\n vtkView2DProxy.extend(publicAPI, model, initialValues);\n\n vtkLPSView2DProxy(publicAPI, model);\n}\n\nexport const newInstance = macro.newInstance(extend, 'vtkLPSView2DProxy');\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macro';\n\nimport vtkSliceRepresentationProxy from '@kitware/vtk.js/Proxy/Representations/SliceRepresentationProxy';\n\nconst SLICE_MODE_MAP = {\n X: 'I',\n Y: 'J',\n Z: 'K',\n I: 'I',\n J: 'J',\n K: 'K',\n};\n\nfunction vtkIJKSliceRepresentationProxy(publicAPI, model) {\n model.classHierarchy.push('vtkIJKSliceRepresentationProxy');\n\n const superClass = { ...publicAPI };\n\n // don't set colors on slices\n publicAPI.setColorBy = () => {};\n\n // pretend XYZ slicing is actually just IJK.\n publicAPI.setSlicingMode = (modeString) => {\n return superClass.setSlicingMode(SLICE_MODE_MAP[modeString]);\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n // Object methods\n vtkSliceRepresentationProxy.extend(publicAPI, model);\n\n macro.proxyPropertyMapping(publicAPI, model, {\n opacity: { modelKey: 'property', property: 'opacity' },\n });\n\n // Object specific methods\n vtkIJKSliceRepresentationProxy(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkIJKSliceRepresentationProxy'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macro';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';\nimport ImagePropertyConstants from '@kitware/vtk.js/Rendering/Core/ImageProperty/Constants';\n\nimport vtkIJKSliceRepresentationProxy from '../IJKSliceRepresentationProxy';\n\nconst { InterpolationType } = ImagePropertyConstants;\n\n// ----------------------------------------------------------------------------\n// vtkLabelMapSliceRepProxy methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLabelMapSliceRepProxy(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLabelMapSliceRepProxy');\n\n let labelMapSub = null;\n\n // needed for vtk.js >= 23.0.0\n model.property.setUseLookupTableScalarRange(true);\n model.property.setInterpolationType(InterpolationType.NEAREST);\n model.mapper.setRelativeCoincidentTopologyPolygonOffsetParameters(-2, -2);\n\n let cachedColorMap = null;\n\n function updateTransferFunctions(labelmap) {\n const colorMap = labelmap.getColorMap();\n if (colorMap === cachedColorMap) {\n return;\n }\n // Cache the colormap using ref equality. This will\n // avoid updating the colormap unnecessarily.\n cachedColorMap = colorMap;\n\n const cfun = vtkColorTransferFunction.newInstance();\n const ofun = vtkPiecewiseFunction.newInstance();\n\n Object.keys(colorMap).forEach((label) => {\n const l = Number(label);\n cfun.addRGBPoint(l, ...colorMap[label].slice(0, 3).map((c) => c / 255));\n ofun.addPoint(l, colorMap[label][3] / 255);\n });\n\n model.property.setRGBTransferFunction(cfun);\n model.property.setScalarOpacity(ofun);\n }\n\n function setInputData(labelmap) {\n if (labelMapSub) {\n labelMapSub.unsubscribe();\n labelMapSub = null;\n }\n\n if (labelmap) {\n labelMapSub = labelmap.onModified(() =>\n updateTransferFunctions(labelmap)\n );\n updateTransferFunctions(labelmap);\n }\n }\n\n // override because we manage our own color/opacity functions\n publicAPI.setColorBy = () => {};\n\n publicAPI.delete = macro.chain(publicAPI.delete, () => {\n if (labelMapSub) {\n labelMapSub.unsubscribe();\n labelMapSub = null;\n }\n });\n\n // Keep things updated\n model.sourceDependencies.push({ setInputData });\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n // Object methods\n vtkIJKSliceRepresentationProxy.extend(publicAPI, model);\n\n // Object specific methods\n vtkLabelMapSliceRepProxy(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkLabelMapSliceRepProxy'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import vtkLookupTableProxy from '@kitware/vtk.js/Proxy/Core/LookupTableProxy';\nimport vtkPiecewiseFunctionProxy from '@kitware/vtk.js/Proxy/Core/PiecewiseFunctionProxy';\n\nimport vtkSourceProxy from '@kitware/vtk.js/Proxy/Core/SourceProxy';\n\nimport vtkVolumeRepresentationProxy from '@kitware/vtk.js/Proxy/Representations/VolumeRepresentationProxy';\nimport vtkGeometryRepresentationProxy from '@kitware/vtk.js/Proxy/Representations/GeometryRepresentationProxy';\n\nimport vtkLPSView3DProxy from '@/src/vtk/LPSView3DProxy';\nimport vtkLPSView2DProxy from '@/src/vtk/LPSView2DProxy';\nimport vtkIJKSliceRepresentationProxy from '@/src/vtk/IJKSliceRepresentationProxy';\nimport vtkLabelMapSliceRepProxy from '@/src/vtk/LabelMapSliceRepProxy';\n\nfunction createProxyDefinition(\n classFactory,\n ui = [],\n links = [],\n definitionOptions = {},\n props = {}\n) {\n return {\n class: classFactory,\n options: { links, ui, ...definitionOptions },\n props,\n };\n}\n\nfunction createDefaultView(classFactory, options = [], props = {}) {\n return createProxyDefinition(classFactory, [], [], options, props);\n}\n\n// ----------------------------------------------------------------------------\n\nexport default {\n definitions: {\n Proxy: {\n LookupTable: createProxyDefinition(vtkLookupTableProxy, [], [], {\n presetName: 'Default (Cool to Warm)',\n }),\n PiecewiseFunction: createProxyDefinition(vtkPiecewiseFunctionProxy),\n },\n Sources: {\n TrivialProducer: createProxyDefinition(vtkSourceProxy),\n },\n Representations: {\n ImageSlice: createProxyDefinition(vtkIJKSliceRepresentationProxy),\n LabelMapSlice: createProxyDefinition(vtkLabelMapSliceRepProxy),\n Volume: createProxyDefinition(vtkVolumeRepresentationProxy),\n Geometry: createProxyDefinition(vtkGeometryRepresentationProxy),\n },\n Views: {\n View3D: createDefaultView(vtkLPSView3DProxy),\n View2D: createDefaultView(vtkLPSView2DProxy),\n },\n },\n representations: {\n View3D: {\n vtkImageData: { name: 'Volume' },\n vtkPolyData: { name: 'Geometry' },\n },\n View2D: {\n vtkImageData: { name: 'ImageSlice' },\n vtkLabelMap: { name: 'LabelMapSlice' },\n },\n },\n};\n","const START_ID = 0;\n\nexport default class IDGenerator {\n private id: number;\n\n constructor() {\n this.id = START_ID;\n }\n\n nextID() {\n this.id += 1;\n return String(this.id);\n }\n\n reset() {\n this.id = START_ID;\n }\n}\n","import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';\nimport vtkActor2D from '@kitware/vtk.js/Rendering/Core/Actor2D';\nimport vtkContextRepresentation from '@kitware/vtk.js/Widgets/Representations/ContextRepresentation';\nimport vtkWidgetRepresentation from '@kitware/vtk.js/Widgets/Representations/WidgetRepresentation';\nimport macro from '@kitware/vtk.js/macros';\nimport vtkMapper2D from '@kitware/vtk.js/Rendering/Core/Mapper2D';\nimport vtkCoordinate from '@kitware/vtk.js/Rendering/Core/Coordinate';\nimport { Coordinate } from '@kitware/vtk.js/Rendering/Core/Coordinate/Constants';\nimport { Representation } from '@kitware/vtk.js/Rendering/Core/Property/Constants';\nimport { DisplayLocation } from '@kitware/vtk.js/Rendering/Core/Property2D/Constants';\nimport { vec3 } from 'gl-matrix';\n\nfunction generateContour({ stencil, location, slicingIndex, indexToWorld }) {\n const [xdim, ydim] = stencil.size;\n const xoffset = Math.floor((xdim - 1) / 2);\n const yoffset = Math.floor((ydim - 1) / 2);\n\n // grid of corner points (top-left to bottom-right)\n const gridxdim = xdim + 1;\n const gridydim = ydim + 1;\n\n const vertices = []; // arr of 3-tuples\n const lines = []; // arr of 2-tuples of vertex indices\n\n // maps grid x/y to vertex index\n const vertexMap = {};\n const getOrCreateVertexIndex = (x, y) => {\n const key = `${x},${y}`;\n if (key in vertexMap) {\n return vertexMap[key];\n }\n\n const indexCoords = [...location].map((val) => Math.round(val));\n if (slicingIndex === 0) {\n indexCoords[1] += x - xoffset - 0.5;\n indexCoords[2] += y - yoffset - 0.5;\n } else if (slicingIndex === 1) {\n indexCoords[0] += x - xoffset - 0.5;\n indexCoords[2] += y - yoffset - 0.5;\n } else if (slicingIndex === 2) {\n indexCoords[0] += x - xoffset - 0.5;\n indexCoords[1] += y - yoffset - 0.5;\n }\n\n // get the grid point x/y's actual vertex in world space\n // since grid x/y represents the top-left of the actual pixel\n // at x/y, the true continuous index value of the vertex\n // is x-0.5/y-0.5.\n\n const worldCoords = [];\n vec3.transformMat4(worldCoords, indexCoords, indexToWorld);\n vertices.push(worldCoords);\n\n const index = vertices.length - 1;\n vertexMap[key] = index;\n return index;\n };\n\n const getStampPixelAt = (x, y) => {\n if (x < 0 || x >= xdim) return 0;\n if (y < 0 || y >= ydim) return 0;\n return stencil.pixels[y * xdim + x] || 0;\n };\n\n for (let gy = 0; gy < gridydim; gy++) {\n for (let gx = 0; gx < gridxdim; gx++) {\n // evaluate point to see if it needs inclusion\n // by looking at all 4 pixels that share this point\n // as a corner.\n // if all empty or all filled, the current point is\n // not used in the contour.\n const count =\n getStampPixelAt(gx, gy) +\n getStampPixelAt(gx - 1, gy) +\n getStampPixelAt(gx, gy - 1) +\n getStampPixelAt(gx - 1, gy - 1);\n\n if (count > 0 && count < 4) {\n const v0 = getOrCreateVertexIndex(gx, gy);\n\n // now do line check. We look at the east and south lines.\n // east first\n if (getStampPixelAt(gx, gy) !== getStampPixelAt(gx, gy - 1)) {\n const v1 = getOrCreateVertexIndex(gx + 1, gy);\n lines.push([v0, v1]);\n }\n // south next\n if (getStampPixelAt(gx, gy) !== getStampPixelAt(gx - 1, gy)) {\n const v1 = getOrCreateVertexIndex(gx, gy + 1);\n lines.push([v0, v1]);\n }\n }\n }\n }\n\n return {\n points: new Float32Array(vertices.flat()),\n lines: new Uint16Array(lines.map(([v0, v1]) => [2, v0, v1]).flat()),\n };\n}\n\nfunction vtkPaintBrushContextRepresentation(publicAPI, model) {\n model.classHierarchy.push('vtkPaintBrushContextRepresentation');\n\n model.internalPolyData = vtkPolyData.newInstance({ mtime: 0 });\n model.internalArrays = {\n points: model.internalPolyData.getPoints(),\n lines: model.internalPolyData.getLines(),\n };\n\n model.pipelines = {\n brush: {\n source: publicAPI,\n mapper: vtkMapper2D.newInstance({\n transformCoordinate: vtkCoordinate.newInstance({\n coordinateSystem: Coordinate.WORLD,\n }),\n }),\n actor: vtkActor2D.newInstance({ pickable: false, parentProp: publicAPI }),\n },\n };\n\n const actorProperty = model.pipelines.brush.actor.getProperty();\n actorProperty.setLineWidth(2);\n actorProperty.setColor([1, 0, 0]);\n actorProperty.setDisplayLocation(DisplayLocation.FOREGROUND);\n actorProperty.setRepresentation(Representation.SURFACE);\n\n vtkWidgetRepresentation.connectPipeline(model.pipelines.brush);\n\n publicAPI.addActor(model.pipelines.brush.actor);\n\n publicAPI.requestData = (inData, outData) => {\n const widgetState = inData[0];\n\n const stencil = widgetState.getStencil();\n const brush = widgetState.getBrush();\n const { indexToWorld, worldToIndex } = model;\n\n if (stencil && brush.getOrigin()) {\n const location = [];\n vec3.transformMat4(location, brush.getOrigin(), worldToIndex);\n\n const contour = generateContour({\n stencil,\n location,\n slicingIndex: model.slicingIndex,\n indexToWorld,\n });\n\n const { points, lines } = model.internalArrays;\n points.setData(contour.points);\n lines.setData(contour.lines);\n\n model.internalPolyData.modified();\n }\n outData[0] = model.internalPolyData;\n };\n}\n\nconst DEFAULT_VALUES = {\n defaultScale: 1,\n drawBorder: false,\n drawFace: true,\n worldToIndex: null,\n indexToWorld: null,\n slicingIndex: 0,\n};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkContextRepresentation.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, [\n 'slicingIndex',\n 'indexToWorld',\n 'worldToIndex',\n ]);\n macro.get(publicAPI, model, ['mapper', 'actor']);\n vtkPaintBrushContextRepresentation(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkPaintBrushContextRepresentation'\n);\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macro';\n\nexport function shouldIgnoreEvent(e: any) {\n return e.altKey || e.controlKey || e.shiftKey;\n}\n\nexport default function widgetBehavior(publicAPI: any, model: any) {\n model.classHierarchy.push('vtkPaintWidgetProp');\n\n // support setting per-view widget manipulators\n macro.setGet(publicAPI, model, ['manipulator']);\n\n let isPainting = false;\n\n /**\n * Starts painting\n */\n publicAPI.handleLeftButtonPress = (eventData: any) => {\n if (!model.manipulator || shouldIgnoreEvent(eventData)) {\n return macro.VOID;\n }\n\n const worldCoords = model.manipulator.handleEvent(\n eventData,\n model._apiSpecificRenderWindow\n );\n\n if (!worldCoords) {\n return macro.VOID;\n }\n\n const brush = model.widgetState.getBrush();\n brush.setOrigin(...worldCoords);\n\n isPainting = true;\n publicAPI.invokeStartInteractionEvent();\n return macro.EVENT_ABORT;\n };\n\n /**\n * Paints\n */\n publicAPI.handleMouseMove = (eventData: any) => {\n if (shouldIgnoreEvent(eventData)) {\n return macro.VOID;\n }\n\n const worldCoords = model.manipulator.handleEvent(\n eventData,\n model._apiSpecificRenderWindow\n );\n\n if (!worldCoords) {\n return macro.VOID;\n }\n\n const brush = model.widgetState.getBrush();\n brush.setOrigin(...worldCoords);\n\n if (isPainting) {\n publicAPI.invokeInteractionEvent();\n }\n return macro.EVENT_ABORT;\n };\n\n /**\n * Finishes paint\n */\n publicAPI.handleLeftButtonRelease = (eventData: any) => {\n if (!isPainting || shouldIgnoreEvent(eventData)) {\n return macro.VOID;\n }\n\n isPainting = false;\n publicAPI.invokeEndInteractionEvent();\n return macro.EVENT_ABORT;\n };\n\n publicAPI.handleMouseWheel = () => {\n if (isPainting) {\n return macro.EVENT_ABORT;\n }\n return macro.VOID;\n };\n\n publicAPI.grabFocus = () => {\n if (!model.hasFocus) {\n model.hasFocus = true;\n model._interactor.requestAnimation(publicAPI);\n }\n };\n\n publicAPI.loseFocus = () => {\n if (model.hasFocus) {\n model._interactor.cancelAnimation(publicAPI);\n }\n model.hasFocus = false;\n // model._widgetManager.enablePicking();\n // model._interactor.render();\n };\n}\n","import { IBrushStencil } from '@/src/core/tools/paint/brush';\nimport { Vector3 } from '@kitware/vtk.js/types';\nimport vtkStateBuilder from '@kitware/vtk.js/Widgets/Core/StateBuilder';\nimport vtkWidgetState from '@kitware/vtk.js/Widgets/Core/WidgetState';\n\nexport interface PaintPointWidgetState extends vtkWidgetState {\n setOrigin(origin: Vector3 | null): boolean;\n getOrigin(): Vector3 | null;\n setScale1(scale: number): boolean;\n getScale1(): number;\n setVisible(visible: boolean): boolean;\n getVisible(): boolean;\n setColor(color: number): boolean;\n getColor(): number;\n}\n\nexport interface PaintWidgetState extends vtkWidgetState {\n getBrush(): PaintPointWidgetState;\n getStencil(): IBrushStencil;\n setStencil(stencil: IBrushStencil): boolean;\n}\n\nexport default function generateState() {\n return vtkStateBuilder\n .createBuilder()\n .addStateFromMixin({\n labels: ['brush'],\n name: 'brush',\n mixins: ['origin', 'scale1', 'visible', 'color'],\n initialValues: {\n scale1: 1,\n origin: null,\n visible: true,\n },\n })\n .addField({\n name: 'stencil',\n initialValue: null,\n })\n .build() as PaintWidgetState;\n}\n","import macro from '@kitware/vtk.js/macro';\nimport vtkAbstractWidgetFactory from '@kitware/vtk.js/Widgets/Core/AbstractWidgetFactory';\nimport vtkPlanePointManipulator from '@kitware/vtk.js/Widgets/Manipulators/PlaneManipulator';\nimport vtkPaintBrushContextRepresentation from '@/src/vtk/PaintBrushContextRepresentation';\n\nimport widgetBehavior from './behavior';\nimport stateGenerator from './state';\n\nexport { shouldIgnoreEvent } from './behavior';\n\n// ----------------------------------------------------------------------------\n// Factory\n// ----------------------------------------------------------------------------\n\nfunction vtkPaintWidget(publicAPI, model) {\n model.classHierarchy.push('vtkPaintWidget');\n\n model.methodsToLink = ['slicingIndex', 'indexToWorld', 'worldToIndex'];\n\n publicAPI.getRepresentationsForViewType = () => [\n {\n builder: vtkPaintBrushContextRepresentation,\n labels: ['brush'],\n },\n ];\n\n // Default manipulator\n model.manipulator = vtkPlanePointManipulator.newInstance();\n}\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkAbstractWidgetFactory.extend(publicAPI, model, {\n ...initialValues,\n behavior: widgetBehavior,\n widgetState: stateGenerator(),\n });\n macro.get(publicAPI, model, ['manipulator']);\n\n vtkPaintWidget(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkPaintWidget');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import { Vector2 } from '@kitware/vtk.js/types';\nimport { IBrushStencil, IPaintBrush } from './brush';\n\n// Adapted from http://members.chello.at/easyfilter/bresenham.html\nfunction rasterizeEllipse(xdiam: number, ydiam: number) {\n const buffer = new Uint8Array(xdiam * ydiam);\n\n const putPixel = (x: number, y: number) => {\n buffer[x + y * xdiam] = 1;\n };\n\n const blitLine = (x0: number, x1: number, y: number) => {\n const start = y * xdiam + x0;\n const end = start + (x1 - x0 + 1);\n buffer.fill(1, start, end);\n };\n\n let x0 = 0;\n let y0 = 0;\n let x1 = xdiam - 1;\n let y1 = ydiam - 1;\n\n let a = x1;\n let b = y1;\n // eslint-disable-next-line no-bitwise\n const b1 = b & 1;\n let dx = 4 * (1 - a) * b * b;\n let dy = 4 * (b1 + 1) * a * a;\n let err = dx + dy + b1 * a * a;\n let e2 = 0;\n\n y0 += Math.floor((b + 1) / 2);\n y1 = y0 - b1;\n a *= 8 * a;\n b *= 8 * b;\n do {\n blitLine(x0, x1, y0);\n blitLine(x0, x1, y1);\n e2 = 2 * err;\n if (e2 <= dy) {\n y0++;\n y1--;\n dy += a;\n err += dy;\n }\n if (e2 >= dx || 2 * err > dy) {\n x0++;\n x1--;\n dx += b;\n err += dx;\n }\n } while (x0 <= x1);\n while (y0 - y1 < ydiam) {\n putPixel(x0 - 1, y0);\n putPixel(x1 + 1, y0++);\n putPixel(x0 - 1, y1);\n putPixel(x1 + 1, y1--);\n }\n\n return buffer;\n}\n\nexport default class EllipsePaintBrush implements IPaintBrush {\n private size: number = 1;\n private scale: Vector2 = [1, 1];\n private cachedStencil!: IBrushStencil;\n\n constructor() {\n this.recomputeStencil();\n }\n\n setSize(size: number) {\n this.size = Math.max(0, size);\n this.recomputeStencil();\n }\n\n setScale(scale: Vector2) {\n this.scale = scale;\n this.recomputeStencil();\n }\n\n private recomputeStencil() {\n const scaledSize = [\n Math.ceil(this.size * this.scale[0]),\n Math.ceil(this.size * this.scale[1]),\n ] as Vector2;\n this.cachedStencil = {\n size: scaledSize,\n pixels: rasterizeEllipse(scaledSize[0], scaledSize[1]),\n };\n }\n\n getStencil() {\n return this.cachedStencil;\n }\n}\n","import vtkLabelMap from '@/src/vtk/LabelMap';\nimport vtkPaintWidget from '@/src/vtk/PaintWidget';\nimport { Vector2 } from '@kitware/vtk.js/types';\nimport { vec3 } from 'gl-matrix';\nimport { IPaintBrush } from './brush';\nimport EllipsePaintBrush from './ellipse-brush';\n\nexport default class PaintTool {\n readonly factory: vtkPaintWidget;\n private brush: IPaintBrush;\n private brushValue: number;\n\n constructor() {\n this.factory = vtkPaintWidget.newInstance();\n this.brush = new EllipsePaintBrush();\n this.brushValue = 1;\n }\n\n private updateWidgetStencil() {\n // use unscaled stencil for paint outline\n const stencil = this.brush.getStencil();\n const widgetState = this.factory.getWidgetState();\n widgetState.setStencil(stencil);\n }\n\n setBrushSize(size: number) {\n this.brush.setSize(size);\n this.updateWidgetStencil();\n }\n\n setBrushScale(scale: Vector2) {\n this.brush.setScale(scale);\n this.updateWidgetStencil();\n }\n\n setBrushValue(value: number) {\n this.brushValue = value;\n }\n\n /**\n * Adds paint to a labelmap.\n *\n * If endPoint is specified, then linearly interpolates the brush\n * from the start to the end.\n *\n * Assumption: startPoint and endPoint are on the same slice axis.\n *\n * @param labelmap paint in this labelmap\n * @param sliceAxis Which index-space axis to paint on (0, 1, or 2).\n * @param startPoint start point\n * @param endPoint ending point (optional)\n */\n paintLabelmap(\n labelmap: vtkLabelMap,\n sliceAxis: 0 | 1 | 2,\n startPoint: vec3,\n endPoint?: vec3\n ) {\n const stencil = this.brush.getStencil();\n\n const start = [\n // transforms + floating point errors can make zero values occasionally\n // turn into really tiny negative values\n ...startPoint.map((val) => Math.round(val)),\n ];\n // Assumption: startPoint and endPoint are on the same slice axis.\n const ijkSlice = start[sliceAxis];\n start.splice(sliceAxis, 1);\n\n let end = [...start];\n if (endPoint) {\n end = [...endPoint.map((val) => Math.round(val))];\n end.splice(sliceAxis, 1);\n }\n\n const labelmapPixels = labelmap.getPointData().getScalars().getData();\n const labelmapDims = labelmap.getDimensions();\n const jStride = labelmapDims[0];\n const kStride = labelmapDims[0] * labelmapDims[1];\n\n const isInBounds = (point: number[]) =>\n point[0] >= 0 &&\n point[1] >= 0 &&\n point[2] >= 0 &&\n point[0] < labelmapDims[0] &&\n point[1] < labelmapDims[1] &&\n point[2] < labelmapDims[2];\n\n const { pixels, size } = stencil;\n const centerX = Math.floor((size[0] - 1) / 2);\n const centerY = Math.floor((size[1] - 1) / 2);\n\n const point1 = [...start];\n const point2 = [...end];\n const rounded = [0, 0, 0];\n const curPoint: number[] = [0, 0];\n for (let y = 0; y < size[1]; y++) {\n const ydelta = y - centerY;\n const yoffset = y * size[0];\n for (let x = 0; x < size[0]; x++) {\n const xdelta = x - centerX;\n const pixelOffset = yoffset + x;\n if (pixels[pixelOffset]) {\n point1[0] = start[0] + xdelta;\n point1[1] = start[1] + ydelta;\n point2[0] = end[0] + xdelta;\n point2[1] = end[1] + ydelta;\n\n // line between the two points\n const dx = point2[0] - point1[0];\n const dy = point2[1] - point1[1];\n let steps = Math.abs(Math.abs(dx) > Math.abs(dy) ? dx : dy);\n const incX = dx / steps;\n const incY = dy / steps;\n [curPoint[0], curPoint[1]] = point1;\n while (steps-- >= 0) {\n // add slice axis to make a proper 3D index\n curPoint.splice(sliceAxis, 0, ijkSlice);\n rounded[0] = Math.round(curPoint[0]);\n rounded[1] = Math.round(curPoint[1]);\n rounded[2] = Math.round(curPoint[2]);\n\n if (isInBounds(rounded)) {\n const offset =\n rounded[0] + rounded[1] * jStride + rounded[2] * kStride;\n labelmapPixels[offset] = this.brushValue;\n }\n\n // undo adding the slice axis value\n curPoint.splice(sliceAxis, 1);\n\n curPoint[0] += incX;\n curPoint[1] += incY;\n }\n }\n }\n }\n\n labelmap.modified();\n }\n}\n","import { Vector3 } from '@kitware/vtk.js/types';\nimport { ImageMetadata } from '@/src/store/datasets-images';\nimport {\n InteractionState,\n RulerWidgetState,\n} from '@/src/vtk/RulerWidget/state';\nimport vtkRulerWidget from '@/src/vtk/RulerWidget';\nimport mitt, { Emitter } from 'mitt';\nimport { LPSAxis } from '@/src/types/lps';\n\nexport interface SerializedRulerV1 {\n version: '1.0';\n /**\n * Index space\n */\n firstPoint: Vector3;\n /**\n * Index space\n */\n secondPoint: Vector3;\n viewAxis: LPSAxis;\n /**\n * Index space slice\n */\n slice: number;\n imageID: string;\n /**\n * imageMetadata is saved as context for where\n * the measurement is located in the world.\n */\n imageMetadata: Omit<ImageMetadata, 'name'>;\n /**\n * Ruler metadata\n */\n color: string;\n}\n\nexport interface RulerStateUpdate {\n firstPoint?: Vector3 | null;\n secondPoint?: Vector3 | null;\n interactionState?: InteractionState;\n}\n\ntype RulerToolManagerEvents = {\n widgetUpdate: {\n id: string;\n update: RulerStateUpdate;\n };\n};\n\nexport default class RulerTool {\n private listeners: Map<string, Function>;\n\n private factories: Map<string, vtkRulerWidget>;\n\n private recurseGuard: boolean = false;\n\n public events: Emitter<RulerToolManagerEvents>;\n\n constructor() {\n this.listeners = new Map();\n this.factories = new Map();\n this.events = mitt();\n }\n\n teardown() {\n this.events.all.clear();\n this.listeners.forEach((stop) => stop());\n this.factories.forEach((factory) => factory.delete());\n this.listeners.clear();\n this.factories.clear();\n }\n\n getFactory(id: string) {\n return this.factories.get(id) ?? null;\n }\n\n createRuler(id: string): vtkRulerWidget {\n if (this.factories.has(id)) {\n return this.factories.get(id)!;\n }\n const factory = vtkRulerWidget.newInstance();\n this.listeners.set(\n id,\n this.createStoreUpdater(id, factory.getWidgetState())\n );\n\n this.factories.set(id, factory);\n return factory;\n }\n\n removeRuler(id: string) {\n const factory = this.factories.get(id);\n if (factory) {\n factory.delete();\n this.factories.delete(id);\n }\n const cleanup = this.listeners.get(id);\n if (cleanup) {\n cleanup();\n this.listeners.delete(id);\n }\n }\n\n private createStoreUpdater(id: string, state: RulerWidgetState) {\n const sub = state.onModified(() => {\n if (this.recurseGuard) {\n return;\n }\n\n const update: RulerStateUpdate = {\n firstPoint: state.getFirstPoint().getOrigin(),\n secondPoint: state.getSecondPoint().getOrigin(),\n interactionState: state.getInteractionState(),\n };\n\n this.events.emit('widgetUpdate', { id, update });\n });\n\n return () => {\n sub.unsubscribe();\n };\n }\n\n updateRuler(id: string, update: RulerStateUpdate) {\n const factory = this.factories.get(id);\n if (factory) {\n this.recurseGuard = true;\n\n const state = factory.getWidgetState();\n const first = state.getFirstPoint();\n const second = state.getSecondPoint();\n\n if (update.firstPoint) {\n first.setOrigin(update.firstPoint);\n first.setVisible(true);\n }\n if (update.secondPoint) {\n second.setOrigin(update.secondPoint);\n second.setVisible(true);\n }\n if (Number.isInteger(update.interactionState)) {\n state.setInteractionState(update.interactionState!);\n }\n\n this.recurseGuard = false;\n }\n }\n}\n","import { DICOMIO } from '../io/dicom';\nimport IDGenerator from './id';\nimport ProxyWrapper from './proxies';\nimport PaintTool from './tools/paint';\nimport RulerTool from './tools/ruler';\n\n/**\n * Pinia plugin for injecting tool services.\n */\nexport function CorePiniaProviderPlugin({\n rulers,\n paint,\n proxies,\n id,\n dicomIO,\n}: {\n rulers?: RulerTool;\n paint?: PaintTool;\n proxies?: ProxyWrapper;\n id?: IDGenerator;\n dicomIO?: DICOMIO;\n} = {}) {\n const dependencies = {\n $rulers: rulers ?? new RulerTool(),\n $paint: paint ?? new PaintTool(),\n $proxies: proxies,\n $id: id ?? new IDGenerator(),\n $dicomIO: dicomIO ?? new DICOMIO(),\n };\n return () => dependencies;\n}\n","/**\n * document.exitPointerLock is undefined on iOS.\n * - Tested on iOS Safari 15.6.1.\n */\nexport function patchExitPointerLock() {\n const { exitPointerLock } = document;\n document.exitPointerLock = () => {\n try {\n exitPointerLock?.call(document);\n } catch (e) {\n // ignore if undefined\n }\n };\n}\n","import '@/public/global.css';\nimport '@kitware/vtk.js/Rendering/Profiles/All';\nimport 'vue-toastification/dist/index.css';\n\nimport Vue from 'vue';\nimport VueCompositionAPI from '@vue/composition-api';\nimport VueToast from 'vue-toastification';\nimport { createPinia, PiniaVuePlugin } from 'pinia';\nimport vtkProxyManager from '@kitware/vtk.js/Proxy/Core/ProxyManager';\nimport vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';\nimport vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper';\n\nimport App from './components/App.vue';\nimport vuetify from './plugins/vuetify';\nimport { DICOMIO } from './io/dicom';\nimport { FILE_READERS } from './io';\nimport { registerAllReaders } from './io/readers';\nimport proxyConfiguration from './vtk/proxy';\nimport { CorePiniaProviderPlugin } from './core/provider';\nimport ProxyWrapper from './core/proxies';\nimport { patchExitPointerLock } from './utils/hacks';\n\nVue.config.productionTip = false;\n\nVue.use(VueCompositionAPI);\nVue.use(VueToast);\nVue.use(PiniaVuePlugin);\n\n// patches\npatchExitPointerLock();\n\n// Initialize global mapper topologies\n// polys and lines in the front\nvtkMapper.setResolveCoincidentTopologyToPolygonOffset();\nvtkMapper.setResolveCoincidentTopologyPolygonOffsetParameters(-3, -3);\nvtkMapper.setResolveCoincidentTopologyLineOffsetParameters(-3, -3);\n// image poly in the back\nvtkImageMapper.setResolveCoincidentTopologyToPolygonOffset();\nvtkImageMapper.setResolveCoincidentTopologyPolygonOffsetParameters(1, 1);\n\nregisterAllReaders(FILE_READERS);\n\nconst proxyManager = vtkProxyManager.newInstance({ proxyConfiguration });\n\nconst dicomIO = new DICOMIO();\ndicomIO.initialize();\n\nconst pinia = createPinia();\npinia.use(\n CorePiniaProviderPlugin({\n proxies: new ProxyWrapper(proxyManager),\n dicomIO,\n })\n);\n\nconst app = new Vue({\n vuetify,\n proxyManager,\n pinia,\n provide: {\n ProxyManager: proxyManager,\n },\n render: (h) => h(App),\n});\n\napp.$mount('#app');\n","const itkConfig = {\n pipelineWorkerUrl: '/itk/web-workers/min-bundles/pipeline.worker.js',\n imageIOUrl: '/itk/image-io',\n meshIOUrl: '/itk/mesh-io',\n pipelinesUrl: '/itk/pipelines',\n};\n\nexport default itkConfig;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","__webpack_require__.amdO = {};","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"385\":\"51ca48a2\",\"422\":\"c64a6aa7\",\"979\":\"c4823352\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkVolView\"] = self[\"webpackChunkVolView\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(4132); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","on","openFiles","scopedSlots","_u","key","fn","ref","dragHover","$vuetify","breakpoint","$event","leftSideBar","_v","_e","staticClass","aboutBoxDialog","model","value","callback","$$v","expression","userPromptFiles","saveDialog","_g","_b","layoutName","_l","name","messageCount","messageBadgeColor","messageDialog","settingsDialog","directives","rawName","currentLayout","hasData","staticRenderFns","RESIZE_CURSOR","props","minWidth","maxWidth","width","handleSize","type","default","data","internalWidth","computed","handleSizeCSS","mounted","beforeDestroy","VNavigationDrawer","methods","setResizableStyles","el","setEvents","clearEvents","startResize","stopResize","handleResize","document","evt","setCursor","resetCursor","disableSelection","resetSelection","component","class","classV","sizeV","$attrs","Object","assign","$listeners","iconSize","_s","icon","_t","required","size","buttonClass","filter","join","VBtn","flexFlow","item","i","id","tag","hover","enableResizeToFit","slice","sliceMin","sliceMax","setSlice","active","viewID","widgetManager","viewDirection","topLabel","proxy","leftLabel","windowWidth","windowLevel","toFixed","dicomInfo","patientID","studyID","studyDescription","seriesNumber","seriesDescription","manageVTKSubscription","subscription","onUnmounted","unsubscribe","useResizeToFit","camera","initialValue","resizeToFit","trackResizeToFit","cachedCameraInfo","position","parallelScale","ignoreResizeToFitTracking","cb","resetResizeToFitTracking","getPosition","getParallelScale","onModified","vec3","equals","onDragStart","onDragMove","onDragEnd","preventDefault","style","height","handleHeight","transform","handlePosition","getYOffsetFromTransform","matStr","match","split","map","min","max","step","maxHandlePos","dragging","initialHandlePos","initialMousePosY","yOffset","draggingHandlePos","Math","updateMaxHandlePos","ev","y","getNearestSlice","$style","gridRoot","top","row","left","cell","center","right","middle","bottom","script","injectStyles","context","useResizeObserver","targetElRef","observer","ResizeObserver","entries","length","watch","targetEl","prevTarget","unobserve","observe","immediate","onBeforeUnmount","unref","EPSILON","VTKTwoViewWidgetManager","Symbol","VTKThreeViewWidgetManager","Messages","WebGLLost","title","details","useVTKCallback","handleListener","listener","cleanup","isRef","watchEffect","toOrderedLabels","vec","v","axis","abs","sort","a","b","sign","useOrientationLabels","view","getCamera","updateAxes","vup","getViewUp","vdir","getDirectionOfProjection","vright","cross","vbottom","c","vleft","cameraOnModified","LPSAxes","createLPSPoint","Sagittal","Coronal","Axial","createLPSBounds","getAxisBounds","bounds","directions","index","getLPSAxisFromDir","dir","Error","defaultLPSDirections","Left","fromValues","Right","Posterior","Anterior","Superior","Inferior","getLPSDirections","direction","availableCols","availableRows","lpsDirs","bestValue","bestValueLoc","removeIndices","forEach","col","colIdx","rowIdx","axisVector","vecSign","posVector","negVector","splice","defer","innerResolve","innerReject","resolve","reject","reason","promise","Promise","res","rej","removeFromArray","arr","idx","indexOf","clampValue","pick","obj","keys","reduce","o","k","ensureDefault","records","default_","arrayEquals","wrapInArray","maybeArray","Array","isArray","getURLBasename","url","URL","pathname","at","Tools","InteractionState","LayoutDirection","DataSetType","generateState","vtkStateBuilder","addStateFromMixin","labels","mixins","initialValues","scale1","origin","visible","addField","PlacingFirst","build","DataSetTypeNative","z","LPSAxisDir","DataSet","path","LayoutDirectionNative","Layout","optional","items","Vector3","WindowLevelConfig","level","SliceConfig","axisDirection","CameraConfig","focalPoint","directionOfProjection","viewUp","ColorBy","arrayName","location","PiecewiseGaussian","xBias","yBias","PiecewiseNode","x","midpoint","sharpness","OpacityGaussians","mode","vtkPiecewiseFunctionProxy","gaussians","array","mappingRange","OpacityPoints","preset","shift","OpacityNodes","nodes","OpacityFunction","ColorTransferFunction","CVRConfig","colorBy","transferFunction","opacityFunction","enabled","lightFollowsCamera","useVolumetricScatteringBlending","volumetricScatteringBlending","useLocalAmbientOcclusion","laoKernelSize","laoKernelRadius","ambient","diffuse","specular","VolumeColorConfig","cvr","ViewConfig","window","volumeColorConfig","ViewType","View","config","LabelMap","parent","LPSAxis","InteractionStateNative","Ruler","firstPoint","nullable","secondPoint","viewAxis","imageID","interactionState","color","Crosshairs","ToolsEnumNative","ToolsEnum","Paint","activeLabelmapID","brushSize","brushValue","labelmapOpacity","LPSCroppingPlanes","Cropping","rulers","crosshairs","paint","crop","current","ManifestSchema","version","dataSets","labelMaps","tools","views","primarySelection","layout","useFileStore","defineStore","state","byDataID","getters","getFiles","dataID","actions","remove","del","add","files","set","async","serializeData","stateFile","dataIDs","dataType","fileStore","manifest","zip","dataPath","push","file","filePath","extractFilesFromZip","zipFile","JSZip","promises","paths","relPath","splitPath","baseName","fileEntry","then","blob","File","all","ARCHIVE_FILE_TYPES","Set","ITK_IMAGE_EXTENSIONS","from","extensionToImageIO","ext","toLowerCase","FILE_TYPES","FILE_MAGIC_DB","skip","header","charCodeAt","HEAD_CHUNK","prefixEquals","target","prefix","getFileTypeFromMagic","head","reader","FileReader","onload","chunk","Uint8Array","result","readAsArrayBuffer","retypeFile","find","endsWith","retypedFile","extractArchivesRecursively","results","has","archivedEntries","flat","entry","archives","moreEntries","readFileAs","fio","globalThis","TypeError","readAsText","readFileAsArrayBuffer","FILE_READERS","Map","defaultImageMetadata","orientation","mat3","create","lpsOrientation","spacing","dimensions","worldBounds","worldToIndex","mat4","indexToWorld","useImageStore","idList","dataIndex","metadata","addVTKImageData","imageData","$id","nextID","$proxies","addData","updateData","getDimensions","getSpacing","getOrigin","getDirection","getBounds","getWorldToIndex","getIndexToWorld","deleteData","IMAGE","dataSet","get","dataObj","isA","ANONYMOUS_PATIENT","ANONYMOUS_PATIENT_ID","imageCacheMultiKey","offset","asThumbnail","genSynPatientKey","patient","pid","PatientID","trim","PatientName","bdate","PatientBirthDate","sex","PatientSex","s","replace","useDICOMStore","sliceData","volumeToImageID","imageIDToVolumeKey","patientInfo","patientStudies","studyInfo","studyVolumes","volumeInfo","volumeStudy","studyPatient","needsRebuild","dicomIO","$dicomIO","nameToFileMap","f","volumesToFilesMap","categorizeFiles","updatedVolumeKeys","volumeKey","fileNames","volumeFiles","fileName","numberOfSlices","info","readTags","strconv","patientKey","studyKey","StudyInstanceUID","study","NumberOfSlices","VolumeID","_updateDatabase","volume","deleteVolume","imageStore","deleteStudy","deletePatient","DICOM","importFiles","volumeKeys","sliceIndex","cacheKey","numSlices","sliceFile","itkImage","getVolumeSlice","forceRebuild","rebuild","buildVolume","vtkImage","vtkITKHelper","SeriesInstanceUID","useModelStore","addVTKPolyData","polyData","MessageType","useMessageStore","_nextID","byID","msgList","messages","importantMessages","msg","Success","addError","opts","_addMessage","String","persist","addWarning","Warning","addInfo","Info","addSuccess","clearOne","Vue","clearAll","options","HTTPHandler","testURL","protocol","fetchURL","progress","response","fetch","contentLength","Number","headers","Infinity","body","getReader","bytes","recv","done","readData","read","Blob","GoogleBucketHandler","urlComponents","bucketPath","httpURL","HANDLERS","fetchFile","handler","h","RemoteResource","RemoteDataManifest","resources","fetchRemoteManifest","resource","readRemoteManifestFile","manifestFile","decoder","TextDecoder","ab","arrayBuffer","text","decode","parse","JSON","makeFileSuccessStatus","loaded","filename","makeFileFailureStatus","error","makeDICOMSuccessStatus","makeDICOMFailureStatus","makeDICOMSelection","makeImageSelection","selectionEquals","s1","s2","convertSuccessResultToDataSelection","useDatasetStore","modelStore","dicomStore","primaryDataset","sel","allDataIDs","getDataProxyByID","getData","setPrimarySelection","err","messageStore","loadFiles","allFiles","manifestFiles","manifestStatuses","fileEntries","dicoms","otherFiles","dicomStatus","volKey","catch","otherStatuses","e","statuses","serialize","deserialize","$onAction","args","after","getImageSpatialExtent","image","extent","getSpatialExtent","useCurrentImage","dataStore","currentImageID","currentImageMetadata","currentImageData","currentImageExtent","isImageLoading","useCameraOrientation","imageMetadataRef","orientationMatrix","lpsDirections","cameraDirVec","cameraUpVec","clampRangeToBounds","range","convertCropBoundsToVTKPlane","cropBounds","lowerUpper","axisIndex","transformMat4","neg","normal","vtkPlane","useCropStore","reactive","croppingByImageID","getComputedVTKPlanes","clampCroppingPlanes","planes","lpsBounds","setCropping","setCroppingForAxis","resetCropping","dataIDMap","cropping","newImageID","readonly","clampPointToBounds","point","p","widgetBehavior","publicAPI","classHierarchy","isDragging","ignoreKey","altKey","controlKey","shiftKey","macro","handleLeftButtonPress","pickable","widgetState","setPlaced","_interactor","requestAnimation","_apiSpecificRenderWindow","invokeStartInteractionEvent","handleMouseMove","callData","getPlaced","manipulator","worldCoordsOfPointer","handleEvent","handle","getHandle","indexCoordsOfPointer","worldOrigin","indexOrigin","setOrigin","invokeInteractionEvent","handleLeftButtonRelease","cancelAnimation","invokeEndInteractionEvent","grabFocus","loseFocus","vtkCrosshairsWidget","behavior","stateGenerator","getRepresentationsForViewType","viewType","ViewTypes","onBoundsChange","vtkPlanePointManipulator","DEFAULT_VALUES","extend","vtkAbstractWidgetFactory","newInstance","useDoubleRecord","reactiveRoot","_set","k1","k2","undefined","getComputed","k1v","k2v","hasComputed","_delete","deleteFirstKey","deleteSecondKey","delete","removeViewFromConfig","removeDataFromConfig","serializeViewConfig","configGetter","viewConfigStateKey","viewConfig","configForData","defaultSliceConfig","setupSlicingConfig","sliceConfigs","getSliceConfig","getComputedSliceConfig","updateSliceConfig","update","floor","resetSlice","ceil","removeView","removeData","defaultWindowLevelConfig","setupWindowingConfig","windowLevelConfigs","getWindowingConfig","updateWindowingConfig","resetWindowLevel","setupCameraConfig","cameraConfigs","getCameraConfig","updateCameraConfig","computeWorldToDisplay","xyz","renderer","getRenderWindow","getViews","worldToDisplay","normalizeMouseEventPosition","canvas","getCanvas","getBoundingClientRect","scaleX","scaleY","clientX","clientY","intersectMouseEventWithPlane","intersectDisplayWithPlane","worldToSVG","coords","getViewportSize","devicePixelRatio","getCSSCoordinatesFromEvent","eventData","pokedRenderer","bbox","getContainer","getShiftedOpacityFromPreset","presetName","effectiveRange","vtkColorMaps","points","xmin","xmax","getOpacityFunctionFromPreset","stringify","getColorFunctionRangeFromPreset","AbsoluteRange","RGBPoints","getOpacityRangeFromPreset","EffectiveRange","InitViewIDs","Three","InitViewSpecs","DefaultViewSpec","Layouts","V","H","layouts","LABELMAP_PALETTE","SAMPLE_DATA","description","CTAHeadThumbnail","MRAHeadThumbnail","MRICardiacThumbnail","MRIPROSTATExThumbnail","USFetusThumbnail","TOOL_COLORS","DEFAULT_PRESET_BY_MODALITY","CT","MR","US","registerPresets","presets","MedicalPresets","GroupedPresets","group","DEFAULT_PRESET","PresetNameList","flatMap","DEFAULT_AMBIENT","DEFAULT_DIFFUSE","DEFAULT_SPECULAR","getPresetFromImageModality","Modality","defaultVolumeColorConfig","setupVolumeColorConfig","volumeColorConfigs","getVolumeColorConfig","getComputedVolumeColorConfig","updateVolumeColorConfig","createUpdateFunc","validator","updatedConfig","updateVolumeColorBy","updateVolumeColorTransferFunction","updateVolumeOpacityFunction","updateVolumeCVRParameters","cvrConfig","setVolumeColorPreset","imageDataRange","getPointData","getScalars","getRange","ctRange","ctFunc","opFunc","opRange","resetToDefaultColoring","scalars","getName","useViewConfigStore","sliceConfig","windowingConfig","cameraConfig","newDataID","useViewStore","viewSpecs","structuredClone","viewIDs","getViewProxy","getView","getDataRepresentationForView","createOrGetViewProxy","createView","addView","setLayout","layoutsToProcess","ly","viewConfigStore","spec","viewSpec","useCrosshairsToolStore","factory","getWidgetState","imagePosition","out","viewStore","currentViewIDs","getWidgetFactory","setPosition","pos","activateTool","deactivateTool","indexPos","round","setIndexToWorld","setWorldToIndex","xDim","yDim","zDim","imageBounds","setBounds","inflate","vtkLabelMap","colorMap","vtkImageData","PromiseWorker","constructor","worker","msgID","waiting","onmessage","handleMessage","bind","postMessage","message","transferables","wrappedMsg","deferred","runAsyncVTKReader","readerName","Worker","status","vtk","runAsyncVTKWriter","writerName","getState","stlReader","vtiReader","vtpReader","vtiWriter","LabelmapArrayType","createLabelmapFromImage","getNumberOfPoints","labelmap","setScalars","vtkDataArray","numberOfComponents","values","setDimensions","computeTransforms","setColorMap","toLabelMap","useLabelmapStore","labelmaps","parentImage","newLabelmapFromImage","labelMap","labelPath","serializedData","stateFiles","labelmapIDMap","labelMapObj","DEFAULT_BRUSH_SIZE","DEFAULT_BRUSH_VALUE","usePaintToolStore","strokePoints","isActive","$paint","activeLabelmap","labelmapStore","selectOrCreateLabelmap","found","parentID","setBrushSize","setBrushValue","setLabelmapOpacity","opacity","doPaintStroke","lastIndex","lastPoint","prevPoint","paintLabelmap","setSliceAxis","scale","setBrushScale","startStroke","indexPoint","clone","call","placeStrokePoint","endStroke","updatePlaneManipulatorFor2DView","viewDir","imageMetadata","setUserNormal","setUserOrigin","createPlaneManipulatorFor2DView","vtkPlaneManipulator","emptyRuler","useRulerStore","rulerIDs","activeRulerID","colorIndex","lengthByID","rulersIndex","lengths","sqrt","distance2BetweenPoints","getVTKFactory","$rulers","getFactory","deactivateRuler","rulerID","activateRuler","updateRulerInternal","patch","ruler","Settled","updateRuler","addNewRuler","rulerState","createRuler","removeRuler","removeActiveRuler","addNewRulerFromViewEvent","currentImage","viewProxy","getOpenglRenderWindow","PlacingSecond","jumpToRuler","relevantViewIDs","updateFromWidgetState","event","initialize","events","off","uninitialize","rulersInState","getStore","tool","setupTool","store","teardownTool","useToolStore","currentTool","WindowLevel","setCurrentTool","rulerStore","crosshairsStore","paintStore","cropStore","computeStep","PROPS","viewId","WindowLevelTool","defineComponent","setup","toRefs","windowConfigDefaults","wlConfig","wwRange","wlRange","vertVal","horizVal","ww","wl","rangeManipulator","vtkMouseRangeManipulator","button","scrollEnabled","updateManipulator","removeAllListeners","vertRange","horizRange","setVerticalListener","setHorizontalListener","curViewProxy","oldViewProxy","istyle","getInteractorStyle2D","removeMouseManipulator","addMouseManipulator","isDeleted","functional","ctx","toolStore","sliceConfigDefault","sliceRange","scrollVal","setScrollListener","manipulatorClass","intStyle","getInteractorStyle3D","manipulators","updateStyle","newManipulators","oldManipulators","m","newOptions","pop","opt","setButton","setShift","setControl","control","curIntStyle","oldIntStyle","toolOptions","Pan","MouseManipulatorTool","vtkMouseCameraTrackballPanManipulator","flipDirection","Zoom","vtkMouseCameraTrackballZoomToMouseManipulator","focused","openContextMenu","contextMenu","$set","deleteRulerFromContextMenu","rulerId","Boolean","emit","rulerIDRef","widgetManagerRef","factoryRef","widgetRef","rulerRef","onMounted","addWidget","rightClickSub","onRightClickEvent","setManipulator","widget","removeWidget","rulerSlice","curSlice","isInteger","setVisibility","setHandleVisibility","renderWidgets","first","second","textdx","textdy","anchor","textSize","rulerLength","point1","point2","textOffset","updatePoints","viewRenderer","getRenderer","pt1","pt2","point2D","deep","textProperties","dx","dy","containerEl","shouldIgnoreEvent","superClass","subscriptions","setFirstPoint","coord","getFirstPoint","setSecondPoint","getSecondPoint","intState","getInteractionState","hasFocus","worldCoords","setInteractionState","activeState","getActive","setVisible","deactivate","handleRightButtonPress","invokeRightClickEvent","vtkRulerWidget","builder","vtkSphereHandleRepresentation","scaleInPixels","getLength","components","RulerWidget2D","RulerSVG2D","show","forRulerID","displayXY","deleteActiveRuler","startNewRuler","VOID","EVENT_ABORT","onLeftButtonPress","getInteractor","currentRulers","rulerByID","curImageID","isToolActive","curViewAxis","curActiveRulerID","VList","viewProxyRef","viewAxisIndex","worldPointToIndex","worldPoint","slicingIndex","setSlicingIndex","subs","onStartInteractionEvent","getBrush","onInteractionEvent","onEndInteractionEvent","onMouseEnter","onMouseLeave","releaseFocus","PaintWidget2D","useSceneBuilder","sceneIDs","baseImageRep","_viewID","baseImage","labelmapReps","labelmapIDs","modelReps","models","modelIDs","baseRep","lmReps","mReps","removeAllRepresentations","setRescaleOnColorBy","addRepresentation","rep","computeVisiblePropBounds","usePersistCameraConfig","toPersist","persistCameraConfig","blockPersistingCameraConfig","func","restoreCameraConfig","setParallelScale","setFocalPoint","setCenterOfRotation","setDirectionOfProjection","setViewUp","getFocalPoint","persistFunc","ViewProxyType","position2D","pt","CrosshairsWidget2D","CrosshairSVG2D","storeToRefs","isVisible","crosshairsSlice","ProxyWrapper","proxyManager","viewProxies","dataProxies","deleteProxy","createProxy","setInputData","dataProxy","getRepresentation","useViewProxy","container","setContainer","curContainer","modified","onViewProxyModified","useViewProxyMounted","useViewProxyUnmounted","prev","useWidgetManager","wm","vtkWidgetManager","pickingEnabled","useSvgLayer","captureOn","CaptureOn","setRenderer","enablePicking","disablePicking","curWM","oldWM","createPrimitiveSyncContext","initialState","states","usage","register","valueRef","stopTo","newValue","flush","watchOptions","stopFrom","newState","useSync","newKey","generateComputed","source","prop","useLevelSync","useWidthSync","useWindowingSync","triggerRef","ax1","lines","lowerLine","outOfBounds","onPointerDown","onPointerMove","onPointerUp","upperLine","ax2","useCurrentSlice","planeOrigin","axisName","number","planeNormal","useVTKViewContainer","useVTKMultiWorldToDisplay","displayCoords","ren","disp","getActiveCamera","useVTKMultiWorldToSVG","svgCoords","xy","line","startEdge","startCrop","focusWidth","endCrop","endEdge","cursor","clickWidth","onHover","onPointer","grabLineEl","down","setPointerCapture","pointerId","releasePointerCapture","computeCropLines","cropAxis","cropPlanes","boundary","currentSlice","viewIDVal","cropAxisVal","cropPlanesVal","boundaryVal","sliceInfo","sliceAxis","perpAxis","ax","cropRange","perpRange","perpBoundary","sliceCropRange","getLineSegments","cropLinesToSVGDisplay","cropLines","worldPoints","indexLPSPoint","indexPt","svgPoints","useDragging","mouseEventToLPSPoint","getCropEdgePos","setCropEdgePos","activeAxis","activeEdge","initialPointerIndex","initialCrop","selectedCropEdge","initialPoint","delta","Crop2DLineHandle","imageExtent","currentSlicingAxis","inPlaneAxes","ax1Lines","ax2Lines","ax1SVGLines","ax2SVGLines","lower","upper","newPlanes","isValidCroppingPlanes","lpsPlanesEqual","inject","croppingPlanes","vtkImageCroppingWidget","setEdgeHandlesEnabled","setFaceHandlesEnabled","setCornerHandlesEnabled","oldWm","getRepresentations","getActors","actor","getProperty","setAmbient","setWorldToIndexT","setIndexToWorldT","placeWidget","applyPlanes","lpsPlanes","dirs","getCroppingPlanes","getPlanes","setPlanes","onPlanesUpdated","planesFromStore","Crop2D","Crop3D","Crop","SLICE_OFFSET_KEYS","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","SliceSlider","ViewOverlayGrid","SliceScrollTool","PanTool","ZoomTool","RulerTool","PaintTool","CrosshairsTool","CropTool","vtkContainerRef","curImageData","curImageMetadata","sliceConfigDefaults","StudyID","StudyDescription","SeriesNumber","SeriesDescription","sliceDomain","ijkIndex","dimMax","setViewProxyContainer","Slice","onBeforeMount","removeAllManipulators","setOrientationAxesVisibility","setSlicingMode","onKeyDown","sliceOffset","stopPropagation","onKeyStroke","resize","provide","oldImageData","resizeToFitScene","lookAxis","upAxis","dimsWithSpacing","d","resetCamera","updateCamera","onResize","resetCameraClippingRange","setWindowWidth","setWindowLevel","lmRep","setOpacity","topLeftLabel","defaultKey","withProxyManager","pxm","useProxyManager","isViewAnimating","isAnimating","onStartAnimation","onEndAnimation","Volume","setOrientationAxesType","setBackground","getVolumes","setPickable","cvrParams","params","animating","getInputDataSet","mapper","getMapper","property","volumeBounds","getLights","createLight","light","setColor","setIntensity","setConeAngle","setPositional","setTwoSidedLighting","setLightTypeToHeadLight","updateLightsGeometryToFollowCamera","setLightTypeToSceneLight","setMaximumSamplesPerRay","dims","spatialDiagonal","sampleDistance","getMaximumSamplesPerRay","setSampleDistance","setGlobalIlluminationReach","setShade","setScalarOpacityUnitDistance","getDiagonalLength","setUseGradientOpacity","setGradientOpacityMinimumValue","dataRange","setGradientOpacityMaximumValue","setGradientOpacityMinimumOpacity","setVolumetricScatteringBlending","setLocalAmbientOcclusion","setLAOKernelSize","setLAOKernelRadius","setDiffuse","setSpecular","colorTransferFunction","lut","getLookupTable","setMode","vtkLookupTableProxy","setPresetName","setDataRange","pwf","getPiecewiseFunction","setGaussians","opacityPoints","setPoints","setNodes","setColorBy","removeAllClippingPlanes","plane","addClippingPlane","TYPE_TO_COMPONENT","VtkTwoView","VtkThreeView","ProgressState","viewIDToSpecs","$emit","selectedModuleIndex","mod","Modules","openPanels","handlePanelChange","ANONYMOUS_DATA_KEY","SAMPLE_DATA_KEY","sample","isDownloading","isLoaded","downloadSample","indeterminate","isDone","disabled","inputValue","onChange","imageSize","imageUrl","$slots","selectable","VCard","ImageListCard","datasetStore","urlToID","idToURL","clearLoadedStatus","percent","Pending","sampleFile","Done","loadResult","selection","samples","isError","VIcon","ThumbnailSlice","images","selectedSome","selectedAll","removeSelection","apply","arguments","selectionKey","select","thumbnails","imageURI","selected","selectItem","isSelected","mandatory","testFunction","internalValue","toggle","scalarImageToImageData","scaleMin","scaleMax","im","ImageData","arr32","Uint32Array","buffer","factor","byte","generateThumbnail","whichSlice","Middle","Last","j","subarray","createVTKImageThumbnailer","createElement","getContext","resizeCanvas","resizeContext","generate","imageDataToDataURI","resizeWidth","resizeHeight","putImageData","clearRect","drawImage","toDataURL","useMultiSelection","allItems","yn","imageCacheKey","ItemGroup","GroupableItem","nonDICOMImages","thumbnailer","imageIDs","canvasIM","aspectRatio","idLookup","removeSelectedStudies","StudyDate","removeSelectedDICOMVolumes","thumbnailCache","dicomCacheKey","itkImageToURI","itkBuf","generateDICOMThumbnail","middleSlice","thumb","volumes","encodedImage","lookup","usePanels","panels","newKeys","oldKeys","addedKeys","isOpen","changeKey","panel","PatientStudyVolumeBrowser","selectedSeries","studies","selPatient","studyKeys","studyKeysSet","SampleDataBrowser","ImageDataBrowser","PatientBrowser","patients","hasAnonymousImages","panelKeys","newSet","oldSet","includes","setCVRParam","selectLightingMode","lightingModel","LIGHTING_MODELS","TARGET_VIEW_ID","standard","hybrid","lao","laoEnabled","vsbEnabled","buttonIdx","fullMappingRange","colorSliderStep","rgbPoints","onColorMappingUpdate","onColorMappingFinalize","Mode","Gaussians","Points","ADJUST_POSITION_CURSOR","samplePiecewiseLinear","filledPoints","sampledPoints","pi","p1","p2","slope","sx","vtkPiecewiseWidget","pwMode","opacityPointShift","setGaussiansMode","setPointsMode","isModeGaussians","isModePoints","getMode","shiftPosition","meta","originalOpacityPointShift","originalXY","onClick","onDown","mouseIsDown","invokeAnimation","mouseCoords","vtkPiecewiseGaussianWidget","graphArea","activeGaussian","dragAction","onDrag","normCoords","opacities","invokeOpacityChange","setOpacityPoints","getEffectiveOpacityPoints","selectedGaussian","DEFAULT_TRACK_COLOR","CLASS_COLOR_FUNCTION","CLASS_COLOR_FUNCTION_MIDDLE","VRangeSlider","startBackgroundColor","filledBackgroundColor","colorStops","endBackgroundColor","onSliderMouseDown","onSliderClick","onMouseMove","genTrackContainer","styles","extraStyles","background","padding","children","applyRangeDelta","high","low","createRenderingPipeline","vtkVolume","vtkVolumeMapper","cfun","vtkColorTransferFunction","ofun","vtkPiecewiseFunction","setRGBTransferFunction","setScalarOpacity","setMapper","updateRenderingProperty","setGradientOpacityMaximumOpacity","setSpecularPower","createVolumeThumbnailer","scene","vtkGenericRenderWindow","listenWindowResize","pipeline","opacityFuncProxy","piecewiseFunction","colorTransferFuncProxy","lookupTable","setInputImage","hasViewProp","addVolume","removeVolume","resetCameraWithOrientation","up","getInputData","sub","resetOpacityFunction","pwfProxy","pointsNormalized","useVolumeThumbnailing","thumbnailSize","currentThumbnails","interruptSentinel","doThumbnailing","localSentinel","helper","renWin","imageURL","captureImages","WIDGET_WIDTH","WIDGET_HEIGHT","THUMBNAIL_SIZE","ColorFunctionSlider","editorContainerRef","pwfEditorRef","recurseGuard","colorTransferFunctionRef","pwfWidget","numberOfBins","backgroundColor","histogramColor","strokeColor","activeColor","handleColor","buttonDisableFillColor","buttonDisableStrokeColor","buttonStrokeColor","buttonFillColor","strokeWidth","activeStrokeWidth","buttonStrokeWidth","handleWidth","colorTransferFunc","setColorTransferFunction","pwfSubscriptions","updateOpacityFunc","getGaussians","getOpacityPointShift","onWidgetOpacityChange","onOpacityChange","animationRequested","request3DAnimation","cancel3DAnimation","onWidgetAnimation","onAnimation","contentRect","setSize","bindMouseListeners","unbindMouseListeners","setDataArray","applyColorMap","setMappingRange","onTFModified","selectedPreset","hasCurrentImage","effectiveMappingRange","selectPreset","updateColorMappingRange","presetList","blue","VCol","VolumeRendering","VolumePresets","VolumeProperties","VExpansionPanel","measurements","mm","updateColor","jumpTo","lm","MeasurementsList","LabelmapList","DataBrowser","AnnotationsModule","RenderingModule","onDragOver","onDragLeave","onDrop","readAllDirEntries","dirEntry","allEntries","entryToFile","readAllFiles","toProcess","types","created","staticStyle","VolViewFullLogo","noCurrentImage","paintMenu","cropMenu","swatches","brushColor","setBrushColor","rgbaToHexa","rgba","hexa","comp","toString","convertToSwatches","palette","hexToValue","hex","toUpperCase","op","resetCrop","ToolButton","PaintControls","CropControls","showErrors","showWarnings","showInfo","filteredMessages","_","scrollIfLast","deleteItem","headerClass","MessageTypeClass","watchResize","element","timeout","timeoutID","refreshTimeout","clearTimeout","setTimeout","disconnect","MessageItem","errors","warnings","messageID","messageListEl","cachedLast","last","listEl","firstElementChild","scrollHeight","scroll","toast","createToastInterface","hideProgressBar","maxToasts","transition","useToast","detailsButton","TIMEOUT","toasts","makeToastOptions","closeOnClick","onClose","msgLookup","dismiss","toastMethod","showDetailsButton","warning","success","MessageNotificationContent","dark","Vuetify","useLocalStorage","icons","kitwareMark","KitwareMark","theme","mobileBreakpoint","vuetify","framework","MANIFEST","VERSION","save","labelStore","content","generateAsync","saveAs","restore","manifestString","stateIDToStoreID","selectedID","dataSelection","loadState","typedFile","isStateFile","valid","validFileName","_k","keyCode","saveSession","DEFAULT_FILENAME","useGlobalErrorHook","onError","addEventListener","removeEventListener","ProxyManagerEvent","onProxyManagerEvent","proxySubs","onProxyRegistrationChange","action","proxyId","ProxyCreated","ProxyModified","ProxyDeleted","useWebGLWatchdog","watchdogs","reportError","useThrottleFn","rw","useEventListener","useAppLoadingNotifications","loadingCount","toastID","resetState","_setError","startLoading","closeButton","stopLoading","TYPE","runAsLoading","setError","loadFirstDataset","errored","failedFilenames","failedError","loadRemoteFilesFromURLParams","urls","names","fileResults","allSettled","fileResult","loadResults","failedURLs","selectDataID","ResizableNavDrawer","LayoutGrid","DragAndDrop","AboutBox","ToolStrip","ModulePanel","MessageCenter","MessageNotifications","VolViewLogo","Settings","SaveSession","root","fileEl","click","setAttribute","urlParams","vtkURLExtract","mobile","VApp","DICOMIO","webWorker","initializeCheck","module","inputs","outputs","runPipeline","runTask","InterfaceTypes","fd","tags","tagsArgs","t","readDICOMTags","tagValues","readImageDICOMFileSeries","itkReader","fileBuffer","vtkITKImageReader","setFileName","parseAsArrayBuffer","getOutputData","registerAllReaders","readerMap","readImageArrayBuffer","commonViewCustomizations","delayedRender","renderWindow","openglRenderWindow","invokeResize","blocking","orientationWidget","updateMarkerOrientation","representations","removeViewProp","cornerAnnotation","vtkLPSView3DProxy","vtkViewProxy","vtkLPSView2DProxy","bindRepresentationToManipulator","boundsToUse","slicingMode","count","viewUpAxis","w","getSize","bw","bh","viewAspect","boundsAspect","vtkView2DProxy","SLICE_MODE_MAP","X","Y","Z","I","J","K","vtkIJKSliceRepresentationProxy","modeString","vtkSliceRepresentationProxy","modelKey","InterpolationType","ImagePropertyConstants","vtkLabelMapSliceRepProxy","labelMapSub","setUseLookupTableScalarRange","setInterpolationType","NEAREST","setRelativeCoincidentTopologyPolygonOffsetParameters","cachedColorMap","updateTransferFunctions","getColorMap","label","l","addRGBPoint","addPoint","sourceDependencies","createProxyDefinition","classFactory","ui","links","definitionOptions","createDefaultView","definitions","Proxy","LookupTable","PiecewiseFunction","Sources","TrivialProducer","vtkSourceProxy","Representations","ImageSlice","LabelMapSlice","vtkVolumeRepresentationProxy","Geometry","vtkGeometryRepresentationProxy","Views","View3D","View2D","vtkPolyData","START_ID","IDGenerator","reset","generateContour","stencil","xdim","ydim","xoffset","yoffset","gridxdim","gridydim","vertices","vertexMap","getOrCreateVertexIndex","indexCoords","val","getStampPixelAt","pixels","gy","gx","v0","v1","Float32Array","Uint16Array","vtkPaintBrushContextRepresentation","internalPolyData","mtime","internalArrays","getPoints","getLines","pipelines","brush","vtkMapper2D","transformCoordinate","vtkCoordinate","coordinateSystem","Coordinate","vtkActor2D","parentProp","actorProperty","setLineWidth","setDisplayLocation","DisplayLocation","setRepresentation","Representation","vtkWidgetRepresentation","addActor","requestData","inData","outData","getStencil","contour","setData","defaultScale","drawBorder","drawFace","vtkContextRepresentation","isPainting","handleMouseWheel","vtkPaintWidget","methodsToLink","rasterizeEllipse","xdiam","ydiam","putPixel","blitLine","x0","x1","start","end","fill","y0","y1","b1","e2","EllipsePaintBrush","recomputeStencil","setScale","scaledSize","cachedStencil","updateWidgetStencil","setStencil","startPoint","endPoint","ijkSlice","labelmapPixels","labelmapDims","jStride","kStride","isInBounds","centerX","centerY","rounded","curPoint","ydelta","xdelta","pixelOffset","steps","incX","incY","listeners","factories","mitt","teardown","clear","stop","createStoreUpdater","CorePiniaProviderPlugin","proxies","dependencies","patchExitPointerLock","exitPointerLock","VueCompositionAPI","VueToast","PiniaVuePlugin","vtkMapper","vtkImageMapper","vtkProxyManager","proxyConfiguration","pinia","createPinia","use","app","ProxyManager","App","$mount","itkConfig","pipelineWorkerUrl","imageIOUrl","meshIOUrl","pipelinesUrl","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","__webpack_modules__","amdD","amdO","O","chunkIds","priority","notFulfilled","fulfilled","every","r","n","getter","__esModule","definition","defineProperty","enumerable","u","chunkId","g","Function","prototype","hasOwnProperty","toStringTag","nmd","baseURI","self","href","installedChunks","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}