diff --git a/GSS2/ViewModels/AmineContent/AnalysisViewModel.cs b/GSS2/ViewModels/AmineContent/AnalysisViewModel.cs index 372a76b..539ae81 100644 --- a/GSS2/ViewModels/AmineContent/AnalysisViewModel.cs +++ b/GSS2/ViewModels/AmineContent/AnalysisViewModel.cs @@ -89,7 +89,7 @@ public partial class AnalysisViewModel : ViewModelBase public const double UNPROCESSED_THRESHOLD = 0.6; public const double HOTSPOT_THRESHOLD = 1.1; public const double EPSILON = 1e-10; - public const double UNPROCESSED_FRACTION_THRESHOLD = 10; + public const double UNPROCESSED_FRACTION_THRESHOLD = 50; /// /// Модель гистограммы @@ -508,14 +508,14 @@ public partial class AnalysisViewModel : ViewModelBase MeanInnerStdDev = -1; MeanHotspotArea = -1; MeanOpticalIntegral = -1; - + ProcessedAreasHistogram.Clear(); UnprocessedAreasHistogram.Clear(); HotspotAreasHistogram.Clear(); OpticalIntegralsHistogram.Clear(); InnerStdDevsHistogram.Clear(); InnerHeterogeneitiesHistogram.Clear(); - + ParticleIndex = 0; return; @@ -660,7 +660,7 @@ public partial class AnalysisViewModel : ViewModelBase // Обновляем гистограмму ParticleValuesHistogram.Set(NormalizedValues[value], 0, 3, "Количество, шт", "Значение"); // Обновляем изображение - + ZoomPanOnParticle(); } @@ -668,10 +668,10 @@ public partial class AnalysisViewModel : ViewModelBase { ZoomPanOnParticle(); } - + private void ZoomPanOnParticle() { - if (ParticleIndex < 0 || + if (ParticleIndex < 0 || ParticleIndex >= Xs.Count() || ParticleIndex >= Ys.Count()) return; @@ -683,10 +683,10 @@ public partial class AnalysisViewModel : ViewModelBase var maxX = Xs[ParticleIndex].Max(); var minY = Ys[ParticleIndex].Min(); var maxY = Ys[ParticleIndex].Max(); - + ParticleImagesZoom = MathF.Max((float)ParticleImagesBounds.Width, (float)ParticleImagesBounds.Height) * MathF.Max(maxX - minX, maxY - minY) / AnalyzerService.ANALYSIS_IMAGE_SIZE; - ParticleImagesPanX = -((maxX + minX) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Width * ParticleImagesZoom; - ParticleImagesPanY = -((maxY + minY) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Height * ParticleImagesZoom; + ParticleImagesPanX = -((maxX + minX) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Width * ParticleImagesZoom; + ParticleImagesPanY = -((maxY + minY) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Height * ParticleImagesZoom; } } @@ -995,8 +995,8 @@ public partial class AnalysisViewModel : ViewModelBase ea.PropertyName == nameof(MainSectionIsScrolling) || ea.PropertyName == nameof(InfoSectionIsScrolling)) UpdateCanInteract(); - if (ea.PropertyName == nameof(MenuSelectedIndex) || - ea.PropertyName == nameof(InfoSectionCurrentIndex) ) + if (ea.PropertyName == nameof(MenuSelectedIndex) || + ea.PropertyName == nameof(InfoSectionCurrentIndex)) UpdateCharts?.Invoke(this, EventArgs.Empty); }; @@ -1012,25 +1012,24 @@ public partial class AnalysisViewModel : ViewModelBase if (value >= MenuItems.Count()) _logger.LogError("Значение {}({}) больше количества элементов {}({})", nameof(MenuSelectedIndex), MenuSelectedIndex, nameof(MenuItems), MenuItems.Count()); // Если значение меньше 0, то значит элемент меню не выбран - if (value < 0 || value > MenuItems.Count()) - { - // Логгируем как ошибку - _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); - // Сохраняем несуществующий индекс - var nonExistingIndex = MenuSelectedIndex; - // Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями - MenuSelectedIndex = -1; - // Удаляем несуществующий элемент из списка - MenuItems.RemoveAt(nonExistingIndex); - return; - } - - _logger.LogTrace("Выбран элемент из списка: {}", value); - // Находим запись в базе данных - var selectedRecord = _context.ResultRecords.Find(MenuItems[value].Id); - // Если запись найдена, то заполняем поля из базы данных - if (selectedRecord is not null) + if (value >= 0 && value < MenuItems.Count()) { + _logger.LogTrace("Выбран элемент из списка: {}", value); + // Находим запись в базе данных + var selectedRecord = _context.ResultRecords.Find(MenuItems[value].Id); + // Если запись не найдена + if (selectedRecord is null) + { + // Логгируем как ошибку + _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.ResultRecords)); + var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс + // Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями + MenuSelectedIndex = -1; + // Удаляем несуществующий элемент из списка + MenuItems.RemoveAt(nonExistingIndex); + return; + } + // Если запись найдена, то заполняем поля из базы данных // Заполняем простые поля Record.Id = selectedRecord.Id; Record.Uuid = selectedRecord.Uuid; @@ -1781,7 +1780,7 @@ public partial class AnalysisViewModel : ViewModelBase _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", BrandComboBoxItems[BrandComboBoxSelectedIndex].Id, nameof(_context.BrandRecords)); return; } - if (brand.MixtureNormalRate <= 0) + if (brand.MixtureNormalRate <= 0) { _logger.LogError("Норма расхода выбранной марки меньше или равена 0"); return; @@ -1878,13 +1877,13 @@ public partial class AnalysisViewModel : ViewModelBase // Вычисляем пороговые значения var unprocessedThreshold = RecordViewModel.UNPROCESSED_THRESHOLD * brand.MixtureNormalRate; var hotspotsThreshold = RecordViewModel.HOTSPOT_THRESHOLD * brand.MixtureNormalRate; - + // Выичсляем максимальное значение OpenCvSharp.Cv2.MinMaxLoc(resultImage, out _, out double max); // Если иаксмиальное значниеz слишком мало, то устанавливаем его чуть больше hotspotsThreshold, чтобы не возникло деления на ноль и отридцательных значений - if (max <= hotspotsThreshold) + if (max <= hotspotsThreshold) max = hotspotsThreshold + 0.001; - + // Создаём цветное изображение результата var coloredResultImage = new OpenCvSharp.Mat(resultImage.Size(), OpenCvSharp.MatType.CV_8UC3, OpenCvSharp.Scalar.All(0)); // Расшрашиваем диапазон 0...unprocessedThreshold -> чёрный...белый @@ -1898,7 +1897,7 @@ public partial class AnalysisViewModel : ViewModelBase var invMask = new OpenCvSharp.Mat(mask.Size(), mask.Type(), OpenCvSharp.Scalar.All(0)); OpenCvSharp.Cv2.BitwiseNot(mask, invMask); coloredResultImage.SetTo(OpenCvSharp.Scalar.All(0), invMask); - + // Освобождаем память, оригинальное изображение результата можно удалить invMask.Dispose(); resultImage.Dispose(); diff --git a/GSS2/ViewModels/AmineContent/BrandCalibrationViewModel.cs b/GSS2/ViewModels/AmineContent/BrandCalibrationViewModel.cs index bb6fa46..78c838a 100644 --- a/GSS2/ViewModels/AmineContent/BrandCalibrationViewModel.cs +++ b/GSS2/ViewModels/AmineContent/BrandCalibrationViewModel.cs @@ -173,21 +173,8 @@ public partial class BrandCalibrationViewModel : ViewModelBase _logger.LogTrace("Выбран элемент из списка: {}", value); // Находим запись в базе данных var selectedRecord = _context.BrandRecords.Find(MenuItems[value].Id); - // Если запись найдена, то заполняем поля из базы данных - if (selectedRecord is not null) - { - Record.Id = selectedRecord.Id; - Record.Uuid = selectedRecord.Uuid; - Record.CreateDateTime = selectedRecord.CreateDateTime; - Record.EditDateTime = selectedRecord.EditDateTime; - Record.BrandName = selectedRecord.BrandName; - Record.MixtureName = selectedRecord.MixtureName; - Record.MixtureNormalRate = selectedRecord.MixtureNormalRate; - Record.Comment = selectedRecord.Comment; - return; - } - // Если значение не найдено в базе данных - else + // Если запись не найдена + if (selectedRecord is null) { // Логгируем как ошибку _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); @@ -198,6 +185,16 @@ public partial class BrandCalibrationViewModel : ViewModelBase MenuItems.RemoveAt(nonExistingIndex); return; } + // Если запись найдена, то заполняем поля из базы данных + Record.Id = selectedRecord.Id; + Record.Uuid = selectedRecord.Uuid; + Record.CreateDateTime = selectedRecord.CreateDateTime; + Record.EditDateTime = selectedRecord.EditDateTime; + Record.BrandName = selectedRecord.BrandName; + Record.MixtureName = selectedRecord.MixtureName; + Record.MixtureNormalRate = selectedRecord.MixtureNormalRate; + Record.Comment = selectedRecord.Comment; + return; } // Если элемент не выбран, заполняем поля пустыми значениями diff --git a/GSS2/ViewModels/AmineContent/SampleCalibrationViewModel.cs b/GSS2/ViewModels/AmineContent/SampleCalibrationViewModel.cs index 19914b1..8a1f0df 100644 --- a/GSS2/ViewModels/AmineContent/SampleCalibrationViewModel.cs +++ b/GSS2/ViewModels/AmineContent/SampleCalibrationViewModel.cs @@ -321,63 +321,11 @@ public partial class SampleCalibrationViewModel : ViewModelBase _logger.LogTrace("Выбран элемент из списка: {}", value); // Находим запись в базе данных var selectedRecord = _context.SampleRecords.Find(MenuItems[value].Id); - // Если запись найдена, то заполняем поля из базы данных - if (selectedRecord is not null) - { - // Заполняем простые поля - Record.Id = selectedRecord.Id; - Record.Uuid = selectedRecord.Uuid; - Record.CreateDateTime = selectedRecord.CreateDateTime; - Record.EditDateTime = selectedRecord.EditDateTime; - Record.SampleName = selectedRecord.SampleName; - Record.SampleComment = selectedRecord.SampleComment; - Record.SamplingDateTime = selectedRecord.SamplingDateTime; - Record.SamplingPlace = selectedRecord.SamplingPlace; - Record.MixtureActualRate = selectedRecord.MixtureActualRate; - Record.MeasuredContent = selectedRecord.MeasuredContent; - if (selectedRecord.Features.Count() > 0) - Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList(); - else - Record.Features = new List(); - - // Ищем изображение в базе данных - var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId); - // Если изображение не найдено в базе данных, то логгируем как ошибку - if (imageRecord is null) - _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords)); - // В любом случае заполняем изображение - Record.Image.Data = imageRecord?.Base64 ?? ""; - - // Ищем марку в базе данных - var brandRecord = _context.BrandRecords.Find(selectedRecord.BrandId); - // Если марка не найдена в базе данных - if (brandRecord is null) - { - // Логгируем как ошибку - _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.BrandId, nameof(_context.BrandRecords)); - // Устанавливаем, что элемент не выбран - BrandComboBoxSelectedIndex = -1; - } - // Если марка найдена в базе данных - else - { - // Ищем марку в выпадающем списке марок - var brandComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id); - // Если марка не найдена в выпадающем списке марок, то логгируем как ошибку - if (brandComboBoxItem is null) - _logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems)); - // Если марка найдена в выпадающем списке марок, выбираем её - else - BrandComboBoxSelectedIndex = BrandComboBoxItems.IndexOf(brandComboBoxItem); - } - - return; - } // Если значение не найдено в базе данных - else + if (selectedRecord is null) { // Логгируем как ошибку - _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); + _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.SampleRecords)); var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс // Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями MenuSelectedIndex = -1; @@ -385,6 +333,55 @@ public partial class SampleCalibrationViewModel : ViewModelBase MenuItems.RemoveAt(nonExistingIndex); return; } + // Если запись найдена, то заполняем поля из базы данных + // Заполняем простые поля + Record.Id = selectedRecord.Id; + Record.Uuid = selectedRecord.Uuid; + Record.CreateDateTime = selectedRecord.CreateDateTime; + Record.EditDateTime = selectedRecord.EditDateTime; + Record.SampleName = selectedRecord.SampleName; + Record.SampleComment = selectedRecord.SampleComment; + Record.SamplingDateTime = selectedRecord.SamplingDateTime; + Record.SamplingPlace = selectedRecord.SamplingPlace; + Record.MixtureActualRate = selectedRecord.MixtureActualRate; + Record.MeasuredContent = selectedRecord.MeasuredContent; + if (selectedRecord.Features.Count() > 0) + Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList(); + else + Record.Features = new List(); + + // Ищем изображение в базе данных + var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId); + // Если изображение не найдено в базе данных, то логгируем как ошибку + if (imageRecord is null) + _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords)); + // В любом случае заполняем изображение + Record.Image.Data = imageRecord?.Base64 ?? ""; + + // Ищем марку в базе данных + var brandRecord = _context.BrandRecords.Find(selectedRecord.BrandId); + // Если марка не найдена в базе данных + if (brandRecord is null) + { + // Логгируем как ошибку + _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.BrandId, nameof(_context.BrandRecords)); + // Устанавливаем, что элемент не выбран + BrandComboBoxSelectedIndex = -1; + } + // Если марка найдена в базе данных + else + { + // Ищем марку в выпадающем списке марок + var brandComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id); + // Если марка не найдена в выпадающем списке марок, то логгируем как ошибку + if (brandComboBoxItem is null) + _logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems)); + // Если марка найдена в выпадающем списке марок, выбираем её + else + BrandComboBoxSelectedIndex = BrandComboBoxItems.IndexOf(brandComboBoxItem); + } + + return; } // Если элемент не выбран, заполняем поля пустыми значениями diff --git a/GSS2/ViewModels/AmineContent/SeparatorCalibrationViewModel.cs b/GSS2/ViewModels/AmineContent/SeparatorCalibrationViewModel.cs index b599bf8..5635c2b 100644 --- a/GSS2/ViewModels/AmineContent/SeparatorCalibrationViewModel.cs +++ b/GSS2/ViewModels/AmineContent/SeparatorCalibrationViewModel.cs @@ -219,38 +219,11 @@ public partial class SeparatorCalibrationViewModel : ViewModelBase _logger.LogTrace("Выбран элемент из списка: {}", value); // Находим запись в базе данных var selectedRecord = _context.SeparatorRecords.Find(MenuItems[value].Id); - // Если запись найдена, то заполняем поля из базы данных - if (selectedRecord is not null) - { - // Заполняем простые поля - Record.Id = selectedRecord.Id; - Record.Uuid = selectedRecord.Uuid; - Record.CreateDateTime = selectedRecord.CreateDateTime; - Record.EditDateTime = selectedRecord.EditDateTime; - Record.Type = selectedRecord.Type; - Record.Comment = selectedRecord.Comment; - if (selectedRecord.Features.Count() > 0) - Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList(); - else - Record.Features = new List(); - - // Ищем изображение в базе данных - var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId); - // Если изображение не найдено в базе данных, то логгируем как ошибку - if (imageRecord is null) - _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords)); - // В любом случае заполняем изображение - Record.Image.Data = imageRecord?.Base64 ?? ""; - - // Ищем все признаки в базе данных - - return; - } - // Если значение не найдено в базе данных - else + // Если запись не найдена + if (selectedRecord is null) { // Логгируем как ошибку - _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); + _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.SeparatorRecords)); var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс // Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями MenuSelectedIndex = -1; @@ -258,6 +231,28 @@ public partial class SeparatorCalibrationViewModel : ViewModelBase MenuItems.RemoveAt(nonExistingIndex); return; } + // Если запись найдена, то заполняем поля из базы данных + // Заполняем простые поля + Record.Id = selectedRecord.Id; + Record.Uuid = selectedRecord.Uuid; + Record.CreateDateTime = selectedRecord.CreateDateTime; + Record.EditDateTime = selectedRecord.EditDateTime; + Record.Type = selectedRecord.Type; + Record.Comment = selectedRecord.Comment; + if (selectedRecord.Features.Count() > 0) + Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList(); + else + Record.Features = new List(); + + // Ищем изображение в базе данных + var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId); + // Если изображение не найдено в базе данных, то логгируем как ошибку + if (imageRecord is null) + _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords)); + // В любом случае заполняем изображение + Record.Image.Data = imageRecord?.Base64 ?? ""; + + return; } // Если элемент не выбран, заполняем поля пустыми значениями