@geode/opengeodeweb-front 10.34.0-rc.2 → 10.34.0-rc.21

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 (499) hide show
  1. package/.build/opengeodeweb_front_schemas.js +175 -0
  2. package/.build/server/utils/app_config.js +57 -0
  3. package/.build/server/utils/cleanup.js +135 -0
  4. package/.build/server/utils/cloud.js +156 -0
  5. package/.build/server/utils/microservices.js +153 -0
  6. package/.build/server/utils/path.js +108 -0
  7. package/.build/server/utils/scripts.js +134 -0
  8. package/.build/server/utils/server.js +44 -0
  9. package/.build/server/utils/server_config.js +51 -0
  10. package/.build/server/utils/stream.js +6 -0
  11. package/.build/server/utils/ws_client.js +100 -0
  12. package/.build/shared/app_mode.js +8 -0
  13. package/.build/shared/scripts.js +49 -0
  14. package/.build/shared/utils/call_raw.js +31 -0
  15. package/.build/shared/utils/call_schema.js +28 -0
  16. package/.build/shared/utils/fetch_raw.js +52 -0
  17. package/.build/shared/utils/fetch_schema.js +32 -0
  18. package/.build/shared/utils/file.js +14 -0
  19. package/.build/shared/utils/parse_boolean.js +23 -0
  20. package/.build/shared/utils/response_handlers/load.js +50 -0
  21. package/.build/shared/utils/types.js +1 -0
  22. package/.build/shared/utils/validate_schema.js +17 -0
  23. package/README.md +8 -0
  24. package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
  25. package/app/components/ActionButton.vue +28 -12
  26. package/app/components/Basic/Slider.vue +2 -2
  27. package/app/components/Basic/Switch.vue +2 -2
  28. package/app/components/CameraManager/List.vue +11 -11
  29. package/app/components/CameraManager/Saver.vue +8 -4
  30. package/app/components/CameraManager.vue +24 -12
  31. package/app/components/CameraOrientation.vue +31 -17
  32. package/app/components/ClippingPlaneCard.vue +13 -12
  33. package/app/components/ClippingPlanes.vue +31 -21
  34. package/app/components/CrsSelector.vue +26 -18
  35. package/app/components/DeleteDialog.vue +18 -16
  36. package/app/components/DragAndDrop.vue +55 -37
  37. package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
  38. package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
  39. package/app/components/ExtensionSelector.vue +34 -18
  40. package/app/components/FeedBack/ErrorBanner.vue +4 -3
  41. package/app/components/FeedBack/Snackers.vue +6 -5
  42. package/app/components/FetchingData.vue +8 -12
  43. package/app/components/FileSelector.vue +27 -17
  44. package/app/components/FileUploader.vue +51 -30
  45. package/app/components/GlassCard.vue +17 -13
  46. package/app/components/HybridRenderingView.vue +25 -12
  47. package/app/components/HybridViewerTooltip.vue +28 -26
  48. package/app/components/InfraConnected.vue +1 -1
  49. package/app/components/Launcher.vue +12 -10
  50. package/app/components/Loading/EcoMessages.vue +24 -13
  51. package/app/components/Loading/Header.vue +6 -7
  52. package/app/components/Loading/Progress.vue +6 -7
  53. package/app/components/Loading.vue +10 -14
  54. package/app/components/MissingFilesSelector.vue +35 -19
  55. package/app/components/ObjectSelector.vue +37 -21
  56. package/app/components/PackagesVersions.vue +16 -8
  57. package/app/components/Recaptcha.vue +17 -23
  58. package/app/components/RemoteRenderingView.vue +21 -15
  59. package/app/components/Ruler.vue +11 -9
  60. package/app/components/Screenshot.vue +25 -19
  61. package/app/components/SearchBar.vue +12 -6
  62. package/app/components/ShrinkFilter.vue +19 -14
  63. package/app/components/Step.vue +32 -12
  64. package/app/components/Stepper.vue +19 -7
  65. package/app/components/ToolPanel.vue +29 -13
  66. package/app/components/ViewToolbar.vue +53 -44
  67. package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
  68. package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
  69. package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
  70. package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
  71. package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
  72. package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
  73. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
  74. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
  75. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
  76. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
  77. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
  78. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
  79. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
  80. package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
  81. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
  82. package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
  83. package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
  84. package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
  85. package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
  86. package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
  87. package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
  88. package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
  89. package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
  90. package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
  91. package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
  92. package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
  93. package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
  94. package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
  95. package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
  96. package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
  97. package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
  98. package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
  99. package/app/components/Viewer/ObjectTree/Box.vue +32 -15
  100. package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
  101. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
  102. package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
  103. package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
  104. package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
  105. package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
  106. package/app/components/Viewer/Options/ColorMapList.vue +52 -24
  107. package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
  108. package/app/components/Viewer/Options/ColorPicker.vue +239 -50
  109. package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
  110. package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
  111. package/app/components/Viewer/Options/OptionsSection.vue +7 -5
  112. package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
  113. package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
  114. package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
  115. package/app/components/Viewer/Options/TextureItem.vue +29 -22
  116. package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
  117. package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
  118. package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
  119. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
  120. package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
  121. package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
  122. package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
  123. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
  124. package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
  125. package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
  126. package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
  127. package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
  128. package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
  129. package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
  130. package/app/components/Viewer/Ui.vue +19 -14
  131. package/app/components/Wrapper.vue +16 -10
  132. package/app/components/ZScaling.vue +18 -10
  133. package/app/components/csv-preview/CsvPreviewer.vue +72 -50
  134. package/app/components/csv-preview/CsvSettings.vue +30 -50
  135. package/app/components/csv-preview/CsvTable.vue +34 -14
  136. package/app/composables/{batch_style.js → batch_style.ts} +9 -7
  137. package/app/composables/clipping_planes_widget.ts +204 -0
  138. package/app/composables/clipping_planes_widget_entries.ts +189 -0
  139. package/app/composables/copy_to_clipboard.ts +7 -0
  140. package/app/composables/global_attribute_style.ts +303 -0
  141. package/app/composables/hover_highlight.ts +127 -0
  142. package/app/composables/{model_collections.js → model_collections.ts} +28 -9
  143. package/app/composables/{model_components.js → model_components.ts} +28 -9
  144. package/app/composables/{project_manager.js → project_manager.ts} +77 -20
  145. package/app/composables/responsive_middle_truncate.ts +48 -0
  146. package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
  147. package/app/composables/stepper_tree.ts +79 -0
  148. package/app/composables/tree_filter.ts +194 -0
  149. package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
  150. package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
  151. package/app/composables/use_adaptive_styles.ts +186 -0
  152. package/app/composables/use_overlapping_picker.ts +263 -0
  153. package/app/composables/use_quick_colormap.ts +55 -0
  154. package/app/composables/virtual_tree.ts +271 -0
  155. package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
  156. package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
  157. package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
  158. package/app/stores/app.ts +252 -0
  159. package/app/stores/app_helpers/extension.ts +179 -0
  160. package/app/stores/{back.js → back.ts} +54 -28
  161. package/app/stores/camera_manager.ts +80 -0
  162. package/app/stores/{cloud.js → cloud.ts} +18 -13
  163. package/app/stores/data.ts +392 -0
  164. package/app/stores/data_helpers/collections.ts +138 -0
  165. package/app/stores/data_helpers/mesh.ts +169 -0
  166. package/app/stores/data_style.ts +167 -0
  167. package/app/stores/{feedback.js → feedback.ts} +19 -8
  168. package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
  169. package/app/stores/infra.ts +106 -0
  170. package/app/stores/{menu.js → menu.ts} +67 -36
  171. package/app/stores/treeview.ts +383 -0
  172. package/app/stores/{viewer.js → viewer.ts} +75 -42
  173. package/app/utils/attributes.ts +40 -0
  174. package/app/utils/clipping_planes.ts +222 -0
  175. package/app/utils/color_picker.js +54 -0
  176. package/app/utils/colormap.ts +102 -0
  177. package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
  178. package/app/utils/default_styles/{index.js → index.ts} +4 -3
  179. package/app/utils/default_styles/meshes.ts +264 -0
  180. package/app/utils/default_styles/{models.js → models.ts} +106 -52
  181. package/app/utils/{extension.js → extension.ts} +63 -19
  182. package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
  183. package/app/utils/{log.js → log.ts} +12 -2
  184. package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
  185. package/app/utils/status.ts +19 -0
  186. package/app/utils/{stores.js → stores.ts} +5 -5
  187. package/app/utils/{string.js → string.ts} +6 -6
  188. package/app/utils/{treeview.js → treeview.ts} +4 -1
  189. package/internal/database/{base_database.js → base_database.ts} +7 -3
  190. package/internal/database/database.ts +102 -0
  191. package/internal/database/{extended_database.js → extended_database.ts} +5 -1
  192. package/internal/database/tables/camera_positions.ts +6 -0
  193. package/internal/database/tables/{data.js → data.ts} +3 -1
  194. package/internal/database/tables/data_style.ts +6 -0
  195. package/internal/database/tables/model_component_datastyle.ts +6 -0
  196. package/internal/database/tables/model_component_type_datastyle.ts +6 -0
  197. package/internal/database/tables/model_components.ts +6 -0
  198. package/internal/database/tables/model_components_relation.ts +6 -0
  199. package/internal/database/tables/table_definition.ts +5 -0
  200. package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
  201. package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
  202. package/internal/stores/data_style/mesh/cells/common.ts +50 -0
  203. package/internal/stores/data_style/mesh/cells/index.ts +161 -0
  204. package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
  205. package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
  206. package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
  207. package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
  208. package/internal/stores/data_style/mesh/edges/common.ts +41 -0
  209. package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
  210. package/internal/stores/data_style/mesh/edges/index.ts +155 -0
  211. package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
  212. package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
  213. package/internal/stores/data_style/mesh/edges/width.ts +42 -0
  214. package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
  215. package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
  216. package/internal/stores/data_style/mesh/points/common.ts +51 -0
  217. package/internal/stores/data_style/mesh/points/index.ts +133 -0
  218. package/internal/stores/data_style/mesh/points/size.ts +43 -0
  219. package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
  220. package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
  221. package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
  222. package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
  223. package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
  224. package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
  225. package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
  226. package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
  227. package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
  228. package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
  229. package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
  230. package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
  231. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
  232. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
  233. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
  234. package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
  235. package/internal/stores/data_style/model/blocks/common.ts +67 -0
  236. package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
  237. package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
  238. package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
  239. package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
  240. package/internal/stores/data_style/model/color.ts +348 -0
  241. package/internal/stores/data_style/model/common.ts +262 -0
  242. package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
  243. package/internal/stores/data_style/model/corners/common.ts +71 -0
  244. package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
  245. package/internal/stores/data_style/model/corners/vertex.ts +315 -0
  246. package/internal/stores/data_style/model/corners/visibility.ts +39 -0
  247. package/internal/stores/data_style/model/edges/common.ts +29 -0
  248. package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
  249. package/internal/stores/data_style/model/edges/visibility.ts +55 -0
  250. package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
  251. package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
  252. package/internal/stores/data_style/model/lines/common.ts +63 -0
  253. package/internal/stores/data_style/model/lines/edge.ts +343 -0
  254. package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
  255. package/internal/stores/data_style/model/lines/vertex.ts +344 -0
  256. package/internal/stores/data_style/model/lines/visibility.ts +37 -0
  257. package/internal/stores/data_style/model/points/common.ts +25 -0
  258. package/internal/stores/data_style/model/points/index.ts +35 -0
  259. package/internal/stores/data_style/model/points/size.ts +44 -0
  260. package/internal/stores/data_style/model/points/visibility.ts +46 -0
  261. package/internal/stores/data_style/model/selection.ts +138 -0
  262. package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
  263. package/internal/stores/data_style/model/surfaces/common.ts +69 -0
  264. package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
  265. package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
  266. package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
  267. package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
  268. package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
  269. package/internal/stores/data_style/state.ts +281 -0
  270. package/internal/stores/data_style/types.ts +30 -0
  271. package/internal/stores/hybrid_viewer/brightness.ts +124 -0
  272. package/internal/stores/hybrid_viewer/camera.ts +326 -0
  273. package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
  274. package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
  275. package/internal/stores/hybrid_viewer/core.ts +64 -0
  276. package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
  277. package/internal/stores/hybrid_viewer/highlight.ts +183 -0
  278. package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
  279. package/internal/stores/hybrid_viewer/scene.ts +125 -0
  280. package/internal/stores/hybrid_viewer/viewport.ts +177 -0
  281. package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
  282. package/internal/utils/api_fetch.ts +133 -0
  283. package/internal/utils/upload_file.ts +115 -0
  284. package/internal/utils/viewer_call.ts +99 -0
  285. package/internal/utils/ws_client.ts +54 -0
  286. package/nuxt.config.ts +168 -0
  287. package/opengeodeweb_front_schemas.json +2 -2
  288. package/package.json +49 -13
  289. package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
  290. package/server/api/local/app/project_folder_path.post.ts +33 -0
  291. package/server/api/local/app/run_back.post.ts +39 -0
  292. package/server/api/local/app/run_viewer.post.ts +39 -0
  293. package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
  294. package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
  295. package/server/api/local/extensions/upload.put.ts +71 -0
  296. package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
  297. package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
  298. package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
  299. package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
  300. package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
  301. package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
  302. package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
  303. package/server/api/serverless/run_cloud.post.ts +92 -0
  304. package/server/utils/{app_config.js → app_config.ts} +40 -18
  305. package/server/utils/{cleanup.js → cleanup.ts} +76 -29
  306. package/server/utils/{cloud.js → cloud.ts} +33 -17
  307. package/server/utils/{extension.js → extension.ts} +31 -4
  308. package/server/utils/{microservices.js → microservices.ts} +68 -27
  309. package/server/utils/{path.js → path.ts} +36 -17
  310. package/server/utils/{scripts.js → scripts.ts} +49 -33
  311. package/server/utils/{server.js → server.ts} +13 -6
  312. package/server/utils/server_config.ts +74 -0
  313. package/server/utils/stream.ts +6 -0
  314. package/server/utils/ws_client.ts +165 -0
  315. package/shared/{scripts.js → scripts.ts} +15 -10
  316. package/shared/utils/call_raw.ts +73 -0
  317. package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
  318. package/shared/utils/fetch_raw.ts +125 -0
  319. package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
  320. package/shared/utils/file.ts +22 -0
  321. package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
  322. package/shared/utils/response_handlers/load.ts +109 -0
  323. package/shared/utils/types.ts +27 -0
  324. package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
  325. package/.github/workflows/config.json +0 -5
  326. package/.github/workflows/deploy.yml +0 -15
  327. package/.github/workflows/manual_release.yml +0 -11
  328. package/.github/workflows/merge_request.yml +0 -9
  329. package/.github/workflows/pr_update.yml +0 -11
  330. package/.github/workflows/prepare_deploy.yml +0 -9
  331. package/.github/workflows/schedule.yml +0 -18
  332. package/.github/workflows/test.yml +0 -14
  333. package/.github/workflows/test_pr.yml +0 -12
  334. package/.oxlintrc.json +0 -150
  335. package/.releaserc +0 -11
  336. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
  337. package/app/composables/clipping_planes_widget.js +0 -249
  338. package/app/composables/global_attribute_style.js +0 -181
  339. package/app/composables/hover_highlight.js +0 -91
  340. package/app/composables/responsive_middle_truncate.js +0 -34
  341. package/app/composables/stepper_tree.js +0 -56
  342. package/app/composables/tree_filter.js +0 -138
  343. package/app/composables/use_adaptive_styles.js +0 -120
  344. package/app/composables/use_overlapping_picker.js +0 -169
  345. package/app/composables/use_quick_colormap.js +0 -32
  346. package/app/composables/virtual_tree.js +0 -191
  347. package/app/stores/app.js +0 -326
  348. package/app/stores/camera_manager.js +0 -57
  349. package/app/stores/data.js +0 -278
  350. package/app/stores/data_helpers/collections.js +0 -96
  351. package/app/stores/data_helpers/mesh.js +0 -122
  352. package/app/stores/data_style.js +0 -116
  353. package/app/stores/infra.js +0 -95
  354. package/app/stores/treeview.js +0 -290
  355. package/app/utils/attributes.js +0 -23
  356. package/app/utils/clipping_planes.js +0 -110
  357. package/app/utils/colormap.js +0 -64
  358. package/app/utils/default_styles/meshes.js +0 -191
  359. package/app/utils/status.js +0 -10
  360. package/commitlint.config.js +0 -20
  361. package/internal/database/database.js +0 -80
  362. package/internal/database/tables/camera_positions.js +0 -4
  363. package/internal/database/tables/data_style.js +0 -4
  364. package/internal/database/tables/model_component_datastyle.js +0 -4
  365. package/internal/database/tables/model_component_type_datastyle.js +0 -4
  366. package/internal/database/tables/model_components.js +0 -4
  367. package/internal/database/tables/model_components_relation.js +0 -4
  368. package/internal/stores/data_style/mesh/cells/cell.js +0 -196
  369. package/internal/stores/data_style/mesh/cells/common.js +0 -39
  370. package/internal/stores/data_style/mesh/cells/index.js +0 -81
  371. package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
  372. package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
  373. package/internal/stores/data_style/mesh/edges/common.js +0 -32
  374. package/internal/stores/data_style/mesh/edges/edge.js +0 -195
  375. package/internal/stores/data_style/mesh/edges/index.js +0 -81
  376. package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
  377. package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
  378. package/internal/stores/data_style/mesh/edges/width.js +0 -34
  379. package/internal/stores/data_style/mesh/points/common.js +0 -37
  380. package/internal/stores/data_style/mesh/points/index.js +0 -82
  381. package/internal/stores/data_style/mesh/points/size.js +0 -35
  382. package/internal/stores/data_style/mesh/points/vertex.js +0 -193
  383. package/internal/stores/data_style/mesh/points/visibility.js +0 -37
  384. package/internal/stores/data_style/mesh/polygons/common.js +0 -32
  385. package/internal/stores/data_style/mesh/polygons/index.js +0 -107
  386. package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
  387. package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
  388. package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
  389. package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
  390. package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
  391. package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
  392. package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
  393. package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
  394. package/internal/stores/data_style/model/blocks/common.js +0 -51
  395. package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
  396. package/internal/stores/data_style/model/blocks/vertex.js +0 -204
  397. package/internal/stores/data_style/model/blocks/visibility.js +0 -20
  398. package/internal/stores/data_style/model/color.js +0 -218
  399. package/internal/stores/data_style/model/common.js +0 -141
  400. package/internal/stores/data_style/model/corners/common.js +0 -51
  401. package/internal/stores/data_style/model/corners/vertex.js +0 -204
  402. package/internal/stores/data_style/model/corners/visibility.js +0 -20
  403. package/internal/stores/data_style/model/edges/common.js +0 -20
  404. package/internal/stores/data_style/model/edges/visibility.js +0 -38
  405. package/internal/stores/data_style/model/lines/common.js +0 -51
  406. package/internal/stores/data_style/model/lines/edge.js +0 -203
  407. package/internal/stores/data_style/model/lines/vertex.js +0 -204
  408. package/internal/stores/data_style/model/lines/visibility.js +0 -20
  409. package/internal/stores/data_style/model/points/common.js +0 -20
  410. package/internal/stores/data_style/model/points/index.js +0 -25
  411. package/internal/stores/data_style/model/points/size.js +0 -36
  412. package/internal/stores/data_style/model/points/visibility.js +0 -36
  413. package/internal/stores/data_style/model/selection.js +0 -89
  414. package/internal/stores/data_style/model/surfaces/common.js +0 -51
  415. package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
  416. package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
  417. package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
  418. package/internal/stores/data_style/state.js +0 -197
  419. package/internal/stores/hybrid_viewer/brightness.js +0 -82
  420. package/internal/stores/hybrid_viewer/camera.js +0 -274
  421. package/internal/stores/hybrid_viewer/highlight.js +0 -170
  422. package/internal/stores/hybrid_viewer/scene.js +0 -136
  423. package/internal/stores/hybrid_viewer/viewport.js +0 -140
  424. package/internal/utils/api_fetch.js +0 -52
  425. package/internal/utils/upload_file.js +0 -57
  426. package/internal/utils/viewer_call.js +0 -49
  427. package/internal/utils/ws_client.js +0 -29
  428. package/nuxt.config.js +0 -106
  429. package/scripts/generate_geode_objects.js +0 -24
  430. package/server/api/local/app/project_folder_path.post.js +0 -29
  431. package/server/api/local/app/run_back.post.js +0 -33
  432. package/server/api/local/app/run_viewer.post.js +0 -33
  433. package/server/api/local/extensions/upload.put.js +0 -72
  434. package/server/api/microservice/app/set_app_base_url.post.js +0 -25
  435. package/server/api/microservice/app/set_back_base_url.post.js +0 -22
  436. package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
  437. package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
  438. package/server/api/serverless/run_cloud.post.js +0 -44
  439. package/server/utils/server_config.js +0 -58
  440. package/server/utils/ws_client.js +0 -112
  441. package/shared/utils/call_raw.js +0 -46
  442. package/shared/utils/fetch_raw.js +0 -61
  443. package/shared/utils/file.js +0 -16
  444. package/shared/utils/response_handlers/load.js +0 -74
  445. package/tests/integration/data/uploads/test.og_brep +0 -0
  446. package/tests/integration/data/uploads/test.og_edc2d +0 -0
  447. package/tests/integration/data/uploads/test.og_edc3d +0 -0
  448. package/tests/integration/data/uploads/test.og_psf3d +0 -0
  449. package/tests/integration/data/uploads/test.og_rgd2d +0 -0
  450. package/tests/integration/data/uploads/test.og_rgd3d +0 -0
  451. package/tests/integration/data/uploads/test.vtu +0 -22
  452. package/tests/integration/setup.js +0 -92
  453. package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
  454. package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
  455. package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
  456. package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
  457. package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
  458. package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
  459. package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
  460. package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
  461. package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
  462. package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
  463. package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
  464. package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
  465. package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
  466. package/tests/integration/stores/viewer.nuxt.test.js +0 -69
  467. package/tests/setup_indexeddb.js +0 -4
  468. package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
  469. package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
  470. package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
  471. package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
  472. package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
  473. package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
  474. package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
  475. package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
  476. package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
  477. package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
  478. package/tests/unit/components/Step.nuxt.test.js +0 -51
  479. package/tests/unit/components/Stepper.nuxt.test.js +0 -41
  480. package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
  481. package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
  482. package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
  483. package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
  484. package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
  485. package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
  486. package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
  487. package/tests/unit/stores/app.nuxt.test.js +0 -189
  488. package/tests/unit/stores/back.nuxt.test.js +0 -147
  489. package/tests/unit/stores/cloud.nuxt.test.js +0 -90
  490. package/tests/unit/stores/data.nuxt.test.js +0 -162
  491. package/tests/unit/stores/feedback.nuxt.test.js +0 -90
  492. package/tests/unit/stores/infra.nuxt.test.js +0 -313
  493. package/tests/unit/stores/treeview.nuxt.test.js +0 -63
  494. package/tests/unit/stores/viewer.nuxt.test.js +0 -161
  495. package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
  496. package/tests/utils.js +0 -20
  497. package/tests/vitest.config.js +0 -67
  498. /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
  499. /package/shared/{app_mode.js → app_mode.ts} +0 -0
@@ -0,0 +1,124 @@
1
+ import { BACKGROUND_GREY_VALUE, RGB_MAX } from "./constants";
2
+ import { useHybridViewerCore } from "./core";
3
+
4
+ const RGBA_CHANNELS = 4;
5
+ const SAMPLE_SIZE = 10;
6
+ const TOTAL_CHANNELS = 400;
7
+
8
+ interface Rect {
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
13
+ }
14
+
15
+ // The decoded background image handed to us by the viewer's image stream (see app/stores/hybrid_viewer.ts's onImageReady) - draw-able onto a 2D canvas.
16
+ type DrawableImage = CanvasImageSource & { width: number; height: number };
17
+
18
+ interface BrightnessOptions {
19
+ latestImage: DrawableImage | undefined;
20
+ offscreenCtx: CanvasRenderingContext2D | undefined;
21
+ offscreenCanvas: HTMLCanvasElement | undefined;
22
+ }
23
+
24
+ interface RelativeRect {
25
+ relX: number;
26
+ relY: number;
27
+ relW: number;
28
+ relH: number;
29
+ }
30
+
31
+ function mapRect(rect: Rect, latestImage: DrawableImage, canvasRect: DOMRect): RelativeRect {
32
+ const scaleX = latestImage.width / canvasRect.width;
33
+ const scaleY = latestImage.height / canvasRect.height;
34
+ return {
35
+ relX: (rect.x - canvasRect.left) * scaleX,
36
+ relY: (rect.y - canvasRect.top) * scaleY,
37
+ relW: rect.width * scaleX,
38
+ relH: rect.height * scaleY,
39
+ };
40
+ }
41
+
42
+ function sampleMinBrightness(
43
+ ctx: CanvasRenderingContext2D,
44
+ image: DrawableImage,
45
+ relRect: RelativeRect,
46
+ ): number {
47
+ ctx.drawImage(
48
+ image,
49
+ Math.max(0, relRect.relX),
50
+ Math.max(0, relRect.relY),
51
+ Math.min(image.width, relRect.relW),
52
+ Math.min(image.height, relRect.relH),
53
+ 0,
54
+ 0,
55
+ SAMPLE_SIZE,
56
+ SAMPLE_SIZE,
57
+ );
58
+ const { data } = ctx.getImageData(0, 0, SAMPLE_SIZE, SAMPLE_SIZE);
59
+ let minBrightness = 1;
60
+ for (let i = 0; i < TOTAL_CHANNELS; i += RGBA_CHANNELS) {
61
+ const brightness = ((data[i] ?? 0) + (data[i + 1] ?? 0) + (data[i + 2] ?? 0)) / (3 * RGB_MAX);
62
+ if (brightness < minBrightness) {
63
+ minBrightness = brightness;
64
+ }
65
+ }
66
+ return minBrightness;
67
+ }
68
+
69
+ function computeAverageBrightness(rect: Rect, options: BrightnessOptions): number {
70
+ const { latestImage, offscreenCtx, offscreenCanvas } = options;
71
+ const { genericRenderWindow } = useHybridViewerCore();
72
+ if (!latestImage || !offscreenCtx || !offscreenCanvas || !genericRenderWindow.value) {
73
+ return BACKGROUND_GREY_VALUE / RGB_MAX;
74
+ }
75
+ // oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
76
+ const webGLRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
77
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
78
+ const apiSpecificRenderWindow = webGLRenderWindow as unknown as {
79
+ getCanvas: () => HTMLCanvasElement | null | undefined;
80
+ };
81
+ const canvas = apiSpecificRenderWindow.getCanvas();
82
+ if (canvas === undefined || canvas === null) {
83
+ return BACKGROUND_GREY_VALUE / RGB_MAX;
84
+ }
85
+ if (rect.width <= 0 || rect.height <= 0) {
86
+ return BACKGROUND_GREY_VALUE / RGB_MAX;
87
+ }
88
+ const relRect = mapRect(rect, latestImage, canvas.getBoundingClientRect());
89
+ if (relRect.relW <= 0 || relRect.relH <= 0) {
90
+ return BACKGROUND_GREY_VALUE / RGB_MAX;
91
+ }
92
+ offscreenCanvas.width = SAMPLE_SIZE;
93
+ offscreenCanvas.height = SAMPLE_SIZE;
94
+ try {
95
+ return sampleMinBrightness(offscreenCtx, latestImage, relRect);
96
+ } catch {
97
+ return BACKGROUND_GREY_VALUE / RGB_MAX;
98
+ }
99
+ }
100
+ function useHybridViewerBrightness(): {
101
+ latestImage: Ref<DrawableImage | undefined>;
102
+ getAverageBrightness: (rect: Rect) => number;
103
+ } {
104
+ const latestImage = ref<DrawableImage | undefined>(undefined);
105
+ const offscreenCanvas: HTMLCanvasElement | undefined =
106
+ typeof document === "undefined" ? undefined : document.createElement("canvas");
107
+ const offscreenCtx: CanvasRenderingContext2D | undefined = offscreenCanvas
108
+ ? (offscreenCanvas.getContext("2d", {
109
+ willReadFrequently: true,
110
+ }) ?? undefined)
111
+ : undefined;
112
+ function getAverageBrightness(rect: Rect): number {
113
+ return computeAverageBrightness(rect, {
114
+ latestImage: latestImage.value,
115
+ offscreenCtx,
116
+ offscreenCanvas,
117
+ });
118
+ }
119
+ return {
120
+ latestImage,
121
+ getAverageBrightness,
122
+ };
123
+ }
124
+ export { computeAverageBrightness, useHybridViewerBrightness };
@@ -0,0 +1,326 @@
1
+ import type { CameraOptions, Vector3, vtkCamera, vtkOpenGLRenderWindow } from "./vtk_types";
2
+ import {
3
+ LONG_ANIMATION_DURATION,
4
+ SHORT_ANIMATION_DURATION,
5
+ animateCamera,
6
+ computeAnimationDuration,
7
+ } from "./camera_animation";
8
+ import { requireRenderWindow, useHybridViewerCore } from "./core";
9
+ import { dot } from "@kitware/vtk.js/Common/Core/Math";
10
+ import { useHybridViewerScene } from "./scene";
11
+ import { useViewerStore } from "@ogw_front/stores/viewer";
12
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
13
+
14
+ const BUMP_MULTIPLIER = 0.2;
15
+ const ALIGNMENT_THRESHOLD = 0.9;
16
+ const EASE_EXPONENT = 1.1;
17
+
18
+ interface OrientationConfig {
19
+ position: Vector3;
20
+ view_up: Vector3;
21
+ }
22
+
23
+ const ORIENTATIONS: Record<string, OrientationConfig> = {
24
+ zplus: {
25
+ position: [0, 0, 1],
26
+ view_up: [0, 1, 0],
27
+ },
28
+ zminus: {
29
+ position: [0, 0, -1],
30
+ view_up: [0, 1, 0],
31
+ },
32
+ yplus: {
33
+ position: [0, 1, 0],
34
+ view_up: [0, 0, 1],
35
+ },
36
+ yminus: {
37
+ position: [0, -1, 0],
38
+ view_up: [0, 0, 1],
39
+ },
40
+ xplus: {
41
+ position: [1, 0, 0],
42
+ view_up: [0, 0, 1],
43
+ },
44
+ xminus: {
45
+ position: [-1, 0, 0],
46
+ view_up: [0, 0, 1],
47
+ },
48
+ };
49
+
50
+ function getImageStyle(): CSSStyleDeclaration | undefined {
51
+ const { genericRenderWindow } = useHybridViewerCore();
52
+ if (!genericRenderWindow.value) {
53
+ return undefined;
54
+ }
55
+ // oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
56
+ const apiSpecificRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
57
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
58
+ const webGLRenderWindow = apiSpecificRenderWindow as unknown as vtkOpenGLRenderWindow;
59
+ const bgImage: unknown = webGLRenderWindow.getReferenceByName("bgImage");
60
+ return bgImage instanceof HTMLImageElement ? bgImage.style : undefined;
61
+ }
62
+
63
+ function getCameraOptions(camera: vtkCamera): CameraOptions {
64
+ return {
65
+ focal_point: [...(camera.getFocalPoint() ?? [0, 0, 0])] as Vector3,
66
+ view_up: [...(camera.getViewUp() ?? [0, 0, 0])] as Vector3,
67
+ position: [...(camera.getPosition() ?? [0, 0, 0])] as Vector3,
68
+ view_angle: camera.getViewAngle(),
69
+ clipping_range: [...(camera.getClippingRange() ?? [0, 0])] as [number, number],
70
+ distance: camera.getDistance(),
71
+ };
72
+ }
73
+
74
+ function applyCameraOptions(
75
+ camera: vtkCamera | undefined,
76
+ options: Partial<CameraOptions> | undefined,
77
+ ): void {
78
+ if (camera && options) {
79
+ camera.set({
80
+ focalPoint: options.focal_point,
81
+ viewUp: options.view_up,
82
+ position: options.position,
83
+ viewAngle: options.view_angle,
84
+ clippingRange: options.clipping_range,
85
+ });
86
+ }
87
+ }
88
+
89
+ const BOUNDS_LENGTH = 6;
90
+
91
+ function isBounds(value: unknown): value is [number, number, number, number, number, number] {
92
+ return (
93
+ Array.isArray(value) &&
94
+ value.length === BOUNDS_LENGTH &&
95
+ value.every((item): item is number => typeof item === "number")
96
+ );
97
+ }
98
+
99
+ function toBounds(value: unknown): [number, number, number, number, number, number] {
100
+ if (!isBounds(value)) {
101
+ throw new Error("Expected a six-element numeric bounds array");
102
+ }
103
+ return value;
104
+ }
105
+
106
+ function centerCameraOnPosition(
107
+ camera: vtkCamera | undefined,
108
+ pickedPosition: Vector3 | undefined,
109
+ ): void {
110
+ if (!camera || !pickedPosition) {
111
+ return;
112
+ }
113
+ const position = camera.getPosition();
114
+ const directionOfProjection = camera.getDirectionOfProjection();
115
+ const distance = dot(
116
+ [
117
+ pickedPosition[0] - position[0],
118
+ pickedPosition[1] - position[1],
119
+ pickedPosition[2] - position[2],
120
+ ],
121
+ directionOfProjection,
122
+ );
123
+ camera.setFocalPoint(...pickedPosition);
124
+ camera.setPosition(
125
+ pickedPosition[0] - distance * directionOfProjection[0],
126
+ pickedPosition[1] - distance * directionOfProjection[1],
127
+ pickedPosition[2] - distance * directionOfProjection[2],
128
+ );
129
+ }
130
+
131
+ // Shared via createSharedComposable (rather than merged into the parent hybridViewer store) so sibling slices, e.g. viewport.ts and ruler.ts, can read camera_options/setCamera/syncRemoteCamera directly without importing the parent store and creating a cycle. A Pinia store would work too but its $id/$patch/... properties would leak into the composed store's spread and collapse its inferred type.
132
+ const useHybridViewerCamera = createSharedComposable(() => {
133
+ const camera_options = reactive<Record<string, unknown>>({});
134
+
135
+ function performSyncRemoteCamera(): void {
136
+ const { genericRenderWindow, remoteRender } = useHybridViewerCore();
137
+ const viewerStore = useViewerStore();
138
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
139
+ const camera = renderer.getActiveCamera();
140
+ const options_camera = getCameraOptions(camera);
141
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.update_camera;
142
+ const params = {
143
+ camera_options: options_camera,
144
+ };
145
+ viewerStore
146
+ .request(
147
+ {
148
+ schema,
149
+ params,
150
+ },
151
+ {
152
+ response_function: async () => {
153
+ await remoteRender().catch(() => undefined);
154
+ Object.assign(camera_options, options_camera);
155
+ },
156
+ },
157
+ )
158
+ // oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync caller; see codebase convention in global_attribute_style.ts.
159
+ .catch(() => undefined);
160
+ }
161
+
162
+ function syncRemoteCamera(): void {
163
+ performSyncRemoteCamera();
164
+ }
165
+
166
+ function performSetCamera(targetCameraOptions: CameraOptions): void {
167
+ const { genericRenderWindow, is_moving } = useHybridViewerCore();
168
+ const imageStyle = getImageStyle();
169
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
170
+ const camera = renderer.getActiveCamera();
171
+ const startState = getCameraOptions(camera);
172
+ const duration = computeAnimationDuration(startState, targetCameraOptions);
173
+ is_moving.value = true;
174
+ if (imageStyle) {
175
+ imageStyle.opacity = "0";
176
+ }
177
+ animateCamera({
178
+ camera,
179
+ startState,
180
+ targetState: targetCameraOptions,
181
+ duration,
182
+ bumpMultiplier: 0,
183
+ easeExponent: EASE_EXPONENT,
184
+ onUpdate: () => {
185
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
186
+ renderWindow.render();
187
+ },
188
+ onEnd: () => {
189
+ applyCameraOptions(camera, targetCameraOptions);
190
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
191
+ renderWindow.render();
192
+ is_moving.value = false;
193
+ performSyncRemoteCamera();
194
+ },
195
+ });
196
+ }
197
+
198
+ function setCamera(targetCameraOptions: CameraOptions): void {
199
+ performSetCamera(targetCameraOptions);
200
+ }
201
+
202
+ function resetCamera(): void {
203
+ const { genericRenderWindow } = useHybridViewerCore();
204
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
205
+ renderer.resetCamera();
206
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
207
+ renderWindow.render();
208
+ syncRemoteCamera();
209
+ }
210
+
211
+ async function performFocusCameraOnObject(id: string, block_ids: string[] = []): Promise<void> {
212
+ const { genericRenderWindow } = useHybridViewerCore();
213
+ const { hybridDb } = useHybridViewerScene();
214
+ if (!hybridDb[id]) {
215
+ return;
216
+ }
217
+ const viewerStore = useViewerStore();
218
+ const bounds: [number, number, number, number, number, number] =
219
+ block_ids.length > 0
220
+ ? toBounds(
221
+ await viewerStore.request({
222
+ schema: viewer_schemas.opengeodeweb_viewer.model.get_blocks_bounds,
223
+ params: {
224
+ id,
225
+ block_ids,
226
+ },
227
+ }),
228
+ )
229
+ : hybridDb[id].actor.getBounds();
230
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
231
+ const camera = renderer.getActiveCamera();
232
+ const startOptions = getCameraOptions(camera);
233
+ renderer.resetCamera(bounds);
234
+ const targetOptions = getCameraOptions(camera);
235
+ applyCameraOptions(camera, startOptions);
236
+ performSetCamera(targetOptions);
237
+ }
238
+
239
+ async function focusCameraOnObject(id: string, block_ids: string[] = []): Promise<void> {
240
+ await performFocusCameraOnObject(id, block_ids);
241
+ }
242
+
243
+ function performCameraOrientation(orientation: string): void {
244
+ const config = ORIENTATIONS[orientation.toLowerCase()];
245
+ if (!config) {
246
+ return;
247
+ }
248
+ const { genericRenderWindow, is_moving } = useHybridViewerCore();
249
+ const imageStyle = getImageStyle();
250
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
251
+ const camera = renderer.getActiveCamera();
252
+ const startState = getCameraOptions(camera);
253
+ applyCameraOptions(camera, {
254
+ ...config,
255
+ focal_point: [0, 0, 0],
256
+ });
257
+ renderer.resetCamera();
258
+ const targetState = getCameraOptions(camera);
259
+ applyCameraOptions(camera, startState);
260
+ const alignment = dot(camera.getDirectionOfProjection(), config.position);
261
+ const duration =
262
+ alignment > ALIGNMENT_THRESHOLD ? LONG_ANIMATION_DURATION : SHORT_ANIMATION_DURATION;
263
+ is_moving.value = true;
264
+ if (imageStyle) {
265
+ imageStyle.opacity = "0";
266
+ }
267
+ animateCamera({
268
+ camera,
269
+ startState,
270
+ targetState,
271
+ duration,
272
+ bumpMultiplier: BUMP_MULTIPLIER,
273
+ easeExponent: EASE_EXPONENT,
274
+ onUpdate: () => {
275
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
276
+ renderWindow.render();
277
+ },
278
+ onEnd: () => {
279
+ is_moving.value = false;
280
+ performSyncRemoteCamera();
281
+ },
282
+ });
283
+ }
284
+
285
+ function setCameraOrientation(orientation: string): void {
286
+ performCameraOrientation(orientation);
287
+ }
288
+
289
+ return {
290
+ camera_options,
291
+ syncRemoteCamera,
292
+ setCamera,
293
+ resetCamera,
294
+ focusCameraOnObject,
295
+ setCameraOrientation,
296
+ };
297
+ });
298
+
299
+ interface CameraSnapshot {
300
+ zScale?: number;
301
+ camera_options?: CameraOptions;
302
+ }
303
+
304
+ async function applySnapshot(snapshot: CameraSnapshot | undefined): Promise<void> {
305
+ if (!snapshot) {
306
+ return;
307
+ }
308
+ if (typeof snapshot.zScale === "number") {
309
+ await useHybridViewerScene().setZScaling(snapshot.zScale);
310
+ }
311
+ if (snapshot.camera_options) {
312
+ useHybridViewerCamera().setCamera(snapshot.camera_options);
313
+ }
314
+ }
315
+ export {
316
+ ALIGNMENT_THRESHOLD,
317
+ BUMP_MULTIPLIER,
318
+ EASE_EXPONENT,
319
+ ORIENTATIONS,
320
+ applyCameraOptions,
321
+ applySnapshot,
322
+ centerCameraOnPosition,
323
+ getCameraOptions,
324
+ useHybridViewerCamera,
325
+ };
326
+ export type { CameraSnapshot };
@@ -1,3 +1,4 @@
1
+ import type { CameraOptions, Vector3, vtkCamera } from "./vtk_types";
1
2
  import { dot } from "@kitware/vtk.js/Common/Core/Math";
2
3
 
3
4
  const NEAR_ZERO_THRESHOLD = 1e-10;
@@ -6,15 +7,15 @@ const LONG_ANIMATION_DURATION = 1000;
6
7
  const SHORT_ANIMATION_DURATION = 500;
7
8
  const MID_ANIMATION_RATIO = 0.5;
8
9
 
9
- function vecSub(vector, other) {
10
+ function vecSub(vector: Vector3, other: Vector3): Vector3 {
10
11
  return [vector[0] - other[0], vector[1] - other[1], vector[2] - other[2]];
11
12
  }
12
13
 
13
- function vecLength(vector) {
14
+ function vecLength(vector: Vector3): number {
14
15
  return Math.hypot(vector[0], vector[1], vector[2]);
15
16
  }
16
17
 
17
- function vecNormalize(vector) {
18
+ function vecNormalize(vector: Vector3): Vector3 {
18
19
  const len = vecLength(vector);
19
20
  if (len < NEAR_ZERO_THRESHOLD) {
20
21
  return [0, 0, 1];
@@ -22,7 +23,7 @@ function vecNormalize(vector) {
22
23
  return [vector[0] / len, vector[1] / len, vector[2] / len];
23
24
  }
24
25
 
25
- function slerp(from, target, ratio, mid) {
26
+ function slerp(from: Vector3, target: Vector3, ratio: number, mid?: Vector3): Vector3 {
26
27
  const normFrom = vecNormalize(from);
27
28
  const normTarget = vecNormalize(target);
28
29
  let dotProduct =
@@ -51,7 +52,7 @@ function slerp(from, target, ratio, mid) {
51
52
  ];
52
53
  }
53
54
 
54
- function computeAnimationDuration(startState, targetState) {
55
+ function computeAnimationDuration(startState: CameraOptions, targetState: CameraOptions): number {
55
56
  const startDir = vecNormalize(vecSub(startState.position, startState.focal_point));
56
57
  const targetDir = vecNormalize(vecSub(targetState.position, targetState.focal_point));
57
58
  const dotProduct = Math.max(-1, Math.min(1, dot(startDir, targetDir)));
@@ -62,7 +63,18 @@ function computeAnimationDuration(startState, targetState) {
62
63
  );
63
64
  }
64
65
 
65
- function animateCamera(options) {
66
+ interface AnimateCameraOptions {
67
+ camera: vtkCamera;
68
+ startState: CameraOptions;
69
+ targetState: CameraOptions;
70
+ duration: number;
71
+ bumpMultiplier: number;
72
+ easeExponent: number;
73
+ onUpdate: () => void;
74
+ onEnd: () => void;
75
+ }
76
+
77
+ function animateCamera(options: AnimateCameraOptions): void {
66
78
  const {
67
79
  camera,
68
80
  startState,
@@ -83,7 +95,7 @@ function animateCamera(options) {
83
95
  const startTargetDot =
84
96
  normStart[0] * normTarget[0] + normStart[1] * normTarget[1] + normStart[2] * normTarget[2];
85
97
 
86
- let antipodalMid = undefined;
98
+ let antipodalMid: Vector3 | undefined = undefined;
87
99
  if (startTargetDot < -SLERP_LINEAR_THRESHOLD) {
88
100
  const normUp = vecNormalize(startState.view_up);
89
101
  antipodalMid = vecNormalize([
@@ -94,7 +106,7 @@ function animateCamera(options) {
94
106
  }
95
107
 
96
108
  const startTime = performance.now();
97
- function animate(currentTime) {
109
+ function animate(currentTime: number): void {
98
110
  const progress = Math.min((currentTime - startTime) / duration, 1);
99
111
  const ease =
100
112
  duration > SHORT_ANIMATION_DURATION
@@ -103,12 +115,18 @@ function animateCamera(options) {
103
115
  const bump = bumpMultiplier * Math.sin(Math.PI * progress);
104
116
  const dir = slerp(startDir, targetDir, ease, antipodalMid);
105
117
  const dist = startDist + (targetDist - startDist) * ease + bump;
106
- const focalPoint = startState.focal_point.map(
107
- (startValue, index) => startValue + (targetState.focal_point[index] - startValue) * ease,
108
- );
118
+ const focalPoint: Vector3 = [
119
+ startState.focal_point[0] + (targetState.focal_point[0] - startState.focal_point[0]) * ease,
120
+ startState.focal_point[1] + (targetState.focal_point[1] - startState.focal_point[1]) * ease,
121
+ startState.focal_point[2] + (targetState.focal_point[2] - startState.focal_point[2]) * ease,
122
+ ];
109
123
  const viewUp = slerp(startState.view_up, targetState.view_up, ease);
110
124
  camera.set({
111
- position: focalPoint.map((focalCoord, index) => focalCoord + dir[index] * dist),
125
+ position: [
126
+ focalPoint[0] + dir[0] * dist,
127
+ focalPoint[1] + dir[1] * dist,
128
+ focalPoint[2] + dir[2] * dist,
129
+ ],
112
130
  viewUp,
113
131
  focalPoint,
114
132
  });
@@ -3,9 +3,9 @@ const BACKGROUND_GREY_VALUE = 180;
3
3
  const ACTOR_DARK_VALUE = 20;
4
4
 
5
5
  const bgVal = BACKGROUND_GREY_VALUE / RGB_MAX;
6
- const BACKGROUND_COLOR = [bgVal, bgVal, bgVal];
6
+ const BACKGROUND_COLOR: [number, number, number] = [bgVal, bgVal, bgVal];
7
7
  const actVal = ACTOR_DARK_VALUE / RGB_MAX;
8
- const ACTOR_COLOR = [actVal, actVal, actVal];
8
+ const ACTOR_COLOR: [number, number, number] = [actVal, actVal, actVal];
9
9
  const HOVER_TIMEOUT_MS = 500;
10
10
  const WHEEL_TIME_OUT_MS = 600;
11
11
  const HOVER_DEBOUNCE_MS = 50;
@@ -0,0 +1,64 @@
1
+ import { Status } from "@ogw_front/utils/status";
2
+ import type { ViewStreamLike } from "./vtk_types";
3
+ import type { vtkGenericRenderWindow as VtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
4
+ import { useViewerStore } from "@ogw_front/stores/viewer";
5
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
6
+
7
+ interface GenericRenderWindowHolder {
8
+ value?: VtkGenericRenderWindow;
9
+ }
10
+
11
+ // `genericRenderWindow.value` is only ever read from these functions after the viewer has been initialized (see app/stores/hybrid_viewer.ts's initHybridViewer), so requireRenderWindow throwing on that path would indicate a real bug rather than an expected state.
12
+ function requireRenderWindow(holder: GenericRenderWindowHolder): VtkGenericRenderWindow {
13
+ if (!holder.value) {
14
+ throw new Error("genericRenderWindow accessed before the viewer was initialized");
15
+ }
16
+ return holder.value;
17
+ }
18
+
19
+ // Render-window, status and drag/pick state shared across the hybrid viewer's slice composables (app/stores/hybrid_viewer.ts and internal/stores/hybrid_viewer/*), plus the debounced remote-render call they all trigger. Shared via createSharedComposable (a singleton per mounted tree, not a Pinia store) so those slices can depend on it directly instead of on the composed hybridViewer store, which would create an import cycle; a real Pinia store here would also pull its own $id/$patch/... properties into the composed store's spread and collapse its inferred type.
20
+ const useHybridViewerCore = createSharedComposable(() => {
21
+ const genericRenderWindow = reactive<GenericRenderWindowHolder>({});
22
+ const status = ref(Status.NOT_CREATED);
23
+ const is_moving = ref(false);
24
+ const is_picking = ref(false);
25
+ const viewStream = ref<ViewStreamLike | undefined>(undefined);
26
+
27
+ let renderPromise: Promise<void> | undefined = undefined;
28
+ let renderPending = false;
29
+
30
+ async function remoteRender(): Promise<void> {
31
+ if (renderPromise) {
32
+ renderPending = true;
33
+ await renderPromise;
34
+ return;
35
+ }
36
+
37
+ renderPromise = (async (): Promise<void> => {
38
+ try {
39
+ const viewerStore = useViewerStore();
40
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.render;
41
+ await viewerStore.request({ schema });
42
+ } finally {
43
+ renderPromise = undefined;
44
+ if (renderPending) {
45
+ renderPending = false;
46
+ await remoteRender();
47
+ }
48
+ }
49
+ })();
50
+ return renderPromise;
51
+ }
52
+
53
+ return {
54
+ genericRenderWindow,
55
+ status,
56
+ is_moving,
57
+ is_picking,
58
+ viewStream,
59
+ remoteRender,
60
+ };
61
+ });
62
+
63
+ export { requireRenderWindow, useHybridViewerCore };
64
+ export type { GenericRenderWindowHolder };
@@ -1,10 +1,10 @@
1
- import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
1
+ import { useHybridViewerCore } from "./core";
2
2
  import { useViewerStore } from "@ogw_front/stores/viewer";
3
3
  import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
4
4
 
5
- async function performSetClippingPlanes(ids, planes) {
5
+ async function setClippingPlanes(ids: string[], planes: unknown): Promise<void> {
6
6
  const viewerStore = useViewerStore();
7
- const { remoteRender } = useHybridViewerStore();
7
+ const { remoteRender } = useHybridViewerCore();
8
8
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.clipping_planes;
9
9
  const params = {
10
10
  ids,
@@ -16,9 +16,9 @@ async function performSetClippingPlanes(ids, planes) {
16
16
  });
17
17
  await remoteRender();
18
18
  }
19
- async function performSetShrink(ids, shrink_factor) {
19
+ async function setShrink(ids: string[], shrink_factor: number): Promise<void> {
20
20
  const viewerStore = useViewerStore();
21
- const { remoteRender } = useHybridViewerStore();
21
+ const { remoteRender } = useHybridViewerCore();
22
22
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.shrink;
23
23
  const params = {
24
24
  ids,
@@ -30,16 +30,13 @@ async function performSetShrink(ids, shrink_factor) {
30
30
  });
31
31
  await remoteRender();
32
32
  }
33
- function useHybridViewerFilters() {
34
- async function setClippingPlanes(ids, planes) {
35
- await performSetClippingPlanes(ids, planes);
36
- }
37
- async function setShrink(ids, shrink_factor) {
38
- await performSetShrink(ids, shrink_factor);
39
- }
33
+ function useHybridViewerFilters(): {
34
+ setClippingPlanes: (ids: string[], planes: unknown) => Promise<void>;
35
+ setShrink: (ids: string[], shrink_factor: number) => Promise<void>;
36
+ } {
40
37
  return {
41
38
  setClippingPlanes,
42
39
  setShrink,
43
40
  };
44
41
  }
45
- export { performSetClippingPlanes, performSetShrink, useHybridViewerFilters };
42
+ export { useHybridViewerFilters };