@3cr/viewer-browser 0.0.62 → 0.0.86
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.
- package/components.d.ts +0 -2
- package/coverage/3cr-viewer-browser/index.html +116 -0
- package/coverage/3cr-viewer-browser/index.ts.html +199 -0
- package/coverage/3cr-viewer-browser/src/App.vue.html +316 -0
- package/coverage/3cr-viewer-browser/src/components/WebGL3DR.vue.html +442 -0
- package/coverage/3cr-viewer-browser/src/components/icons/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/components/icons/liver.vue.html +148 -0
- package/coverage/3cr-viewer-browser/src/components/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/components/loading/LoadingSpinner.vue.html +622 -0
- package/coverage/3cr-viewer-browser/src/components/loading/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/components/modal/MftpWebGL3DRModal.vue.html +3241 -0
- package/coverage/3cr-viewer-browser/src/components/modal/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/components/selectors/ValueSelector.vue.html +358 -0
- package/coverage/3cr-viewer-browser/src/components/selectors/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/components/sliders/DoubleSliderSelector.vue.html +487 -0
- package/coverage/3cr-viewer-browser/src/components/sliders/VerticalSliderSelector.vue.html +358 -0
- package/coverage/3cr-viewer-browser/src/components/sliders/index.html +131 -0
- package/coverage/3cr-viewer-browser/src/dataLayer/iconData.ts.html +118 -0
- package/coverage/3cr-viewer-browser/src/dataLayer/index.html +146 -0
- package/coverage/3cr-viewer-browser/src/dataLayer/payloadHandler.ts.html +352 -0
- package/coverage/3cr-viewer-browser/src/dataLayer/scanState.ts.html +628 -0
- package/coverage/3cr-viewer-browser/src/helpers/index.html +146 -0
- package/coverage/3cr-viewer-browser/src/helpers/layoutOverlayStyle.ts.html +406 -0
- package/coverage/3cr-viewer-browser/src/helpers/modelHelper.ts.html +412 -0
- package/coverage/3cr-viewer-browser/src/helpers/utils.ts.html +133 -0
- package/coverage/3cr-viewer-browser/src/index.html +131 -0
- package/coverage/3cr-viewer-browser/src/main.ts.html +124 -0
- package/coverage/3cr-viewer-browser/src/models/LoadViewerOptions.ts.html +166 -0
- package/coverage/3cr-viewer-browser/src/models/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/notifications/index.html +116 -0
- package/coverage/3cr-viewer-browser/src/notifications/notification.ts.html +229 -0
- package/coverage/3cr-viewer-browser/src/plugins/index.html +131 -0
- package/coverage/3cr-viewer-browser/src/plugins/index.ts.html +136 -0
- package/coverage/3cr-viewer-browser/src/plugins/vuetify.ts.html +220 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +296 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/dist/Viewer3CR.js +12 -12
- package/dist/Viewer3CR.mjs +10109 -10142
- package/dist/Viewer3CR.umd.js +12 -12
- package/index.ts +7 -42
- package/package.json +1 -1
- package/src/App.vue +6 -2
- package/src/components/modal/MftpWebGL3DRModal.vue +133 -495
- package/src/components/modal/__tests__/mftp-webgl-3dr-modal.spec.ts +79 -84
- package/src/components/selectors/ValueSelector.vue +4 -0
- package/src/components/selectors/__tests__/value-selector.spec.ts +18 -0
- package/src/components/sliders/DoubleSliderSelector.vue +10 -4
- package/src/components/sliders/__tests__/double-slider-selector.spec.ts +32 -0
- package/src/dataLayer/__tests__/payload-handler.spec.ts +98 -0
- package/src/dataLayer/iconData.ts +11 -0
- package/src/dataLayer/payloadHandler.ts +89 -0
- package/src/dataLayer/scanState.ts +181 -0
- package/src/demo/options.ts +93 -0
- package/src/models/Callbacks.ts +2 -0
- package/src/models/LoadViewerOptions.ts +27 -0
- package/src/models/LoadViewerPayload.ts +8 -0
- package/src/notifications/notification.ts +48 -0
- package/vitest.config.mts +1 -0
- package/coverage/.tmp/coverage-100.json +0 -1
- package/coverage/.tmp/coverage-101.json +0 -1
- package/coverage/.tmp/coverage-102.json +0 -1
- package/coverage/.tmp/coverage-103.json +0 -1
- package/coverage/.tmp/coverage-104.json +0 -1
- package/coverage/.tmp/coverage-105.json +0 -1
- package/coverage/.tmp/coverage-106.json +0 -1
- package/coverage/.tmp/coverage-107.json +0 -1
- package/coverage/.tmp/coverage-108.json +0 -1
- package/coverage/.tmp/coverage-109.json +0 -1
- package/coverage/.tmp/coverage-110.json +0 -1
- package/coverage/.tmp/coverage-98.json +0 -1
- package/coverage/.tmp/coverage-99.json +0 -1
- /package/src/{components/modal → demo}/DemoModal.vue +0 -0
- /package/src/{components/modal → demo}/DemoPatientModal.vue +0 -0
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
/>
|
|
330
330
|
<v-card-actions class="py-3">
|
|
331
331
|
<v-select
|
|
332
|
-
:value="
|
|
332
|
+
:value="currentGreyscalePreset"
|
|
333
333
|
:items="initialScanState.GreyscalePresets"
|
|
334
334
|
label="Greyscale Preset"
|
|
335
335
|
item-text="Name"
|
|
@@ -491,8 +491,12 @@
|
|
|
491
491
|
color="transparent"
|
|
492
492
|
:icon="true"
|
|
493
493
|
@click="
|
|
494
|
-
viewSelection(
|
|
495
|
-
|
|
494
|
+
payloadHandler.viewSelection(
|
|
495
|
+
ViewSelectionActions.vs06
|
|
496
|
+
);
|
|
497
|
+
payloadHandler.viewSelection(
|
|
498
|
+
ViewSelectionActions.vs05
|
|
499
|
+
);
|
|
496
500
|
"
|
|
497
501
|
><v-icon color="white">home</v-icon></v-btn
|
|
498
502
|
>
|
|
@@ -590,7 +594,7 @@
|
|
|
590
594
|
<v-btn
|
|
591
595
|
color="primary"
|
|
592
596
|
@click="
|
|
593
|
-
rotateByDeg(
|
|
597
|
+
payloadHandler.rotateByDeg(
|
|
594
598
|
getCurrentActiveView(layout),
|
|
595
599
|
rotationDeg
|
|
596
600
|
)
|
|
@@ -667,38 +671,55 @@ import VerticalSliderSelector from "@/components/sliders/VerticalSliderSelector.
|
|
|
667
671
|
import { generateDivStyleForLayout } from "@/helpers/layoutOverlayStyle";
|
|
668
672
|
|
|
669
673
|
import {
|
|
670
|
-
inflateInitialScanState,
|
|
671
|
-
inflateScanState,
|
|
672
|
-
} from "@/helpers/modelHelper";
|
|
673
|
-
import {
|
|
674
|
-
SlidersActions,
|
|
675
|
-
PresetsActions,
|
|
676
|
-
ScanMovementActions,
|
|
677
|
-
ScanOrientationActions,
|
|
678
674
|
FileManagementActions,
|
|
679
675
|
FrontEndInterfaces,
|
|
680
|
-
AnchorPoint,
|
|
681
|
-
ColourPresetData,
|
|
682
|
-
CurrentScanState,
|
|
683
|
-
InitialScanState,
|
|
684
676
|
PositionData,
|
|
677
|
+
PresetsActions,
|
|
678
|
+
ScanMovementActions,
|
|
685
679
|
ScanView,
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
NotificationPayload,
|
|
680
|
+
SlidersActions,
|
|
681
|
+
ViewSelectionActions,
|
|
689
682
|
} from "@3cr/types-ts";
|
|
683
|
+
import { defineEmits, nextTick, ref, unref, watch, WatchSource } from "vue";
|
|
690
684
|
|
|
691
|
-
import { toNumber } from "@/helpers/utils";
|
|
692
|
-
import { computed, ref, unref, watch, defineEmits, nextTick } from "vue";
|
|
693
685
|
import {
|
|
694
|
-
|
|
686
|
+
checkIsDemo,
|
|
687
|
+
demoType,
|
|
688
|
+
executeDemoOption,
|
|
689
|
+
isDemo,
|
|
690
|
+
m_demo,
|
|
691
|
+
m_demoPatient,
|
|
692
|
+
} from "@/demo/options";
|
|
693
|
+
import { handleNotification } from "@/notifications/notification";
|
|
694
|
+
import DemoPatientModal from "@/demo/DemoPatientModal.vue";
|
|
695
|
+
import DemoModal from "@/demo/DemoModal.vue";
|
|
696
|
+
import { LoadViewerPayload } from "@/models/LoadViewerPayload";
|
|
697
|
+
import {
|
|
698
|
+
defaultLoadViewerOptions,
|
|
695
699
|
LoadViewerOptions,
|
|
696
|
-
|
|
697
|
-
} from "
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
700
|
+
} from "@/models/LoadViewerOptions";
|
|
701
|
+
import { PayloadHandler, sendPayload } from "@/dataLayer/payloadHandler";
|
|
702
|
+
import {
|
|
703
|
+
cMinMax,
|
|
704
|
+
cSlider,
|
|
705
|
+
currentColourPreset,
|
|
706
|
+
currentGreyscalePreset,
|
|
707
|
+
huMinMax,
|
|
708
|
+
initialScanState,
|
|
709
|
+
isLayout1x3,
|
|
710
|
+
isLayout2x2,
|
|
711
|
+
scanState,
|
|
712
|
+
setInitialScanStateFromPayload,
|
|
713
|
+
setScanStateFromPayload,
|
|
714
|
+
sMinMax,
|
|
715
|
+
sSlider,
|
|
716
|
+
thresholdSlider,
|
|
717
|
+
tMinMax,
|
|
718
|
+
transactionStarted,
|
|
719
|
+
tSlider,
|
|
720
|
+
windowSlider,
|
|
721
|
+
} from "@/dataLayer/scanState";
|
|
722
|
+
import { getIconForPreset } from "@/dataLayer/iconData";
|
|
702
723
|
|
|
703
724
|
const emit = defineEmits<{
|
|
704
725
|
instanceLoaded: [void];
|
|
@@ -718,92 +739,15 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
718
739
|
Key: "OWjSMiL/ewUV1V6fGybhKcTyiysTPsIMp2DjdVoOUGI=",
|
|
719
740
|
},
|
|
720
741
|
}),
|
|
721
|
-
options: () =>
|
|
742
|
+
options: () => defaultLoadViewerOptions,
|
|
722
743
|
});
|
|
723
|
-
const isDemo = ref<boolean>(false);
|
|
724
|
-
let m_demo = ref<boolean>(false);
|
|
725
|
-
let m_demoPatient = ref<boolean>(false);
|
|
726
|
-
|
|
727
|
-
const demoLicenceOptions: LoadViewerOptions = {
|
|
728
|
-
OnClosePopup: () => Promise.resolve(),
|
|
729
|
-
OnExitViewer: () => {
|
|
730
|
-
m_demo.value = true;
|
|
731
|
-
},
|
|
732
|
-
OnLoadNewDicomSeries: () => {
|
|
733
|
-
m_demo.value = true;
|
|
734
|
-
},
|
|
735
|
-
OnDownloadDicomSeries: () => {
|
|
736
|
-
m_demo.value = true;
|
|
737
|
-
},
|
|
738
|
-
OnLoadSavedSession: () => {
|
|
739
|
-
m_demo.value = true;
|
|
740
|
-
},
|
|
741
|
-
OnSaveSession: () => {
|
|
742
|
-
m_demo.value = true;
|
|
743
|
-
},
|
|
744
|
-
OnSendTo3rdParty: () => {
|
|
745
|
-
m_demo.value = true;
|
|
746
|
-
},
|
|
747
|
-
OnShareToMobile: () => {
|
|
748
|
-
m_demo.value = true;
|
|
749
|
-
},
|
|
750
|
-
OnShare: () => {
|
|
751
|
-
m_demo.value = true;
|
|
752
|
-
},
|
|
753
|
-
OnScreenshot: () => {
|
|
754
|
-
m_demo.value = true;
|
|
755
|
-
},
|
|
756
|
-
};
|
|
757
|
-
|
|
758
|
-
const demoPatientOptions: LoadViewerOptions = {
|
|
759
|
-
OnClosePopup: () => Promise.resolve(),
|
|
760
|
-
OnExitViewer: () => {
|
|
761
|
-
m_demoPatient.value = true;
|
|
762
|
-
},
|
|
763
|
-
OnLoadNewDicomSeries: () => {
|
|
764
|
-
m_demoPatient.value = true;
|
|
765
|
-
},
|
|
766
|
-
OnDownloadDicomSeries: () => {
|
|
767
|
-
m_demoPatient.value = true;
|
|
768
|
-
},
|
|
769
|
-
OnLoadSavedSession: () => {
|
|
770
|
-
m_demoPatient.value = true;
|
|
771
|
-
},
|
|
772
|
-
OnSaveSession: () => {
|
|
773
|
-
m_demoPatient.value = true;
|
|
774
|
-
},
|
|
775
|
-
OnSendTo3rdParty: () => {
|
|
776
|
-
m_demoPatient.value = true;
|
|
777
|
-
},
|
|
778
|
-
OnShareToMobile: () => {
|
|
779
|
-
m_demoPatient.value = true;
|
|
780
|
-
},
|
|
781
|
-
OnShare: () => {
|
|
782
|
-
m_demoPatient.value = true;
|
|
783
|
-
},
|
|
784
|
-
OnScreenshot: () => {
|
|
785
|
-
m_demoPatient.value = true;
|
|
786
|
-
},
|
|
787
|
-
};
|
|
788
744
|
|
|
789
|
-
const
|
|
790
|
-
|
|
791
|
-
return urlParams.get("demoType") || "licence";
|
|
792
|
-
});
|
|
745
|
+
const web_gl = ref<typeof WebGL3DR | null>(null);
|
|
746
|
+
const payloadHandler = new PayloadHandler(web_gl);
|
|
793
747
|
|
|
794
748
|
function executeOption(key: keyof LoadViewerOptions) {
|
|
795
749
|
if (unref(isDemo)) {
|
|
796
|
-
|
|
797
|
-
const functionToExecute = demoLicenceOptions[key];
|
|
798
|
-
if (functionToExecute !== undefined) {
|
|
799
|
-
functionToExecute();
|
|
800
|
-
}
|
|
801
|
-
} else if (unref(demoType) === "patient") {
|
|
802
|
-
const functionToExecute = demoPatientOptions[key];
|
|
803
|
-
if (functionToExecute !== undefined) {
|
|
804
|
-
functionToExecute();
|
|
805
|
-
}
|
|
806
|
-
}
|
|
750
|
+
executeDemoOption(key);
|
|
807
751
|
} else {
|
|
808
752
|
const functionToExecute = unref(props.options)[key];
|
|
809
753
|
if (functionToExecute !== undefined) {
|
|
@@ -819,9 +763,6 @@ const drawer = ref<boolean>(true);
|
|
|
819
763
|
const drawerCollapsed = ref<boolean>(true);
|
|
820
764
|
const scanLoading = ref<boolean>(true);
|
|
821
765
|
const instanceLoaded = ref<boolean>(true);
|
|
822
|
-
const scanState = ref<CurrentScanState>(inflateScanState());
|
|
823
|
-
const initialScanState = ref<InitialScanState>(inflateInitialScanState());
|
|
824
|
-
const currentColourPreset = ref<ColourPresetData | undefined>(undefined);
|
|
825
766
|
const openPanels = ref<number>(0);
|
|
826
767
|
const previousLayout = ref<string>("lo_02");
|
|
827
768
|
const footerItems = ref([
|
|
@@ -830,9 +771,8 @@ const footerItems = ref([
|
|
|
830
771
|
icon: "refresh",
|
|
831
772
|
color: "red",
|
|
832
773
|
click: async () => {
|
|
833
|
-
|
|
834
|
-
await viewSelection(
|
|
835
|
-
await viewSelection("vs_06");
|
|
774
|
+
await payloadHandler.viewSelection(ViewSelectionActions.vs05);
|
|
775
|
+
await payloadHandler.viewSelection(ViewSelectionActions.vs06);
|
|
836
776
|
},
|
|
837
777
|
},
|
|
838
778
|
{
|
|
@@ -862,238 +802,69 @@ const miniMenu = ref([
|
|
|
862
802
|
tooltip:
|
|
863
803
|
"Tissue Density - Change the view of density within the scan, allowing you to see through a certain density of particles",
|
|
864
804
|
},
|
|
865
|
-
// { icon: 'display_settings', text: 'Display', tooltip: 'Display - Alter the view of the current scan' },
|
|
866
805
|
]);
|
|
867
806
|
|
|
868
|
-
const huMinMax = ref({
|
|
869
|
-
min: -999999,
|
|
870
|
-
max: 999999,
|
|
871
|
-
});
|
|
872
|
-
|
|
873
|
-
const tMinMax = ref({
|
|
874
|
-
min: 0,
|
|
875
|
-
max: 999999,
|
|
876
|
-
});
|
|
877
|
-
const sMinMax = ref({
|
|
878
|
-
min: 0,
|
|
879
|
-
max: 999999,
|
|
880
|
-
});
|
|
881
|
-
const cMinMax = ref({
|
|
882
|
-
min: 0,
|
|
883
|
-
max: 999999,
|
|
884
|
-
});
|
|
885
807
|
const rotationDeg = ref<number>(0);
|
|
886
|
-
const scanStateIncoming = ref<string>("");
|
|
887
|
-
const transactionStarted = ref<boolean>(false);
|
|
888
808
|
const stateOverlay = ref<boolean>(false);
|
|
889
809
|
const m_closeDialog = ref<boolean>(false);
|
|
890
810
|
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
set(value: Array<number>) {
|
|
911
|
-
scanState.value.Display.ThresholdLower = value[0];
|
|
912
|
-
scanState.value.Display.ThresholdUpper = value[1];
|
|
913
|
-
},
|
|
914
|
-
});
|
|
915
|
-
const tSlider = computed({
|
|
916
|
-
get() {
|
|
917
|
-
return [
|
|
918
|
-
Math.trunc(unref(scanState).Slice.TransverseLower),
|
|
919
|
-
Math.trunc(unref(scanState).Slice.TransverseUpper),
|
|
920
|
-
];
|
|
921
|
-
},
|
|
922
|
-
set(value: Array<number>) {
|
|
923
|
-
scanState.value.Slice.TransverseLower = value[0];
|
|
924
|
-
scanState.value.Slice.TransverseLower = value[1];
|
|
925
|
-
},
|
|
926
|
-
});
|
|
927
|
-
const sSlider = computed({
|
|
928
|
-
get() {
|
|
929
|
-
return [
|
|
930
|
-
Math.trunc(unref(scanState).Slice.SagittalLower),
|
|
931
|
-
Math.trunc(unref(scanState).Slice.SagittalUpper),
|
|
932
|
-
];
|
|
933
|
-
},
|
|
934
|
-
set(value: Array<number>) {
|
|
935
|
-
scanState.value.Slice.SagittalLower = value[0];
|
|
936
|
-
scanState.value.Slice.SagittalUpper = value[1];
|
|
937
|
-
},
|
|
938
|
-
});
|
|
811
|
+
type WatchSlidersType = { [key in SlidersActions]: WatchSource<number> };
|
|
812
|
+
const watchSliders: WatchSlidersType = {
|
|
813
|
+
[SlidersActions.sl01]: () => scanState.value.Display.Brightness,
|
|
814
|
+
[SlidersActions.sl02]: () => scanState.value.Display.Contrast,
|
|
815
|
+
[SlidersActions.sl03]: () => scanState.value.Display.Opacity,
|
|
816
|
+
[SlidersActions.sl04]: () => scanState.value.Display.WindowLower,
|
|
817
|
+
[SlidersActions.sl05]: () => scanState.value.Display.WindowUpper,
|
|
818
|
+
[SlidersActions.sl06]: () => scanState.value.Display.ThresholdLower,
|
|
819
|
+
[SlidersActions.sl07]: () => scanState.value.Display.ThresholdUpper,
|
|
820
|
+
[SlidersActions.sl08]: () => scanState.value.Slice.TransverseLower,
|
|
821
|
+
[SlidersActions.sl09]: () => scanState.value.Orientations.Transverse.Slice,
|
|
822
|
+
[SlidersActions.sl10]: () => scanState.value.Slice.TransverseUpper,
|
|
823
|
+
[SlidersActions.sl11]: () => scanState.value.Slice.SagittalLower,
|
|
824
|
+
[SlidersActions.sl12]: () => scanState.value.Orientations.Sagittal.Slice,
|
|
825
|
+
[SlidersActions.sl13]: () => scanState.value.Slice.SagittalUpper,
|
|
826
|
+
[SlidersActions.sl14]: () => scanState.value.Slice.CoronalLower,
|
|
827
|
+
[SlidersActions.sl15]: () => scanState.value.Orientations.Coronal.Slice,
|
|
828
|
+
[SlidersActions.sl16]: () => scanState.value.Slice.CoronalUpper,
|
|
829
|
+
};
|
|
939
830
|
|
|
940
|
-
const
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
scanState.value.Slice.CoronalLower = value[0];
|
|
949
|
-
scanState.value.Slice.CoronalUpper = value[1];
|
|
950
|
-
},
|
|
951
|
-
});
|
|
952
|
-
const web_gl = ref<typeof WebGL3DR | null>(null);
|
|
831
|
+
for (const slider of Object.keys(watchSliders)) {
|
|
832
|
+
watch(
|
|
833
|
+
watchSliders[slider as keyof WatchSlidersType],
|
|
834
|
+
async (value: number) => {
|
|
835
|
+
await payloadHandler.sliderHandler(slider as SlidersActions, value);
|
|
836
|
+
}
|
|
837
|
+
);
|
|
838
|
+
}
|
|
953
839
|
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
await sliderHandler(SlidersActions.sl01, value);
|
|
958
|
-
}
|
|
959
|
-
);
|
|
960
|
-
watch(
|
|
961
|
-
() => scanState.value.Display.Contrast,
|
|
962
|
-
async (value: number) => {
|
|
963
|
-
await sliderHandler(SlidersActions.sl02, value);
|
|
964
|
-
}
|
|
965
|
-
);
|
|
966
|
-
watch(
|
|
967
|
-
() => scanState.value.Display.Opacity,
|
|
968
|
-
async (value: number) => {
|
|
969
|
-
await sliderHandler(SlidersActions.sl03, value);
|
|
970
|
-
}
|
|
971
|
-
);
|
|
972
|
-
watch(
|
|
973
|
-
() => scanState.value.Display.WindowLower,
|
|
974
|
-
async (value: number) => {
|
|
975
|
-
await sliderHandler(SlidersActions.sl04, value);
|
|
976
|
-
}
|
|
977
|
-
);
|
|
978
|
-
watch(
|
|
979
|
-
() => scanState.value.Display.WindowUpper,
|
|
980
|
-
async (value: number) => {
|
|
981
|
-
await sliderHandler(SlidersActions.sl05, value);
|
|
982
|
-
}
|
|
983
|
-
);
|
|
984
|
-
watch(
|
|
985
|
-
() => scanState.value.Display.ThresholdLower,
|
|
986
|
-
async (value: number) => {
|
|
987
|
-
await sliderHandler(SlidersActions.sl06, value);
|
|
988
|
-
}
|
|
989
|
-
);
|
|
990
|
-
watch(
|
|
991
|
-
() => scanState.value.Display.ThresholdUpper,
|
|
992
|
-
async (value: number) => {
|
|
993
|
-
await sliderHandler(SlidersActions.sl07, value);
|
|
994
|
-
}
|
|
995
|
-
);
|
|
996
|
-
watch(
|
|
997
|
-
() => scanState.value.Slice.TransverseLower,
|
|
998
|
-
async (value: number) => {
|
|
999
|
-
await sliderHandler(SlidersActions.sl08, value);
|
|
1000
|
-
}
|
|
1001
|
-
);
|
|
1002
|
-
watch(
|
|
1003
|
-
() => scanState.value.Orientations.Transverse.Slice,
|
|
1004
|
-
async (value: number) => {
|
|
1005
|
-
await sliderHandler(SlidersActions.sl09, value);
|
|
1006
|
-
}
|
|
1007
|
-
);
|
|
1008
|
-
watch(
|
|
1009
|
-
() => scanState.value.Slice.TransverseUpper,
|
|
1010
|
-
async (value: number) => {
|
|
1011
|
-
await sliderHandler(SlidersActions.sl10, value);
|
|
1012
|
-
}
|
|
1013
|
-
);
|
|
1014
|
-
watch(
|
|
1015
|
-
() => scanState.value.Slice.SagittalLower,
|
|
1016
|
-
async (value: number) => {
|
|
1017
|
-
await sliderHandler(SlidersActions.sl11, value);
|
|
1018
|
-
}
|
|
1019
|
-
);
|
|
1020
|
-
watch(
|
|
1021
|
-
() => scanState.value.Orientations.Sagittal.Slice,
|
|
1022
|
-
async (value: number) => {
|
|
1023
|
-
await sliderHandler(SlidersActions.sl12, value);
|
|
1024
|
-
}
|
|
1025
|
-
);
|
|
1026
|
-
watch(
|
|
1027
|
-
() => scanState.value.Slice.SagittalUpper,
|
|
1028
|
-
async (value: number) => {
|
|
1029
|
-
await sliderHandler(SlidersActions.sl13, value);
|
|
1030
|
-
}
|
|
1031
|
-
);
|
|
1032
|
-
watch(
|
|
1033
|
-
() => scanState.value.Slice.CoronalLower,
|
|
1034
|
-
async (value: number) => {
|
|
1035
|
-
await sliderHandler(SlidersActions.sl14, value);
|
|
1036
|
-
}
|
|
1037
|
-
);
|
|
1038
|
-
watch(
|
|
1039
|
-
() => scanState.value.Orientations.Coronal.Slice,
|
|
1040
|
-
async (value: number) => {
|
|
1041
|
-
await sliderHandler(SlidersActions.sl15, value);
|
|
1042
|
-
}
|
|
1043
|
-
);
|
|
1044
|
-
watch(
|
|
1045
|
-
() => scanState.value.Slice.CoronalUpper,
|
|
1046
|
-
async (value: number) => {
|
|
1047
|
-
await sliderHandler(SlidersActions.sl16, value);
|
|
1048
|
-
}
|
|
1049
|
-
);
|
|
1050
|
-
watch(
|
|
1051
|
-
() => scanState.value.InteractionSettings.PanSensivitity,
|
|
1052
|
-
async (value: number) => {
|
|
1053
|
-
await scanMovementHandler(ScanMovementActions.sm05, value);
|
|
1054
|
-
}
|
|
1055
|
-
);
|
|
1056
|
-
watch(
|
|
1057
|
-
() => scanState.value.InteractionSettings.ZoomSensitivity,
|
|
1058
|
-
async (value: number) => {
|
|
1059
|
-
await scanMovementHandler(ScanMovementActions.sm08, value);
|
|
1060
|
-
}
|
|
1061
|
-
);
|
|
1062
|
-
watch(
|
|
1063
|
-
() => scanState.value.InteractionSettings.RotateSensitivity,
|
|
1064
|
-
async (value: number) => {
|
|
1065
|
-
await scanMovementHandler(ScanMovementActions.sm10, value);
|
|
1066
|
-
}
|
|
1067
|
-
);
|
|
1068
|
-
watch(
|
|
1069
|
-
() => scanState.value.InteractionSettings.CameraRotateSensitivity,
|
|
1070
|
-
async (value: number) => {
|
|
1071
|
-
await scanMovementHandler(ScanMovementActions.sm12, value);
|
|
1072
|
-
}
|
|
1073
|
-
);
|
|
840
|
+
type WatchScanMovementType = {
|
|
841
|
+
[key in ScanMovementActions]: WatchSource<number>;
|
|
842
|
+
};
|
|
1074
843
|
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
{
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
844
|
+
//@ts-ignore
|
|
845
|
+
const watchScanMovement: WatchScanMovementType = {
|
|
846
|
+
[ScanMovementActions.sm05]: () =>
|
|
847
|
+
scanState.value.InteractionSettings.PanSensivitity,
|
|
848
|
+
[ScanMovementActions.sm08]: () =>
|
|
849
|
+
scanState.value.InteractionSettings.ZoomSensitivity,
|
|
850
|
+
[ScanMovementActions.sm10]: () =>
|
|
851
|
+
scanState.value.InteractionSettings.RotateSensitivity,
|
|
852
|
+
[ScanMovementActions.sm12]: () =>
|
|
853
|
+
scanState.value.InteractionSettings.CameraRotateSensitivity,
|
|
854
|
+
};
|
|
855
|
+
|
|
856
|
+
for (const scanMovement of Object.keys(watchScanMovement)) {
|
|
857
|
+
watch(
|
|
858
|
+
watchScanMovement[scanMovement as keyof typeof watchScanMovement],
|
|
859
|
+
async (value: number) => {
|
|
860
|
+
await payloadHandler.scanMovementHandler(
|
|
861
|
+
scanMovement as ScanMovementActions,
|
|
862
|
+
value
|
|
863
|
+
);
|
|
1094
864
|
}
|
|
1095
865
|
);
|
|
1096
866
|
}
|
|
867
|
+
|
|
1097
868
|
function getCurrentActiveView(position: PositionData): ScanView {
|
|
1098
869
|
return unref(scanState).Layout.PositionData.length !== 1
|
|
1099
870
|
? position.DefaultView
|
|
@@ -1109,16 +880,16 @@ function getViewName(index: number) {
|
|
|
1109
880
|
}
|
|
1110
881
|
async function fullscreenLayout(view: ScanView) {
|
|
1111
882
|
await layouts("lo_01");
|
|
1112
|
-
await viewSelection(`vs_0${view + 1}`);
|
|
1113
|
-
}
|
|
1114
|
-
async function scanMovementHandler(action: string, value: number) {
|
|
1115
|
-
if (unref(transactionStarted)) return;
|
|
1116
|
-
await scanMovement(action, value);
|
|
1117
|
-
}
|
|
1118
|
-
async function sliderHandler(action: string, value: number) {
|
|
1119
|
-
if (unref(transactionStarted)) return;
|
|
1120
|
-
await slider(action, value);
|
|
883
|
+
await payloadHandler.viewSelection(`vs_0${view + 1}` as ViewSelectionActions);
|
|
1121
884
|
}
|
|
885
|
+
// async function scanMovementHandler(action: string, value: number) {
|
|
886
|
+
// if (unref(transactionStarted)) return;
|
|
887
|
+
// await scanMovement(action, value);
|
|
888
|
+
// }
|
|
889
|
+
// async function sliderHandler(action: string, value: number) {
|
|
890
|
+
// if (unref(transactionStarted)) return;
|
|
891
|
+
// await slider(action, value);
|
|
892
|
+
// }
|
|
1122
893
|
|
|
1123
894
|
function closeModal() {
|
|
1124
895
|
m_closeDialog.value = false;
|
|
@@ -1130,181 +901,52 @@ function alterValue(val: boolean) {
|
|
|
1130
901
|
m_closeDialog.value = true;
|
|
1131
902
|
return;
|
|
1132
903
|
} else {
|
|
1133
|
-
|
|
1134
|
-
props.payload.Url ===
|
|
1135
|
-
"https://webgl-3dr.singular.health/test_scans/01440d4e-8b04-4b90-bb2c-698535ce16d6/CHEST.3vxl";
|
|
904
|
+
checkIsDemo(props.payload);
|
|
1136
905
|
}
|
|
1137
906
|
|
|
1138
907
|
value.value = val;
|
|
1139
908
|
}
|
|
1140
|
-
async function sendPayload(
|
|
1141
|
-
interfaceType: string,
|
|
1142
|
-
actionType: string,
|
|
1143
|
-
message: any
|
|
1144
|
-
) {
|
|
1145
|
-
await unref(web_gl)?.sendPayload(
|
|
1146
|
-
JSON.stringify({
|
|
1147
|
-
Version: "0.0.1",
|
|
1148
|
-
Interface: interfaceType,
|
|
1149
|
-
Action: actionType,
|
|
1150
|
-
Message: JSON.stringify(message),
|
|
1151
|
-
})
|
|
1152
|
-
);
|
|
1153
|
-
}
|
|
1154
909
|
async function load() {
|
|
1155
910
|
instanceLoaded.value = true;
|
|
1156
911
|
scanLoading.value = true;
|
|
1157
|
-
await sendPayload("file_management", "fm_01", props.payload);
|
|
1158
|
-
}
|
|
1159
|
-
async function viewSelection(action: string) {
|
|
1160
|
-
await sendPayload(FrontEndInterfaces.view_selection, action, emptyPayload);
|
|
912
|
+
await sendPayload(web_gl, "file_management", "fm_01", props.payload);
|
|
1161
913
|
}
|
|
914
|
+
|
|
1162
915
|
async function layouts(action: string) {
|
|
1163
916
|
if (action !== "lo_01") previousLayout.value = action;
|
|
1164
|
-
await sendPayload(FrontEndInterfaces.layout, action, emptyPayload);
|
|
917
|
+
await sendPayload(web_gl, FrontEndInterfaces.layout, action, emptyPayload);
|
|
1165
918
|
}
|
|
1166
919
|
async function snap() {
|
|
1167
920
|
emit("snap");
|
|
1168
921
|
}
|
|
1169
922
|
|
|
1170
923
|
async function setPreset(action: PresetsActions, preset: any) {
|
|
1171
|
-
await sendPayload("presets", action, preset);
|
|
924
|
+
await sendPayload(web_gl, "presets", action, preset);
|
|
1172
925
|
if (action === PresetsActions.pr02) {
|
|
1173
926
|
currentColourPreset.value = preset;
|
|
1174
927
|
}
|
|
1175
928
|
}
|
|
1176
|
-
|
|
1177
|
-
await sendPayload("sliders", action, {
|
|
1178
|
-
Version: "0.0.1",
|
|
1179
|
-
Value: toNumber(value),
|
|
1180
|
-
});
|
|
1181
|
-
}
|
|
1182
|
-
async function scanMovement(action: string, value: number) {
|
|
1183
|
-
await sendPayload(FrontEndInterfaces.scan_movement, action, {
|
|
1184
|
-
Version: "0.0.1",
|
|
1185
|
-
Value: toNumber(value),
|
|
1186
|
-
});
|
|
1187
|
-
}
|
|
929
|
+
|
|
1188
930
|
async function hoverOverCanvas(isHovering: boolean) {
|
|
1189
|
-
await sendPayload("interactivity", "in_01", {
|
|
931
|
+
await sendPayload(web_gl, "interactivity", "in_01", {
|
|
1190
932
|
Version: "0.0.1",
|
|
1191
933
|
Value: isHovering,
|
|
1192
934
|
});
|
|
1193
|
-
await sendPayload("interactivity", "in_02", {
|
|
935
|
+
await sendPayload(web_gl, "interactivity", "in_02", {
|
|
1194
936
|
Version: "0.0.1",
|
|
1195
937
|
Value: isHovering,
|
|
1196
938
|
});
|
|
1197
939
|
}
|
|
1198
|
-
async function i_scanState(_: string, message: string) {
|
|
1199
|
-
transactionStarted.value = true;
|
|
1200
|
-
scanStateIncoming.value = JSON.stringify(JSON.parse(message), null, 2);
|
|
1201
|
-
|
|
1202
|
-
setScanState(message);
|
|
1203
|
-
await nextTick();
|
|
1204
|
-
transactionStarted.value = false;
|
|
1205
|
-
}
|
|
1206
940
|
async function i_fileManagement(action: string, message: string) {
|
|
1207
|
-
if (action
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
scanStateIncoming.value = JSON.stringify(JSON.parse(message), null, 2);
|
|
1211
|
-
const obj = JSON.parse(unref(scanStateIncoming)) as InitialScanState;
|
|
1212
|
-
|
|
1213
|
-
setScanState(JSON.stringify(obj.DefaultDisplaySettings, null, 2));
|
|
1214
|
-
initialScanState.value = obj;
|
|
1215
|
-
huMinMax.value.max = obj.HuUpper;
|
|
1216
|
-
huMinMax.value.min = obj.HuLower;
|
|
1217
|
-
sMinMax.value.max = obj.XSlices;
|
|
1218
|
-
cMinMax.value.max = obj.YSlices;
|
|
1219
|
-
tMinMax.value.max = obj.ZSlices;
|
|
1220
|
-
currentColourPreset.value = obj.ColourPresets[0];
|
|
1221
|
-
|
|
1222
|
-
await nextTick();
|
|
1223
|
-
transactionStarted.value = false;
|
|
1224
|
-
scanLoading.value = false;
|
|
1225
|
-
drawerCollapsed.value = false;
|
|
1226
|
-
await hoverOverCanvas(false);
|
|
1227
|
-
}
|
|
1228
|
-
|
|
1229
|
-
async function i_notifications(action: string, message: string) {
|
|
1230
|
-
const notification = JSON.parse(message) as NotificationPayload;
|
|
941
|
+
if (action === FileManagementActions.fm02) {
|
|
942
|
+
await setInitialScanStateFromPayload(action, message);
|
|
1231
943
|
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
return;
|
|
1238
|
-
default:
|
|
944
|
+
await nextTick();
|
|
945
|
+
transactionStarted.value = false;
|
|
946
|
+
scanLoading.value = false;
|
|
947
|
+
drawerCollapsed.value = false;
|
|
948
|
+
await hoverOverCanvas(false);
|
|
1239
949
|
}
|
|
1240
|
-
if (notification.Action.startsWith("sl")) return;
|
|
1241
|
-
|
|
1242
|
-
let type = "success";
|
|
1243
|
-
switch (action) {
|
|
1244
|
-
// Muting no01
|
|
1245
|
-
case NotificationsActions.no01:
|
|
1246
|
-
type = "success";
|
|
1247
|
-
return;
|
|
1248
|
-
|
|
1249
|
-
case NotificationsActions.no02:
|
|
1250
|
-
type = "warn";
|
|
1251
|
-
break;
|
|
1252
|
-
|
|
1253
|
-
case NotificationsActions.no03:
|
|
1254
|
-
type = "error";
|
|
1255
|
-
break;
|
|
1256
|
-
|
|
1257
|
-
// Muting no04
|
|
1258
|
-
case NotificationsActions.no04:
|
|
1259
|
-
type = "info";
|
|
1260
|
-
return;
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
notify({
|
|
1264
|
-
title: notification.Code,
|
|
1265
|
-
text: notification.Action,
|
|
1266
|
-
type,
|
|
1267
|
-
});
|
|
1268
|
-
}
|
|
1269
|
-
const isLayout2x2 = computed(() => {
|
|
1270
|
-
return (
|
|
1271
|
-
unref(scanState).Layout.PositionData.length > 1 &&
|
|
1272
|
-
unref(scanState).Layout.PositionData[0].Anchor === AnchorPoint.TOP_LEFT &&
|
|
1273
|
-
unref(scanState).Layout.PositionData[1].Anchor === AnchorPoint.TOP_RIGHT &&
|
|
1274
|
-
unref(scanState).Layout.PositionData[2].Anchor ===
|
|
1275
|
-
AnchorPoint.BOTTOM_LEFT &&
|
|
1276
|
-
unref(scanState).Layout.PositionData[3].Anchor === AnchorPoint.BOTTOM_RIGHT
|
|
1277
|
-
);
|
|
1278
|
-
});
|
|
1279
|
-
const isLayout1x3 = computed(() => {
|
|
1280
|
-
return (
|
|
1281
|
-
unref(scanState).Layout.PositionData.length > 1 &&
|
|
1282
|
-
unref(scanState).Layout.PositionData[0].Anchor === AnchorPoint.CENTER &&
|
|
1283
|
-
unref(scanState).Layout.PositionData[1].Anchor === AnchorPoint.TOP_RIGHT &&
|
|
1284
|
-
unref(scanState).Layout.PositionData[2].Anchor === AnchorPoint.RIGHT &&
|
|
1285
|
-
unref(scanState).Layout.PositionData[3].Anchor === AnchorPoint.BOTTOM_RIGHT
|
|
1286
|
-
);
|
|
1287
|
-
});
|
|
1288
|
-
|
|
1289
|
-
function getCurrentGreyscalePreset() {
|
|
1290
|
-
for (const preset of unref(initialScanState).GreyscalePresets) {
|
|
1291
|
-
if (
|
|
1292
|
-
(unref(scanState).Display.WindowLower === preset.Lower ||
|
|
1293
|
-
(preset.Lower < unref(initialScanState).HuLower &&
|
|
1294
|
-
unref(scanState).Display.WindowLower ===
|
|
1295
|
-
unref(initialScanState).HuLower)) &&
|
|
1296
|
-
(unref(scanState).Display.WindowUpper === preset.Upper ||
|
|
1297
|
-
(preset.Upper > unref(initialScanState).HuUpper &&
|
|
1298
|
-
unref(scanState).Display.WindowUpper ===
|
|
1299
|
-
unref(initialScanState).HuUpper))
|
|
1300
|
-
) {
|
|
1301
|
-
return preset.Name;
|
|
1302
|
-
}
|
|
1303
|
-
}
|
|
1304
|
-
return undefined;
|
|
1305
|
-
}
|
|
1306
|
-
function setScanState(message: string) {
|
|
1307
|
-
scanState.value = JSON.parse(message) as CurrentScanState;
|
|
1308
950
|
}
|
|
1309
951
|
|
|
1310
952
|
function handleOnPayload(
|
|
@@ -1313,13 +955,13 @@ function handleOnPayload(
|
|
|
1313
955
|
message: string
|
|
1314
956
|
) {
|
|
1315
957
|
if (interfaceSet === FrontEndInterfaces.scan_state) {
|
|
1316
|
-
|
|
958
|
+
setScanStateFromPayload(actionSet, message);
|
|
1317
959
|
}
|
|
1318
960
|
if (interfaceSet === FrontEndInterfaces.file_management) {
|
|
1319
961
|
i_fileManagement(actionSet, message);
|
|
1320
962
|
}
|
|
1321
963
|
if (interfaceSet === FrontEndInterfaces.notifications) {
|
|
1322
|
-
|
|
964
|
+
handleNotification(actionSet, message);
|
|
1323
965
|
}
|
|
1324
966
|
}
|
|
1325
967
|
|
|
@@ -1327,7 +969,6 @@ defineExpose({
|
|
|
1327
969
|
alterValue,
|
|
1328
970
|
load,
|
|
1329
971
|
handleOnPayload,
|
|
1330
|
-
setScanState,
|
|
1331
972
|
sendPayload,
|
|
1332
973
|
getIconForPreset,
|
|
1333
974
|
cSlider,
|
|
@@ -1335,16 +976,13 @@ defineExpose({
|
|
|
1335
976
|
tSlider,
|
|
1336
977
|
thresholdSlider,
|
|
1337
978
|
windowSlider,
|
|
1338
|
-
isLayout2x2,
|
|
1339
|
-
isLayout1x3,
|
|
1340
979
|
m_closeDialog,
|
|
1341
|
-
getCurrentGreyscalePreset,
|
|
1342
980
|
closeModal,
|
|
1343
981
|
snap,
|
|
1344
982
|
scanState,
|
|
1345
983
|
initialScanState,
|
|
1346
984
|
footerItems,
|
|
1347
|
-
rotateByDeg,
|
|
985
|
+
// rotateByDeg,
|
|
1348
986
|
getCurrentActiveView,
|
|
1349
987
|
getViewName,
|
|
1350
988
|
fullscreenLayout,
|