using OpenTK.Graphics.OpenGL;
using Panuon.WPF.UI;
using SWRIS.Core;
using SWRIS.Dtos;
using SWRIS.Extensions;
using SWRIS.Models;
using SWRIS.Models.ViewModel;
using SWRIS.Repository;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
namespace SWRIS.Pages
{
///
/// DamagesPage.xaml 的交互逻辑
///
public partial class DamagesPage : Page
{
private readonly string[] _colors = new string[] { "#70a1d7", "#a1de93", "#f7f48b", "#f47c7c", "#c264fe", "#00fff5", "#f8b195", "#7a08fa" };
private readonly IRecordRepository recordRepository;
public DamagesViewModel DamagesView { get; set; }
public DamagesPage()
{
InitializeComponent();
DamagesView = new DamagesViewModel
{
Record = new RecordDto(),
Sensors = new ObservableCollection()
};
recordRepository = new RecordRepository();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
if (NavigationService != null)
{
var query = System.Web.HttpUtility.ParseQueryString(NavigationService.CurrentSource.OriginalString.Split('?')[1]);
var record = recordRepository.GetRecord(int.Parse(query["id"]));
if (record != null && record.DataFilePath != null)
{
DamagesView.Record = record;
var inUseSensors = record.InUseSensors?.Split(',').Select(s => int.Parse(s.Trim())).ToArray();
foreach (var sensorNo in inUseSensors)
{
var sensor = new SensorModel
{
Id = sensorNo,
Name = $"传感器{sensorNo}",
Color = _colors[sensorNo - 1],
IsActive = false
};
sensor.PropertyChanged += (s, arg) =>
{
if (arg.PropertyName == nameof(SensorModel.IsActive))
{
if (s is SensorModel sensor1 && sensor1 != null && sensor1.IsActive)
{
// 如果有传感器被选中,取消合值的选中状态
DamagesView.IsSummaryActive = false;
}
}
};
DamagesView.Sensors.Add(sensor);
}
var damageData = DatFileHandler.ReadDatFile(record.DataFilePath);
if (damageData?.Length > 0)
{
var parsedData = ParseSensorData(damageData, record.SensorCount, record.StartPoint, record.EndPoint);
chartLine.AddDataPoints(parsedData, record.Damages.ToList());
}
}
}
DataContext = DamagesView;
}
private void Delete_MouseDown(object sender, MouseButtonEventArgs e)
{
if ((sender as Image)?.Tag is int id)
{
var result = MessageBoxX.Show(Application.Current.MainWindow, "此操作不可恢复,是否确认删除损伤记录?", "警告", MessageBoxButton.YesNo, MessageBoxIcon.Warning, DefaultButton.YesOK);
if (result == MessageBoxResult.Yes)
{
if (recordRepository.DeleteDamage(id))
{
DamagesView.Record.Damages.Remove(DamagesView.Record.Damages.FirstOrDefault(d => d.Id == id));
recordRepository.UpdateRecordDamageCount(DamagesView.Record.Id.Value, DamagesView.Record.Damages.Count());
NoticeBox.Show("损伤数据删除成功", "通知", MessageBoxIcon.Success, false, 3000);
}
}
}
}
private void GoBack_Click(object sender, RoutedEventArgs e)
{
NavigationService?.GoBack();
}
public (double[] Positions, ushort[,] Damages) ParseSensorData(byte[] data, int sensorCount, double startPosition, double endPosition)
{
// 检查数据长度是否能被传感器数量整除
if (data.Length % sensorCount != 0)
{
LogHelper.Error($"数据长度不匹配。数据长度 {data.Length} 字节不能被传感器数量 {sensorCount} 整除。");
return (null, null);
}
// 计算样本数量
int sampleCount = data.Length / sensorCount;
// 计算采样步长
double samplingStep = (endPosition - startPosition) / (sampleCount - 1);
// 初始化结果列表
(double[] Positions, ushort[,] Damages) sensorData = (new double[sampleCount], new ushort[sensorCount, sampleCount]);
// 解析数据
for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
{
sensorData.Positions[sampleIndex] = startPosition;
for (int sensorIndex = 0; sensorIndex < sensorCount; sensorIndex++)
{
// 计算数据在字节数组中的位置
int dataIndex = (sampleIndex * sensorCount) + sensorIndex;
// 将 byte 转换为 ushort(直接赋值,因为 byte 可以隐式转换为 ushort)
sensorData.Damages[sensorIndex, sampleIndex] = data[dataIndex];
}
startPosition += samplingStep;
}
return sensorData;
}
private void Sensor_Checked(object sender, RoutedEventArgs e)
{
if (sender is ToggleButton toggleButton && int.TryParse(toggleButton.Tag?.ToString(), out int id))
{
chartLine?.SignalPlotVisible(id, true);
}
}
private void Sensor_UnChecked(object sender, RoutedEventArgs e)
{
if (sender is ToggleButton toggleButton && int.TryParse(toggleButton.Tag?.ToString(), out int id))
{
chartLine?.SignalPlotVisible(id, false);
}
}
}
}