From e80e0de74ca38b50a4f28f9be4a08a5a76cf7e20 Mon Sep 17 00:00:00 2001 From: Alexandru Popovici Date: Tue, 2 Sep 2025 09:46:30 +0300 Subject: [PATCH] Programmatic Measurements (#5346) * feat(viewer-lib): Added MeasurementData and stuck with shared library defined measurement related types * feat(viewer-lib): Some updates: - Removed unnecessary calculations in point to point measurement. More lean now. Implemented serialization/deserialization - Tempoarary serialization/deserializaton for the rest of the measurement types - MeasurementsExtension now is able to load measurements from MeasurementData objects - Updated viewer's export list to not export mesurements related types that are now exclusively exported by the shared library * feat(viewer): Perpendicular measurements simplification (a little bit) and serialization/deserialization * chore(frontend): Updated measurement types imports * chore(viewer-lib): Removed the old normal indicator line from the perpendicular measurement * feat(viewer-lib): Updates: - Generic fromMeasurementData and toMeasurementData for all measurements since it's unniversal - Each measurement type serializes/deserializes only specialized data - Implemented ponint measurement serializing/deserializing and programmatic functionining * feat(viewer-lib): Area mesurement serialization/deserialization * feat(viewer-lib): Updates: - Each measurement subtype now reports the MeasurementType it belongs to - MeasurementsExtension now emits a MeasurementsChanged event with all the measurements as payload whenever the measurements change - units and precision are no longer serialized/deserialized on a per-measurement basis - Added sync API member addMeasurement * chore(viewer-lib): Fix compiler error * chore(viewer-lib): Added measurements getter in MeasurementExtension * feat(fe2): save/reload measurements integration (#5351) * measurements idempotent api * extra adjustments, stuff seems to work * lint fix * more lint fix * fix for visible going false * better identification * fix FlyControls change action --------- Co-authored-by: Kristaps Fabians Geikins --- .../components/viewer/controls/Bottom.vue | 10 +- .../components/viewer/measurements/Menu.vue | 2 +- .../lib/viewer/composables/serialization.ts | 22 ++- .../lib/viewer/composables/setup.ts | 29 ++-- .../viewer/composables/setup/measurements.ts | 117 +++++++++++++ .../lib/viewer/composables/setup/postSetup.ts | 49 +----- .../lib/viewer/composables/setup/selection.ts | 2 +- .../frontend-2/lib/viewer/composables/ui.ts | 60 ++----- .../server/modules/comments/services/data.ts | 3 +- .../modules/viewer/repositories/savedViews.ts | 19 ++- .../shared/src/viewer/helpers/state.spec.ts | 6 +- packages/shared/src/viewer/helpers/state.ts | 41 +++-- packages/viewer-sandbox/package.json | 1 + .../src/Pipelines/Snow/SnowPipeline.ts | 4 +- packages/viewer-sandbox/src/Sandbox.ts | 4 +- packages/viewer-sandbox/tsconfig.json | 2 +- packages/viewer/src/index.ts | 4 - .../{EventEmitter.js => EventEmitter.ts} | 16 +- packages/viewer/src/modules/LegacyViewer.ts | 6 +- .../extensions/controls/FlyControls.ts | 3 +- .../measurements/AreaMeasurement.ts | 73 ++++++-- .../extensions/measurements/Measurement.ts | 37 +++++ .../measurements/MeasurementsExtension.ts | 157 ++++++++++++------ .../measurements/PerpendicularMeasurement.ts | 129 ++++++-------- .../measurements/PointMeasurement.ts | 5 + .../measurements/PointToPointMeasurement.ts | 72 ++++---- yarn.lock | 1 + 27 files changed, 543 insertions(+), 331 deletions(-) create mode 100644 packages/frontend-2/lib/viewer/composables/setup/measurements.ts rename packages/viewer/src/modules/{EventEmitter.js => EventEmitter.ts} (57%) diff --git a/packages/frontend-2/components/viewer/controls/Bottom.vue b/packages/frontend-2/components/viewer/controls/Bottom.vue index ce170fee3..f68591272 100644 --- a/packages/frontend-2/components/viewer/controls/Bottom.vue +++ b/packages/frontend-2/components/viewer/controls/Bottom.vue @@ -90,8 +90,7 @@ const { isSectionBoxEnabled, isSectionBoxVisible } = useSectionBoxUtilities() -const { getActiveMeasurement, removeMeasurement, enableMeasurements, hasMeasurements } = - useMeasurementUtilities() +const { enableMeasurements, hasMeasurements, measurements } = useMeasurementUtilities() const { resetExplode } = useFilterUtilities() const { viewMode: { mode: currentViewMode }, @@ -273,12 +272,9 @@ registerShortcuts({ }) onKeyStroke('Escape', () => { - const isActiveMeasurement = getActiveMeasurement() + const hasActiveMeasurements = measurements.value.length > 0 + if (hasActiveMeasurements) return - if (isActiveMeasurement) { - removeMeasurement() - return - } // Only close panels if there's no active measurement if (activePanel.value === ActivePanel.measurements) { toggleMeasurements() diff --git a/packages/frontend-2/components/viewer/measurements/Menu.vue b/packages/frontend-2/components/viewer/measurements/Menu.vue index 1000477e1..88b4400e6 100644 --- a/packages/frontend-2/components/viewer/measurements/Menu.vue +++ b/packages/frontend-2/components/viewer/measurements/Menu.vue @@ -83,7 +83,7 @@