@3cr/viewer-browser 0.0.200 → 0.0.246

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 (383) hide show
  1. package/.circleci/config.yml +46 -22
  2. package/.prettierrc +6 -0
  3. package/components.d.ts +27 -10
  4. package/dist/Viewer3CR.js +36 -45
  5. package/dist/Viewer3CR.mjs +26893 -21667
  6. package/dist/Viewer3CR.umd.js +36 -45
  7. package/dist/android-chrome-192x192.png +0 -0
  8. package/dist/android-chrome-512x512.png +0 -0
  9. package/dist/apple-touch-icon.png +0 -0
  10. package/dist/browserconfig.xml +9 -0
  11. package/dist/favicon-16x16.png +0 -0
  12. package/dist/favicon-32x32.png +0 -0
  13. package/dist/favicon.ico +0 -0
  14. package/dist/mstile-144x144.png +0 -0
  15. package/dist/mstile-150x150.png +0 -0
  16. package/dist/mstile-310x150.png +0 -0
  17. package/dist/mstile-310x310.png +0 -0
  18. package/dist/mstile-70x70.png +0 -0
  19. package/dist/safari-pinned-tab.svg +50 -0
  20. package/dist/site.webmanifest +19 -0
  21. package/index.html +34 -41
  22. package/package.json +24 -20
  23. package/playground/android-chrome-192x192.png +0 -0
  24. package/playground/android-chrome-512x512.png +0 -0
  25. package/playground/apple-touch-icon.png +0 -0
  26. package/playground/browserconfig.xml +9 -0
  27. package/playground/favicon-16x16.png +0 -0
  28. package/playground/favicon-32x32.png +0 -0
  29. package/playground/favicon.ico +0 -0
  30. package/playground/index.html +30 -41
  31. package/playground/mstile-144x144.png +0 -0
  32. package/playground/mstile-150x150.png +0 -0
  33. package/playground/mstile-310x150.png +0 -0
  34. package/playground/mstile-310x310.png +0 -0
  35. package/playground/mstile-70x70.png +0 -0
  36. package/playground/safari-pinned-tab.svg +50 -0
  37. package/playground/site.webmanifest +19 -0
  38. package/playground/sw.js +15 -1
  39. package/public/android-chrome-192x192.png +0 -0
  40. package/public/android-chrome-512x512.png +0 -0
  41. package/public/apple-touch-icon.png +0 -0
  42. package/public/browserconfig.xml +9 -0
  43. package/public/favicon-16x16.png +0 -0
  44. package/public/favicon-32x32.png +0 -0
  45. package/public/favicon.ico +0 -0
  46. package/public/mstile-144x144.png +0 -0
  47. package/public/mstile-150x150.png +0 -0
  48. package/public/mstile-310x150.png +0 -0
  49. package/public/mstile-310x310.png +0 -0
  50. package/public/mstile-70x70.png +0 -0
  51. package/public/safari-pinned-tab.svg +50 -0
  52. package/public/site.webmanifest +19 -0
  53. package/src/App.vue +55 -50
  54. package/src/__tests__/app.spec.ts +7 -8
  55. package/{__tests__/index.spec.ts → src/__tests__/main.spec.ts} +5 -6
  56. package/src/assets/logos/3dicom/white-mini.svg +20 -0
  57. package/src/assets/logos/3dicom/white.svg +30 -0
  58. package/src/assets/styles.scss +18 -4
  59. package/src/components/demo/DemoPatientModal.vue +12 -22
  60. package/src/components/demo/__tests__/DemoModal.spec.ts +9 -8
  61. package/src/components/demo/__tests__/DemoPatientModal.spec.ts +11 -10
  62. package/src/components/demo/__tests__/options.spec.ts +1 -1
  63. package/src/components/demo/licence/DemoLicenceInfoModal.vue +11 -29
  64. package/src/components/demo/licence/__tests__/DemoLicenceEnableCloudStorageModal.spec.ts +11 -10
  65. package/src/components/demo/licence/__tests__/DemoLicenceInfoModal.spec.ts +21 -11
  66. package/src/components/demo/licence/__tests__/DemoLicenceSendToPartyModal.spec.ts +10 -10
  67. package/src/components/demo/licence/__tests__/DemoLicenceShareToMobileModal.spec.ts +14 -13
  68. package/src/components/demo/options.ts +74 -76
  69. package/src/components/demo/patient/DemoPatientInfoModal.vue +11 -29
  70. package/src/components/demo/patient/__tests__/DemoPatientEnableCloudStorageModal.spec.ts +11 -10
  71. package/src/components/demo/patient/__tests__/DemoPatientInfoModal.spec.ts +12 -11
  72. package/src/components/demo/patient/__tests__/DemoPatientSendToPartyModal.spec.ts +10 -10
  73. package/src/components/demo/patient/__tests__/DemoPatientShareToMobileModal.spec.ts +14 -13
  74. package/src/components/modal/ActionRail.vue +7 -11
  75. package/src/components/modal/AskAI.vue +35 -50
  76. package/src/components/modal/CloseViewerModal.vue +22 -57
  77. package/src/components/modal/MftpWebGL3DRModal.vue +230 -635
  78. package/src/components/modal/ViewerActionRail.vue +44 -39
  79. package/src/components/modal/ViewerNavigationDrawer.vue +10 -8
  80. package/src/components/modal/ViewerNavigationDrawerContent.vue +91 -49
  81. package/src/components/modal/ViewerNavigationDrawerFooter.vue +83 -63
  82. package/src/components/modal/ViewerNavigationDrawerHeader.vue +14 -44
  83. package/src/components/modal/ViewerScanView.vue +114 -0
  84. package/src/components/modal/WebGL3DR.vue +91 -0
  85. package/src/components/modal/__tests__/ActionRail.spec.ts +10 -0
  86. package/src/components/modal/__tests__/AskAI.spec.ts +33 -0
  87. package/src/components/modal/__tests__/CloseViewerModal.spec.ts +24 -14
  88. package/src/components/modal/__tests__/MftpWebGL3DRModal.spec.ts +147 -176
  89. package/src/components/modal/__tests__/ViewerActionRail.spec.ts +11 -0
  90. package/src/components/modal/__tests__/ViewerNavigationDrawer.spec.ts +10 -12
  91. package/src/components/modal/__tests__/ViewerNavigationDrawerContent.spec.ts +4 -22
  92. package/src/components/modal/__tests__/ViewerNavigationDrawerFooter.spec.ts +35 -32
  93. package/src/components/modal/__tests__/ViewerNavigationDrawerHeader.spec.ts +14 -11
  94. package/src/components/modal/__tests__/ViewerScanView.spec.ts +60 -0
  95. package/src/components/modal/__tests__/WebGL3DR.spec.ts +57 -0
  96. package/src/components/modal/actions/Flip3dAction.vue +1 -1
  97. package/src/components/modal/actions/FlipHorizontalAction.vue +5 -10
  98. package/src/components/modal/actions/FlipVerticalAction.vue +5 -10
  99. package/src/components/modal/actions/FullscreenAction.vue +6 -11
  100. package/src/components/modal/actions/NavigationCubeAction.vue +7 -14
  101. package/src/components/modal/actions/PanAction.vue +4 -4
  102. package/src/components/modal/actions/ResetViewAction.vue +1 -1
  103. package/src/components/modal/actions/Rotate2dAction.vue +8 -20
  104. package/src/components/modal/actions/Slice3dAction.vue +10 -32
  105. package/src/components/modal/actions/ZoomAction.vue +1 -1
  106. package/src/components/modal/actions/__tests__/Action.spec.ts +8 -9
  107. package/src/components/modal/actions/__tests__/Flip3dAction.spec.ts +6 -8
  108. package/src/components/modal/actions/__tests__/FlipHorizontalAction.spec.ts +6 -7
  109. package/src/components/modal/actions/__tests__/FlipVerticalAction.spec.ts +6 -7
  110. package/src/components/modal/actions/__tests__/FullscreenAction.spec.ts +9 -10
  111. package/src/components/modal/actions/__tests__/NavigationCubeAction.spec.ts +11 -11
  112. package/src/components/modal/actions/__tests__/PanAction.spec.ts +9 -10
  113. package/src/components/modal/actions/__tests__/ResetViewAction.spec.ts +7 -7
  114. package/src/components/modal/actions/__tests__/Rotate2dAction.spec.ts +6 -8
  115. package/src/components/modal/actions/__tests__/Slice3dAction.spec.ts +23 -5
  116. package/src/components/modal/actions/__tests__/ZoomAction.spec.ts +8 -10
  117. package/src/components/modal/buttons/AutoAnnotateBtn.vue +197 -0
  118. package/src/components/modal/buttons/__tests__/AutoAnnotateBtn.spec.ts +28 -0
  119. package/src/components/modal/menus/FileMenu.vue +73 -0
  120. package/src/components/modal/menus/SettingsMenu.vue +106 -0
  121. package/src/components/modal/menus/__tests__/FileMenu.spec.ts +110 -0
  122. package/src/components/modal/menus/__tests__/SettingsMenu.spec.ts +71 -0
  123. package/src/components/navigation/mcad/McadGlobalActions.vue +20 -0
  124. package/src/components/navigation/mcad/McadGlobalOpacitySlider.vue +103 -0
  125. package/src/components/navigation/mcad/McadGlobalScanViewBtn.vue +28 -0
  126. package/src/components/navigation/mcad/McadGlobalVisibilityBtn.vue +38 -0
  127. package/src/components/shared/DoubleSliderSelector.vue +142 -0
  128. package/src/components/{loading → shared}/LoadingSpinner.vue +27 -36
  129. package/src/components/shared/UpdateSnackbar.vue +72 -0
  130. package/src/components/{selectors → shared}/ValueSelector.vue +9 -12
  131. package/src/components/shared/__tests__/DoubleSliderSelector.spec.ts +83 -0
  132. package/src/components/shared/__tests__/LoadingSpinner.spec.ts +9 -0
  133. package/src/components/shared/__tests__/UpdateSnackbar.spec.ts +116 -0
  134. package/src/components/shared/__tests__/ValueSelector.spec.ts +39 -0
  135. package/src/components/shared/__tests__/VerticalSliderSelector.spec.ts +50 -0
  136. package/src/components/views/AnnotationTreeView.vue +236 -0
  137. package/src/components/{modal/ViewerDisplaySettings.vue → views/DisplaySettings.vue} +7 -15
  138. package/src/components/views/MarkupTreeView.vue +201 -0
  139. package/src/components/views/McadObjectTreeView.vue +129 -0
  140. package/src/components/views/__tests__/AnnotationTreeView.spec.ts +62 -0
  141. package/src/components/{modal/__tests__/ViewerDisplaySettings.spec.ts → views/__tests__/DisplaySettings.spec.ts} +24 -20
  142. package/src/components/views/__tests__/MarkupTreeView.spec.ts +41 -0
  143. package/src/components/views/__tests__/McadObjectTreeView.spec.ts +47 -0
  144. package/src/components/views/modals/DataOverlayGeneralModal.vue +71 -0
  145. package/src/components/views/modals/DataOverlayMarkupModal.vue +60 -0
  146. package/src/components/views/modals/DataOverlayModal.vue +88 -0
  147. package/src/components/views/shared/MaskIcon.vue +44 -0
  148. package/src/components/views/shared/ObjectColor.vue +31 -0
  149. package/src/components/views/shared/ObjectLabel.vue +30 -0
  150. package/src/components/views/shared/Opacity.vue +65 -0
  151. package/src/components/views/shared/VisibilityBtn.vue +25 -0
  152. package/src/components/views/shared/__tests__/MaskIcon.spec.ts +10 -0
  153. package/src/components/views/shared/__tests__/ObjectColor.spec.ts +10 -0
  154. package/src/components/views/shared/__tests__/ObjectLabel.spec.ts +10 -0
  155. package/src/components/views/shared/__tests__/Opacity.spec.ts +24 -0
  156. package/src/components/views/shared/__tests__/VisibilityBtn.spec.ts +11 -0
  157. package/src/components/views/types/annotation-tree-view-item-child-action.ts +6 -0
  158. package/src/components/views/types/annotation-tree-view-item-child.ts +9 -0
  159. package/src/components/views/types/annotation-tree-view-item.ts +13 -0
  160. package/src/components/views/types/markup-tree-view-item-child.ts +6 -0
  161. package/src/components/views/types/markup-tree-view-item.ts +14 -0
  162. package/src/components/views/types/mcad-object-tree-view-item.ts +13 -0
  163. package/src/composables/__tests__/useAnnotations.spec.ts +35 -0
  164. package/src/composables/__tests__/useEventListener.spec.ts +32 -0
  165. package/src/composables/__tests__/useIntroJs.spec.ts +51 -0
  166. package/src/composables/__tests__/useMarkups.spec.ts +39 -0
  167. package/src/composables/__tests__/useMcadObjects.spec.ts +36 -0
  168. package/src/composables/__tests__/useMouse.spec.ts +20 -0
  169. package/src/{components/modal/composables → composables}/__tests__/useNavigationCubeObserver.spec.ts +17 -12
  170. package/src/{dataLayer → composables}/__tests__/useViewer3cr.spec.ts +1 -2
  171. package/src/composables/useAnnotations.ts +37 -0
  172. package/src/composables/useDebounce.ts +11 -0
  173. package/src/composables/useEventListener.ts +25 -0
  174. package/src/composables/useIntroJs.ts +142 -0
  175. package/src/composables/useMarkups.ts +41 -0
  176. package/src/composables/useMcadObjects.ts +32 -0
  177. package/src/composables/useMouse.ts +14 -0
  178. package/src/{components/modal/composables → composables}/useNavigationCubeObserver.ts +35 -25
  179. package/src/composables/useScanMovement.ts +25 -0
  180. package/src/composables/useScanSliders.ts +36 -0
  181. package/src/composables/useVersion3cr.ts +7 -0
  182. package/src/composables/useViewer3cr.ts +7 -0
  183. package/src/composables/useViewerOptions.ts +36 -0
  184. package/src/{dataLayer → functions}/__tests__/clamp.spec.ts +1 -2
  185. package/src/functions/__tests__/layoutOverlayStyle.spec.ts +325 -0
  186. package/src/{helpers/__tests__/model-helper.spec.ts → functions/__tests__/modelHelper.spec.ts} +77 -40
  187. package/src/{notifications → functions}/__tests__/notification.spec.ts +19 -29
  188. package/src/functions/__tests__/parseAction.spec.ts +9 -0
  189. package/src/functions/__tests__/parseCallToAction.spec.ts +11 -0
  190. package/src/functions/__tests__/parseDataOverlay.spec.ts +15 -0
  191. package/src/functions/__tests__/parseDataOverlayData.spec.ts +9 -0
  192. package/src/functions/__tests__/parseDataOverlayEvent.spec.ts +10 -0
  193. package/src/functions/__tests__/parseMcadEvent.spec.ts +10 -0
  194. package/src/functions/guards/isDataOverlayAngle.ts +6 -0
  195. package/src/functions/guards/isDataOverlayLength.ts +6 -0
  196. package/src/functions/guards/isDataOverlayPolygon.ts +6 -0
  197. package/src/functions/layoutOverlayStyle.ts +84 -0
  198. package/src/{helpers → functions}/modelHelper.ts +81 -18
  199. package/src/functions/notification.ts +82 -0
  200. package/src/functions/parseAction.ts +9 -0
  201. package/src/functions/parseCallToAction.ts +9 -0
  202. package/src/functions/parseDataOverlay.ts +10 -0
  203. package/src/functions/parseDataOverlayData.ts +10 -0
  204. package/src/functions/parseDataOverlayEvent.ts +17 -0
  205. package/src/functions/parseMcadEvent.ts +10 -0
  206. package/src/functions/rgbaToCss.ts +13 -0
  207. package/src/main.ts +57 -9
  208. package/src/{dataLayer → models}/__tests__/eventHandlers.spec.ts +2 -3
  209. package/src/models/__tests__/loadViewerOptions.spec.ts +72 -0
  210. package/src/models/__tests__/loadViewerPayload.spec.ts +10 -0
  211. package/src/models/__tests__/scanState.spec.ts +190 -0
  212. package/src/models/callbacks.ts +4 -0
  213. package/src/models/loadViewerOptions.ts +79 -0
  214. package/src/models/loadViewerPayload.ts +17 -0
  215. package/src/{dataLayer → models}/scanState.ts +63 -74
  216. package/src/plugins/__tests__/usePlugins.spec.ts +12 -0
  217. package/src/plugins/__tests__/vuetify.spec.ts +3 -4
  218. package/src/plugins/usePlugins.ts +8 -0
  219. package/src/plugins/vuetify.ts +31 -65
  220. package/src/services/{gpt/__tests__ → __tests__}/gpt.service.spec.ts +2 -2
  221. package/src/services/__tests__/service-worker.service.spec.ts +32 -0
  222. package/src/{dataLayer/__tests__/viewer3cr.spec.ts → services/__tests__/viewer-3cr.service.spec.ts} +97 -36
  223. package/src/services/gpt.service.ts +17 -0
  224. package/src/services/service-worker.service.ts +16 -0
  225. package/src/{dataLayer/viewer3cr.ts → services/viewer-3cr.service.ts} +281 -150
  226. package/src/tools/data-overlay.tool.ts +71 -0
  227. package/src/types/action.ts +13 -0
  228. package/src/types/call-to-action.ts +9 -0
  229. package/src/types/colour.ts +6 -0
  230. package/src/types/data-overlay-angle.ts +16 -0
  231. package/src/types/data-overlay-annotation.ts +18 -0
  232. package/src/types/data-overlay-data.ts +15 -0
  233. package/src/types/data-overlay-event.ts +5 -0
  234. package/src/types/data-overlay-info.ts +18 -0
  235. package/src/types/data-overlay-interaction.ts +15 -0
  236. package/src/types/data-overlay-length.ts +16 -0
  237. package/src/types/data-overlay-markup.ts +7 -0
  238. package/src/types/data-overlay-mcad.ts +20 -0
  239. package/src/types/data-overlay-polygon.ts +18 -0
  240. package/src/types/data-overlay.ts +16 -0
  241. package/src/types/demo-type.ts +4 -0
  242. package/src/types/gpt-question.ts +4 -0
  243. package/src/types/gpt-response-payload.ts +6 -0
  244. package/src/types/mcad-object-interaction.ts +15 -0
  245. package/src/types/segment-angle.ts +5 -0
  246. package/src/types/vector2.ts +4 -0
  247. package/src/types/vector3.ts +5 -0
  248. package/test/fakers/action-data.faker.ts +11 -0
  249. package/test/fakers/action.faker.ts +19 -0
  250. package/test/fakers/call-to-action.faker.ts +17 -0
  251. package/test/fakers/colour.faker.ts +17 -0
  252. package/test/fakers/data-overlay-angle.faker.ts +37 -0
  253. package/test/fakers/data-overlay-annotation.faker.ts +41 -0
  254. package/test/fakers/data-overlay-data.faker.ts +97 -0
  255. package/test/fakers/data-overlay-info.faker.ts +29 -0
  256. package/test/fakers/data-overlay-interaction.faker.ts +62 -0
  257. package/test/fakers/data-overlay-length.faker.ts +37 -0
  258. package/test/fakers/data-overlay-mcad.faker.ts +40 -0
  259. package/test/fakers/data-overlay-polygon.faker.ts +39 -0
  260. package/test/fakers/gpt-question.faker.ts +11 -0
  261. package/test/fakers/gpt-response.faker.ts +12 -0
  262. package/test/fakers/invert-transform.faker.ts +16 -0
  263. package/test/fakers/mcad-object-interaction.faker.ts +22 -0
  264. package/test/fakers/orientation.faker.ts +17 -0
  265. package/test/fakers/segment-angle.faker.ts +12 -0
  266. package/test/fakers/vector2.faker.ts +12 -0
  267. package/test/fakers/vector3.faker.ts +16 -0
  268. package/test/plugins/findByTestId.ts +25 -0
  269. package/test/plugins/vuetify.ts +16 -0
  270. package/test/setup.ts +16 -5
  271. package/tsconfig.json +4 -15
  272. package/vite.config.mts +20 -46
  273. package/vitest.config.mts +24 -43
  274. package/index.ts +0 -72
  275. package/src/assets/images/dark/3DICOM.png +0 -0
  276. package/src/assets/images/dark/3dicom-logo.svg +0 -1
  277. package/src/assets/images/light/3DICOM.png +0 -0
  278. package/src/assets/images/light/3dicom-logo.svg +0 -1
  279. package/src/assets/logo.png +0 -0
  280. package/src/assets/logo.svg +0 -6
  281. package/src/components/WebGL3DR.vue +0 -102
  282. package/src/components/__tests__/webgl3dr.spec.ts +0 -37
  283. package/src/components/icons/liver.vue +0 -21
  284. package/src/components/loading/__tests__/loading-spinner.spec.ts +0 -11
  285. package/src/components/modal/ViewerAnnotationModal.vue +0 -111
  286. package/src/components/modal/ViewerAnnotations.vue +0 -289
  287. package/src/components/modal/__tests__/ViewerAnnotationModal.spec.ts +0 -79
  288. package/src/components/modal/composables/useEventListener.ts +0 -22
  289. package/src/components/selectors/__tests__/value-selector.spec.ts +0 -53
  290. package/src/components/sliders/DoubleSliderSelector.vue +0 -141
  291. package/src/components/sliders/__tests__/double-slider-selector.spec.ts +0 -104
  292. package/src/components/sliders/__tests__/vertical-slider-selector.spec.ts +0 -61
  293. package/src/dataLayer/__tests__/getIconForPreset.spec.ts +0 -40
  294. package/src/dataLayer/__tests__/patchDataOverlay.spec.ts +0 -88
  295. package/src/dataLayer/__tests__/scanState.spec.ts +0 -93
  296. package/src/dataLayer/getIconForPreset.ts +0 -11
  297. package/src/dataLayer/patchDataOverlay.ts +0 -101
  298. package/src/dataLayer/useViewer3cr.ts +0 -7
  299. package/src/helpers/__tests__/layout-overlay-style.spec.ts +0 -290
  300. package/src/helpers/__tests__/utils.spec.ts +0 -70
  301. package/src/helpers/layoutOverlayStyle.ts +0 -96
  302. package/src/helpers/utils.ts +0 -16
  303. package/src/models/Callbacks.ts +0 -2
  304. package/src/models/LoadViewerOptions.ts +0 -31
  305. package/src/models/LoadViewerPayload.ts +0 -9
  306. package/src/models/__tests__/load-viewer-options.spec.ts +0 -22
  307. package/src/notifications/notification.ts +0 -50
  308. package/src/plugins/__tests__/index.spec.ts +0 -19
  309. package/src/plugins/index.ts +0 -17
  310. package/src/services/gpt/gpt.service.ts +0 -35
  311. package/static/3cr-types-browser/index.ts +0 -74
  312. package/static/3cr-types-browser/types/Action.ts +0 -6
  313. package/static/3cr-types-browser/types/AlphaKeys.ts +0 -5
  314. package/static/3cr-types-browser/types/AnchorPoint.ts +0 -12
  315. package/static/3cr-types-browser/types/CallToAction.ts +0 -5
  316. package/static/3cr-types-browser/types/ColourData.ts +0 -7
  317. package/static/3cr-types-browser/types/ColourPresetData.ts +0 -9
  318. package/static/3cr-types-browser/types/CurrentDataOverlayState.ts +0 -6
  319. package/static/3cr-types-browser/types/CurrentScanState.ts +0 -22
  320. package/static/3cr-types-browser/types/DataOverlay.ts +0 -22
  321. package/static/3cr-types-browser/types/DataOverlayActions.ts +0 -14
  322. package/static/3cr-types-browser/types/DataOverlayData.ts +0 -8
  323. package/static/3cr-types-browser/types/DataOverlayEvent.ts +0 -8
  324. package/static/3cr-types-browser/types/DecryptionKey.ts +0 -4
  325. package/static/3cr-types-browser/types/DisplaySettings.ts +0 -10
  326. package/static/3cr-types-browser/types/EmptyPayload.ts +0 -3
  327. package/static/3cr-types-browser/types/EnumPayload.ts +0 -4
  328. package/static/3cr-types-browser/types/FileManagementActions.ts +0 -11
  329. package/static/3cr-types-browser/types/FlipValue.ts +0 -7
  330. package/static/3cr-types-browser/types/FrontEndInterfaces.ts +0 -14
  331. package/static/3cr-types-browser/types/GradientKeys.ts +0 -7
  332. package/static/3cr-types-browser/types/GreyscalePresetData.ts +0 -6
  333. package/static/3cr-types-browser/types/InitialDataOverlayState.ts +0 -6
  334. package/static/3cr-types-browser/types/InitialScanState.ts +0 -19
  335. package/static/3cr-types-browser/types/InteractionType.ts +0 -8
  336. package/static/3cr-types-browser/types/InteractivityActions.ts +0 -6
  337. package/static/3cr-types-browser/types/InteractivityState.ts +0 -4
  338. package/static/3cr-types-browser/types/InvertTransformData.ts +0 -6
  339. package/static/3cr-types-browser/types/LayoutActions.ts +0 -6
  340. package/static/3cr-types-browser/types/LayoutData.ts +0 -7
  341. package/static/3cr-types-browser/types/LoadDataSet.ts +0 -6
  342. package/static/3cr-types-browser/types/LoadSessionState.ts +0 -4
  343. package/static/3cr-types-browser/types/LocalLoadDataset.ts +0 -3
  344. package/static/3cr-types-browser/types/MovementData.ts +0 -7
  345. package/static/3cr-types-browser/types/NavigationCubeActions.ts +0 -8
  346. package/static/3cr-types-browser/types/NavigationCubeData.ts +0 -12
  347. package/static/3cr-types-browser/types/NavigationCubeTransform.ts +0 -9
  348. package/static/3cr-types-browser/types/NotificationPayload.ts +0 -7
  349. package/static/3cr-types-browser/types/NotificationsActions.ts +0 -6
  350. package/static/3cr-types-browser/types/Object.ts +0 -1
  351. package/static/3cr-types-browser/types/ObjectColour.ts +0 -7
  352. package/static/3cr-types-browser/types/ObjectIcon.ts +0 -5
  353. package/static/3cr-types-browser/types/ObjectInvert.ts +0 -7
  354. package/static/3cr-types-browser/types/ObjectSize.ts +0 -7
  355. package/static/3cr-types-browser/types/ObjectSize2D.ts +0 -7
  356. package/static/3cr-types-browser/types/ObjectVisible.ts +0 -5
  357. package/static/3cr-types-browser/types/PositionData.ts +0 -14
  358. package/static/3cr-types-browser/types/PresetsActions.ts +0 -4
  359. package/static/3cr-types-browser/types/RotationValue.ts +0 -7
  360. package/static/3cr-types-browser/types/ScanMovementActions.ts +0 -27
  361. package/static/3cr-types-browser/types/ScanMovementData.ts +0 -3
  362. package/static/3cr-types-browser/types/ScanOrientationActions.ts +0 -6
  363. package/static/3cr-types-browser/types/ScanStateActions.ts +0 -4
  364. package/static/3cr-types-browser/types/ScanView.ts +0 -6
  365. package/static/3cr-types-browser/types/SettingsData.ts +0 -12
  366. package/static/3cr-types-browser/types/SlicerData.ts +0 -9
  367. package/static/3cr-types-browser/types/SliderValue.ts +0 -4
  368. package/static/3cr-types-browser/types/SlidersActions.ts +0 -18
  369. package/static/3cr-types-browser/types/Vector2Data.ts +0 -5
  370. package/static/3cr-types-browser/types/Vector3Data.ts +0 -6
  371. package/static/3cr-types-browser/types/VectorMovementData.ts +0 -8
  372. package/static/3cr-types-browser/types/ViewInteractiveMode.ts +0 -5
  373. package/static/3cr-types-browser/types/ViewOrientation.ts +0 -8
  374. package/static/3cr-types-browser/types/ViewOrientations.ts +0 -10
  375. package/static/3cr-types-browser/types/ViewSelectionActions.ts +0 -9
  376. package/static/3cr-types-browser/types/ViewToggleData.ts +0 -7
  377. package/static/3cr-types-browser/types/VolumeOrientation.ts +0 -7
  378. package/test/helper.ts +0 -44
  379. /package/src/components/{sliders → shared}/VerticalSliderSelector.vue +0 -0
  380. /package/{config.ts → src/config.ts} +0 -0
  381. /package/src/{dataLayer → functions}/clamp.ts +0 -0
  382. /package/src/{dataLayer → models}/eventHandlers.ts +0 -0
  383. /package/{static/3cr-types-browser/types/ActionData.ts → src/types/action-data.ts} +0 -0
@@ -1,27 +1,50 @@
1
- import { FrontEndPayload } from "@3cr/sdk-browser/types/payload";
2
- import { createInstance, executePayload, registerOnPayloadHandler } from "@3cr/sdk-browser";
3
- import { unref } from "vue";
1
+ import { createInstance, executePayload, registerOnPayloadHandler } from '@3cr/sdk-browser';
2
+ import { unref } from 'vue';
4
3
  import {
5
4
  AnchorPoint,
6
- DataOverlayActions,
5
+ DataOverlaysActions,
7
6
  FileManagementActions,
8
- FrontEndInterfaces, InteractivityActions, LayoutActions, NavigationCubeActions, PresetsActions, ScanMovementActions,
7
+ FrontEndInterfaces,
8
+ InteractivityActions,
9
+ LayoutActions,
10
+ NavigationCubeActions,
11
+ PresetsActions,
12
+ ScanMovementActions,
9
13
  ScanOrientationActions,
10
- ScanView, SlidersActions, ViewSelectionActions
11
- } from "@3cr/types-ts";
12
- import { LoadViewerPayload } from "@/models/LoadViewerPayload";
13
- import { currentColourPreset, previousLayout, transactionStarted } from "@/dataLayer/scanState";
14
- import { toNumber } from "@/helpers/utils";
15
- import { EventHandlers } from "@/dataLayer/eventHandlers";
16
- import { clamp } from "@/dataLayer/clamp";
17
-
18
- type InterfaceCallback = (message: string, action: string) => void | Promise<void>;
19
-
20
- type ActionCallback = (message: string) => void | Promise<void>;
21
-
22
- export const emptyPayload = { Version: "1.1.0" };
23
-
24
- export class Viewer3cr {
14
+ ScanView,
15
+ SlidersActions,
16
+ ViewSelectionActions,
17
+ FrontEndPayload,
18
+ InteractivityState,
19
+ MarkupsActions,
20
+ McadActions,
21
+ ObjectBoolean,
22
+ ObjectColour,
23
+ ObjectInvert,
24
+ ObjectVisibility,
25
+ ViewToggleData,
26
+ GraphicType
27
+ } from '@3cr/types-ts';
28
+ import { LoadViewerPayload } from '@/models/loadViewerPayload';
29
+ import { currentColourPreset, previousLayout, transactionStarted } from '@/models/scanState';
30
+ import { EventHandlers } from '@/models/eventHandlers';
31
+ import { clamp } from '@/functions/clamp';
32
+ import { LoadSessionState } from '@3cr/types-ts/types/LoadSessionState';
33
+
34
+ type InterfaceCallback = (
35
+ message: string,
36
+ action: string,
37
+ returnChannel: string,
38
+ returnTo: string
39
+ ) => void | Promise<void>;
40
+
41
+ type ActionCallback = (message: string, returnChannel: string, returnTo: string) => void | Promise<void>;
42
+
43
+ export const emptyPayload = { Version: '1.1.0' };
44
+
45
+ type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
46
+
47
+ export class Viewer3crService {
25
48
  private interfaceCallbacks = new EventHandlers<string, InterfaceCallback>();
26
49
 
27
50
  private actionCallbacks = new EventHandlers<string, ActionCallback>();
@@ -48,29 +71,21 @@ export class Viewer3cr {
48
71
  }
49
72
 
50
73
  /**
51
- * DO-02: Toggle 2D annotation visibility.
52
- * @param id The annotation id.
53
- * @param visibility The annotation visibility.
74
+ * DO-03: Toggle 2D annotation visibility.
75
+ * @param value The object visibility
54
76
  */
55
- async toggle2dAnnotation(id: string, visibility: boolean): Promise<void> {
56
- await this.sendPayload(FrontEndInterfaces.data_overlay, DataOverlayActions.do03, {
57
- Version: '1.1.0',
58
- Id: id,
59
- Visibility: visibility
60
- });
77
+ async toggle2dAnnotation(value: Optional<ObjectVisibility, 'Version'>): Promise<void> {
78
+ value.Version ??= '1.1.0';
79
+ await this.sendPayload(FrontEndInterfaces.data_overlay, DataOverlaysActions.do03, value);
61
80
  }
62
81
 
63
82
  /**
64
83
  * DO-11: Toggle 3D annotation visibility.
65
- * @param id The annotation id.
66
- * @param visibility The annotation visibility.
67
- */
68
- async toggle3dAnnotation(id: string, visibility: boolean): Promise<void> {
69
- await this.sendPayload(FrontEndInterfaces.data_overlay, DataOverlayActions.do11, {
70
- Version: '1.1.0',
71
- Id: id,
72
- Visibility: visibility
73
- });
84
+ * @param value The object visibility
85
+ */
86
+ async toggle3dAnnotation(value: Optional<ObjectVisibility, 'Version'>): Promise<void> {
87
+ value.Version ??= '1.1.0';
88
+ await this.sendPayload(FrontEndInterfaces.data_overlay, DataOverlaysActions.do11, value);
74
89
  }
75
90
 
76
91
  /**
@@ -83,96 +98,60 @@ export class Viewer3cr {
83
98
 
84
99
  /**
85
100
  * FM-03: Load previous CurrentScanState values.
86
- * @param url The URL to the file.
101
+ * @param value The URL to the file.
87
102
  */
88
- async loadScanSession(url: string): Promise<void> {
89
- await this.sendPayload(FrontEndInterfaces.file_management, FileManagementActions.fm03, {
90
- Version: '1.1.0',
91
- Url: url
92
- });
103
+ async loadScanSession(value: Optional<LoadSessionState, 'Version'>): Promise<void> {
104
+ value.Version ??= '1.1.0';
105
+ await this.sendPayload(FrontEndInterfaces.file_management, FileManagementActions.fm03, value);
93
106
  }
94
107
 
95
108
  /**
96
- * FM-05: Load separate data overlay file from external UI.
97
- * @param url The URL to the file.
109
+ * FM-05: Sets the data overlay session with the given session file.
110
+ * This will clear all previously loaded data overlay sessions.
111
+ * @param value The URL to the file.
98
112
  */
99
- async loadDataOverlay(url: string): Promise<void> {
100
- await this.sendPayload(FrontEndInterfaces.file_management, FileManagementActions.fm05, {
101
- Version: '1.1.0',
102
- Url: url
103
- });
113
+ async setDataOverlaySession(value: Optional<LoadSessionState, 'Version'>): Promise<void> {
114
+ value.Version ??= '1.1.0';
115
+ await this.sendPayload(FrontEndInterfaces.file_management, FileManagementActions.fm05, value);
104
116
  }
105
117
 
106
118
  /**
107
- * FM-09: Load separate MCAD file from external UI.
108
- * @param url The URL to the file.
119
+ * FM-06: Adds a data overlay session to existing sessions.
120
+ * @param value The URL to the file.
109
121
  */
110
- async loadMcad(url: string): Promise<void> {
111
- await this.sendPayload(FrontEndInterfaces.file_management, 'fm_09', {
112
- Version: '1.1.0',
113
- Url: url
114
- });
115
- }
116
-
117
- /**
118
- * SO-01: Rotate 2D view by up to +-XXX degrees.
119
- * @param view The 2D view.
120
- * @param deg The degrees.
121
- */
122
- async rotateByDeg(view: ScanView, deg: number) {
123
- await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so01, {
124
- Version: "0.0.1",
125
- View: view,
126
- Angle: deg,
127
- });
128
- }
129
-
130
- /**
131
- * SO-02: Flip 2D View Horizontally.
132
- * @param view The scan view.
133
- * @param flipped Whether to enable horizontal flip.
134
- */
135
- async flipHorizontally(view: ScanView, flipped: boolean): Promise<void> {
136
- await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so02, {
137
- Version: "0.0.1",
138
- View: view,
139
- Flipped: flipped
140
- })
141
- }
142
-
143
- /**
144
- * SO-03: Flip 2D View Vertically.
145
- * @param view The scan view.
146
- * @param flipped Whether to enable vertical flip.
147
- */
148
- async flipVertically(view: ScanView, flipped: boolean): Promise<void> {
149
- await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so03, {
150
- Version: "0.0.1",
151
- View: view,
152
- Flipped: flipped
153
- });
122
+ async addDataOverlaySession(value: Optional<LoadSessionState, 'Version'>): Promise<void> {
123
+ value.Version ??= '1.1.0';
124
+ await this.sendPayload(FrontEndInterfaces.file_management, FileManagementActions.fm06, value);
154
125
  }
155
126
 
156
127
  /**
157
- * SO-04: Invert Volume Rendering
158
- * @param sagittal If the Sagittal axis is inverted.
159
- * @param coronal If the Coronal axis is inverted.
160
- * @param transverse If the Transverse axis is inverted.
128
+ * FM-09: Load separate MCAD file from external UI.
129
+ * @param value The URL to the file.
130
+ * @param returnChannel The return channel.
131
+ * @param returnTo The return to id.
161
132
  */
162
- async invertTransform(sagittal: boolean, coronal: boolean, transverse: boolean): Promise<void> {
163
- // TODO: Replace so_04 with action type constant
164
- await this.sendPayload(FrontEndInterfaces.scan_orientation, 'so_04', {
165
- Version: "0.0.1",
166
- InvertedSagittal: sagittal,
167
- InvertedCoronal: coronal,
168
- InvertedTransverse: transverse
169
- });
133
+ async loadMcadObjects(
134
+ value?: Optional<LoadSessionState, 'Version'>,
135
+ returnChannel?: string[],
136
+ returnTo?: string
137
+ ): Promise<void> {
138
+ await this.sendPayload(
139
+ FrontEndInterfaces.file_management,
140
+ FileManagementActions.fm09,
141
+ value,
142
+ returnChannel,
143
+ returnTo
144
+ );
170
145
  }
171
146
 
172
147
  async viewSelection(action: ViewSelectionActions) {
173
148
  await this.sendPayload(FrontEndInterfaces.view_selection, action, emptyPayload);
174
149
  }
175
150
 
151
+ async viewSelectionToggleView(payload: Optional<ViewToggleData, 'Version'>) {
152
+ await this.sendPayload(FrontEndInterfaces.view_selection, ViewSelectionActions.vs07, payload);
153
+ }
154
+
176
155
  async sliderHandler(action: SlidersActions, value: number) {
177
156
  if (unref(transactionStarted)) return;
178
157
  await this.slider(action, value);
@@ -195,6 +174,79 @@ export class Viewer3cr {
195
174
  }
196
175
  }
197
176
 
177
+ /**
178
+ * MC-03: Set visibility of MCAD objects.
179
+ * @param value The object visibility value.
180
+ */
181
+ async setMcadObjectVisibility(value: Optional<ObjectVisibility, 'Version'>): Promise<void> {
182
+ value.Version ??= '1.2.0';
183
+ await this.sendPayload(FrontEndInterfaces.mcad, McadActions.mc03, value);
184
+ }
185
+
186
+ /**
187
+ * MC-04: Set colour & opacity of MCAD objects.
188
+ * @param value The colour & opacity value.
189
+ */
190
+ async setMcadObjectColour(value: Optional<ObjectColour, 'Version'>): Promise<void> {
191
+ value.Version ??= '1.2.0';
192
+ await this.sendPayload(FrontEndInterfaces.mcad, McadActions.mc04, value);
193
+ }
194
+
195
+ /**
196
+ * MC-05: Enables movement of MCAD objects.
197
+ * @param value The movement toggle.
198
+ */
199
+ async moveMcadObject(value: Optional<ObjectBoolean, 'Version'>): Promise<void> {
200
+ value.Version ??= '1.2.0';
201
+ await this.sendPayload(FrontEndInterfaces.mcad, McadActions.mc05, value);
202
+ }
203
+
204
+ /**
205
+ * MC-16: Invert MCAD objects.
206
+ * @param value The inversion state.
207
+ */
208
+ async invertMcadObject(value: Optional<ObjectInvert, 'Version'>): Promise<void> {
209
+ value.Version ??= '1.2.0';
210
+ await this.sendPayload(FrontEndInterfaces.mcad, McadActions.mc16, value);
211
+ }
212
+
213
+ /**
214
+ * MU-16: Set 2D/3D visibility of markups.
215
+ * @param id The markup id.
216
+ * @param visibility The visibility state.
217
+ */
218
+ async setMarkupVisibility(id: string, visibility: boolean): Promise<void> {
219
+ const payload = { Version: '1.2.1', Id: id, Visibility2d: visibility, Visibility3d: visibility };
220
+ await this.sendPayload(FrontEndInterfaces.markups, MarkupsActions.mu16, [payload]);
221
+ }
222
+
223
+ /**
224
+ * MU-20: 2D length tool.
225
+ * @param value If the length tool should be enabled.
226
+ */
227
+ async lengthTool(value: Optional<InteractivityState, 'Version'>): Promise<void> {
228
+ value.Version ??= '1.2.0';
229
+ await this.sendPayload(FrontEndInterfaces.markups, MarkupsActions.mu20, value);
230
+ }
231
+
232
+ /**
233
+ * MU-21: 2D polygon tool.
234
+ * @param value If the polygon tool should be enabled.
235
+ */
236
+ async polygonTool(value: Optional<InteractivityState, 'Version'>): Promise<void> {
237
+ value.Version ??= '1.2.0';
238
+ await this.sendPayload(FrontEndInterfaces.markups, MarkupsActions.mu21, value);
239
+ }
240
+
241
+ /**
242
+ * MU-22: 2D angle tool.
243
+ * @param value If the angle tool should be enabled.
244
+ */
245
+ async angleTool(value: Optional<InteractivityState, 'Version'>): Promise<void> {
246
+ value.Version ??= '1.2.0';
247
+ await this.sendPayload(FrontEndInterfaces.markups, MarkupsActions.mu22, value);
248
+ }
249
+
198
250
  /**
199
251
  * NC-01: Set Navigation Cube Co-ordinates and Size.
200
252
  * @param anchorPoint The anchor point on the screen.
@@ -203,7 +255,13 @@ export class Viewer3cr {
203
255
  * @param width The navigation cube width.
204
256
  * @param height The navigation cube height.
205
257
  */
206
- async setNavCubePositionSize(anchorPoint: AnchorPoint, x: number, y: number, width: number, height: number): Promise<void> {
258
+ async setNavCubePositionSize(
259
+ anchorPoint: AnchorPoint,
260
+ x: number,
261
+ y: number,
262
+ width: number,
263
+ height: number
264
+ ): Promise<void> {
207
265
  await this.sendPayload(FrontEndInterfaces.navigation_cube, NavigationCubeActions.nc01, {
208
266
  Version: '0.0.1',
209
267
  AnchorPoint: anchorPoint,
@@ -218,8 +276,8 @@ export class Viewer3cr {
218
276
  */
219
277
  async setNavCubeVisibility(visibility: boolean): Promise<void> {
220
278
  await this.sendPayload(FrontEndInterfaces.navigation_cube, NavigationCubeActions.nc02, {
221
- Version: "0.0.1",
222
- Value: visibility,
279
+ Version: '0.0.1',
280
+ Value: visibility
223
281
  });
224
282
  }
225
283
 
@@ -254,8 +312,7 @@ export class Viewer3cr {
254
312
  * @param a Alpha channel.
255
313
  */
256
314
  async setNavCubeColourOpacity(r: number, g: number, b: number, a: number): Promise<void> {
257
- // TODO: Replace nc_05 with action type constant
258
- await this.sendPayload(FrontEndInterfaces.navigation_cube, 'nc_05', {
315
+ await this.sendPayload(FrontEndInterfaces.navigation_cube, NavigationCubeActions.nc05, {
259
316
  Version: '0.0.1',
260
317
  R: clamp(r / 255, 0, 1),
261
318
  G: clamp(g / 255, 0, 1),
@@ -273,8 +330,7 @@ export class Viewer3cr {
273
330
  * @param a Alpha channel.
274
331
  */
275
332
  async setNavCubeHighlightColourOpacity(r: number, g: number, b: number, a: number): Promise<void> {
276
- // TODO: Replace nc_07 with action type constant
277
- await this.sendPayload(FrontEndInterfaces.navigation_cube, 'nc_07', {
333
+ await this.sendPayload(FrontEndInterfaces.navigation_cube, NavigationCubeActions.nc07, {
278
334
  Version: '0.0.1',
279
335
  R: clamp(r / 255, 0, 1),
280
336
  G: clamp(g / 255, 0, 1),
@@ -283,17 +339,27 @@ export class Viewer3cr {
283
339
  });
284
340
  }
285
341
 
342
+ /**
343
+ * NC-08: Set Navigation Cube Face Graphics.
344
+ * @param type Face type of cube.
345
+ */
346
+ async setNavCubeGraphics(type: GraphicType): Promise<void> {
347
+ await this.sendPayload(FrontEndInterfaces.navigation_cube, NavigationCubeActions.nc08, {
348
+ Version: '0.0.1',
349
+ Value: type
350
+ });
351
+ }
352
+
286
353
  /**
287
354
  * SM-13: Pan the selected view to the left.
288
355
  * @param view The view.
289
356
  * @param value The movement in mm.
290
357
  */
291
358
  async panLeft(view: ScanView, value: number): Promise<void> {
292
- // TODO: Replace sm_13 with action type constant
293
- await this.sendPayload(FrontEndInterfaces.scan_movement, "sm_13", {
294
- Version: "0.0.1",
359
+ await this.sendPayload(FrontEndInterfaces.scan_movement, ScanMovementActions.sm13, {
360
+ Version: '0.0.1',
295
361
  View: view,
296
- Movement: value,
362
+ Movement: value
297
363
  });
298
364
  }
299
365
 
@@ -303,11 +369,10 @@ export class Viewer3cr {
303
369
  * @param value The movement in mm.
304
370
  */
305
371
  async panRight(view: ScanView, value: number): Promise<void> {
306
- // TODO: Replace sm_14 with action type constant
307
- await this.sendPayload(FrontEndInterfaces.scan_movement, "sm_14", {
308
- Version: "0.0.1",
372
+ await this.sendPayload(FrontEndInterfaces.scan_movement, ScanMovementActions.sm14, {
373
+ Version: '0.0.1',
309
374
  View: view,
310
- Movement: value,
375
+ Movement: value
311
376
  });
312
377
  }
313
378
 
@@ -317,11 +382,10 @@ export class Viewer3cr {
317
382
  * @param value The movement in mm.
318
383
  */
319
384
  async panUp(view: ScanView, value: number): Promise<void> {
320
- // TODO: Replace sm_15 with action type constant
321
- await this.sendPayload(FrontEndInterfaces.scan_movement, "sm_15", {
322
- Version: "0.0.1",
385
+ await this.sendPayload(FrontEndInterfaces.scan_movement, ScanMovementActions.sm15, {
386
+ Version: '0.0.1',
323
387
  View: view,
324
- Movement: value,
388
+ Movement: value
325
389
  });
326
390
  }
327
391
 
@@ -331,11 +395,10 @@ export class Viewer3cr {
331
395
  * @param value The movement in mm.
332
396
  */
333
397
  async panDown(view: ScanView, value: number): Promise<void> {
334
- // TODO: Replace sm_16 with action type constant
335
- await this.sendPayload(FrontEndInterfaces.scan_movement, "sm_16", {
336
- Version: "0.0.1",
398
+ await this.sendPayload(FrontEndInterfaces.scan_movement, ScanMovementActions.sm16, {
399
+ Version: '0.0.1',
337
400
  View: view,
338
- Movement: value,
401
+ Movement: value
339
402
  });
340
403
  }
341
404
 
@@ -345,8 +408,8 @@ export class Viewer3cr {
345
408
  * @param value The amount to zoom in.
346
409
  */
347
410
  async zoomIn(view: ScanView, value: number): Promise<void> {
348
- await this.sendPayload(FrontEndInterfaces.scan_movement, "sm_17", {
349
- Version: "0.0.1",
411
+ await this.sendPayload(FrontEndInterfaces.scan_movement, ScanMovementActions.sm17, {
412
+ Version: '0.0.1',
350
413
  View: view,
351
414
  Movement: value
352
415
  });
@@ -358,53 +421,121 @@ export class Viewer3cr {
358
421
  * @param value The amount to zoom out.
359
422
  */
360
423
  async zoomOut(view: ScanView, value: number): Promise<void> {
361
- await this.sendPayload(FrontEndInterfaces.scan_movement, "sm_18", {
362
- Version: "0.0.1",
424
+ await this.sendPayload(FrontEndInterfaces.scan_movement, ScanMovementActions.sm18, {
425
+ Version: '0.0.1',
363
426
  View: view,
364
427
  Movement: value
365
428
  });
366
429
  }
367
430
 
431
+ /**
432
+ * SO-01: Rotate 2D view by up to +-XXX degrees.
433
+ * @param view The 2D view.
434
+ * @param deg The degrees.
435
+ */
436
+ async rotateByDeg(view: ScanView, deg: number) {
437
+ await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so01, {
438
+ Version: '0.0.1',
439
+ View: view,
440
+ Angle: deg
441
+ });
442
+ }
443
+
444
+ /**
445
+ * SO-02: Flip 2D View Horizontally.
446
+ * @param view The scan view.
447
+ * @param flipped Whether to enable horizontal flip.
448
+ */
449
+ async flipHorizontally(view: ScanView, flipped: boolean): Promise<void> {
450
+ await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so02, {
451
+ Version: '0.0.1',
452
+ View: view,
453
+ Flipped: flipped
454
+ });
455
+ }
456
+
457
+ /**
458
+ * SO-03: Flip 2D View Vertically.
459
+ * @param view The scan view.
460
+ * @param flipped Whether to enable vertical flip.
461
+ */
462
+ async flipVertically(view: ScanView, flipped: boolean): Promise<void> {
463
+ await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so03, {
464
+ Version: '0.0.1',
465
+ View: view,
466
+ Flipped: flipped
467
+ });
468
+ }
469
+
470
+ /**
471
+ * SO-04: Invert Volume Rendering
472
+ * @param sagittal If the Sagittal axis is inverted.
473
+ * @param coronal If the Coronal axis is inverted.
474
+ * @param transverse If the Transverse axis is inverted.
475
+ */
476
+ async invertTransform(sagittal: boolean, coronal: boolean, transverse: boolean): Promise<void> {
477
+ await this.sendPayload(FrontEndInterfaces.scan_orientation, ScanOrientationActions.so04, {
478
+ Version: '0.0.1',
479
+ InvertedSagittal: sagittal,
480
+ InvertedCoronal: coronal,
481
+ InvertedTransverse: transverse
482
+ });
483
+ }
484
+
368
485
  /**
369
486
  * IN-01, IN-02: Enable/Disable Unity input interactions.
370
487
  * @param isHovering If the inputs should be enabled.
371
488
  */
372
489
  async hoverOverCanvas(isHovering: boolean) {
373
490
  await this.sendPayload(FrontEndInterfaces.interactivity, InteractivityActions.in01, {
374
- Version: "0.0.1",
375
- Value: isHovering,
491
+ Version: '0.0.1',
492
+ Value: isHovering
376
493
  });
377
494
  await this.sendPayload(FrontEndInterfaces.interactivity, InteractivityActions.in02, {
378
- Version: "0.0.1",
379
- Value: isHovering,
495
+ Version: '0.0.1',
496
+ Value: isHovering
380
497
  });
381
498
  }
382
499
 
383
500
  private async scanMovement(action: ScanMovementActions, value: number) {
384
501
  await this.sendPayload(FrontEndInterfaces.scan_movement, action, {
385
- Version: "0.0.1",
386
- Value: toNumber(value),
502
+ Version: '0.0.1',
503
+ Value: value
387
504
  });
388
505
  }
389
506
 
390
507
  private async slider(action: SlidersActions, value: number) {
391
508
  await this.sendPayload(FrontEndInterfaces.sliders, action, {
392
- Version: "0.0.1",
393
- Value: toNumber(value),
509
+ Version: '0.0.1',
510
+ Value: value
394
511
  });
395
512
  }
396
513
 
397
- async sendPayload(iface: string, action: string, message: any): Promise<void> {
514
+ async sendPayload(
515
+ iface: string,
516
+ action: string,
517
+ message: any,
518
+ returnChannel?: string[],
519
+ returnTo?: string
520
+ ): Promise<void> {
398
521
  await executePayload({
399
- Version: "0.0.1",
522
+ Version: '0.0.1',
400
523
  Interface: iface as any,
401
524
  Action: action as any,
402
- Message: JSON.stringify(message),
525
+ ReturnChannel: returnChannel ? JSON.stringify(returnChannel) : null,
526
+ ReturnTo: returnTo ?? null,
527
+ Message: JSON.stringify(message)
403
528
  });
404
529
  }
405
530
 
406
- private async onPayload(payload: FrontEndPayload): Promise<void> {
407
- await this.interfaceCallbacks.call(payload.Interface, payload.Message, payload.Action);
408
- await this.actionCallbacks.call(payload.Action, payload.Message);
531
+ async onPayload(payload: FrontEndPayload): Promise<void> {
532
+ await this.interfaceCallbacks.call(
533
+ payload.Interface,
534
+ payload.Message,
535
+ payload.Action,
536
+ payload.ReturnChannel,
537
+ payload.ReturnTo
538
+ );
539
+ await this.actionCallbacks.call(payload.Action, payload.Message, payload.ReturnChannel, payload.ReturnTo);
409
540
  }
410
541
  }
@@ -0,0 +1,71 @@
1
+ import { McadObjectInteraction } from '@/types/mcad-object-interaction';
2
+ import { Interactiontype } from '@3cr/types-ts';
3
+ import { DataOverlay } from '@/types/data-overlay';
4
+ import { ref, watch, WatchStopHandle } from 'vue';
5
+ import { useAnnotations } from '@/composables/useAnnotations';
6
+ import { useMarkups } from '@/composables/useMarkups';
7
+ import { useMcadObjects } from '@/composables/useMcadObjects';
8
+ import { DataOverlayInteraction } from '@/types/data-overlay-interaction';
9
+
10
+ export function useDataOverlayTool() {
11
+ let _flag = false;
12
+ let _focused: DataOverlay | null = null;
13
+ let _handles: WatchStopHandle[] = [];
14
+
15
+ const { annotationEvent } = useAnnotations();
16
+ const { markupEvent } = useMarkups();
17
+ const { mcadObjectEvent } = useMcadObjects();
18
+ const selected = ref<DataOverlay | null>(null);
19
+
20
+ function activate(): void {
21
+ document.addEventListener('mousedown', onMouseDown);
22
+ document.addEventListener('mousemove', onMouseMove);
23
+ document.addEventListener('mouseup', onMouseUp);
24
+ _handles.push(
25
+ watch(annotationEvent, onInteraction),
26
+ watch(markupEvent, onInteraction),
27
+ watch(mcadObjectEvent, onMcadInteraction)
28
+ );
29
+ }
30
+
31
+ function deactivate(): void {
32
+ document.removeEventListener('mousedown', onMouseDown);
33
+ document.removeEventListener('mousemove', onMouseMove);
34
+ document.removeEventListener('mouseup', onMouseUp);
35
+ _handles.forEach((handle) => handle());
36
+ _handles = [];
37
+ selected.value = null;
38
+ }
39
+
40
+ function onMouseDown(): void {
41
+ _flag = true;
42
+ }
43
+
44
+ function onMouseMove(): void {
45
+ _flag = false;
46
+ }
47
+
48
+ function onMouseUp(): void {
49
+ if (_flag) {
50
+ selected.value = _focused;
51
+ }
52
+ }
53
+
54
+ function onInteraction(event: DataOverlayInteraction<DataOverlay> | null): void {
55
+ if (event?.Interaction === Interactiontype.HOVER_START) {
56
+ _focused = event.DataOverlay;
57
+ } else if (event?.Interaction === Interactiontype.HOVER_END) {
58
+ _focused = null;
59
+ }
60
+ }
61
+
62
+ function onMcadInteraction(event: McadObjectInteraction | null): void {
63
+ if (event?.Interaction === Interactiontype.HOVER_START) {
64
+ _focused = event.Mcad;
65
+ } else if (event?.Interaction === Interactiontype.HOVER_END) {
66
+ _focused = null;
67
+ }
68
+ }
69
+
70
+ return { selected, activate, deactivate };
71
+ }
@@ -0,0 +1,13 @@
1
+ import { ActionData } from '@/types/action-data';
2
+
3
+ interface ActionBase {
4
+ ActionType: number;
5
+ }
6
+
7
+ export interface Action extends ActionBase {
8
+ ActionData: ActionData;
9
+ }
10
+
11
+ export interface ActionRaw extends ActionBase {
12
+ ActionData: string;
13
+ }
@@ -0,0 +1,9 @@
1
+ import { Action, ActionRaw } from '@/types/action';
2
+
3
+ export interface CallToAction {
4
+ Actions: Action[];
5
+ }
6
+
7
+ export interface CallToActionRaw {
8
+ Actions: ActionRaw[];
9
+ }