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
@@ -1,144 +0,0 @@
1
- import { defineStore } from 'pinia';
2
- import Vue from 'vue';
3
-
4
- export enum MessageType {
5
- Error,
6
- Warning,
7
- Info,
8
- Success,
9
- }
10
-
11
- export type MessageOptions = {
12
- details?: string;
13
- persist?: boolean;
14
- };
15
-
16
- export interface Message {
17
- id: string;
18
- type: MessageType;
19
- title: string;
20
- options: MessageOptions;
21
- }
22
-
23
- export type UpdateProgressFunction = (progress: number) => void;
24
- export type TaskFunction = (updateProgress?: UpdateProgressFunction) => any;
25
- interface State {
26
- _nextID: number;
27
- byID: Record<string, Message>;
28
- msgList: string[];
29
- }
30
-
31
- export const useMessageStore = defineStore('message', {
32
- state: (): State => ({
33
- _nextID: 1,
34
- byID: {},
35
- msgList: [],
36
- }),
37
- getters: {
38
- messages(): Array<Message> {
39
- return this.msgList.map((id: string) => this.byID[id]);
40
- },
41
- // only info, error, warn
42
- importantMessages(): Array<Message> {
43
- return this.messages.filter((msg) => msg.type !== MessageType.Success);
44
- },
45
- },
46
- actions: {
47
- /**
48
- * Adds an error message.
49
- * @param title message title
50
- * @param opts an Error, a string containing details, or a MessageOptions
51
- */
52
- addError(title: string, opts?: Error | string | MessageOptions) {
53
- if (opts instanceof Error) {
54
- return this._addMessage(
55
- {
56
- type: MessageType.Error,
57
- title,
58
- },
59
- {
60
- details: String(opts),
61
- persist: false,
62
- }
63
- );
64
- }
65
- return this._addMessage(
66
- {
67
- type: MessageType.Error,
68
- title,
69
- },
70
- opts
71
- );
72
- },
73
- /**
74
- * Adds a warning message.
75
- * @param title message title
76
- * @param opts a string containing details or a MessageOptions
77
- */
78
- addWarning(title: string, details?: string | MessageOptions) {
79
- return this._addMessage(
80
- {
81
- type: MessageType.Warning,
82
- title,
83
- },
84
- details
85
- );
86
- },
87
- /**
88
- * Adds a success message.
89
- * @param title message title
90
- * @param opts a string containing details or a MessageOptions
91
- */
92
- addInfo(title: string, details?: string | MessageOptions) {
93
- return this._addMessage(
94
- {
95
- type: MessageType.Info,
96
- title,
97
- },
98
- details
99
- );
100
- },
101
- /**
102
- * Adds a success message.
103
- * @param title message title
104
- * @param opts a string containing details or a MessageOptions
105
- */
106
- addSuccess(title: string, details?: string | MessageOptions) {
107
- return this._addMessage(
108
- {
109
- type: MessageType.Success,
110
- title,
111
- },
112
- details
113
- );
114
- },
115
- clearOne(id: string) {
116
- if (id in this.byID) {
117
- Vue.delete(this.byID, id);
118
- const idx = this.msgList.indexOf(id);
119
- this.msgList.splice(idx, 1);
120
- }
121
- },
122
- clearAll() {
123
- this.byID = {};
124
- this.msgList = [];
125
- },
126
- _addMessage(
127
- msg: Omit<Message, 'id' | 'options'>,
128
- details?: string | MessageOptions
129
- ) {
130
- const id = String(this._nextID++);
131
- const options: MessageOptions = {
132
- persist: false,
133
- ...(typeof details === 'string' ? { details } : details),
134
- };
135
- Vue.set(this.byID, id, {
136
- ...msg,
137
- options,
138
- id,
139
- });
140
- this.msgList.push(id);
141
- return id;
142
- },
143
- },
144
- });
@@ -1,136 +0,0 @@
1
- import { getImageSpatialExtent } from '@/src/composables/useCurrentImage';
2
- import { LPSAxis } from '@/src/types/lps';
3
- import { getAxisBounds } from '@/src/utils/lps';
4
- import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';
5
- import { Vector2, Vector3 } from '@kitware/vtk.js/types';
6
- import { computed, reactive, readonly, set, unref } from '@vue/composition-api';
7
- import { MaybeRef } from '@vueuse/core';
8
- import { vec3 } from 'gl-matrix';
9
- import { defineStore } from 'pinia';
10
- import { ImageMetadata, useImageStore } from '../datasets-images';
11
- import { LPSCroppingPlanes } from './types';
12
- import { StateFile, Manifest } from '../../io/state-file/schema';
13
-
14
- function clampRangeToBounds(range: Vector2, bounds: Vector2) {
15
- return [
16
- Math.max(bounds[0], Math.min(bounds[1], range[0])),
17
- Math.max(bounds[0], Math.min(bounds[1], range[1])),
18
- ] as Vector2;
19
- }
20
-
21
- function convertCropBoundsToVTKPlane(
22
- cropBounds: LPSCroppingPlanes,
23
- metadata: ImageMetadata,
24
- axis: LPSAxis,
25
- lowerUpper: 0 | 1
26
- ) {
27
- const { indexToWorld, orientation, lpsOrientation: lpsDirs } = metadata;
28
-
29
- const origin = [0, 0, 0] as Vector3;
30
- const axisIndex = lpsDirs[axis];
31
- origin[axisIndex] = cropBounds[axis][lowerUpper];
32
- vec3.transformMat4(origin, origin, indexToWorld);
33
-
34
- // The lower bound normal is the associated column in the
35
- // image orientation matrix. The upper bound normal is the
36
- // lower bound normal, but negated.
37
- const neg = -(lowerUpper * 2 - 1);
38
- const normal = [
39
- ...orientation.slice(axisIndex * 3, axisIndex * 3 + 3).map((c) => c * neg),
40
- ] as Vector3;
41
-
42
- return vtkPlane.newInstance({ origin, normal });
43
- }
44
-
45
- export const useCropStore = defineStore('crop', () => {
46
- const imageStore = useImageStore();
47
-
48
- const state = reactive({
49
- croppingByImageID: {} as Record<string, LPSCroppingPlanes>,
50
- });
51
-
52
- const getComputedVTKPlanes = (imageID: MaybeRef<string | null>) =>
53
- computed(() => {
54
- const id = unref(imageID);
55
- if (id && id in state.croppingByImageID && id in imageStore.metadata) {
56
- const cropBounds = state.croppingByImageID[id];
57
- const metadata = imageStore.metadata[id];
58
- return [
59
- convertCropBoundsToVTKPlane(cropBounds, metadata, 'Sagittal', 0),
60
- convertCropBoundsToVTKPlane(cropBounds, metadata, 'Sagittal', 1),
61
- convertCropBoundsToVTKPlane(cropBounds, metadata, 'Coronal', 0),
62
- convertCropBoundsToVTKPlane(cropBounds, metadata, 'Coronal', 1),
63
- convertCropBoundsToVTKPlane(cropBounds, metadata, 'Axial', 0),
64
- convertCropBoundsToVTKPlane(cropBounds, metadata, 'Axial', 1),
65
- ];
66
- }
67
- return null;
68
- });
69
-
70
- const clampCroppingPlanes = (
71
- imageID: string,
72
- planes: LPSCroppingPlanes
73
- ): LPSCroppingPlanes => {
74
- const lpsBounds = getImageSpatialExtent(imageID);
75
- // if perf becomes an issue, change this to modify the planes arg
76
- return {
77
- Sagittal: clampRangeToBounds(planes.Sagittal, lpsBounds.Sagittal),
78
- Coronal: clampRangeToBounds(planes.Coronal, lpsBounds.Coronal),
79
- Axial: clampRangeToBounds(planes.Axial, lpsBounds.Axial),
80
- };
81
- };
82
-
83
- const setCropping = (imageID: string, planes: LPSCroppingPlanes) => {
84
- set(state.croppingByImageID, imageID, clampCroppingPlanes(imageID, planes));
85
- };
86
-
87
- const setCroppingForAxis = (
88
- imageID: string,
89
- axis: LPSAxis,
90
- planes: Vector2
91
- ) => {
92
- if (imageID in state.croppingByImageID) {
93
- setCropping(imageID, {
94
- ...state.croppingByImageID[imageID],
95
- [axis]: planes,
96
- });
97
- }
98
- };
99
-
100
- const resetCropping = (imageID: string) => {
101
- const image = imageStore.dataIndex[imageID];
102
- if (!image) return;
103
-
104
- const { lpsOrientation } = imageStore.metadata[imageID];
105
- const extent = image.getSpatialExtent();
106
- setCropping(imageID, {
107
- Sagittal: getAxisBounds(extent, 'Sagittal', lpsOrientation),
108
- Coronal: getAxisBounds(extent, 'Coronal', lpsOrientation),
109
- Axial: getAxisBounds(extent, 'Axial', lpsOrientation),
110
- });
111
- };
112
-
113
- function serialize(stateFile: StateFile) {
114
- const { tools } = stateFile.manifest;
115
- tools.crop = state.croppingByImageID;
116
- }
117
-
118
- function deserialize(manifest: Manifest, dataIDMap: Record<string, string>) {
119
- const cropping = manifest.tools.crop;
120
-
121
- Object.entries(cropping).forEach(([imageID, planes]) => {
122
- const newImageID = dataIDMap[imageID];
123
- setCropping(newImageID, planes);
124
- });
125
- }
126
-
127
- return {
128
- croppingByImageID: readonly(state.croppingByImageID),
129
- getComputedVTKPlanes,
130
- setCropping,
131
- setCroppingForAxis,
132
- resetCropping,
133
- serialize,
134
- deserialize,
135
- };
136
- });
@@ -1,131 +0,0 @@
1
- import { useCurrentImage } from '@/src/composables/useCurrentImage';
2
- import vtkCrosshairsWidget from '@/src/vtk/CrosshairsWidget';
3
- import { Bounds, Vector3 } from '@kitware/vtk.js/types';
4
- import { inflate } from '@kitware/vtk.js/Common/DataModel/BoundingBox';
5
- import { computed, ref, unref, watch } from '@vue/composition-api';
6
- import { vec3 } from 'gl-matrix';
7
- import { defineStore } from 'pinia';
8
- import { getLPSAxisFromDir } from '@/src/utils/lps';
9
- import { Manifest, StateFile } from '@/src/io/state-file/schema';
10
- import { useViewConfigStore } from '../view-configs';
11
- import { useViewStore } from '../views';
12
-
13
- export const useCrosshairsToolStore = defineStore('crosshairs', () => {
14
- type _This = ReturnType<typeof useCrosshairsToolStore>;
15
-
16
- const factory = vtkCrosshairsWidget.newInstance();
17
- const widgetState = factory.getWidgetState();
18
- const handle = widgetState.getHandle();
19
-
20
- const active = ref(false);
21
- const { currentImageID, currentImageMetadata } = useCurrentImage();
22
-
23
- // world-space
24
- const position = ref<Vector3>([0, 0, 0]);
25
- // image space
26
- const imagePosition = computed(() => {
27
- const out = vec3.create();
28
- vec3.transformMat4(
29
- out,
30
- position.value,
31
- currentImageMetadata.value.worldToIndex
32
- );
33
- return out as Vector3;
34
- });
35
-
36
- const viewConfigStore = useViewConfigStore();
37
- const viewStore = useViewStore();
38
-
39
- // only gets views that have a slicing config
40
- const currentViewIDs = computed(() => {
41
- const imageID = unref(currentImageID);
42
- if (imageID) {
43
- return viewStore.viewIDs.filter(
44
- (viewID) => !!viewConfigStore.getSliceConfig(viewID, imageID)
45
- );
46
- }
47
- return [];
48
- });
49
-
50
- function getWidgetFactory(this: _This) {
51
- return factory;
52
- }
53
-
54
- function setPosition(pos: Vector3) {
55
- position.value = pos;
56
- }
57
-
58
- // update the slicing
59
- watch(imagePosition, (indexPos) => {
60
- if (active.value) {
61
- const imageID = unref(currentImageID);
62
- const { lpsOrientation } = unref(currentImageMetadata);
63
-
64
- if (!imageID) {
65
- return;
66
- }
67
-
68
- currentViewIDs.value.forEach((viewID) => {
69
- const sliceConfig = viewConfigStore.getSliceConfig(viewID, imageID);
70
- const axis = getLPSAxisFromDir(sliceConfig!.axisDirection);
71
- const index = lpsOrientation[axis];
72
- const slice = Math.round(indexPos[index]);
73
- viewConfigStore.updateSliceConfig(viewID, imageID, { slice });
74
- });
75
- }
76
- });
77
-
78
- // update widget state based on current image
79
- watch(
80
- currentImageMetadata,
81
- (metadata) => {
82
- widgetState.setIndexToWorld(metadata.indexToWorld);
83
- widgetState.setWorldToIndex(metadata.worldToIndex);
84
- const [xDim, yDim, zDim] = metadata.dimensions;
85
- const imageBounds: Bounds = [0, xDim - 1, 0, yDim - 1, 0, zDim - 1];
86
- // inflate by 0.5, since the image slice rendering is inflated
87
- // by 0.5.
88
- handle.setBounds(inflate(imageBounds, 0.5));
89
- },
90
- { immediate: true }
91
- );
92
-
93
- // update the position
94
- handle.onModified(() => {
95
- const origin = handle.getOrigin();
96
- if (origin) {
97
- position.value = origin;
98
- }
99
- });
100
-
101
- function activateTool() {
102
- widgetState.setPlaced(false);
103
- active.value = true;
104
- return true;
105
- }
106
-
107
- function deactivateTool() {
108
- active.value = false;
109
- }
110
-
111
- function serialize(state: StateFile) {
112
- const { crosshairs } = state.manifest.tools;
113
- crosshairs.position = position.value;
114
- }
115
-
116
- function deserialize(manifest: Manifest) {
117
- const { crosshairs } = manifest.tools;
118
- position.value = crosshairs.position;
119
- }
120
-
121
- return {
122
- getWidgetFactory,
123
- setPosition,
124
- position,
125
- imagePosition,
126
- activateTool,
127
- deactivateTool,
128
- serialize,
129
- deserialize,
130
- };
131
- });
@@ -1,95 +0,0 @@
1
- import { Manifest, StateFile } from '@/src/io/state-file/schema';
2
- import { defineStore } from 'pinia';
3
- import { useCropStore } from './crop';
4
- import { useCrosshairsToolStore } from './crosshairs';
5
- import { usePaintToolStore } from './paint';
6
- import { useRulerStore } from './rulers';
7
- import { Tools } from './types';
8
-
9
- interface State {
10
- currentTool: Tools;
11
- }
12
-
13
- export interface IToolStore {
14
- activateTool: () => boolean;
15
- deactivateTool: () => void;
16
- }
17
-
18
- function getStore(tool: Tools): IToolStore | null {
19
- if (tool === Tools.Ruler) {
20
- return useRulerStore();
21
- }
22
- if (tool === Tools.Paint) {
23
- return usePaintToolStore();
24
- }
25
- if (tool === Tools.Crosshairs) {
26
- return useCrosshairsToolStore();
27
- }
28
- return null;
29
- }
30
-
31
- /**
32
- * Returns true if the tool is ready to be
33
- * activated. By default, a tool without a
34
- * store setup() will be activated.
35
- */
36
- function setupTool(tool: Tools) {
37
- const store = getStore(tool);
38
- if (store) {
39
- return store.activateTool();
40
- }
41
- return true;
42
- }
43
-
44
- function teardownTool(tool: Tools) {
45
- const store = getStore(tool);
46
- if (store) {
47
- store.deactivateTool();
48
- }
49
- }
50
-
51
- export const useToolStore = defineStore('tool', {
52
- state: (): State => ({
53
- currentTool: Tools.WindowLevel,
54
- }),
55
- actions: {
56
- setCurrentTool(tool: Tools) {
57
- if (!setupTool(tool)) {
58
- return;
59
- }
60
- teardownTool(this.currentTool);
61
- this.currentTool = tool;
62
- },
63
- serialize(state: StateFile) {
64
- const { tools } = state.manifest;
65
- const rulerStore = useRulerStore();
66
- const crosshairsStore = useCrosshairsToolStore();
67
- const paintStore = usePaintToolStore();
68
- const cropStore = useCropStore();
69
-
70
- rulerStore.serialize(state);
71
- crosshairsStore.serialize(state);
72
- paintStore.serialize(state);
73
- cropStore.serialize(state);
74
-
75
- tools.current = this.currentTool;
76
- },
77
- deserialize(
78
- manifest: Manifest,
79
- labelmapIDMap: Record<string, string>,
80
- dataIDMap: Record<string, string>
81
- ) {
82
- const { tools } = manifest;
83
- const rulerStore = useRulerStore();
84
- const crosshairsStore = useCrosshairsToolStore();
85
- const paintStore = usePaintToolStore();
86
- const cropStore = useCropStore();
87
-
88
- rulerStore.deserialize(manifest);
89
- crosshairsStore.deserialize(manifest);
90
- paintStore.deserialize(manifest, labelmapIDMap);
91
- cropStore.deserialize(manifest, dataIDMap);
92
- this.currentTool = tools.current;
93
- },
94
- },
95
- });
@@ -1,191 +0,0 @@
1
- import { Vector2 } from '@kitware/vtk.js/types';
2
- import { useCurrentImage } from '@/src/composables/useCurrentImage';
3
- import { Manifest, StateFile } from '@/src/io/state-file/schema';
4
- import { computed, ref, watch } from '@vue/composition-api';
5
- import { vec3 } from 'gl-matrix';
6
- import { defineStore } from 'pinia';
7
- import { Tools } from './types';
8
- import { useLabelmapStore } from '../datasets-labelmaps';
9
-
10
- const DEFAULT_BRUSH_SIZE = 4;
11
- const DEFAULT_BRUSH_VALUE = 1;
12
-
13
- export const usePaintToolStore = defineStore('paint', () => {
14
- type _This = ReturnType<typeof usePaintToolStore>;
15
-
16
- const activeLabelmapID = ref<string | null>(null);
17
- const brushSize = ref(DEFAULT_BRUSH_SIZE);
18
- const brushValue = ref(DEFAULT_BRUSH_VALUE);
19
- const strokePoints = ref<vec3[]>([]);
20
- const labelmapOpacity = ref(1);
21
- const isActive = ref(false);
22
-
23
- const { currentImageID } = useCurrentImage();
24
-
25
- function getWidgetFactory(this: _This) {
26
- return this.$paint.factory;
27
- }
28
-
29
- const activeLabelmap = computed(() => {
30
- if (!activeLabelmapID.value) return null;
31
- const labelmapStore = useLabelmapStore();
32
- return labelmapStore.labelmaps[activeLabelmapID.value] ?? null;
33
- });
34
-
35
- // --- actions --- //
36
-
37
- function selectOrCreateLabelmap(imageID: string | null) {
38
- if (!imageID) {
39
- activeLabelmapID.value = null;
40
- return;
41
- }
42
-
43
- const labelmapStore = useLabelmapStore();
44
- const found = Object.entries(labelmapStore.parentImage).find(
45
- ([, parentID]) => imageID === parentID
46
- );
47
- if (found) {
48
- [activeLabelmapID.value] = found;
49
- } else {
50
- activeLabelmapID.value = labelmapStore.newLabelmapFromImage(imageID);
51
- }
52
- }
53
-
54
- function setBrushSize(this: _This, size: number) {
55
- brushSize.value = Math.round(size);
56
- this.$paint.setBrushSize(size);
57
- }
58
-
59
- function setBrushValue(this: _This, value: number) {
60
- brushValue.value = value;
61
- this.$paint.setBrushValue(value);
62
- }
63
-
64
- function setLabelmapOpacity(opacity: number) {
65
- labelmapOpacity.value = Math.min(1, Math.max(0, opacity));
66
- }
67
-
68
- function doPaintStroke(this: _This, axisIndex: 0 | 1 | 2) {
69
- if (!activeLabelmap.value) {
70
- return;
71
- }
72
-
73
- const lastIndex = strokePoints.value.length - 1;
74
- if (lastIndex >= 0) {
75
- const lastPoint = strokePoints.value[lastIndex];
76
- const prevPoint =
77
- lastIndex >= 1 ? strokePoints.value[lastIndex - 1] : undefined;
78
- this.$paint.paintLabelmap(
79
- activeLabelmap.value,
80
- axisIndex,
81
- lastPoint,
82
- prevPoint
83
- );
84
- }
85
- }
86
-
87
- function setSliceAxis(this: _This, axisIndex: 0 | 1 | 2) {
88
- if (!activeLabelmap.value) return;
89
- const spacing = activeLabelmap.value.getSpacing();
90
- spacing.splice(axisIndex, 1);
91
- const scale: Vector2 = [1 / spacing[0], 1 / spacing[1]];
92
- this.$paint.setBrushScale(scale);
93
- }
94
-
95
- function startStroke(this: _This, indexPoint: vec3, axisIndex: 0 | 1 | 2) {
96
- strokePoints.value = [vec3.clone(indexPoint)];
97
- doPaintStroke.call(this, axisIndex);
98
- }
99
-
100
- function placeStrokePoint(
101
- this: _This,
102
- indexPoint: vec3,
103
- axisIndex: 0 | 1 | 2
104
- ) {
105
- strokePoints.value.push(indexPoint);
106
- doPaintStroke.call(this, axisIndex);
107
- }
108
-
109
- function endStroke(this: _This, indexPoint: vec3, axisIndex: 0 | 1 | 2) {
110
- strokePoints.value.push(indexPoint);
111
- doPaintStroke.call(this, axisIndex);
112
- }
113
-
114
- // --- setup and teardown --- //
115
-
116
- function activateTool(this: _This) {
117
- const imageID = currentImageID.value;
118
- if (!imageID) {
119
- return false;
120
- }
121
- selectOrCreateLabelmap(imageID);
122
- this.$paint.setBrushSize(this.brushSize);
123
-
124
- isActive.value = true;
125
- return true;
126
- }
127
-
128
- function deactivateTool() {
129
- activeLabelmapID.value = null;
130
- isActive.value = false;
131
- }
132
-
133
- function serialize(state: StateFile) {
134
- const { paint } = state.manifest.tools;
135
-
136
- paint.activeLabelmapID = activeLabelmapID.value;
137
- paint.brushSize = brushSize.value;
138
- paint.brushValue = brushValue.value;
139
- paint.labelmapOpacity = labelmapOpacity.value;
140
- }
141
-
142
- function deserialize(
143
- this: _This,
144
- manifest: Manifest,
145
- labelmapIDMap: Record<string, string>
146
- ) {
147
- const { paint } = manifest.tools;
148
- this.setBrushSize(paint.brushSize);
149
- this.setBrushValue(paint.brushValue);
150
- this.setLabelmapOpacity(paint.labelmapOpacity);
151
- isActive.value = manifest.tools.current === Tools.Paint;
152
-
153
- if (paint.activeLabelmapID !== null) {
154
- activeLabelmapID.value = labelmapIDMap[paint.activeLabelmapID];
155
- }
156
- }
157
-
158
- // --- change labelmap if paint is active --- //
159
-
160
- watch(currentImageID, (imageID) => {
161
- if (isActive.value) {
162
- selectOrCreateLabelmap(imageID);
163
- }
164
- });
165
-
166
- return {
167
- // state
168
- activeLabelmapID,
169
- brushSize,
170
- brushValue,
171
- strokePoints,
172
- labelmapOpacity,
173
- isActive,
174
-
175
- getWidgetFactory,
176
-
177
- activateTool,
178
- deactivateTool,
179
-
180
- selectOrCreateLabelmap,
181
- setBrushSize,
182
- setBrushValue,
183
- setLabelmapOpacity,
184
- setSliceAxis,
185
- startStroke,
186
- placeStrokePoint,
187
- endStroke,
188
- serialize,
189
- deserialize,
190
- };
191
- });