livia-test/MdpC6/ViewModels/MdpC6ControlViewModel.cs
2025-03-28 14:31:53 +08:00

159 lines
11 KiB
C#

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 MdpC6.ViewModels;
public class MdpC6ControlViewModel : ObservableRecipient, ILiviaControlViewModel, IRecipient<DataLoadedMessage>
{
public ImageRotationViewerControlViewModel BrainLobesImageRotationViewerControlViewModel { get; }
public ImageRotationViewerControlViewModel ArterialTerritoriesImageRotationViewerControlViewModel { get; }
public ImageRotationViewerControlViewModel LimbicSystemImageRotationViewerControlViewModel { get; }
public PerfusionDataGridControlViewModel CerebrumCerebellumPerfusionDataGridControlViewModel { get; }
public PerfusionDataGridControlViewModel BrainLobesPerfusionDataGridControlViewModel { get; }
public PerfusionDataGridControlViewModel ArterialTerritoriesPerfusionDataGridControlViewModel { get; }
public PerfusionDataGridControlViewModel LimbicSystemPerfusionDataGridControlViewModel { 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; }
public IDataBlockLoader DataBlockLoader { get; }
public int RoiTabSelectedIndex { get => _roiTabSelectedIndex; set => SetProperty(ref _roiTabSelectedIndex, value); }
private int _roiTabSelectedIndex;
public MdpC6ControlViewModel(IDataBlockLoader dataBlockLoader)
{
WeakReferenceMessenger.Default.RegisterAll(this);
DataBlockLoader = dataBlockLoader;
BrainLobesImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(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);
ArterialTerritoriesImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(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);
LimbicSystemImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(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);
CerebrumCerebellumPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
CerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum", "cbf.json");
dataBlockLoader.AddViewModel(CerebrumCerebellumPerfusionDataGridControlViewModel);
BrainLobesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
BrainLobesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_BrainLobes", "cbf.json");
dataBlockLoader.AddViewModel(BrainLobesPerfusionDataGridControlViewModel);
ArterialTerritoriesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
ArterialTerritoriesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ArterialTerritories", "cbf.json");
dataBlockLoader.AddViewModel(ArterialTerritoriesPerfusionDataGridControlViewModel);
LimbicSystemPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
LimbicSystemPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "LimbicSystem", "cbf.json");
dataBlockLoader.AddViewModel(LimbicSystemPerfusionDataGridControlViewModel);
//LeftAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
//LeftAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json");
//LeftAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf";
//dataBlockLoader.AddViewModel(LeftAnteriorRoiSummaryControlViewModel);
//RightAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
//RightAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_r.json");
//RightAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf";
//dataBlockLoader.AddViewModel(RightAnteriorRoiSummaryControlViewModel);
//LeftAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
//LeftAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_l.json");
//LeftAttRoiSummaryControlViewModel.RoiTabId = "att";
//dataBlockLoader.AddViewModel(LeftAttRoiSummaryControlViewModel);
//RightAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
//RightAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_r.json");
//RightAttRoiSummaryControlViewModel.RoiTabId = "att";
//dataBlockLoader.AddViewModel(RightAttRoiSummaryControlViewModel);
//LeftAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
//LeftAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_l.json");
//LeftAcbvRoiSummaryControlViewModel.RoiTabId = "acbv";
//dataBlockLoader.AddViewModel(LeftAcbvRoiSummaryControlViewModel);
//RightAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
//RightAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_r.json");
//RightAcbvRoiSummaryControlViewModel.RoiTabId = "acbv";
//dataBlockLoader.AddViewModel(RightAcbvRoiSummaryControlViewModel);
MosaicImageGroupViewModel = ActivatorUtilities.CreateInstance<MosaicImageGroupControlViewModel>(ServiceProviderFactory.ServiceProvider);
dataBlockLoader.AddDeferredLoadingModuleViewModel(MosaicImageGroupViewModel);
dataBlockLoader.Init();
RoiSummaryControlViewModel.RoiTabIdToTabIndexDictionary = new Dictionary<string, int>
{
{ "cbf", 0 }, { "att", 1 }, { "acbv", 2 }
};
}
public List<ReportModuleExpanderViewModel> GenerateReportModuleGroups()
{
List<ReportModuleItemViewModel> 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("ArterialTerritoriesRotationViewerName"),
"AnImage_ArterialTerritories"),
new ReportModuleItemViewModel((string)Application.Current.TryFindResource("LimbicSystemRotationViewerName"),
"LimbicSystem")
];
//TODO::maybe cache it when loading data is better. No need to check colorMap
List<ReportModuleItemViewModel> colorImageItems = (from viewModel in MosaicImageGroupViewModel.MosaicImageCollection where viewModel.UseColorBar select new ReportModuleItemViewModel(viewModel.DisplayName, viewModel.DisplayName)).ToList();
List<ReportModuleExpanderViewModel> result =
[
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleAtlas"), "regional_perfusion",
atlasItems),
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleColorImage"),
"param_color_img", colorImageItems)
];
return result;
}
public void Receive(DataLoadedMessage message)
{
WeakReferenceMessenger.Default.Send(new RoiTabChangedMessage(RoiTabSelectedIndex));
}
}