forked from amkovkov/GranuSightSoftware2
fix: logic errors in view models
This commit is contained in:
@@ -89,7 +89,7 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
public const double UNPROCESSED_THRESHOLD = 0.6;
|
public const double UNPROCESSED_THRESHOLD = 0.6;
|
||||||
public const double HOTSPOT_THRESHOLD = 1.1;
|
public const double HOTSPOT_THRESHOLD = 1.1;
|
||||||
public const double EPSILON = 1e-10;
|
public const double EPSILON = 1e-10;
|
||||||
public const double UNPROCESSED_FRACTION_THRESHOLD = 10;
|
public const double UNPROCESSED_FRACTION_THRESHOLD = 50;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Модель гистограммы
|
/// Модель гистограммы
|
||||||
@@ -508,14 +508,14 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
MeanInnerStdDev = -1;
|
MeanInnerStdDev = -1;
|
||||||
MeanHotspotArea = -1;
|
MeanHotspotArea = -1;
|
||||||
MeanOpticalIntegral = -1;
|
MeanOpticalIntegral = -1;
|
||||||
|
|
||||||
ProcessedAreasHistogram.Clear();
|
ProcessedAreasHistogram.Clear();
|
||||||
UnprocessedAreasHistogram.Clear();
|
UnprocessedAreasHistogram.Clear();
|
||||||
HotspotAreasHistogram.Clear();
|
HotspotAreasHistogram.Clear();
|
||||||
OpticalIntegralsHistogram.Clear();
|
OpticalIntegralsHistogram.Clear();
|
||||||
InnerStdDevsHistogram.Clear();
|
InnerStdDevsHistogram.Clear();
|
||||||
InnerHeterogeneitiesHistogram.Clear();
|
InnerHeterogeneitiesHistogram.Clear();
|
||||||
|
|
||||||
ParticleIndex = 0;
|
ParticleIndex = 0;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -660,7 +660,7 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
// Обновляем гистограмму
|
// Обновляем гистограмму
|
||||||
ParticleValuesHistogram.Set(NormalizedValues[value], 0, 3, "Количество, шт", "Значение");
|
ParticleValuesHistogram.Set(NormalizedValues[value], 0, 3, "Количество, шт", "Значение");
|
||||||
// Обновляем изображение
|
// Обновляем изображение
|
||||||
|
|
||||||
ZoomPanOnParticle();
|
ZoomPanOnParticle();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -668,10 +668,10 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
{
|
{
|
||||||
ZoomPanOnParticle();
|
ZoomPanOnParticle();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ZoomPanOnParticle()
|
private void ZoomPanOnParticle()
|
||||||
{
|
{
|
||||||
if (ParticleIndex < 0 ||
|
if (ParticleIndex < 0 ||
|
||||||
ParticleIndex >= Xs.Count() ||
|
ParticleIndex >= Xs.Count() ||
|
||||||
ParticleIndex >= Ys.Count())
|
ParticleIndex >= Ys.Count())
|
||||||
return;
|
return;
|
||||||
@@ -683,10 +683,10 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
var maxX = Xs[ParticleIndex].Max();
|
var maxX = Xs[ParticleIndex].Max();
|
||||||
var minY = Ys[ParticleIndex].Min();
|
var minY = Ys[ParticleIndex].Min();
|
||||||
var maxY = Ys[ParticleIndex].Max();
|
var maxY = Ys[ParticleIndex].Max();
|
||||||
|
|
||||||
ParticleImagesZoom = MathF.Max((float)ParticleImagesBounds.Width, (float)ParticleImagesBounds.Height) * MathF.Max(maxX - minX, maxY - minY) / AnalyzerService.ANALYSIS_IMAGE_SIZE;
|
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;
|
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;
|
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(MainSectionIsScrolling) ||
|
||||||
ea.PropertyName == nameof(InfoSectionIsScrolling))
|
ea.PropertyName == nameof(InfoSectionIsScrolling))
|
||||||
UpdateCanInteract();
|
UpdateCanInteract();
|
||||||
if (ea.PropertyName == nameof(MenuSelectedIndex) ||
|
if (ea.PropertyName == nameof(MenuSelectedIndex) ||
|
||||||
ea.PropertyName == nameof(InfoSectionCurrentIndex) )
|
ea.PropertyName == nameof(InfoSectionCurrentIndex))
|
||||||
UpdateCharts?.Invoke(this, EventArgs.Empty);
|
UpdateCharts?.Invoke(this, EventArgs.Empty);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1012,25 +1012,24 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
if (value >= MenuItems.Count())
|
if (value >= MenuItems.Count())
|
||||||
_logger.LogError("Значение {}({}) больше количества элементов {}({})", nameof(MenuSelectedIndex), MenuSelectedIndex, nameof(MenuItems), MenuItems.Count());
|
_logger.LogError("Значение {}({}) больше количества элементов {}({})", nameof(MenuSelectedIndex), MenuSelectedIndex, nameof(MenuItems), MenuItems.Count());
|
||||||
// Если значение меньше 0, то значит элемент меню не выбран
|
// Если значение меньше 0, то значит элемент меню не выбран
|
||||||
if (value < 0 || value > MenuItems.Count())
|
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)
|
|
||||||
{
|
{
|
||||||
|
_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.Id = selectedRecord.Id;
|
||||||
Record.Uuid = selectedRecord.Uuid;
|
Record.Uuid = selectedRecord.Uuid;
|
||||||
@@ -1781,7 +1780,7 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", BrandComboBoxItems[BrandComboBoxSelectedIndex].Id, nameof(_context.BrandRecords));
|
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", BrandComboBoxItems[BrandComboBoxSelectedIndex].Id, nameof(_context.BrandRecords));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (brand.MixtureNormalRate <= 0)
|
if (brand.MixtureNormalRate <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError("Норма расхода выбранной марки меньше или равена 0");
|
_logger.LogError("Норма расхода выбранной марки меньше или равена 0");
|
||||||
return;
|
return;
|
||||||
@@ -1878,13 +1877,13 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
// Вычисляем пороговые значения
|
// Вычисляем пороговые значения
|
||||||
var unprocessedThreshold = RecordViewModel.UNPROCESSED_THRESHOLD * brand.MixtureNormalRate;
|
var unprocessedThreshold = RecordViewModel.UNPROCESSED_THRESHOLD * brand.MixtureNormalRate;
|
||||||
var hotspotsThreshold = RecordViewModel.HOTSPOT_THRESHOLD * brand.MixtureNormalRate;
|
var hotspotsThreshold = RecordViewModel.HOTSPOT_THRESHOLD * brand.MixtureNormalRate;
|
||||||
|
|
||||||
// Выичсляем максимальное значение
|
// Выичсляем максимальное значение
|
||||||
OpenCvSharp.Cv2.MinMaxLoc(resultImage, out _, out double max);
|
OpenCvSharp.Cv2.MinMaxLoc(resultImage, out _, out double max);
|
||||||
// Если иаксмиальное значниеz слишком мало, то устанавливаем его чуть больше hotspotsThreshold, чтобы не возникло деления на ноль и отридцательных значений
|
// Если иаксмиальное значниеz слишком мало, то устанавливаем его чуть больше hotspotsThreshold, чтобы не возникло деления на ноль и отридцательных значений
|
||||||
if (max <= hotspotsThreshold)
|
if (max <= hotspotsThreshold)
|
||||||
max = hotspotsThreshold + 0.001;
|
max = hotspotsThreshold + 0.001;
|
||||||
|
|
||||||
// Создаём цветное изображение результата
|
// Создаём цветное изображение результата
|
||||||
var coloredResultImage = new OpenCvSharp.Mat(resultImage.Size(), OpenCvSharp.MatType.CV_8UC3, OpenCvSharp.Scalar.All(0));
|
var coloredResultImage = new OpenCvSharp.Mat(resultImage.Size(), OpenCvSharp.MatType.CV_8UC3, OpenCvSharp.Scalar.All(0));
|
||||||
// Расшрашиваем диапазон 0...unprocessedThreshold -> чёрный...белый
|
// Расшрашиваем диапазон 0...unprocessedThreshold -> чёрный...белый
|
||||||
@@ -1898,7 +1897,7 @@ public partial class AnalysisViewModel : ViewModelBase
|
|||||||
var invMask = new OpenCvSharp.Mat(mask.Size(), mask.Type(), OpenCvSharp.Scalar.All(0));
|
var invMask = new OpenCvSharp.Mat(mask.Size(), mask.Type(), OpenCvSharp.Scalar.All(0));
|
||||||
OpenCvSharp.Cv2.BitwiseNot(mask, invMask);
|
OpenCvSharp.Cv2.BitwiseNot(mask, invMask);
|
||||||
coloredResultImage.SetTo(OpenCvSharp.Scalar.All(0), invMask);
|
coloredResultImage.SetTo(OpenCvSharp.Scalar.All(0), invMask);
|
||||||
|
|
||||||
// Освобождаем память, оригинальное изображение результата можно удалить
|
// Освобождаем память, оригинальное изображение результата можно удалить
|
||||||
invMask.Dispose();
|
invMask.Dispose();
|
||||||
resultImage.Dispose();
|
resultImage.Dispose();
|
||||||
|
|||||||
@@ -173,21 +173,8 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
|||||||
_logger.LogTrace("Выбран элемент из списка: {}", value);
|
_logger.LogTrace("Выбран элемент из списка: {}", value);
|
||||||
// Находим запись в базе данных
|
// Находим запись в базе данных
|
||||||
var selectedRecord = _context.BrandRecords.Find(MenuItems[value].Id);
|
var selectedRecord = _context.BrandRecords.Find(MenuItems[value].Id);
|
||||||
// Если запись найдена, то заполняем поля из базы данных
|
// Если запись не найдена
|
||||||
if (selectedRecord is not null)
|
if (selectedRecord is 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
|
|
||||||
{
|
{
|
||||||
// Логгируем как ошибку
|
// Логгируем как ошибку
|
||||||
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords));
|
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords));
|
||||||
@@ -198,6 +185,16 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
|||||||
MenuItems.RemoveAt(nonExistingIndex);
|
MenuItems.RemoveAt(nonExistingIndex);
|
||||||
return;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если элемент не выбран, заполняем поля пустыми значениями
|
// Если элемент не выбран, заполняем поля пустыми значениями
|
||||||
|
|||||||
@@ -321,63 +321,11 @@ public partial class SampleCalibrationViewModel : ViewModelBase
|
|||||||
_logger.LogTrace("Выбран элемент из списка: {}", value);
|
_logger.LogTrace("Выбран элемент из списка: {}", value);
|
||||||
// Находим запись в базе данных
|
// Находим запись в базе данных
|
||||||
var selectedRecord = _context.SampleRecords.Find(MenuItems[value].Id);
|
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<float[]>();
|
|
||||||
|
|
||||||
// Ищем изображение в базе данных
|
|
||||||
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; // Сохраняем несуществующий индекс
|
var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс
|
||||||
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
|
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
|
||||||
MenuSelectedIndex = -1;
|
MenuSelectedIndex = -1;
|
||||||
@@ -385,6 +333,55 @@ public partial class SampleCalibrationViewModel : ViewModelBase
|
|||||||
MenuItems.RemoveAt(nonExistingIndex);
|
MenuItems.RemoveAt(nonExistingIndex);
|
||||||
return;
|
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<float[]>();
|
||||||
|
|
||||||
|
// Ищем изображение в базе данных
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если элемент не выбран, заполняем поля пустыми значениями
|
// Если элемент не выбран, заполняем поля пустыми значениями
|
||||||
|
|||||||
@@ -219,38 +219,11 @@ public partial class SeparatorCalibrationViewModel : ViewModelBase
|
|||||||
_logger.LogTrace("Выбран элемент из списка: {}", value);
|
_logger.LogTrace("Выбран элемент из списка: {}", value);
|
||||||
// Находим запись в базе данных
|
// Находим запись в базе данных
|
||||||
var selectedRecord = _context.SeparatorRecords.Find(MenuItems[value].Id);
|
var selectedRecord = _context.SeparatorRecords.Find(MenuItems[value].Id);
|
||||||
// Если запись найдена, то заполняем поля из базы данных
|
// Если запись не найдена
|
||||||
if (selectedRecord is not null)
|
if (selectedRecord is 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<float[]>();
|
|
||||||
|
|
||||||
// Ищем изображение в базе данных
|
|
||||||
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
|
|
||||||
{
|
{
|
||||||
// Логгируем как ошибку
|
// Логгируем как ошибку
|
||||||
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords));
|
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.SeparatorRecords));
|
||||||
var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс
|
var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс
|
||||||
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
|
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
|
||||||
MenuSelectedIndex = -1;
|
MenuSelectedIndex = -1;
|
||||||
@@ -258,6 +231,28 @@ public partial class SeparatorCalibrationViewModel : ViewModelBase
|
|||||||
MenuItems.RemoveAt(nonExistingIndex);
|
MenuItems.RemoveAt(nonExistingIndex);
|
||||||
return;
|
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<float[]>();
|
||||||
|
|
||||||
|
// Ищем изображение в базе данных
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если элемент не выбран, заполняем поля пустыми значениями
|
// Если элемент не выбран, заполняем поля пустыми значениями
|
||||||
|
|||||||
Reference in New Issue
Block a user