From 5ab455fb09c659e92ad4de41ec7472e2b8e48499 Mon Sep 17 00:00:00 2001 From: Roy Date: Tue, 1 Nov 2022 17:58:50 +0200 Subject: Hot folder impl completed. --- .../Tango.PPC.Jobs/ViewModels/JobsViewVM.cs | 126 +++++++++---------- .../Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj | 6 +- .../Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs | 137 ++++++++++++++++++--- 3 files changed, 185 insertions(+), 84 deletions(-) (limited to 'Software/Visual_Studio/PPC/Modules') diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobsViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobsViewVM.cs index b37cd1c68..0b039b618 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobsViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/ViewModels/JobsViewVM.cs @@ -893,71 +893,71 @@ namespace Tango.PPC.Jobs.ViewModels private async void HandleCsvJobFileLoaded(List files) { - var item = files.FirstOrDefault(); - if (item == null) return; + //var item = files.FirstOrDefault(); + //if (item == null) return; - var vm = new ImportCsvJobViewVM(); - vm.Name = Path.GetFileNameWithoutExtension(item.Name); - await vm.Init(); - await NotificationProvider.ShowDialog(vm); + //var vm = new ImportCsvJobViewVM(); + //vm.Name = Path.GetFileNameWithoutExtension(item.Name); + //await vm.Init(); + //await NotificationProvider.ShowDialog(vm); - if (vm.DialogResult && vm.SelectedRml != null) - { - try - { - NotificationProvider.SetGlobalBusyMessage("Importing job from file..."); - - using (ObservablesContext db = ObservablesContext.CreateDefault()) - { - var segments = await SegmentsCsvHelper.FromFile(item.Path, MachineProvider.Machine, db); - - Job job = new Job(); - job.LastUpdated = DateTime.UtcNow; - job.JobSource = JobSource.Local; - job.Name = vm.Name; - job.NumberOfHeads = 1; - job.NumberOfUnits = 1; - job.SampleUnitsOrMeters = 1; - job.CreationDate = DateTime.UtcNow; - job.JobStatus = JobStatuses.Draft; - job.JobType = JobTypes.Knitting; - job.EnableLubrication = true; - job.MachineGuid = MachineProvider.Machine.Guid; - job.RmlGuid = vm.SelectedRml.Guid; - job.Machine = await new MachineBuilder(db).Set(job.MachineGuid).WithCats().WithConfiguration().BuildAsync(); - job.Rml = await new RmlBuilder(db).Set(job.RmlGuid).WithActiveParametersGroup().WithCAT(MachineProvider.Machine.Guid).WithCCT().WithGbdAndLub().WithLiquidFactors().BuildAsync(); - job.WindingMethodGuid = Adapter.WindingMethods.FirstOrDefault().Guid; - job.SpoolTypeGuid = Settings.SpoolTypeGuid != null ? Settings.SpoolTypeGuid : Adapter.SpoolTypes.FirstOrDefault().Guid; - - foreach (var segment in segments) - { - segment.Job = job; - job.Segments.Add(segment); - } - - IColorConverter converter = new DefaultColorConverter(); - - foreach (var stop in segments.SelectMany(x => x.BrushStops.Where(y => y.BrushColorSpace == ColorSpaces.Volume))) - { - var output = converter.Convert(stop, false); - var suggestion = output.CreateSingleSuggestion(); - stop.Color = suggestion.Color; - } - - db.Jobs.Add(job); - await db.SaveChangesAsync(); - LoadJobs(); - } - - NotificationProvider.ReleaseGlobalBusyMessage(); - } - catch (Exception ex) - { - NotificationProvider.ReleaseGlobalBusyMessage(); - LogManager.Log(ex, "Error importing job from CSV."); - await NotificationProvider.ShowError($"Error importing job from csv file.\n{ex.FlattenMessage()}"); - } - } + //if (vm.DialogResult && vm.SelectedRml != null) + //{ + // try + // { + // NotificationProvider.SetGlobalBusyMessage("Importing job from file..."); + + // using (ObservablesContext db = ObservablesContext.CreateDefault()) + // { + // var segments = await SegmentsCsvHelper.FromFile(item.Path, MachineProvider.Machine, db); + + // Job job = new Job(); + // job.LastUpdated = DateTime.UtcNow; + // job.JobSource = JobSource.Local; + // job.Name = vm.Name; + // job.NumberOfHeads = 1; + // job.NumberOfUnits = 1; + // job.SampleUnitsOrMeters = 1; + // job.CreationDate = DateTime.UtcNow; + // job.JobStatus = JobStatuses.Draft; + // job.JobType = JobTypes.Knitting; + // job.EnableLubrication = true; + // job.MachineGuid = MachineProvider.Machine.Guid; + // job.RmlGuid = vm.SelectedRml.Guid; + // job.Machine = await new MachineBuilder(db).Set(job.MachineGuid).WithCats().WithConfiguration().BuildAsync(); + // job.Rml = await new RmlBuilder(db).Set(job.RmlGuid).WithActiveParametersGroup().WithCAT(MachineProvider.Machine.Guid).WithCCT().WithGbdAndLub().WithLiquidFactors().BuildAsync(); + // job.WindingMethodGuid = Adapter.WindingMethods.FirstOrDefault().Guid; + // job.SpoolTypeGuid = Settings.SpoolTypeGuid != null ? Settings.SpoolTypeGuid : Adapter.SpoolTypes.FirstOrDefault().Guid; + + // foreach (var segment in segments) + // { + // segment.Job = job; + // job.Segments.Add(segment); + // } + + // IColorConverter converter = new DefaultColorConverter(); + + // foreach (var stop in segments.SelectMany(x => x.BrushStops.Where(y => y.BrushColorSpace == ColorSpaces.Volume))) + // { + // var output = converter.Convert(stop, false); + // var suggestion = output.CreateSingleSuggestion(); + // stop.Color = suggestion.Color; + // } + + // db.Jobs.Add(job); + // await db.SaveChangesAsync(); + // LoadJobs(); + // } + + // NotificationProvider.ReleaseGlobalBusyMessage(); + // } + // catch (Exception ex) + // { + // NotificationProvider.ReleaseGlobalBusyMessage(); + // LogManager.Log(ex, "Error importing job from CSV."); + // await NotificationProvider.ShowError($"Error importing job from csv file.\n{ex.FlattenMessage()}"); + // } + //} } #endregion diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj index 8edc18f1f..26c059d15 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/Tango.PPC.JobsV2.csproj @@ -458,6 +458,10 @@ {0be74eee-22cb-4dba-b896-793b9e1a3ac0} Tango.PPC.Common + + {208c8bd8-72c6-4e3c-acaa-351091a2acc7} + Tango.PPC.Shared + {04febb02-f782-4b96-b47d-f6902afa43be} Tango.PPC.Storage @@ -715,7 +719,7 @@ - + \ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs index 1f6798881..38413b24c 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.JobsV2/ViewModels/JobsViewVM.cs @@ -42,6 +42,9 @@ using Tango.PPC.Storage.Models; using Tango.BL.Helpers; using Tango.ColorConversion; using Tango.PPC.Jobs.Models; +using Tango.PPC.Shared.RemoteJobUpload; +using Tango.PPC.Common.Notifications; +using Tango.PPC.Common.Notifications.NotificationItems; namespace Tango.PPC.Jobs.ViewModels { @@ -221,7 +224,7 @@ namespace Tango.PPC.Jobs.ViewModels /// Gets or sets the export job command. /// public RelayCommand ExportJobCommand { get; set; } - + #endregion #region Constructors @@ -248,7 +251,7 @@ namespace Tango.PPC.Jobs.ViewModels DeleteJobsCommand = new RelayCommand(() => DeleteJobs(SelectedJobs)); CloneJobsCommand = new RelayCommand(() => CloneJobs(SelectedJobs)); ExportJobCommand = new RelayCommand(ExportJob); - + RegisterForMessage(HandleJobRemovedMessage); RegisterForMessage(HandleJobSavedMessage); RegisterForMessage((x) => Filter = null); @@ -345,7 +348,7 @@ namespace Tango.PPC.Jobs.ViewModels /// /// Loads the jobs from database. /// - public void LoadJobs(Action onCompleted = null) + public void LoadJobs(Action onCompleted = null, bool animate = true) { try { @@ -353,7 +356,7 @@ namespace Tango.PPC.Jobs.ViewModels Task.Factory.StartNew(() => { - IsLoadingJobs = true; + if (animate) IsLoadingJobs = true; Thread.Sleep(500); @@ -417,32 +420,32 @@ namespace Tango.PPC.Jobs.ViewModels var settings = SettingsManager.Default.GetOrCreate(); var machine = MachineProvider.Machine; - - if(_rmls.Count == 0) + + if (_rmls.Count == 0) { await Task.Delay(200); } var selectedRmlGuid = Settings.DefaultRmlGuid; - JobCreationViewVM vm = new JobCreationViewVM( _spoolTypes.ToList(), _rmls.ToList(), selectedRmlGuid, 0, false ); - + JobCreationViewVM vm = new JobCreationViewVM(_spoolTypes.ToList(), _rmls.ToList(), selectedRmlGuid, 0, false); + var selectedSpoolTypeGuid = Settings.SpoolTypeGuid; - vm.SelectedSpoolType = false == String.IsNullOrEmpty(selectedSpoolTypeGuid ) ? _spoolTypes.FirstOrDefault( x=>x.Guid == selectedSpoolTypeGuid) : _spoolTypes.FirstOrDefault(x=>x.Type == SpoolTypes.StandardSpool); + vm.SelectedSpoolType = false == String.IsNullOrEmpty(selectedSpoolTypeGuid) ? _spoolTypes.FirstOrDefault(x => x.Guid == selectedSpoolTypeGuid) : _spoolTypes.FirstOrDefault(x => x.Type == SpoolTypes.StandardSpool); if (twnFile == null) { vm = await NotificationProvider.ShowDialog(vm); if (!vm.DialogResult) return; - - if(vm.SelectedRML != null) + + if (vm.SelectedRML != null) { selectedRmlGuid = vm.SelectedRML.Guid; } - if(vm.SelectedSpoolType != null) + if (vm.SelectedSpoolType != null) { selectedSpoolTypeGuid = vm.SelectedSpoolType.Guid; } - + } - + Job job = new Job(); job.LastUpdated = DateTime.UtcNow; job.JobSource = JobSource.Local; @@ -463,7 +466,7 @@ namespace Tango.PPC.Jobs.ViewModels job.RmlGuid = selectedRmlGuid; job.WindingMethodGuid = Adapter.WindingMethods.FirstOrDefault().Guid; job.SpoolTypeGuid = selectedSpoolTypeGuid; - + if (Jobs.Count > 0) { job.JobIndex = Jobs.Max(x => x.JobIndex) + 1; @@ -529,7 +532,7 @@ namespace Tango.PPC.Jobs.ViewModels LogManager.Log($"Job {job.Name} added successfully."); RaiseMessage(new JobSelectedMessage() { Job = job, Context = _db }); - + await Task.Delay(200); await NavigationManager.NavigateWithObject(new JobNavigationObject() @@ -544,7 +547,7 @@ namespace Tango.PPC.Jobs.ViewModels await NotificationProvider.ShowError("An error occurred while trying to add a new job."); } } - + /// /// Deletes the specified jobs from db. /// @@ -690,6 +693,8 @@ namespace Tango.PPC.Jobs.ViewModels } MachineDataSynchronizer.SynchronizationEnded += MachineDataSynchronizer_SynchronizationEnded; + + RemoteJobUploadService.JobReceived += RemoteJobUploadService_JobReceived; } public override void OnNavigatedTo() @@ -837,7 +842,9 @@ namespace Tango.PPC.Jobs.ViewModels using (ObservablesContext db = ObservablesContext.CreateDefault()) { - var segments = await SegmentsCsvHelper.FromFile(item.Path, MachineProvider.Machine, db); + var result = await SegmentsCsvHelper.FromFile(item.Path, MachineProvider.Machine, db); + var segments = result.Segments; + Job job = new Job(); job.LastUpdated = DateTime.UtcNow; @@ -865,11 +872,16 @@ namespace Tango.PPC.Jobs.ViewModels IColorConverter converter = new DefaultColorConverter(); - foreach (var stop in segments.SelectMany(x => x.BrushStops.Where(y => y.BrushColorSpace == ColorSpaces.Volume))) + foreach (var stop in segments.SelectMany(x => x.BrushStops)) { var output = converter.Convert(stop, false); var suggestion = output.CreateSingleSuggestion(); - stop.Color = suggestion.Color; + stop.Red = suggestion.Color.R; + stop.Green = suggestion.Color.G; + stop.Blue = suggestion.Color.B; + stop.BestMatchR = suggestion.Color.R; + stop.BestMatchG = suggestion.Color.G; + stop.BestMatchB = suggestion.Color.B; } db.Jobs.Add(job); @@ -890,6 +902,91 @@ namespace Tango.PPC.Jobs.ViewModels #endregion + #region Handle CSV Job File Received By Remote Job Upload Service + + private void RemoteJobUploadService_JobReceived(object sender, Common.RemoteJobUpload.RemoteJobReceivedEventArgs e) + { + if (e.Type == RemoteJobUploadType.CSV) + { + Task.Factory.StartNew(async () => + { + try + { + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var result = await SegmentsCsvHelper.FromFile(e.FilePath, MachineProvider.Machine, db); + var segments = result.Segments; + + String rmlGuid = null; + + if (result.Rml != null) + { + rmlGuid = result.Rml.Guid; + } + else + { + rmlGuid = Settings.DefaultRmlGuid; + } + + Job job = new Job(); + job.LastUpdated = DateTime.UtcNow; + job.JobSource = JobSource.Local; + job.Name = e.Name; + job.NumberOfHeads = 1; + job.NumberOfUnits = 1; + job.SampleUnitsOrMeters = 1; + job.CreationDate = DateTime.UtcNow; + job.JobStatus = JobStatuses.Draft; + job.JobType = JobTypes.Knitting; + job.EnableLubrication = true; + job.MachineGuid = MachineProvider.Machine.Guid; + job.RmlGuid = rmlGuid; + job.Machine = await new MachineBuilder(db).Set(job.MachineGuid).WithCats().WithConfiguration().BuildAsync(); + job.Rml = await new RmlBuilder(db).Set(job.RmlGuid).WithActiveParametersGroup().WithCAT(MachineProvider.Machine.Guid).WithCCT().WithGbdAndLub().WithLiquidFactors().BuildAsync(); + job.WindingMethodGuid = Adapter.WindingMethods.FirstOrDefault().Guid; + job.SpoolTypeGuid = Settings.SpoolTypeGuid != null ? Settings.SpoolTypeGuid : Adapter.SpoolTypes.FirstOrDefault().Guid; + + foreach (var segment in segments) + { + segment.Job = job; + job.Segments.Add(segment); + } + + IColorConverter converter = new DefaultColorConverter(); + + foreach (var stop in segments.SelectMany(x => x.BrushStops).Where(x => x.BrushColorSpace != ColorSpaces.RGB)) + { + var output = converter.Convert(stop, false); + var suggestion = output.CreateSingleSuggestion(); + stop.Red = suggestion.Color.R; + stop.Green = suggestion.Color.G; + stop.Blue = suggestion.Color.B; + stop.BestMatchR = suggestion.Color.R; + stop.BestMatchG = suggestion.Color.G; + stop.BestMatchB = suggestion.Color.B; + } + + db.Jobs.Add(job); + await db.SaveChangesAsync(); + } + + LoadJobs(() => + { + NotificationProvider.PushNotification(new MessageNotificationItem($"Csv job '{e.Name}' received successfully.", "", MessageNotificationItem.MessageNotificationItemTypes.Success, () => { }, NotificationItem.NotificationPriority.Low)); + e.Confirm(); + }, false); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error occurred on remote job upload."); + e.Abort(ex.FlattenMessage()); + } + }); + } + } + + #endregion + #region Handle TCC File Loading From Storage private async void HandleColorProfileFileLoaded(List tccFiles) -- cgit v1.3.1