From 1571c398a96a701507c45a1cf945a53192eedc04 Mon Sep 17 00:00:00 2001 From: LI Ligeng Date: Fri, 28 Mar 2025 14:31:53 +0800 Subject: [PATCH] update code for v1.1 --- .gitattributes | 63 ++ .gitignore | 370 ++++++++ Astroke/App.xaml | 32 + Astroke/App.xaml.cs | 65 ++ Astroke/AssemblyInfo.cs | 10 + Astroke/Astroke.csproj | 39 + Astroke/Program.cs | 31 + Astroke/Resources/Images/astroke.ico | Bin 0 -> 116840 bytes Astroke/Resources/Images/placeholder.png | Bin 0 -> 20131 bytes Astroke/Resources/Strings/Strings.xaml | 24 + Astroke/Resources/Strings/en.xaml | 12 + Astroke/ViewModels/AStrokeControlViewModel.cs | 207 +++++ .../AStrokeRoiSummaryControlViewModel.cs | 31 + .../AspectsScoreRoiSummaryControlViewModel.cs | 39 + Astroke/Views/Controls/AStrokeControl.xaml | 283 ++++++ Astroke/Views/Controls/AStrokeControl.xaml.cs | 29 + .../Controls/AStrokeRoiSummaryControl.xaml | 148 +++ .../Controls/AStrokeRoiSummaryControl.xaml.cs | 12 + .../AspectsScoreRoiSummaryControl.xaml | 101 +++ .../AspectsScoreRoiSummaryControl.xaml.cs | 12 + CereFlow/App.xaml | 32 + CereFlow/App.xaml.cs | 85 ++ CereFlow/AssemblyInfo.cs | 10 + CereFlow/CereFlow.csproj | 38 + CereFlow/Program.cs | 31 + CereFlow/Resources/Images/cereflow.ico | Bin 0 -> 118024 bytes CereFlow/Resources/Images/placeholder.png | Bin 0 -> 101764 bytes CereFlow/Resources/Strings/Strings.xaml | 23 + .../ViewModels/CereFlowControlViewModel.cs | 163 ++++ CereFlow/Views/Controls/CereFlowControl.xaml | 182 ++++ .../Views/Controls/CereFlowControl.xaml.cs | 29 + CereflowSetup/CereflowSetup.vdproj | 723 +++++++++++++++ DicomViewer/App.xaml | 23 + DicomViewer/App.xaml.cs | 6 + DicomViewer/AssemblyInfo.cs | 10 + DicomViewer/DicomViewer.csproj | 17 + DicomViewer/Models/DicomDataTuple.cs | 30 + DicomViewer/Resources/Strings/Strings.xaml | 4 + DicomViewer/Resources/Themes/Theme.xaml | 66 ++ DicomViewer/ViewModels/MainWindowViewModel.cs | 190 ++++ DicomViewer/Views/MainWindow.xaml | 134 +++ DicomViewer/Views/MainWindow.xaml.cs | 79 ++ Livia.Tests/Livia.Tests.csproj | 37 + Livia.Tests/Models/AesOperationTests.cs | 60 ++ Livia.Tests/Models/DataBlockLoaderTests.cs | 137 +++ Livia.Tests/Models/SerialKeyManagerTests.cs | 119 +++ Livia.Tests/Startup.cs | 21 + Livia.sln | 127 +++ Livia.sln.DotSettings | 24 + Livia/App.config | 111 +++ Livia/AssemblyInfo.cs | 10 + Livia/Livia.csproj | 88 ++ Livia/Models/AesOperation.cs | 73 ++ Livia/Models/AppHelper.cs | 120 +++ Livia/Models/Data/AdditionalInfoJson.cs | 90 ++ Livia/Models/Data/DataBlock.cs | 36 + Livia/Models/Data/LiviaHttpClient.cs | 644 +++++++++++++ .../Data/LocalCommandLineServerHandler.cs | 258 ++++++ Livia/Models/Data/MdpCServerHandler.cs | 16 + Livia/Models/Data/MosaicImageData.cs | 22 + Livia/Models/Data/PerfusionDataJson.cs | 18 + Livia/Models/Data/RoiSummaryDataJson.cs | 42 + Livia/Models/Data/SearchQueryJson.cs | 37 + Livia/Models/Data/SelectReportModuleJson.cs | 69 ++ Livia/Models/Data/SeriesGroupListJson.cs | 32 + Livia/Models/Data/ServerHandler.cs | 855 ++++++++++++++++++ Livia/Models/Data/ServerJobData.cs | 102 +++ Livia/Models/Data/ServiceConfigurations.cs | 34 + Livia/Models/DataBlockLoader.cs | 177 ++++ Livia/Models/IdleTimer.cs | 84 ++ Livia/Models/ImageSeries.cs | 263 ++++++ Livia/Models/PatientInfoManager.cs | 41 + Livia/Models/ProcessManager.cs | 170 ++++ Livia/Models/RoiLegendManager.cs | 71 ++ Livia/Models/SerialKeyManager.cs | 78 ++ Livia/Models/ServerExceptions.cs | 24 + Livia/Models/VersionUpdateManager.cs | 136 +++ Livia/Properties/Settings.Designer.cs | 278 ++++++ Livia/Properties/Settings.settings | 69 ++ Livia/Properties/SettingsLogger.cs | 45 + Livia/Properties/ViewSettings.Designer.cs | 158 ++++ Livia/Properties/ViewSettings.settings | 39 + .../Resources/Fonts/SourceHanSans-VF.otf.ttc | Bin 0 -> 32683280 bytes Livia/Resources/Images/an-image.png | Bin 0 -> 251142 bytes Livia/Resources/Images/black-white.png | Bin 0 -> 87754 bytes Livia/Resources/Images/login_background.png | Bin 0 -> 5639473 bytes Livia/Resources/Images/orange-green.png | Bin 0 -> 124222 bytes Livia/Resources/Strings/Licenses.xaml | 438 +++++++++ Livia/Resources/Strings/Strings.xaml | 516 +++++++++++ Livia/Resources/Strings/en.xaml | 525 +++++++++++ Livia/Resources/Themes/LiviaButton.xaml | 678 ++++++++++++++ Livia/Resources/Themes/LiviaCard.xaml | 35 + Livia/Resources/Themes/LiviaDataGrid.xaml | 190 ++++ Livia/Resources/Themes/LiviaDatePicker.xaml | 36 + .../Themes/LiviaDialogDataTemplate.xaml | 21 + .../Themes/LiviaResourceDictionary.xaml | 23 + Livia/Resources/Themes/LiviaScrollViewer.xaml | 181 ++++ Livia/Resources/Themes/LiviaTabItem.xaml | 236 +++++ Livia/Resources/Themes/LiviaTheme.xaml | 88 ++ Livia/Resources/Themes/LiviaWindow.xaml | 98 ++ .../Resources/Themes/MainWindowTabButton.xaml | 133 +++ .../MaterialTitleBarFloatingActionButton.xaml | 90 ++ .../Resources/Themes/ScrollViewBarStyle.xaml | 241 +++++ .../Resources/Themes/SettingsWindowItem.xaml | 78 ++ Livia/Utility/DebounceHelper.cs | 28 + .../ServiceProviderFactory.cs | 89 ++ Livia/Utility/FocusVisualStyleClear.cs | 19 + Livia/Utility/LiviaUtility.cs | 209 +++++ Livia/Utility/Messages.cs | 33 + Livia/Utility/UtilityExtensions.cs | 65 ++ .../ViewModels/CheckReportWindowViewModel.cs | 146 +++ Livia/ViewModels/ColorBarControlViewModel.cs | 21 + Livia/ViewModels/DataBlockTableViewModel.cs | 213 +++++ Livia/ViewModels/ILiviaControlViewModel.cs | 16 + .../ImageRotationViewerControlViewModel.cs | 244 +++++ ...mageRotationViewerGroupControlViewModel.cs | 90 ++ Livia/ViewModels/LoginControlViewModel.cs | 46 + Livia/ViewModels/MainWindowViewModel.cs | 348 +++++++ .../ViewModels/MosaicImageControlViewModel.cs | 15 + .../MosaicImageGroupControlViewModel.cs | 176 ++++ Livia/ViewModels/PagingControlViewModel.cs | 100 ++ .../PerfusionDataGridControlViewModel.cs | 42 + .../PerfusionDataGridGroupControlViewModel.cs | 85 ++ .../ViewModels/RoiExpanderControlViewModel.cs | 330 +++++++ .../RoiExpanderGroupControlViewModel.cs | 146 +++ .../RoiLocationDataControlViewModel.cs | 65 ++ .../ViewModels/RoiSummaryControlViewModel.cs | 139 +++ .../SearchQueryInputControlViewModel.cs | 98 ++ .../SelectReportModuleWindowViewModel.cs | 227 +++++ .../ViewModels/SelectSeriesWindowViewModel.cs | 60 ++ .../SeriesGroupExpanderViewModel.cs | 27 + Livia/ViewModels/SettingsWindowViewModel.cs | 124 +++ Livia/ViewModels/SimpleImageViewModel.cs | 27 + .../Utility/SelectableObservableCollection.cs | 59 ++ .../ValidateSerialKeyWindowViewModel.cs | 38 + .../AttachedProperties/IconKindProperties.cs | 26 + .../MaterialTitleBarButtonProperties.cs | 91 ++ .../SolidColorBrushProperties.cs | 64 ++ .../StringItemProperties.cs | 25 + Livia/Views/CheckReportDialog.xaml | 138 +++ Livia/Views/CheckReportDialog.xaml.cs | 123 +++ Livia/Views/Controls/ColorBarControl.xaml | 57 ++ Livia/Views/Controls/ColorBarControl.xaml.cs | 12 + .../Views/Controls/DataBlockTableControl.xaml | 317 +++++++ .../Controls/DataBlockTableControl.xaml.cs | 145 +++ .../ImageRotationViewerBorderlessControl.xaml | 147 +++ ...ageRotationViewerBorderlessControl.xaml.cs | 142 +++ .../Controls/ImageRotationViewerControl.xaml | 121 +++ .../ImageRotationViewerControl.xaml.cs | 131 +++ .../ImageRotationViewerGroupControl.xaml | 33 + .../ImageRotationViewerGroupControl.xaml.cs | 12 + Livia/Views/Controls/LicenseInfoControl.xaml | 29 + .../Views/Controls/LicenseInfoControl.xaml.cs | 31 + Livia/Views/Controls/LoginControl.xaml | 173 ++++ Livia/Views/Controls/LoginControl.xaml.cs | 75 ++ Livia/Views/Controls/MaterialTitleBar.xaml | 39 + Livia/Views/Controls/MaterialTitleBar.xaml.cs | 133 +++ Livia/Views/Controls/MosaicImageControl.xaml | 57 ++ .../Views/Controls/MosaicImageControl.xaml.cs | 12 + .../Controls/MosaicImageGroupControl.xaml | 122 +++ .../Controls/MosaicImageGroupControl.xaml.cs | 38 + Livia/Views/Controls/PagingControl.xaml | 43 + Livia/Views/Controls/PagingControl.xaml.cs | 51 ++ .../Controls/PerfusionDataGridControl.xaml | 171 ++++ .../Controls/PerfusionDataGridControl.xaml.cs | 79 ++ .../PerfusionDataGridGroupControl.xaml | 58 ++ .../PerfusionDataGridGroupControl.xaml.cs | 24 + Livia/Views/Controls/RoiExpanderControl.xaml | 218 +++++ .../Views/Controls/RoiExpanderControl.xaml.cs | 58 ++ .../Controls/RoiExpanderGroupControl.xaml | 129 +++ .../Controls/RoiExpanderGroupControl.xaml.cs | 12 + Livia/Views/Controls/RoiLegendControl.xaml | 34 + Livia/Views/Controls/RoiLegendControl.xaml.cs | 12 + .../Controls/RoiLocationDataControl.xaml | 86 ++ .../Controls/RoiLocationDataControl.xaml.cs | 12 + Livia/Views/Controls/RoiSummaryControl.xaml | 29 + .../Views/Controls/RoiSummaryControl.xaml.cs | 12 + .../Controls/SearchQueryInputControl.xaml | 143 +++ .../Controls/SearchQueryInputControl.xaml.cs | 40 + .../AspectsScoreToColorConverter.cs | 20 + .../BooleanToVisibilityHiddenConverter.cs | 23 + .../Converters/IntToFontWeightConverter.cs | 19 + ...seBooleanToVisibilityCollapsedConverter.cs | 23 + ...verseBooleanToVisibilityHiddenConverter.cs | 23 + .../NullableToVisibilityCollapsedConverter.cs | 20 + .../Converters/PerfusionDataColorConverter.cs | 25 + ...RoiLocationDisplayModeToStringConverter.cs | 20 + .../RoiTwoColumnModeToStringConverter.cs | 19 + .../Converters/SeriesListToStringConverter.cs | 19 + .../ServerJobStatusColorConverter.cs | 25 + ...erverJobStatusVisibilityHiddenConverter.cs | 40 + .../Converters/StringToFontFamilyConverter.cs | 22 + .../UnfoldButtonStateToStringConverter.cs | 19 + Livia/Views/MainWindow.xaml | 504 +++++++++++ Livia/Views/MainWindow.xaml.cs | 239 +++++ Livia/Views/ProgressBarDialog.xaml | 70 ++ Livia/Views/ProgressBarDialog.xaml.cs | 67 ++ Livia/Views/SelectReportModuleDialog.xaml | 212 +++++ Livia/Views/SelectReportModuleDialog.xaml.cs | 98 ++ Livia/Views/SelectSeriesDialog.xaml | 129 +++ Livia/Views/SelectSeriesDialog.xaml.cs | 44 + Livia/Views/SettingsWindow.xaml | 458 ++++++++++ Livia/Views/SettingsWindow.xaml.cs | 148 +++ Livia/Views/Utility/ViewUtility.cs | 106 +++ Livia/Views/Utility/WarningSystem.cs | 100 ++ Livia/Views/ValidateSerialKeyDialog.xaml | 113 +++ Livia/Views/ValidateSerialKeyDialog.xaml.cs | 51 ++ Livia/Views/WarningDialog.xaml | 94 ++ Livia/Views/WarningDialog.xaml.cs | 81 ++ LiviaAdmin/App.xaml | 30 + LiviaAdmin/App.xaml.cs | 58 ++ LiviaAdmin/AssemblyInfo.cs | 10 + LiviaAdmin/LiviaAdmin.csproj | 12 + LiviaAdmin/ViewModels/MainWindowViewModel.cs | 39 + LiviaAdmin/Views/MainWindow.xaml | 54 ++ LiviaAdmin/Views/MainWindow.xaml.cs | 26 + MdpC2.Tests/MdpC2.Tests.csproj | 40 + MdpC2.Tests/UnitTest1.cs | 67 ++ MdpC2/App.xaml | 32 + MdpC2/App.xaml.cs | 108 +++ MdpC2/AssemblyInfo.cs | 10 + MdpC2/MdpC2.csproj | 28 + MdpC2/Resources/Images/cereflow.ico | Bin 0 -> 10058 bytes MdpC2/Resources/Images/placeholder.png | Bin 0 -> 172552 bytes MdpC2/Resources/Strings/Strings.xaml | 23 + MdpC2/Resources/Strings/en.xaml | 13 + MdpC2/ViewModels/MdpC2ControlViewModel.cs | 163 ++++ MdpC2/Views/Controls/MdpC2Control.xaml | 181 ++++ MdpC2/Views/Controls/MdpC2Control.xaml.cs | 29 + MdpC2/app.manifest | 79 ++ MdpC2Setup/MdpC2Setup.vdproj | 739 +++++++++++++++ MdpC3/App.xaml | 32 + MdpC3/App.xaml.cs | 115 +++ MdpC3/AssemblyInfo.cs | 10 + MdpC3/MdpC3.csproj | 36 + MdpC3/Resources/Images/Cereflow.ico | Bin 0 -> 4286 bytes MdpC3/Resources/Images/placeholder.png | Bin 0 -> 172489 bytes MdpC3/Resources/Strings/Strings.xaml | 23 + MdpC3/Resources/Strings/en.xaml | 12 + MdpC3/ViewModels/MdpC3ControlViewModel.cs | 163 ++++ MdpC3/Views/Controls/MdpC3Control.xaml | 181 ++++ MdpC3/Views/Controls/MdpC3Control.xaml.cs | 29 + MdpC3/app.manifest | 79 ++ MdpC3Setup/MdpC3Setup.vdproj | 739 +++++++++++++++ MdpC6/App.xaml | 32 + MdpC6/App.xaml.cs | 96 ++ MdpC6/AssemblyInfo.cs | 10 + MdpC6/MdpC6.csproj | 37 + MdpC6/Resources/Images/cereflow.ico | Bin 0 -> 9662 bytes MdpC6/Resources/Images/placeholder.png | Bin 0 -> 174490 bytes MdpC6/Resources/Strings/Strings.xaml | 35 + MdpC6/Resources/Strings/en.xaml | 29 + MdpC6/ViewModels/MdpC6ControlViewModel.cs | 159 ++++ MdpC6/Views/Controls/MdpC6Control.xaml | 134 +++ MdpC6/Views/Controls/MdpC6Control.xaml.cs | 29 + MdpC6Setup/MdpC6Setup.vdproj | 733 +++++++++++++++ SiemensCereflow/App.xaml | 32 + SiemensCereflow/App.xaml.cs | 148 +++ SiemensCereflow/AssemblyInfo.cs | 10 + .../PublishProfiles/ClickOnceProfile.pubxml | 36 + SiemensCereflow/Resources/Images/cereflow.ico | Bin 0 -> 4286 bytes .../Resources/Images/placeholder.png | Bin 0 -> 101764 bytes .../Resources/Strings/Strings.xaml | 84 ++ SiemensCereflow/Resources/Strings/en.xaml | 82 ++ SiemensCereflow/SiemensCereflow.csproj | 35 + .../SiemensCereFlowControlViewModel.cs | 107 +++ .../Controls/SiemensCereFlowControl.xaml | 145 +++ .../Controls/SiemensCereFlowControl.xaml.cs | 13 + .../SiemensCereflowSetup.vdproj | 750 +++++++++++++++ Tp1/Analysis.dll | 1 + Tp1/App.xaml | 32 + Tp1/App.xaml.cs | 110 +++ Tp1/AssemblyInfo.cs | 10 + Tp1/Resources/Images/TP-1.ico | Bin 0 -> 116840 bytes Tp1/Resources/Images/placeholder.png | Bin 0 -> 58803 bytes Tp1/Resources/Strings/Strings.xaml | 62 ++ Tp1/Tp1.csproj | 46 + Tp1/app.manifest | 79 ++ Tp1Setup/Tp1Setup.vdproj | 749 +++++++++++++++ iBrain/App.xaml | 32 + iBrain/App.xaml.cs | 115 +++ iBrain/AssemblyInfo.cs | 10 + iBrain/Models/BuptIBrainDataBlockLoader.cs | 154 ++++ iBrain/Models/BuptIBrainServerHandler.cs | 28 + iBrain/Resources/Images/ColorBar.png | Bin 0 -> 111065 bytes iBrain/Resources/Images/Placeholder.png | Bin 0 -> 185094 bytes iBrain/Resources/Images/iBrain.ico | Bin 0 -> 10058 bytes iBrain/Resources/Strings/Strings.xaml | 32 + .../ViewModels/BuptIBrainControlViewModel.cs | 76 ++ iBrain/ViewModels/BuptIBrainScoreViewModel.cs | 33 + .../FeatureDataGridControlViewModel.cs | 82 ++ iBrain/Views/Controls/BuptIBrainControl.xaml | 195 ++++ .../Views/Controls/BuptIBrainControl.xaml.cs | 13 + .../Controls/FeatureDataGridControl.xaml | 78 ++ .../Controls/FeatureDataGridControl.xaml.cs | 15 + .../BuptIBrainScoreColorConverter.cs | 25 + .../FeatureDataGridColorConverter.cs | 26 + iBrain/iBrain.csproj | 34 + iBrainSetup/iBrainSetup.vdproj | 723 +++++++++++++++ publish.bat | 29 + 300 files changed, 30150 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Astroke/App.xaml create mode 100644 Astroke/App.xaml.cs create mode 100644 Astroke/AssemblyInfo.cs create mode 100644 Astroke/Astroke.csproj create mode 100644 Astroke/Program.cs create mode 100644 Astroke/Resources/Images/astroke.ico create mode 100644 Astroke/Resources/Images/placeholder.png create mode 100644 Astroke/Resources/Strings/Strings.xaml create mode 100644 Astroke/Resources/Strings/en.xaml create mode 100644 Astroke/ViewModels/AStrokeControlViewModel.cs create mode 100644 Astroke/ViewModels/AStrokeRoiSummaryControlViewModel.cs create mode 100644 Astroke/ViewModels/AspectsScoreRoiSummaryControlViewModel.cs create mode 100644 Astroke/Views/Controls/AStrokeControl.xaml create mode 100644 Astroke/Views/Controls/AStrokeControl.xaml.cs create mode 100644 Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml create mode 100644 Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml.cs create mode 100644 Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml create mode 100644 Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml.cs create mode 100644 CereFlow/App.xaml create mode 100644 CereFlow/App.xaml.cs create mode 100644 CereFlow/AssemblyInfo.cs create mode 100644 CereFlow/CereFlow.csproj create mode 100644 CereFlow/Program.cs create mode 100644 CereFlow/Resources/Images/cereflow.ico create mode 100644 CereFlow/Resources/Images/placeholder.png create mode 100644 CereFlow/Resources/Strings/Strings.xaml create mode 100644 CereFlow/ViewModels/CereFlowControlViewModel.cs create mode 100644 CereFlow/Views/Controls/CereFlowControl.xaml create mode 100644 CereFlow/Views/Controls/CereFlowControl.xaml.cs create mode 100644 CereflowSetup/CereflowSetup.vdproj create mode 100644 DicomViewer/App.xaml create mode 100644 DicomViewer/App.xaml.cs create mode 100644 DicomViewer/AssemblyInfo.cs create mode 100644 DicomViewer/DicomViewer.csproj create mode 100644 DicomViewer/Models/DicomDataTuple.cs create mode 100644 DicomViewer/Resources/Strings/Strings.xaml create mode 100644 DicomViewer/Resources/Themes/Theme.xaml create mode 100644 DicomViewer/ViewModels/MainWindowViewModel.cs create mode 100644 DicomViewer/Views/MainWindow.xaml create mode 100644 DicomViewer/Views/MainWindow.xaml.cs create mode 100644 Livia.Tests/Livia.Tests.csproj create mode 100644 Livia.Tests/Models/AesOperationTests.cs create mode 100644 Livia.Tests/Models/DataBlockLoaderTests.cs create mode 100644 Livia.Tests/Models/SerialKeyManagerTests.cs create mode 100644 Livia.Tests/Startup.cs create mode 100644 Livia.sln create mode 100644 Livia.sln.DotSettings create mode 100644 Livia/App.config create mode 100644 Livia/AssemblyInfo.cs create mode 100644 Livia/Livia.csproj create mode 100644 Livia/Models/AesOperation.cs create mode 100644 Livia/Models/AppHelper.cs create mode 100644 Livia/Models/Data/AdditionalInfoJson.cs create mode 100644 Livia/Models/Data/DataBlock.cs create mode 100644 Livia/Models/Data/LiviaHttpClient.cs create mode 100644 Livia/Models/Data/LocalCommandLineServerHandler.cs create mode 100644 Livia/Models/Data/MdpCServerHandler.cs create mode 100644 Livia/Models/Data/MosaicImageData.cs create mode 100644 Livia/Models/Data/PerfusionDataJson.cs create mode 100644 Livia/Models/Data/RoiSummaryDataJson.cs create mode 100644 Livia/Models/Data/SearchQueryJson.cs create mode 100644 Livia/Models/Data/SelectReportModuleJson.cs create mode 100644 Livia/Models/Data/SeriesGroupListJson.cs create mode 100644 Livia/Models/Data/ServerHandler.cs create mode 100644 Livia/Models/Data/ServerJobData.cs create mode 100644 Livia/Models/Data/ServiceConfigurations.cs create mode 100644 Livia/Models/DataBlockLoader.cs create mode 100644 Livia/Models/IdleTimer.cs create mode 100644 Livia/Models/ImageSeries.cs create mode 100644 Livia/Models/PatientInfoManager.cs create mode 100644 Livia/Models/ProcessManager.cs create mode 100644 Livia/Models/RoiLegendManager.cs create mode 100644 Livia/Models/SerialKeyManager.cs create mode 100644 Livia/Models/ServerExceptions.cs create mode 100644 Livia/Models/VersionUpdateManager.cs create mode 100644 Livia/Properties/Settings.Designer.cs create mode 100644 Livia/Properties/Settings.settings create mode 100644 Livia/Properties/SettingsLogger.cs create mode 100644 Livia/Properties/ViewSettings.Designer.cs create mode 100644 Livia/Properties/ViewSettings.settings create mode 100644 Livia/Resources/Fonts/SourceHanSans-VF.otf.ttc create mode 100644 Livia/Resources/Images/an-image.png create mode 100644 Livia/Resources/Images/black-white.png create mode 100644 Livia/Resources/Images/login_background.png create mode 100644 Livia/Resources/Images/orange-green.png create mode 100644 Livia/Resources/Strings/Licenses.xaml create mode 100644 Livia/Resources/Strings/Strings.xaml create mode 100644 Livia/Resources/Strings/en.xaml create mode 100644 Livia/Resources/Themes/LiviaButton.xaml create mode 100644 Livia/Resources/Themes/LiviaCard.xaml create mode 100644 Livia/Resources/Themes/LiviaDataGrid.xaml create mode 100644 Livia/Resources/Themes/LiviaDatePicker.xaml create mode 100644 Livia/Resources/Themes/LiviaDialogDataTemplate.xaml create mode 100644 Livia/Resources/Themes/LiviaResourceDictionary.xaml create mode 100644 Livia/Resources/Themes/LiviaScrollViewer.xaml create mode 100644 Livia/Resources/Themes/LiviaTabItem.xaml create mode 100644 Livia/Resources/Themes/LiviaTheme.xaml create mode 100644 Livia/Resources/Themes/LiviaWindow.xaml create mode 100644 Livia/Resources/Themes/MainWindowTabButton.xaml create mode 100644 Livia/Resources/Themes/MaterialTitleBarFloatingActionButton.xaml create mode 100644 Livia/Resources/Themes/ScrollViewBarStyle.xaml create mode 100644 Livia/Resources/Themes/SettingsWindowItem.xaml create mode 100644 Livia/Utility/DebounceHelper.cs create mode 100644 Livia/Utility/DependencyInjection/ServiceProviderFactory.cs create mode 100644 Livia/Utility/FocusVisualStyleClear.cs create mode 100644 Livia/Utility/LiviaUtility.cs create mode 100644 Livia/Utility/Messages.cs create mode 100644 Livia/Utility/UtilityExtensions.cs create mode 100644 Livia/ViewModels/CheckReportWindowViewModel.cs create mode 100644 Livia/ViewModels/ColorBarControlViewModel.cs create mode 100644 Livia/ViewModels/DataBlockTableViewModel.cs create mode 100644 Livia/ViewModels/ILiviaControlViewModel.cs create mode 100644 Livia/ViewModels/ImageRotationViewerControlViewModel.cs create mode 100644 Livia/ViewModels/ImageRotationViewerGroupControlViewModel.cs create mode 100644 Livia/ViewModels/LoginControlViewModel.cs create mode 100644 Livia/ViewModels/MainWindowViewModel.cs create mode 100644 Livia/ViewModels/MosaicImageControlViewModel.cs create mode 100644 Livia/ViewModels/MosaicImageGroupControlViewModel.cs create mode 100644 Livia/ViewModels/PagingControlViewModel.cs create mode 100644 Livia/ViewModels/PerfusionDataGridControlViewModel.cs create mode 100644 Livia/ViewModels/PerfusionDataGridGroupControlViewModel.cs create mode 100644 Livia/ViewModels/RoiExpanderControlViewModel.cs create mode 100644 Livia/ViewModels/RoiExpanderGroupControlViewModel.cs create mode 100644 Livia/ViewModels/RoiLocationDataControlViewModel.cs create mode 100644 Livia/ViewModels/RoiSummaryControlViewModel.cs create mode 100644 Livia/ViewModels/SearchQueryInputControlViewModel.cs create mode 100644 Livia/ViewModels/SelectReportModuleWindowViewModel.cs create mode 100644 Livia/ViewModels/SelectSeriesWindowViewModel.cs create mode 100644 Livia/ViewModels/SeriesGroupExpanderViewModel.cs create mode 100644 Livia/ViewModels/SettingsWindowViewModel.cs create mode 100644 Livia/ViewModels/SimpleImageViewModel.cs create mode 100644 Livia/ViewModels/Utility/SelectableObservableCollection.cs create mode 100644 Livia/ViewModels/ValidateSerialKeyWindowViewModel.cs create mode 100644 Livia/Views/AttachedProperties/IconKindProperties.cs create mode 100644 Livia/Views/AttachedProperties/MaterialTitleBarButtonProperties.cs create mode 100644 Livia/Views/AttachedProperties/SolidColorBrushProperties.cs create mode 100644 Livia/Views/AttachedProperties/StringItemProperties.cs create mode 100644 Livia/Views/CheckReportDialog.xaml create mode 100644 Livia/Views/CheckReportDialog.xaml.cs create mode 100644 Livia/Views/Controls/ColorBarControl.xaml create mode 100644 Livia/Views/Controls/ColorBarControl.xaml.cs create mode 100644 Livia/Views/Controls/DataBlockTableControl.xaml create mode 100644 Livia/Views/Controls/DataBlockTableControl.xaml.cs create mode 100644 Livia/Views/Controls/ImageRotationViewerBorderlessControl.xaml create mode 100644 Livia/Views/Controls/ImageRotationViewerBorderlessControl.xaml.cs create mode 100644 Livia/Views/Controls/ImageRotationViewerControl.xaml create mode 100644 Livia/Views/Controls/ImageRotationViewerControl.xaml.cs create mode 100644 Livia/Views/Controls/ImageRotationViewerGroupControl.xaml create mode 100644 Livia/Views/Controls/ImageRotationViewerGroupControl.xaml.cs create mode 100644 Livia/Views/Controls/LicenseInfoControl.xaml create mode 100644 Livia/Views/Controls/LicenseInfoControl.xaml.cs create mode 100644 Livia/Views/Controls/LoginControl.xaml create mode 100644 Livia/Views/Controls/LoginControl.xaml.cs create mode 100644 Livia/Views/Controls/MaterialTitleBar.xaml create mode 100644 Livia/Views/Controls/MaterialTitleBar.xaml.cs create mode 100644 Livia/Views/Controls/MosaicImageControl.xaml create mode 100644 Livia/Views/Controls/MosaicImageControl.xaml.cs create mode 100644 Livia/Views/Controls/MosaicImageGroupControl.xaml create mode 100644 Livia/Views/Controls/MosaicImageGroupControl.xaml.cs create mode 100644 Livia/Views/Controls/PagingControl.xaml create mode 100644 Livia/Views/Controls/PagingControl.xaml.cs create mode 100644 Livia/Views/Controls/PerfusionDataGridControl.xaml create mode 100644 Livia/Views/Controls/PerfusionDataGridControl.xaml.cs create mode 100644 Livia/Views/Controls/PerfusionDataGridGroupControl.xaml create mode 100644 Livia/Views/Controls/PerfusionDataGridGroupControl.xaml.cs create mode 100644 Livia/Views/Controls/RoiExpanderControl.xaml create mode 100644 Livia/Views/Controls/RoiExpanderControl.xaml.cs create mode 100644 Livia/Views/Controls/RoiExpanderGroupControl.xaml create mode 100644 Livia/Views/Controls/RoiExpanderGroupControl.xaml.cs create mode 100644 Livia/Views/Controls/RoiLegendControl.xaml create mode 100644 Livia/Views/Controls/RoiLegendControl.xaml.cs create mode 100644 Livia/Views/Controls/RoiLocationDataControl.xaml create mode 100644 Livia/Views/Controls/RoiLocationDataControl.xaml.cs create mode 100644 Livia/Views/Controls/RoiSummaryControl.xaml create mode 100644 Livia/Views/Controls/RoiSummaryControl.xaml.cs create mode 100644 Livia/Views/Controls/SearchQueryInputControl.xaml create mode 100644 Livia/Views/Controls/SearchQueryInputControl.xaml.cs create mode 100644 Livia/Views/Converters/AspectsScoreToColorConverter.cs create mode 100644 Livia/Views/Converters/BooleanToVisibilityHiddenConverter.cs create mode 100644 Livia/Views/Converters/IntToFontWeightConverter.cs create mode 100644 Livia/Views/Converters/InverseBooleanToVisibilityCollapsedConverter.cs create mode 100644 Livia/Views/Converters/InverseBooleanToVisibilityHiddenConverter.cs create mode 100644 Livia/Views/Converters/NullableToVisibilityCollapsedConverter.cs create mode 100644 Livia/Views/Converters/PerfusionDataColorConverter.cs create mode 100644 Livia/Views/Converters/RoiLocationDisplayModeToStringConverter.cs create mode 100644 Livia/Views/Converters/RoiTwoColumnModeToStringConverter.cs create mode 100644 Livia/Views/Converters/SeriesListToStringConverter.cs create mode 100644 Livia/Views/Converters/ServerJobStatusColorConverter.cs create mode 100644 Livia/Views/Converters/ServerJobStatusVisibilityHiddenConverter.cs create mode 100644 Livia/Views/Converters/StringToFontFamilyConverter.cs create mode 100644 Livia/Views/Converters/UnfoldButtonStateToStringConverter.cs create mode 100644 Livia/Views/MainWindow.xaml create mode 100644 Livia/Views/MainWindow.xaml.cs create mode 100644 Livia/Views/ProgressBarDialog.xaml create mode 100644 Livia/Views/ProgressBarDialog.xaml.cs create mode 100644 Livia/Views/SelectReportModuleDialog.xaml create mode 100644 Livia/Views/SelectReportModuleDialog.xaml.cs create mode 100644 Livia/Views/SelectSeriesDialog.xaml create mode 100644 Livia/Views/SelectSeriesDialog.xaml.cs create mode 100644 Livia/Views/SettingsWindow.xaml create mode 100644 Livia/Views/SettingsWindow.xaml.cs create mode 100644 Livia/Views/Utility/ViewUtility.cs create mode 100644 Livia/Views/Utility/WarningSystem.cs create mode 100644 Livia/Views/ValidateSerialKeyDialog.xaml create mode 100644 Livia/Views/ValidateSerialKeyDialog.xaml.cs create mode 100644 Livia/Views/WarningDialog.xaml create mode 100644 Livia/Views/WarningDialog.xaml.cs create mode 100644 LiviaAdmin/App.xaml create mode 100644 LiviaAdmin/App.xaml.cs create mode 100644 LiviaAdmin/AssemblyInfo.cs create mode 100644 LiviaAdmin/LiviaAdmin.csproj create mode 100644 LiviaAdmin/ViewModels/MainWindowViewModel.cs create mode 100644 LiviaAdmin/Views/MainWindow.xaml create mode 100644 LiviaAdmin/Views/MainWindow.xaml.cs create mode 100644 MdpC2.Tests/MdpC2.Tests.csproj create mode 100644 MdpC2.Tests/UnitTest1.cs create mode 100644 MdpC2/App.xaml create mode 100644 MdpC2/App.xaml.cs create mode 100644 MdpC2/AssemblyInfo.cs create mode 100644 MdpC2/MdpC2.csproj create mode 100644 MdpC2/Resources/Images/cereflow.ico create mode 100644 MdpC2/Resources/Images/placeholder.png create mode 100644 MdpC2/Resources/Strings/Strings.xaml create mode 100644 MdpC2/Resources/Strings/en.xaml create mode 100644 MdpC2/ViewModels/MdpC2ControlViewModel.cs create mode 100644 MdpC2/Views/Controls/MdpC2Control.xaml create mode 100644 MdpC2/Views/Controls/MdpC2Control.xaml.cs create mode 100644 MdpC2/app.manifest create mode 100644 MdpC2Setup/MdpC2Setup.vdproj create mode 100644 MdpC3/App.xaml create mode 100644 MdpC3/App.xaml.cs create mode 100644 MdpC3/AssemblyInfo.cs create mode 100644 MdpC3/MdpC3.csproj create mode 100644 MdpC3/Resources/Images/Cereflow.ico create mode 100644 MdpC3/Resources/Images/placeholder.png create mode 100644 MdpC3/Resources/Strings/Strings.xaml create mode 100644 MdpC3/Resources/Strings/en.xaml create mode 100644 MdpC3/ViewModels/MdpC3ControlViewModel.cs create mode 100644 MdpC3/Views/Controls/MdpC3Control.xaml create mode 100644 MdpC3/Views/Controls/MdpC3Control.xaml.cs create mode 100644 MdpC3/app.manifest create mode 100644 MdpC3Setup/MdpC3Setup.vdproj create mode 100644 MdpC6/App.xaml create mode 100644 MdpC6/App.xaml.cs create mode 100644 MdpC6/AssemblyInfo.cs create mode 100644 MdpC6/MdpC6.csproj create mode 100644 MdpC6/Resources/Images/cereflow.ico create mode 100644 MdpC6/Resources/Images/placeholder.png create mode 100644 MdpC6/Resources/Strings/Strings.xaml create mode 100644 MdpC6/Resources/Strings/en.xaml create mode 100644 MdpC6/ViewModels/MdpC6ControlViewModel.cs create mode 100644 MdpC6/Views/Controls/MdpC6Control.xaml create mode 100644 MdpC6/Views/Controls/MdpC6Control.xaml.cs create mode 100644 MdpC6Setup/MdpC6Setup.vdproj create mode 100644 SiemensCereflow/App.xaml create mode 100644 SiemensCereflow/App.xaml.cs create mode 100644 SiemensCereflow/AssemblyInfo.cs create mode 100644 SiemensCereflow/Properties/PublishProfiles/ClickOnceProfile.pubxml create mode 100644 SiemensCereflow/Resources/Images/cereflow.ico create mode 100644 SiemensCereflow/Resources/Images/placeholder.png create mode 100644 SiemensCereflow/Resources/Strings/Strings.xaml create mode 100644 SiemensCereflow/Resources/Strings/en.xaml create mode 100644 SiemensCereflow/SiemensCereflow.csproj create mode 100644 SiemensCereflow/ViewModels/SiemensCereFlowControlViewModel.cs create mode 100644 SiemensCereflow/Views/Controls/SiemensCereFlowControl.xaml create mode 100644 SiemensCereflow/Views/Controls/SiemensCereFlowControl.xaml.cs create mode 100644 SiemensCereflowSetup/SiemensCereflowSetup.vdproj create mode 100644 Tp1/Analysis.dll create mode 100644 Tp1/App.xaml create mode 100644 Tp1/App.xaml.cs create mode 100644 Tp1/AssemblyInfo.cs create mode 100644 Tp1/Resources/Images/TP-1.ico create mode 100644 Tp1/Resources/Images/placeholder.png create mode 100644 Tp1/Resources/Strings/Strings.xaml create mode 100644 Tp1/Tp1.csproj create mode 100644 Tp1/app.manifest create mode 100644 Tp1Setup/Tp1Setup.vdproj create mode 100644 iBrain/App.xaml create mode 100644 iBrain/App.xaml.cs create mode 100644 iBrain/AssemblyInfo.cs create mode 100644 iBrain/Models/BuptIBrainDataBlockLoader.cs create mode 100644 iBrain/Models/BuptIBrainServerHandler.cs create mode 100644 iBrain/Resources/Images/ColorBar.png create mode 100644 iBrain/Resources/Images/Placeholder.png create mode 100644 iBrain/Resources/Images/iBrain.ico create mode 100644 iBrain/Resources/Strings/Strings.xaml create mode 100644 iBrain/ViewModels/BuptIBrainControlViewModel.cs create mode 100644 iBrain/ViewModels/BuptIBrainScoreViewModel.cs create mode 100644 iBrain/ViewModels/FeatureDataGridControlViewModel.cs create mode 100644 iBrain/Views/Controls/BuptIBrainControl.xaml create mode 100644 iBrain/Views/Controls/BuptIBrainControl.xaml.cs create mode 100644 iBrain/Views/Controls/FeatureDataGridControl.xaml create mode 100644 iBrain/Views/Controls/FeatureDataGridControl.xaml.cs create mode 100644 iBrain/Views/Converters/BuptIBrainScoreColorConverter.cs create mode 100644 iBrain/Views/Converters/FeatureDataGridColorConverter.cs create mode 100644 iBrain/iBrain.csproj create mode 100644 iBrainSetup/iBrainSetup.vdproj create mode 100644 publish.bat diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60c7829 --- /dev/null +++ b/.gitignore @@ -0,0 +1,370 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +SiemensCereflowSetup/*.exe + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +#*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd +/SiemensCereflow/Properties/launchSettings.json +/SiemensCereflow/cereflow_command_line +/*/astroke_cmd +/*/iBrain_cmd +/MdpC3/Properties/launchSettings.json diff --git a/Astroke/App.xaml b/Astroke/App.xaml new file mode 100644 index 0000000..9f9a99f --- /dev/null +++ b/Astroke/App.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Astroke/App.xaml.cs b/Astroke/App.xaml.cs new file mode 100644 index 0000000..b2ca9a5 --- /dev/null +++ b/Astroke/App.xaml.cs @@ -0,0 +1,65 @@ +using System.Windows; +using Astroke.ViewModels; +using Astroke.Views.Controls; +using JetBrains.Annotations; +using Livia.Models; +using Livia.Models.Data; +using Livia.Properties; +using Livia.Utility.DependencyInjection; +using Livia.ViewModels; +using Livia.Views; +using Livia.Views.Utility; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Velopack; + +namespace Astroke; + +/// +/// Interaction logic for App.xaml +/// +public partial class App +{ + + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + private readonly IWarningSystem _warningSystem; + [UsedImplicitly] private Mutex? _mutex; + + public App() + { + ServiceConfigurations.AppName = "astroke"; + VelopackApp.Build().Run(); + ServiceProviderFactory.Init(sc => sc.AddSingleton()); + + InitializeComponent(); + _serviceProvider = ServiceProviderFactory.ServiceProvider; + _logger = ActivatorUtilities.GetServiceOrCreateInstance>(ServiceProviderFactory.ServiceProvider); + _warningSystem = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider); + _logger.LogInformation("App Starting"); + SettingsLogger.Init(); + + AppHelper helper = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider); + + Dispatcher.UnhandledException += helper.OnDispatcherUnhandledException; + helper.UpdateSettings(); + helper.LoadStrings(); + } + + private void OnStartup(object sender, StartupEventArgs eventArgs) + { + _mutex = new Mutex(true, "Livia", out bool isNewInstance); + if (!isNewInstance) + { + _warningSystem.ShowDialog(WarningWindowKind.Warning, true, "InstanceIsRunningError"); + Current.Shutdown(); + } + + MainWindow mainWindow = ActivatorUtilities.CreateInstance(_serviceProvider); + mainWindow.AddMainControl(new AStrokeControl(ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider))); + MainWindow = mainWindow; + mainWindow.Show(); + + _logger.LogInformation("App Started"); + } +} \ No newline at end of file diff --git a/Astroke/AssemblyInfo.cs b/Astroke/AssemblyInfo.cs new file mode 100644 index 0000000..8b5504e --- /dev/null +++ b/Astroke/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/Astroke/Astroke.csproj b/Astroke/Astroke.csproj new file mode 100644 index 0000000..81a9215 --- /dev/null +++ b/Astroke/Astroke.csproj @@ -0,0 +1,39 @@ + + + WinExe + net8.0-windows + enable + enable + true + Resources\Images\astroke.ico + aStroke + true + + + + + + + + Astroke.Program + + + + PreserveNewest + + + PreserveNewest + + + + + + + + Code + + + Code + + + \ No newline at end of file diff --git a/Astroke/Program.cs b/Astroke/Program.cs new file mode 100644 index 0000000..a48c5b4 --- /dev/null +++ b/Astroke/Program.cs @@ -0,0 +1,31 @@ +using System.Windows; +using JetBrains.Annotations; +using Velopack; + +namespace Astroke; + +// from https://github.com/velopack/velopack/blob/master/samples/VeloWpfSample/Program.cs +[UsedImplicitly] +public class Program +{ + + [STAThread] + public static void Main(string[] args) + { + try + { + //TODO::multi language + VelopackApp.Build().WithFirstRun(_ => MessageBox.Show("软件安装成功。后续请使用桌面快捷方式访问本软件。")).Run(); + + // We can now launch the WPF application as normal. + App app = new(); + app.InitializeComponent(); + app.Run(); + + } + catch (Exception ex) + { + MessageBox.Show($"Unhandled exception: {ex}"); + } + } +} \ No newline at end of file diff --git a/Astroke/Resources/Images/astroke.ico b/Astroke/Resources/Images/astroke.ico new file mode 100644 index 0000000000000000000000000000000000000000..860cecd39aab07452fd493ac2fb9c235010e8065 GIT binary patch literal 116840 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 UEy^+->U?hGCR1(?G|b5Oe*#&%OaK4? literal 0 HcmV?d00001 diff --git a/Astroke/Resources/Images/placeholder.png b/Astroke/Resources/Images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc235e6b7dea5dc500992dd6de714f1320e8309 GIT binary patch literal 20131 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 + + 欢迎使用aStroke + aStroke + 请上传MD-pCASL或SD-pCASL、3D T2 FLAIR、DWI (4mm层厚) 序列,所有序列使用同一StudyInstanceUID + + CBF + 弥散受限 + ATT + aCBV + 前循环ASPECTS + 尾状核、内囊、豆状核、脑岛存在CBF<10或ADC<620扣1分;M1-M6区域CBF<10或ADC<620体积大于等于该区域三分之一扣除1分。 + CBF<10或ADC<620中脑和桥脑,扣除2分;大脑后动脉供血区左、大脑后动脉供血区右、小脑左,小脑右、丘脑左、丘脑右区域扣除1分。 + 后循环ASPECTS + + 注册人/企业名称: 安影科技(北京)有限公司 +生产地址: 北京市大兴区宝参南街16号院3号楼(3A)201单元205、206、207室 +售后服务单位: 安影科技(北京)有限公司 +联系方式: 010-69465675 + + \ No newline at end of file diff --git a/Astroke/Resources/Strings/en.xaml b/Astroke/Resources/Strings/en.xaml new file mode 100644 index 0000000..0472e99 --- /dev/null +++ b/Astroke/Resources/Strings/en.xaml @@ -0,0 +1,12 @@ + + + Welcome to aStroke + aStroke + + Ischemic + Restricted Diffusion + Collateral Circulation + ASPECTS + \ No newline at end of file diff --git a/Astroke/ViewModels/AStrokeControlViewModel.cs b/Astroke/ViewModels/AStrokeControlViewModel.cs new file mode 100644 index 0000000..a2ef69d --- /dev/null +++ b/Astroke/ViewModels/AStrokeControlViewModel.cs @@ -0,0 +1,207 @@ +using System.IO; +using System.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Livia.Models; +using Livia.Utility; +using Livia.Utility.DependencyInjection; +using Livia.ViewModels; +using Microsoft.Extensions.DependencyInjection; + +namespace Astroke.ViewModels; + +public class AStrokeControlViewModel : ObservableRecipient, ILiviaControlViewModel, IRecipient, IRecipient +{ + public ImageRotationViewerControlViewModel ArterialTerritoriesImageRotationViewerControlViewModel { get; } + public ImageRotationViewerControlViewModel AspectsImageRotationViewerControlViewModel { get; } + + public PerfusionDataGridGroupControlViewModel PerfusionDataGridGroupViewModel { get; } + + public AStrokeRoiSummaryControlViewModel LeftAStrokeRoiSummaryControlViewModel { get; } + public AStrokeRoiSummaryControlViewModel RightAStrokeRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel LeftRestrictedDiffusionRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel RightRestrictedDiffusionRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel LeftAttRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel RightAttRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel LeftAcbvRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel RightAcbvRoiSummaryControlViewModel { get; } + public AspectsScoreRoiSummaryControlViewModel LeftAnteriorAspectsScoreRoiSummaryControlViewModel { get; } + public AspectsScoreRoiSummaryControlViewModel RightAnteriorAspectsScoreRoiSummaryControlViewModel { get; } + public AspectsScoreRoiSummaryControlViewModel PosteriorAspectsScoreRoiSummaryControlViewModel { get; } + public MosaicImageGroupControlViewModel MosaicImageGroupViewModel { get; } + //TODO::temp fix I do not like this + public bool AttTabVisible { get => _attTabVisible; set => SetProperty(ref _attTabVisible, value); } + public IDataBlockLoader DataBlockLoader { get; } + public int RoiTabSelectedIndex { get => _roiTabSelectedIndex; set => SetProperty(ref _roiTabSelectedIndex, value); } + + private int _roiTabSelectedIndex; + private bool _attTabVisible = true; + + public AStrokeControlViewModel(IDataBlockLoader dataBlockLoader) + { + WeakReferenceMessenger.Default.RegisterAll(this); + DataBlockLoader = dataBlockLoader; + + ArterialTerritoriesImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + ArterialTerritoriesImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("ArterialTerritoriesRotationViewerName"); + ArterialTerritoriesImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\AnImage_ArterialTerritories\mask"; + ArterialTerritoriesImageRotationViewerControlViewModel.StructLoadPath = "structure"; + ArterialTerritoriesImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D; + ArterialTerritoriesImageRotationViewerControlViewModel.AtlasId = "AnImage_ArterialTerritories"; + ArterialTerritoriesImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure"; + dataBlockLoader.AddViewModel(ArterialTerritoriesImageRotationViewerControlViewModel); + + AspectsImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + AspectsImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("AspectsRotationViewerName"); + AspectsImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\AnImage_ASPECTS\mask"; + AspectsImageRotationViewerControlViewModel.StructLoadPath = "structure"; + AspectsImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D; + AspectsImageRotationViewerControlViewModel.AtlasId = "AnImage_ASPECTS"; + AspectsImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure"; + dataBlockLoader.AddViewModel(AspectsImageRotationViewerControlViewModel); + + PerfusionDataGridControlViewModel cerebrumCerebellumPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + cerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum"); + cerebrumCerebellumPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName"); + + PerfusionDataGridControlViewModel arterialTerritoriesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + arterialTerritoriesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ArterialTerritories"); + arterialTerritoriesPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("ArterialTerritoriesPerfusionDataGridName"); + + PerfusionDataGridControlViewModel aspectsPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + aspectsPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ASPECTS"); + aspectsPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("AspectsPerfusionDataGridName"); + + PerfusionDataGridGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(cerebrumCerebellumPerfusionDataGridControlViewModel); + PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(arterialTerritoriesPerfusionDataGridControlViewModel); + PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(aspectsPerfusionDataGridControlViewModel); + dataBlockLoader.AddViewModel(PerfusionDataGridGroupViewModel); + + LeftAStrokeRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAStrokeRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json"); + LeftAStrokeRoiSummaryControlViewModel.RoiTabId = "cbf"; + dataBlockLoader.AddViewModel(LeftAStrokeRoiSummaryControlViewModel); + + RightAStrokeRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAStrokeRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_r.json"); + RightAStrokeRoiSummaryControlViewModel.RoiTabId = "cbf"; + dataBlockLoader.AddViewModel(RightAStrokeRoiSummaryControlViewModel); + + //This is useless but prevents ReSharper form complaining. This function may be needed in the future. + RoiExpanderGroupControlViewModel.DefaultDeselectRoiSet.Add(""); + + LeftRestrictedDiffusionRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftRestrictedDiffusionRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "restricted_diffusion_location_l.json"); + LeftRestrictedDiffusionRoiSummaryControlViewModel.RoiTabId = "restricted_diffusion"; + dataBlockLoader.AddViewModel(LeftRestrictedDiffusionRoiSummaryControlViewModel); + + RightRestrictedDiffusionRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightRestrictedDiffusionRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "restricted_diffusion_location_r.json"); + RightRestrictedDiffusionRoiSummaryControlViewModel.RoiTabId = "restricted_diffusion"; + dataBlockLoader.AddViewModel(RightRestrictedDiffusionRoiSummaryControlViewModel); + + LeftAnteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAnteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "anterior_aspects_l.json"); + LeftAnteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "anterior"; + dataBlockLoader.AddViewModel(LeftAnteriorAspectsScoreRoiSummaryControlViewModel); + + RightAnteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAnteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "anterior_aspects_r.json"); + RightAnteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "anterior"; + dataBlockLoader.AddViewModel(RightAnteriorAspectsScoreRoiSummaryControlViewModel); + + PosteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + PosteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "posterior_aspects.json"); + PosteriorAspectsScoreRoiSummaryControlViewModel.IsTwoSided = true; + PosteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "posterior"; + dataBlockLoader.AddViewModel(PosteriorAspectsScoreRoiSummaryControlViewModel); + + LeftAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_l.json"); + LeftAttRoiSummaryControlViewModel.RoiTabId = "att"; + dataBlockLoader.AddViewModel(LeftAttRoiSummaryControlViewModel); + + RightAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_r.json"); + RightAttRoiSummaryControlViewModel.RoiTabId = "att"; + dataBlockLoader.AddViewModel(RightAttRoiSummaryControlViewModel); + + LeftAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_l.json"); + LeftAcbvRoiSummaryControlViewModel.RoiTabId = "acbv"; + dataBlockLoader.AddViewModel(LeftAcbvRoiSummaryControlViewModel); + + RightAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_r.json"); + RightAcbvRoiSummaryControlViewModel.RoiTabId = "acbv"; + dataBlockLoader.AddViewModel(RightAcbvRoiSummaryControlViewModel); + + MosaicImageGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + dataBlockLoader.AddDeferredLoadingModuleViewModel(MosaicImageGroupViewModel); + + dataBlockLoader.Init(); + + RoiSummaryControlViewModel.RoiTabIdToTabIndexDictionary = new Dictionary + { + { "cbf", 1 }, { "restricted_diffusion", 2 }, { "att", 3 }, { "acbv", 4 }, {"anterior", 5}, {"posterior", 6} + }; + } + + public List GenerateReportModuleGroups() + { + List atlasItems = + [ + new ReportModuleItemViewModel( + (string)Application.Current.TryFindResource("ArterialTerritoriesRotationViewerName"), + "AnImage_ArterialTerritories"), + new ReportModuleItemViewModel((string)Application.Current.TryFindResource("AspectsRotationViewerName"), + "AnImage_ASPECTS") + ]; + + //TODO::maybe cache it when loading data is better. No need to check colorMap + List colorImageItems = (from viewModel in MosaicImageGroupViewModel.MosaicImageCollection where viewModel.UseColorBar select new ReportModuleItemViewModel(viewModel.DisplayName, viewModel.DisplayName)).ToList(); + + + List result = + [ + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleAtlas"), + "regional_perfusion", atlasItems), + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleColorImage"), + "param_color_img", colorImageItems), + new ReportModuleExpanderViewModel("CBF", "cbf", + LeftAStrokeRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAStrokeRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("RoiTabHeader2"), + "restricted_diffusion", + LeftRestrictedDiffusionRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightRestrictedDiffusionRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel("ATT", "att", + LeftAttRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAttRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel("aCBV", "acbv", + LeftAcbvRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAcbvRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("RoiTabHeader5"), + "anterior_aspects", + LeftAnteriorAspectsScoreRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAnteriorAspectsScoreRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("RoiTabHeader6"), + "posterior_aspects", PosteriorAspectsScoreRoiSummaryControlViewModel.GenerateReportModuleList()) + ]; + return result; + } + + public void Receive(DataLoadedMessage message) + { + RoiTabSelectedIndex = 1; + WeakReferenceMessenger.Default.Send(new RoiTabChangedMessage(RoiTabSelectedIndex)); + AttTabVisible = LeftAttRoiSummaryControlViewModel.Visible || RightAttRoiSummaryControlViewModel.Visible; + } + + public void Receive(PerfusionDataGridChangeParameterMessage message) + { + if (message.Value.Item2) + RoiTabSelectedIndex = 0; + } +} \ No newline at end of file diff --git a/Astroke/ViewModels/AStrokeRoiSummaryControlViewModel.cs b/Astroke/ViewModels/AStrokeRoiSummaryControlViewModel.cs new file mode 100644 index 0000000..508fbd2 --- /dev/null +++ b/Astroke/ViewModels/AStrokeRoiSummaryControlViewModel.cs @@ -0,0 +1,31 @@ +using Livia.Models; +using Livia.ViewModels; +using Microsoft.Extensions.Logging; + +namespace Astroke.ViewModels; + +public class AStrokeRoiSummaryControlViewModel(ILogger logger, IRoiLegendManager roiLegendManager) + : RoiSummaryControlViewModel(logger, roiLegendManager) +{ + public float Ratio1 { get => _ratio1; private set => SetProperty(ref _ratio1, value); } + public float Ratio2 { get => _ratio2; private set => SetProperty(ref _ratio2, value); } + public bool ShowDiagnosis { get => _showDiagnosis; private set => SetProperty(ref _showDiagnosis, value); } + + + private float _ratio1; + private float _ratio2; + private bool _showDiagnosis; + //private const float ShowDiagnosisThreshold = 1.8f; + + protected override void UpdateDiagnosis() + { + float iscVolume = SelectedIsCRoiExpanderGroupViewModel?.SelectedVolume ?? 0; + float ispVolume = SelectedIsPRoiExpanderGroupViewModel?.SelectedVolume ?? 0; + + Ratio1 = ispVolume / iscVolume; + Ratio2 = 100 * ispVolume / (ispVolume + iscVolume); + + //ShowDiagnosis = Ratio1 > ShowDiagnosisThreshold && iscVolume > 0; + ShowDiagnosis = false; + } +} \ No newline at end of file diff --git a/Astroke/ViewModels/AspectsScoreRoiSummaryControlViewModel.cs b/Astroke/ViewModels/AspectsScoreRoiSummaryControlViewModel.cs new file mode 100644 index 0000000..ef4165a --- /dev/null +++ b/Astroke/ViewModels/AspectsScoreRoiSummaryControlViewModel.cs @@ -0,0 +1,39 @@ +using Livia.Models; +using Livia.ViewModels; +using Microsoft.Extensions.Logging; + +namespace Astroke.ViewModels; + +public class AspectsScoreRoiSummaryControlViewModel(ILogger logger, IRoiLegendManager roiLegendManager) + : RoiSummaryControlViewModel(logger, roiLegendManager) +{ + + public int CbfIscScore { get => _cbfIscScore; private set => SetProperty(ref _cbfIscScore, value); } + public int AdcIscScore { get => _adcIscScore; private set => SetProperty(ref _adcIscScore, value); } + + private int _cbfIscScore; + private int _adcIscScore; + private const int MaxScore = 10; + private const float Threshold = 100.0f / 3; + + protected override void UpdateDiagnosis() + { + CbfIscScore = CalculateScores(GetSelectedRoiExpanderGroupControlViewModel("CBF-IC")?.RoiViewModelCollection.Items); + AdcIscScore = CalculateScores(GetSelectedRoiExpanderGroupControlViewModel("ADC-IC")?.RoiViewModelCollection.Items); + } + + + private static int CalculateScores(IEnumerable? roiCollection) + { + if (roiCollection == null) return MaxScore; + + int score = MaxScore - roiCollection.Where(roiExpanderControlViewModel => roiExpanderControlViewModel.IsChecked) + .SelectMany(roiExpanderControlViewModel => roiExpanderControlViewModel.Locations) + .GroupBy(roiLocationDataViewModel => roiLocationDataViewModel.Name, roiLocationDataViewModel => roiLocationDataViewModel) + .Where(group => !group.Key.StartsWith("M") || group.Select(x => x.RegionPercentage).Sum() > Threshold) + .Sum(group => group.First().Weight); + + //Just in case + return Math.Clamp(score, 0, MaxScore); + } +} \ No newline at end of file diff --git a/Astroke/Views/Controls/AStrokeControl.xaml b/Astroke/Views/Controls/AStrokeControl.xaml new file mode 100644 index 0000000..7741281 --- /dev/null +++ b/Astroke/Views/Controls/AStrokeControl.xaml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Astroke/Views/Controls/AStrokeControl.xaml.cs b/Astroke/Views/Controls/AStrokeControl.xaml.cs new file mode 100644 index 0000000..739615a --- /dev/null +++ b/Astroke/Views/Controls/AStrokeControl.xaml.cs @@ -0,0 +1,29 @@ +using CommunityToolkit.Mvvm.Messaging; +using System.Windows.Controls; +using Livia.Utility; + +namespace Astroke.Views.Controls; + +/// +/// Interaction logic for AStrokeControl.xaml +/// +public partial class AStrokeControl +{ + public AStrokeControl(object viewModel) + { + InitializeComponent(); + DataContext = viewModel; + } + + private void TabSelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender is not TabControl tab) + return; + + //This is also fired on start up, ignore those calls. + if (!tab.IsLoaded) + return; + + WeakReferenceMessenger.Default.Send(new RoiTabChangedMessage(tab.SelectedIndex)); + } +} \ No newline at end of file diff --git a/Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml b/Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml new file mode 100644 index 0000000..80786cd --- /dev/null +++ b/Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml.cs b/Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml.cs new file mode 100644 index 0000000..f40120e --- /dev/null +++ b/Astroke/Views/Controls/AStrokeRoiSummaryControl.xaml.cs @@ -0,0 +1,12 @@ +namespace Astroke.Views.Controls; + +/// +/// Interaction logic for AStrokeRoiSummaryControl.xaml +/// +public partial class AStrokeRoiSummaryControl +{ + public AStrokeRoiSummaryControl() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml b/Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml new file mode 100644 index 0000000..a4bd39d --- /dev/null +++ b/Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml.cs b/Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml.cs new file mode 100644 index 0000000..250ecc6 --- /dev/null +++ b/Astroke/Views/Controls/AspectsScoreRoiSummaryControl.xaml.cs @@ -0,0 +1,12 @@ +namespace Astroke.Views.Controls; + +/// +/// Interaction logic for AspectsScoreRoiSummaryControl.xaml +/// +public partial class AspectsScoreRoiSummaryControl +{ + public AspectsScoreRoiSummaryControl() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/CereFlow/App.xaml b/CereFlow/App.xaml new file mode 100644 index 0000000..e9e1a75 --- /dev/null +++ b/CereFlow/App.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CereFlow/App.xaml.cs b/CereFlow/App.xaml.cs new file mode 100644 index 0000000..f1dafec --- /dev/null +++ b/CereFlow/App.xaml.cs @@ -0,0 +1,85 @@ +using System.IO; +using System.Windows; +using CereFlow.ViewModels; +using CereFlow.Views.Controls; +using JetBrains.Annotations; +using Livia.Models; +using Livia.Models.Data; +using Livia.Properties; +using Livia.Utility.DependencyInjection; +using Livia.ViewModels; +using Livia.Views; +using Livia.Views.Utility; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Velopack; + +namespace CereFlow; + +/// +/// Interaction logic for App.xaml +/// +public partial class App +{ + + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + private readonly IWarningSystem _warningSystem; + private readonly IProcessManager _processManager; + [UsedImplicitly] private Mutex? _mutex; + + public App() + { + ServiceConfigurations.AppName = "cereflow"; + VelopackApp.Build().Run(); + ServiceProviderFactory.Init(sc => sc.AddSingleton()); + + InitializeComponent(); + _serviceProvider = ServiceProviderFactory.ServiceProvider; + _logger = ActivatorUtilities.GetServiceOrCreateInstance>(ServiceProviderFactory.ServiceProvider); + _warningSystem = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider); + _processManager = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider); + _logger.LogInformation("App Starting"); + SettingsLogger.Init(); + + AppHelper helper = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider); + + Dispatcher.UnhandledException += helper.OnDispatcherUnhandledException; + helper.UpdateSettings(); + helper.LoadStrings(); + } + + private void OnStartup(object sender, StartupEventArgs eventArgs) + { + _mutex = new Mutex(true, "Livia", out bool isNewInstance); + if (!isNewInstance) + { + _warningSystem.ShowDialog(WarningWindowKind.Warning, true, "InstanceIsRunningError"); + Current.Shutdown(); + } + + if (File.Exists(Path.Join(Directory.GetCurrentDirectory(), "astroke_cmd", "astroke_back-sqlite", "astroke_back-sqlite.exe"))) + { + bool success = _processManager.Start([ + new ServerFileLocation("astroke_back-sqlite.exe", Path.Join(Directory.GetCurrentDirectory(), "astroke_cmd", "astroke_back-sqlite")), + new ServerFileLocation("data-storage-sqlite.exe", Path.Join(Directory.GetCurrentDirectory(), "astroke_cmd", "data-storage-sqlite")) + ]); + if (!success) + { + _warningSystem.ShowDialog(WarningWindowKind.Error, true, "SystemCrashing"); + _logger.LogError("Cannot start process"); + Current.Shutdown(); + return; + } + Settings.Default.ServerAddress = "127.0.0.1"; + Settings.Default.ServerPort = 8080; + } + + MainWindow mainWindow = ActivatorUtilities.CreateInstance(_serviceProvider); + mainWindow.AddMainControl(new CereFlowControl(ActivatorUtilities.GetServiceOrCreateInstance(ServiceProviderFactory.ServiceProvider))); + MainWindow = mainWindow; + mainWindow.Show(); + + _logger.LogInformation("App Started"); + } +} \ No newline at end of file diff --git a/CereFlow/AssemblyInfo.cs b/CereFlow/AssemblyInfo.cs new file mode 100644 index 0000000..8b5504e --- /dev/null +++ b/CereFlow/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/CereFlow/CereFlow.csproj b/CereFlow/CereFlow.csproj new file mode 100644 index 0000000..964c25f --- /dev/null +++ b/CereFlow/CereFlow.csproj @@ -0,0 +1,38 @@ + + + WinExe + net8.0-windows + enable + enable + true + Resources\Images\cereflow.ico + Cereflow + true + + + + + PreserveNewest + + + + + + + + + + CereFlow.Program + + + + PreserveNewest + + + PreserveNewest + + + + + + \ No newline at end of file diff --git a/CereFlow/Program.cs b/CereFlow/Program.cs new file mode 100644 index 0000000..862fa94 --- /dev/null +++ b/CereFlow/Program.cs @@ -0,0 +1,31 @@ +using JetBrains.Annotations; +using System.Windows; +using Velopack; + +namespace CereFlow; + +// from https://github.com/velopack/velopack/blob/master/samples/VeloWpfSample/Program.cs +[UsedImplicitly] +public class Program +{ + + [STAThread] + public static void Main(string[] args) + { + try + { + //TODO::multi language + VelopackApp.Build().WithFirstRun(_ => MessageBox.Show("软件安装成功。后续请使用桌面快捷方式访问本软件。")).Run(); + + // We can now launch the WPF application as normal. + App app = new(); + app.InitializeComponent(); + app.Run(); + + } + catch (Exception ex) + { + MessageBox.Show($"Unhandled exception: {ex}"); + } + } +} \ No newline at end of file diff --git a/CereFlow/Resources/Images/cereflow.ico b/CereFlow/Resources/Images/cereflow.ico new file mode 100644 index 0000000000000000000000000000000000000000..0b67133bda51983b3d201ce214c40dd286c15eb2 GIT binary patch literal 118024 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 literal 0 HcmV?d00001 diff --git a/CereFlow/Resources/Images/placeholder.png b/CereFlow/Resources/Images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..4eeea9b75a1ecb2c5a2491821b249a3683f2419e GIT binary patch literal 101764 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

?WR+h9CKC8UfcJ!C<~LnJz|ACg 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%0D8rY@>G)lP-Yx?uIDN6m2Zz(){Pop^5 zxvGdUj3|K+;OmMaO^358G34(mV*!G!H)@pxLuW%PAObnWNb6*NnEn*OYdkcU-0931 z2E*i_SgrT-nbs{96}nd_8@RHP^d%J~s0b(5?Y z$NT(8FB9gNWOFg&%O1#B%`b2TtQUubim;D;s4EjmWopAZ`hM|gS-!;ez67TLh(F?@3pahhtWA^!V&mN!m7L?R|rc==ctcKm%0 zu^dHPd59gyu+vljTjKM>vSctZA{&;PP9H6Le&0`eazDXB-oGXJ)*ZZK-(BS)Y#3j*Is?LG-JS(`ENLC>{*|A3Wm z=7-uDBf=0$A5k&Jl=sVx2APWqbWIm7kvAPpwng5!b)Q+Tfw4uOE#5)Mh^qkiuv4no zQM@~Z3tz^Ns(-wk{(w2c(nx&lrf^x0q_|E4!A~hNR!!V#IHCAL)#QuFJ@li@Lpo*p zOnnrF=)jgrr z>+uENrAZ%!kayz8q@}{#6@P_Skk@gA`55~5U;ac}l1|!8t6A(2Qmi?BnJRaamJN6?B z2`G%vW2A*Ox(0W|K;4mV=Lyu>tYNtcGF6kiOv9mtL}UQ@8*uieeX!C78I0jo+vyeLkpp+{7u~_WGwT;bQAu6@2yA3FXs^Y{%I9-Y73<`Pw1h!6(T?*;J&kJrJGOIog5}Gm z{nV&m6J^SY%FtEEbHWj!G;A;tp);?}$oy=|6q`%Y8CZEsF*h&d%jY<2cUD=-_LiC8 zRh;7eJSre9vI_{I)Ln*PmFWb%v^bj40%MQu1+xwNZr-2m-EVPZF@-vK#vG@R7p|7& zig4R`VwdB-aK`K@e(JD6LCCIb&ZYEVmm=y5raE_38gum*%mt|ScwqdMimVbDht#OJ z)KT5md_kpJfNJjIex&T(uR&+=_mn?ReD|a!14svCwn=WCN!ydY-hI-JNy8a1^>(N_ za$o%!w64mA6a569)oDxfnrM`97d0wth58Pqt61H4=gm8i9B6vaqdK7R+4?dw)g7A zf_Th1P1%Io%kDFwuq#7>2l{vtF2oPs(mP$`?*;gN(#H{?IDFd;c(u02=K)y`2ZS35M3>!LeZ-qtZeEIOkupu-WVUfHDHszXbSzV!3_R~*V>o(^*OuNtAl<)04z6x__T>4r6FdQu!`gjaDG%YDwzJb~EAo5rH)adYo5rIbXoN64v$wex zyJzj7Y#jG*WqxBb*g!qneWty%-Dm=f_YxDQ3O+h3;67VAkqHIwrlHBUO%he=%Vhy$ zG(HTubHXx>3E9qn{poUw%KwJ*+dEPy8eZ~1gzC_*VuUQtud2K7)hYr;FYj670eQC} z#7r(Y$X6h*De1WMa9TIS6~ns39m0QtN#bMnVdVJYc=~MF#KA9YK7Fr~%H{mv>7E=$ z&Jjlt?K`trGAyQw)!7!0(yI!p2d5_Sfni;tw^L1~SiWy$j-B_txixwU1K=yNRI__> zBccEOI<{SiHS1!ON%L*TfY0tpsXBw#mV0VAse>OqsaqPBzJo_{e%a{imDYm9;CNw6 z6y%dD>d2g+obfMoO zHi*8aCVZHN?PpfzLc~Jxh$e+qk4)crdg8tZ*frBo7<+_+?dU}Gk9F*1PdI$!=#840&v$q$ukeZZ zbgz1x8}EcYb0!~ru(*2B)_c2oa;kAp=RZp(;OmkiaT~$hzUx*3p#DaoUtP-Wmw?xB z#V22D@V9>tUID3p+f%PwQCOtFbI8gstRl24=9m{TKH^Fk>5;1f*IkLPF8t2DA-2C> zXkYdoCIE~2*e1vX*∨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 hPY0vXPc%7L-+wM|DQI=d& + + 欢迎使用CereFlow + CereFlow + 请上传MD-pCASL或SD-pCASL、3D T2 FLAIR序列,所有序列使用同一StudyInstanceUID + + CBF + ATT + aCBV + 软件名称:医学图像处理软件 +规格型号:CereFlow +发布版本:V1 +完整版本:V1.0.0.0 + + 注册人/企业名称: 安影科技(北京)有限公司 +生产地址: 北京市大兴区宝参南街16号院3号楼(3A)201单元205、206、207室 +售后服务单位: 安影科技(北京)有限公司 +联系方式: 010-69465675 + \ No newline at end of file diff --git a/CereFlow/ViewModels/CereFlowControlViewModel.cs b/CereFlow/ViewModels/CereFlowControlViewModel.cs new file mode 100644 index 0000000..bc79112 --- /dev/null +++ b/CereFlow/ViewModels/CereFlowControlViewModel.cs @@ -0,0 +1,163 @@ +using System.IO; +using System.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Livia.Models; +using Livia.Utility; +using Livia.Utility.DependencyInjection; +using Livia.ViewModels; +using Microsoft.Extensions.DependencyInjection; + +namespace CereFlow.ViewModels; + +public class CereFlowControlViewModel : ObservableRecipient, ILiviaControlViewModel, IRecipient, IRecipient +{ + public ImageRotationViewerControlViewModel BrainLobesImageRotationViewerControlViewModel { get; } + public ImageRotationViewerControlViewModel LimbicSystemImageRotationViewerControlViewModel { get; } + public PerfusionDataGridGroupControlViewModel PerfusionDataGridGroupViewModel { get; } + + public RoiSummaryControlViewModel LeftAnteriorRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel RightAnteriorRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel LeftAttRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel RightAttRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel LeftAcbvRoiSummaryControlViewModel { get; } + public RoiSummaryControlViewModel RightAcbvRoiSummaryControlViewModel { get; } + + public MosaicImageGroupControlViewModel MosaicImageGroupViewModel { get; } + //TODO::temp fix I do not like this + public bool AttTabVisible { get => _attTabVisible; set => SetProperty(ref _attTabVisible, value); } + public IDataBlockLoader DataBlockLoader { get; } + public int RoiTabSelectedIndex { get => _roiTabSelectedIndex; set => SetProperty(ref _roiTabSelectedIndex, value); } + + private int _roiTabSelectedIndex; + private bool _attTabVisible = true; + + public CereFlowControlViewModel(IDataBlockLoader dataBlockLoader) + { + WeakReferenceMessenger.Default.RegisterAll(this); + DataBlockLoader = dataBlockLoader; + + BrainLobesImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + BrainLobesImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("BrainLobesRotationViewerName"); + BrainLobesImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\AnImage_BrainLobes\mask"; + BrainLobesImageRotationViewerControlViewModel.StructLoadPath = "structure"; + BrainLobesImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D; + BrainLobesImageRotationViewerControlViewModel.AtlasId = "AnImage_BrainLobes"; + BrainLobesImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure"; + dataBlockLoader.AddViewModel(BrainLobesImageRotationViewerControlViewModel); + + LimbicSystemImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LimbicSystemImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("LimbicSystemRotationViewerName"); + LimbicSystemImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\LimbicSystem\mask"; + LimbicSystemImageRotationViewerControlViewModel.StructLoadPath = "structure"; + LimbicSystemImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D; + LimbicSystemImageRotationViewerControlViewModel.AtlasId = "LimbicSystem"; + LimbicSystemImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure"; + dataBlockLoader.AddViewModel(LimbicSystemImageRotationViewerControlViewModel); + + PerfusionDataGridControlViewModel cerebrumCerebellumPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + cerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum"); + cerebrumCerebellumPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName"); + + PerfusionDataGridControlViewModel brainLobesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + brainLobesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_BrainLobes"); + brainLobesPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("BrainLobesPerfusionDataGridName"); + + PerfusionDataGridControlViewModel limbicSystemPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + limbicSystemPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "LimbicSystem"); + limbicSystemPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("LimbicSystemPerfusionDataGridName"); + + PerfusionDataGridGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(cerebrumCerebellumPerfusionDataGridControlViewModel); + PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(brainLobesPerfusionDataGridControlViewModel); + PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(limbicSystemPerfusionDataGridControlViewModel); + dataBlockLoader.AddViewModel(PerfusionDataGridGroupViewModel); + + LeftAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json"); + LeftAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf"; + dataBlockLoader.AddViewModel(LeftAnteriorRoiSummaryControlViewModel); + + RightAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_r.json"); + RightAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf"; + dataBlockLoader.AddViewModel(RightAnteriorRoiSummaryControlViewModel); + + LeftAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_l.json"); + LeftAttRoiSummaryControlViewModel.RoiTabId = "att"; + dataBlockLoader.AddViewModel(LeftAttRoiSummaryControlViewModel); + + RightAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_r.json"); + RightAttRoiSummaryControlViewModel.RoiTabId = "att"; + dataBlockLoader.AddViewModel(RightAttRoiSummaryControlViewModel); + + LeftAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + LeftAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_l.json"); + LeftAcbvRoiSummaryControlViewModel.RoiTabId = "acbv"; + dataBlockLoader.AddViewModel(LeftAcbvRoiSummaryControlViewModel); + + RightAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + RightAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_r.json"); + RightAcbvRoiSummaryControlViewModel.RoiTabId = "acbv"; + dataBlockLoader.AddViewModel(RightAcbvRoiSummaryControlViewModel); + + MosaicImageGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); + dataBlockLoader.AddDeferredLoadingModuleViewModel(MosaicImageGroupViewModel); + + dataBlockLoader.Init(); + + RoiSummaryControlViewModel.RoiTabIdToTabIndexDictionary = new Dictionary + { + { "cbf", 1 }, { "att", 2 }, { "acbv", 3 } + }; + } + + public List GenerateReportModuleGroups() + { + List atlasItems = + [ + new ReportModuleItemViewModel((string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName"), + "AnImage_CerebrumCerebellum"), + new ReportModuleItemViewModel((string)Application.Current.TryFindResource("BrainLobesRotationViewerName"), + "AnImage_BrainLobes"), + new ReportModuleItemViewModel((string)Application.Current.TryFindResource("LimbicSystemRotationViewerName"), + "LimbicSystem") + ]; + + //TODO::maybe cache it when loading data is better. No need to check colorMap + List colorImageItems = (from viewModel in MosaicImageGroupViewModel.MosaicImageCollection where viewModel.UseColorBar select new ReportModuleItemViewModel(viewModel.DisplayName, viewModel.DisplayName)).ToList(); + + List result = + [ + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleAtlas"), + "regional_perfusion", atlasItems), + new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleColorImage"), + "param_color_img", colorImageItems), + new ReportModuleExpanderViewModel("CBF", "cbf", + LeftAnteriorRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAnteriorRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel("ATT", "att", + LeftAttRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAttRoiSummaryControlViewModel.GenerateReportModuleList())), + new ReportModuleExpanderViewModel("aCBV", "acbv", + LeftAcbvRoiSummaryControlViewModel.GenerateReportModuleList() + .Concat(RightAcbvRoiSummaryControlViewModel.GenerateReportModuleList())) + ]; + return result; + } + + public void Receive(DataLoadedMessage message) + { + RoiTabSelectedIndex = 1; + WeakReferenceMessenger.Default.Send(new RoiTabChangedMessage(RoiTabSelectedIndex)); + AttTabVisible = LeftAttRoiSummaryControlViewModel.Visible || RightAttRoiSummaryControlViewModel.Visible; + } + + public void Receive(PerfusionDataGridChangeParameterMessage message) + { + if (message.Value.Item2) + RoiTabSelectedIndex = 0; + } +} \ No newline at end of file diff --git a/CereFlow/Views/Controls/CereFlowControl.xaml b/CereFlow/Views/Controls/CereFlowControl.xaml new file mode 100644 index 0000000..4193b9d --- /dev/null +++ b/CereFlow/Views/Controls/CereFlowControl.xaml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + +