148 lines
4.3 KiB
C#
148 lines
4.3 KiB
C#
using MembranePoreTester.Helpers;
|
|
using MembranePoreTester.Models;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Windows.Input;
|
|
|
|
namespace MembranePoreTester.ViewModels
|
|
{
|
|
public class PoreDistributionViewModel : ViewModelBase
|
|
{
|
|
private PoreDistributionRecord _record = new();
|
|
private TestLiquid _selectedLiquid;
|
|
private bool _isCustomLiquid;
|
|
private double _customSurfaceTension = 30.0;
|
|
private double _lowerPore = 0.2;
|
|
private double _upperPore = 0.8;
|
|
private double _rangePercentage;
|
|
|
|
public PoreDistributionRecord Record
|
|
{
|
|
get => _record;
|
|
set => SetProperty(ref _record, value);
|
|
}
|
|
|
|
public List<TestLiquid> Liquids => TestLiquid.Predefined;
|
|
public List<string> PressureUnits => new() { "Pa", "cmHg", "psi" };
|
|
public List<string> MembraneTypes => new() { "平板膜", "中空纤维膜" };
|
|
|
|
public TestLiquid SelectedLiquid
|
|
{
|
|
get => _selectedLiquid;
|
|
set
|
|
{
|
|
if (SetProperty(ref _selectedLiquid, value))
|
|
{
|
|
Record.Liquid = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool IsCustomLiquid
|
|
{
|
|
get => _isCustomLiquid;
|
|
set
|
|
{
|
|
if (SetProperty(ref _isCustomLiquid, value))
|
|
{
|
|
UpdateCustomLiquid();
|
|
}
|
|
}
|
|
}
|
|
|
|
public double CustomSurfaceTension
|
|
{
|
|
get => _customSurfaceTension;
|
|
set
|
|
{
|
|
if (SetProperty(ref _customSurfaceTension, value))
|
|
{
|
|
UpdateCustomLiquid();
|
|
}
|
|
}
|
|
}
|
|
|
|
public double LowerPore
|
|
{
|
|
get => _lowerPore;
|
|
set => SetProperty(ref _lowerPore, value);
|
|
}
|
|
|
|
public double UpperPore
|
|
{
|
|
get => _upperPore;
|
|
set => SetProperty(ref _upperPore, value);
|
|
}
|
|
|
|
public double RangePercentage
|
|
{
|
|
get => _rangePercentage;
|
|
set => SetProperty(ref _rangePercentage, value);
|
|
}
|
|
|
|
public ICommand AddDataPointCommand { get; }
|
|
public ICommand RemoveDataPointCommand { get; }
|
|
public ICommand CalculateCommand { get; }
|
|
public ICommand GenerateReportCommand { get; }
|
|
|
|
public PoreDistributionViewModel()
|
|
{
|
|
AddDataPointCommand = new RelayCommand(AddDataPoint);
|
|
RemoveDataPointCommand = new RelayCommand(RemoveDataPoint, () => Record.DataPoints.Any());
|
|
CalculateCommand = new RelayCommand(Calculate);
|
|
GenerateReportCommand = new RelayCommand(GenerateReport);
|
|
SelectedLiquid = Liquids[0];
|
|
Record.PressureUnit = PressureUnits[0]; // 默认 "Pa"
|
|
}
|
|
|
|
private void AddDataPoint()
|
|
{
|
|
Record.DataPoints.Add(new DataPoint());
|
|
}
|
|
|
|
private void RemoveDataPoint()
|
|
{
|
|
if (Record.DataPoints.Any())
|
|
Record.DataPoints.RemoveAt(Record.DataPoints.Count - 1);
|
|
}
|
|
|
|
private void UpdateCustomLiquid()
|
|
{
|
|
if (IsCustomLiquid)
|
|
{
|
|
Record.Liquid = new TestLiquid
|
|
{
|
|
Name = "自定义",
|
|
SurfaceTension = CustomSurfaceTension
|
|
};
|
|
}
|
|
}
|
|
|
|
// 添加私有字段和公共属性
|
|
private double _averagePoreSize;
|
|
public double AveragePoreSize
|
|
{
|
|
get => _averagePoreSize;
|
|
set => SetProperty(ref _averagePoreSize, value);
|
|
}
|
|
|
|
|
|
// 修改 Calculate 方法:
|
|
private void Calculate()
|
|
{
|
|
if (Record.DataPoints.Count < 2) return;
|
|
|
|
AveragePoreSize = PoreDistributionAnalysis.CalculateAveragePore(
|
|
Record.DataPoints, Record.PressureUnit, Record.Liquid);
|
|
|
|
RangePercentage = PoreDistributionAnalysis.CalculatePoreRangePercentage(
|
|
Record.DataPoints, Record.PressureUnit, Record.Liquid, LowerPore, UpperPore);
|
|
}
|
|
|
|
private void GenerateReport()
|
|
{
|
|
ReportGenerator.GeneratePoreDistributionReport(Record);
|
|
}
|
|
}
|
|
} |