diff --git a/SmartAquaViewer/Model/Datas.cs b/SmartAquaViewer/Model/Datas.cs index 03a7790..ca04dbd 100644 --- a/SmartAquaViewer/Model/Datas.cs +++ b/SmartAquaViewer/Model/Datas.cs @@ -1,29 +1,46 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using SmartAquaViewer.DataAnalysis; +using static MaterialDesignThemes.Wpf.Theme.ToolBar; namespace SmartAquaViewer.Model { - public class Datas + public class Datas : INotifyPropertyChanged { - public static List WaterQualityList { get; set; } + public static Datas Instance { get; } = new Datas(); - static Datas() + public ObservableCollection WaterQualityList { get; set; } + public ReadOnlyObservableCollection WaterQualityView { get; } + + private Datas() { - WaterQualityList = new List(); + WaterQualityList = new ObservableCollection(); + WaterQualityView = new ReadOnlyObservableCollection(WaterQualityList); } - public static List GetWaterQualityVO() + public ObservableCollection GetWaterQualityVO() { return WaterQualityList; } - public static void SetWaterQualityVO(List sampleData) + public void SetWaterQualityVO(List sampleData) { - WaterQualityList = sampleData; + WaterQualityList.Clear(); + if (sampleData == null) return; + foreach (var data in sampleData) + WaterQualityList.Add(data); + + OnPropertyChanged(nameof(WaterQualityList)); } + + public event PropertyChangedEventHandler? PropertyChanged; + private void OnPropertyChanged(string name) => + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } } diff --git a/SmartAquaViewer/Model/FileModel.cs b/SmartAquaViewer/Model/FileModel.cs index 12bdd70..1cef82a 100644 --- a/SmartAquaViewer/Model/FileModel.cs +++ b/SmartAquaViewer/Model/FileModel.cs @@ -9,5 +9,6 @@ namespace SmartAquaViewer.Model public class FileModel { public string Name { get; set; } + public string Content { get; set; } } } diff --git a/SmartAquaViewer/View/FileListView.xaml b/SmartAquaViewer/View/FileListView.xaml index 4dce29a..d22fda5 100644 --- a/SmartAquaViewer/View/FileListView.xaml +++ b/SmartAquaViewer/View/FileListView.xaml @@ -34,21 +34,22 @@ - - - - - - - - - + + + + + + + + + + + diff --git a/SmartAquaViewer/ViewModel/EnergyViewModel.cs b/SmartAquaViewer/ViewModel/EnergyViewModel.cs index 907798d..b2861d0 100644 --- a/SmartAquaViewer/ViewModel/EnergyViewModel.cs +++ b/SmartAquaViewer/ViewModel/EnergyViewModel.cs @@ -246,7 +246,7 @@ namespace SmartAquaViewer.ViewModel public EnergyViewModel() { - WaterQualityList = Datas.GetWaterQualityVO(); + WaterQualityList = Datas.Instance.GetWaterQualityVO().ToList(); GraphTypes = new ObservableCollection { GraphType.LINE, diff --git a/SmartAquaViewer/ViewModel/FileListViewModel.cs b/SmartAquaViewer/ViewModel/FileListViewModel.cs index e22ec56..6ddb383 100644 --- a/SmartAquaViewer/ViewModel/FileListViewModel.cs +++ b/SmartAquaViewer/ViewModel/FileListViewModel.cs @@ -2,13 +2,17 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using System.Diagnostics; +using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Microsoft.Win32; +using Newtonsoft.Json; using SmartAquaViewer.Controls; +using SmartAquaViewer.DataAnalysis; using SmartAquaViewer.Model; namespace SmartAquaViewer.ViewModel @@ -25,9 +29,10 @@ namespace SmartAquaViewer.ViewModel { if (_selectedFile != value) { - _selectedFile = value; - + _selectedFile = value; OnPropertyChanged(); + + DeserializeContentToJson(); } } } @@ -57,6 +62,9 @@ namespace SmartAquaViewer.ViewModel var fileName = System.IO.Path.GetFileName(filePath); var fileModel = new FileModel { Name = fileName }; + var fileContent = File.ReadAllText(filePath); + fileModel.Content = fileContent; + if (!FileList.Any(f => f.Name == fileModel.Name)) { FileList.Add(fileModel); @@ -65,6 +73,25 @@ namespace SmartAquaViewer.ViewModel } } + private void DeserializeContentToJson() + { + if (SelectedFile == null || string.IsNullOrWhiteSpace(SelectedFile.Content)) + return; + + try + { + var list = JsonConvert.DeserializeObject>(SelectedFile.Content) + ?? new List(); + + // 여기서 SSOT에 "내용만" 갱신 + Datas.Instance.SetWaterQualityVO(list); + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + } + } + public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged([CallerMemberName] string? name = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); diff --git a/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs b/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs index 08a48bc..f2a29a4 100644 --- a/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs +++ b/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs @@ -104,7 +104,7 @@ namespace SmartAquaViewer.ViewModel public GreenHouseGasViewModel() { - WaterQualityList = Datas.GetWaterQualityVO(); + WaterQualityList = Datas.Instance.GetWaterQualityVO().ToList(); GraphTypes = new ObservableCollection { GraphType.LINE, diff --git a/SmartAquaViewer/ViewModel/MainViewModel.cs b/SmartAquaViewer/ViewModel/MainViewModel.cs index 6b80279..5cba522 100644 --- a/SmartAquaViewer/ViewModel/MainViewModel.cs +++ b/SmartAquaViewer/ViewModel/MainViewModel.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows.Input; +using Newtonsoft.Json; using SmartAquaViewer.Controls; using SmartAquaViewer.DataAnalysis; using SmartAquaViewer.Model; @@ -35,6 +37,17 @@ namespace SmartAquaViewer.ViewModel SwapViewCommand = new RelayCommand(SwapView); SelectedViewModel = new MonitoringViewModel(); // Default view + + //더미데이터 생성 및 파일로 저장 + //for (int i = 1; i <= 10; i++) + //{ + // DateTime date = new(2025, 8, i); + // var dataList = WaterQualityVO.GetSampleData(date, date, 24); + // var jsonStr = JsonConvert.SerializeObject(dataList, Formatting.Indented); + + // string fileName = date.ToString("yyyy-MM-dd") + ".json"; + // File.WriteAllText(fileName, jsonStr); + //} } private void SwapView(object obj) diff --git a/SmartAquaViewer/ViewModel/MonitoringViewModel.cs b/SmartAquaViewer/ViewModel/MonitoringViewModel.cs index 93480ad..8f64c0a 100644 --- a/SmartAquaViewer/ViewModel/MonitoringViewModel.cs +++ b/SmartAquaViewer/ViewModel/MonitoringViewModel.cs @@ -32,7 +32,7 @@ namespace SmartAquaViewer.ViewModel public ObservableCollection GraphTypes { get; } - public List WaterQualityList { get; } + public ReadOnlyObservableCollection WaterQualityList { get; } public Dictionary> TankGroups { get; } private MonitorTab _selectedTab; @@ -242,8 +242,9 @@ namespace SmartAquaViewer.ViewModel IsOpenMode = true; BtnVisibilityUp = Visibility.Collapsed; - WaterQualityList = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 1), 10); - Datas.SetWaterQualityVO(WaterQualityList); + //WaterQualityList = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 1), 10); + //Datas.Instance.SetWaterQualityVO(WaterQualityList); + WaterQualityList = Datas.Instance.WaterQualityView; TankGroups = WaterQualityList .GroupBy(x => x.Tank.Number) // 또는 x.Tank.Num @@ -274,21 +275,21 @@ namespace SmartAquaViewer.ViewModel var yField = SelectedYField; var isMarker = ShowMarkers; if (SelectedTab.Equals(MonitorTab.Tank)) SetGraphData_Line_Tank(xField, yField, isMarker); - else GraphControlVM.SetDefaultLineGraph(WaterQualityList, SelectedTab, xField, yField, isMarker); + else GraphControlVM.SetDefaultLineGraph(WaterQualityList.ToList(), SelectedTab, xField, yField, isMarker); break; case GraphType.BOX: var xFieldBox = SelectedXField; var dataFieldBox = SelectedYField; var boxWidth = BoxWidth; var boxTimeSpan = TimeSpan.FromHours(BoxTimeSpan); - GraphControlVM.SetBoxPlot(WaterQualityList, xFieldBox, dataFieldBox, boxWidth, boxTimeSpan); + GraphControlVM.SetBoxPlot(WaterQualityList.ToList(), xFieldBox, dataFieldBox, boxWidth, boxTimeSpan); break; case GraphType.SCATTER: var xFieldScatter = SelectedXField; var yFiledScatter = SelectedYField; var markerSIze = ScatterMarkerSize; var showRegression = ShowRegression; - GraphControlVM.SetScatterPlot(WaterQualityList, xFieldScatter, yFiledScatter, markerSIze, showRegression); + GraphControlVM.SetScatterPlot(WaterQualityList.ToList(), xFieldScatter, yFiledScatter, markerSIze, showRegression); break; case GraphType.STEP: var xFieldStep = SelectedXField?.Name == "RecordedTime" ? SelectedXField : null; @@ -296,9 +297,9 @@ namespace SmartAquaViewer.ViewModel var yFiledStep = SelectedYField; var showMarkerStep = ShowMarkers; if (SelectedKind.Equals(StepFieldKind.Status)) - GraphControlVM.SetStatusSeriesStopPlot(WaterQualityList, yFiledStep, showMarkerStep); + GraphControlVM.SetStatusSeriesStopPlot(WaterQualityList.ToList(), yFiledStep, showMarkerStep); else - GraphControlVM.SetStepPlot(WaterQualityList, SelectedTab, xFieldStep, tFieldsStep, showMarkerStep); + GraphControlVM.SetStepPlot(WaterQualityList.ToList(), SelectedTab, xFieldStep, tFieldsStep, showMarkerStep); break; default: break;