299 lines
9.8 KiB
C#
299 lines
9.8 KiB
C#
|
|
using Common;
|
|||
|
|
using Common.DevicesModels;
|
|||
|
|
using Common.Models;
|
|||
|
|
using CommunityToolkit.Mvvm.Input;
|
|||
|
|
using MegaRobo.C00225155.DataAccess;
|
|||
|
|
using MegaRobo.Contract;
|
|||
|
|
using MegaRobo.Entities;
|
|||
|
|
using MegaRobo.WpfInfrastructure.Abstractions;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
|
|||
|
|
namespace MegaRobo.C00225155App.MenuViewModels
|
|||
|
|
{
|
|||
|
|
public class SuckFluidViewModel : ViewModelBaseEx
|
|||
|
|
{
|
|||
|
|
public List<EnumItem<SuckMode>> SuckModeItems { get; set; }
|
|||
|
|
public List<EnumItem<DrainageMode>> DrainageModeItems { get; set; }
|
|||
|
|
|
|||
|
|
private SuckMode selectedsuckmode;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 选择的吸液模式
|
|||
|
|
/// </summary>
|
|||
|
|
public SuckMode SelectedSuckMode
|
|||
|
|
{
|
|||
|
|
get => selectedsuckmode;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
if (SetProperty(ref selectedsuckmode, value))
|
|||
|
|
{
|
|||
|
|
UpdateSuckFluidPropByMode(value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private DrainageMode selecteddrainagemode;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 选择的排液模式
|
|||
|
|
/// </summary>
|
|||
|
|
public DrainageMode SelectedDrainageMode
|
|||
|
|
{
|
|||
|
|
get => selecteddrainagemode;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
if (SetProperty(ref selecteddrainagemode, value))
|
|||
|
|
{
|
|||
|
|
UpdateDrainagePropByMode(value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private object suckfluidprop;
|
|||
|
|
public object SuckFluidProp
|
|||
|
|
{
|
|||
|
|
get => suckfluidprop;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
if (SetProperty(ref suckfluidprop, value))
|
|||
|
|
{
|
|||
|
|
ParseProperties();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private object drainageprop;
|
|||
|
|
public object DrainageProp
|
|||
|
|
{
|
|||
|
|
get => drainageprop;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
if (SetProperty(ref drainageprop, value))
|
|||
|
|
{
|
|||
|
|
ParseDrainageProperties();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private double ratio;
|
|||
|
|
|
|||
|
|
public double Ratio
|
|||
|
|
{
|
|||
|
|
get { return ratio; }
|
|||
|
|
set { ratio = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
private string liquidname;
|
|||
|
|
public string LiquidName
|
|||
|
|
{
|
|||
|
|
get => liquidname;
|
|||
|
|
set => SetProperty(ref liquidname, value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ObservableCollection<PropertyItem> _properties = new ObservableCollection<PropertyItem>();
|
|||
|
|
public ObservableCollection<PropertyItem> Properties
|
|||
|
|
{
|
|||
|
|
get => _properties;
|
|||
|
|
set => SetProperty(ref _properties, value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ObservableCollection<PropertyItem> _drainageproperties = new ObservableCollection<PropertyItem>();
|
|||
|
|
public ObservableCollection<PropertyItem> DrainageProperties
|
|||
|
|
{
|
|||
|
|
get => _drainageproperties;
|
|||
|
|
set => SetProperty(ref _drainageproperties, value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void Initialize(ICoreService coreService, string title, params object[] args)
|
|||
|
|
{
|
|||
|
|
base.Initialize(coreService, title, args);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected override void LoadServices()
|
|||
|
|
{
|
|||
|
|
base.LoadServices();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected override void LoadDatas()
|
|||
|
|
{
|
|||
|
|
base.LoadDatas();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected override void Register()
|
|||
|
|
{
|
|||
|
|
base.Register();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public SuckFluidViewModel()
|
|||
|
|
{
|
|||
|
|
SuckModeItems = EnumHelperr.GetEnumDescriptionList<SuckMode>();
|
|||
|
|
DrainageModeItems = EnumHelperr.GetEnumDescriptionList<DrainageMode>();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 根据选中的吸液模式,更新吸液参数配置实例
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="mode">选中的吸液模式</param>
|
|||
|
|
private void UpdateSuckFluidPropByMode(SuckMode mode)
|
|||
|
|
{
|
|||
|
|
// 保存当前模式的参数(如果已有配置,用于保留可复用的参数值)
|
|||
|
|
var currentValues = SuckFluidProp != null ? GetCurrentPropertyValues(SuckFluidProp) : null;
|
|||
|
|
|
|||
|
|
// 根据新模式创建对应的参数配置实例(如 MA→SuckFluidByMA)
|
|||
|
|
SuckFluidProp = mode switch
|
|||
|
|
{
|
|||
|
|
SuckMode.MA => new SuckFluidByMA(),
|
|||
|
|
SuckMode.ME => new SuckFluidByME(),
|
|||
|
|
SuckMode.MG => new SuckFluidByMG(),
|
|||
|
|
_ => new SuckFluidByMA() // 默认值
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 如果有旧参数,尝试将可复用的值同步到新实例(可选逻辑)
|
|||
|
|
if (currentValues != null)
|
|||
|
|
{
|
|||
|
|
SyncPropertyValues(SuckFluidProp, currentValues);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 重新解析参数列表,更新界面显示
|
|||
|
|
ParseProperties();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ParseProperties()
|
|||
|
|
{
|
|||
|
|
Properties.Clear(); // 清空现有内容
|
|||
|
|
|
|||
|
|
if (SuckFluidProp == null)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
// 反射获取 SuckFluidProp(实际是 MA/ME/MG 实例)的所有公共属性
|
|||
|
|
var props = SuckFluidProp.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
foreach (var prop in props)
|
|||
|
|
{
|
|||
|
|
// 跳过不需要编辑的属性(如 CmdCode)
|
|||
|
|
if (prop.Name == "CmdCode")
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// 获取 [Numeric] 特性
|
|||
|
|
var numericAttr = prop.GetCustomAttribute<NumericAttribute>();
|
|||
|
|
|
|||
|
|
// 添加到 Properties 集合(供界面显示)
|
|||
|
|
Properties.Add(new PropertyItem
|
|||
|
|
{
|
|||
|
|
Name = prop.Name,
|
|||
|
|
Description = numericAttr?.Descr ?? "无描述",
|
|||
|
|
Value = prop.GetValue(SuckFluidProp), // 初始值
|
|||
|
|
Type = prop.PropertyType,
|
|||
|
|
NumericAttribute = numericAttr,
|
|||
|
|
TargetObject = SuckFluidProp,
|
|||
|
|
PropertyInfo = prop
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 根据选中的分液模式,更新分液参数配置实例
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="mode">选中的分液模式</param>
|
|||
|
|
private void UpdateDrainagePropByMode(DrainageMode mode)
|
|||
|
|
{
|
|||
|
|
// 保存当前模式的参数(如果已有配置)
|
|||
|
|
var currentValues = DrainageProp != null ? GetCurrentPropertyValues(DrainageProp) : null;
|
|||
|
|
|
|||
|
|
// 根据新模式创建对应的参数配置实例(如 ML→DrainageFluidByML)
|
|||
|
|
DrainageProp = mode switch
|
|||
|
|
{
|
|||
|
|
DrainageMode.ML => new DrainageFluidByML(),
|
|||
|
|
DrainageMode.MH => new DrainageFluidByMH(),
|
|||
|
|
_ => new DrainageFluidByML() // 默认值
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 同步可复用的旧参数到新实例(可选逻辑)
|
|||
|
|
if (currentValues != null)
|
|||
|
|
{
|
|||
|
|
SyncPropertyValues(DrainageProp, currentValues);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 重新解析参数列表,更新界面显示
|
|||
|
|
ParseDrainageProperties();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ParseDrainageProperties()
|
|||
|
|
{
|
|||
|
|
DrainageProperties.Clear(); // 清空现有内容
|
|||
|
|
|
|||
|
|
if (DrainageProp == null)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
// 反射获取 SuckFluidProp(实际是 MA/ME/MG 实例)的所有公共属性
|
|||
|
|
var props = DrainageProp.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
foreach (var prop in props)
|
|||
|
|
{
|
|||
|
|
// 跳过不需要编辑的属性(如 CmdCode)
|
|||
|
|
if (prop.Name == "CmdCode")
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// 获取 [Numeric] 特性
|
|||
|
|
var numericAttr = prop.GetCustomAttribute<NumericAttribute>();
|
|||
|
|
|
|||
|
|
// 添加到 Properties 集合(供界面显示)
|
|||
|
|
DrainageProperties.Add(new PropertyItem
|
|||
|
|
{
|
|||
|
|
Name = prop.Name,
|
|||
|
|
Description = numericAttr?.Descr ?? "无描述",
|
|||
|
|
Value = prop.GetValue(DrainageProp), // 初始值
|
|||
|
|
Type = prop.PropertyType,
|
|||
|
|
NumericAttribute = numericAttr,
|
|||
|
|
TargetObject = DrainageProp,
|
|||
|
|
PropertyInfo = prop
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取当前参数实例的所有属性值(用于模式切换时暂存)
|
|||
|
|
/// </summary>
|
|||
|
|
private Dictionary<string, object> GetCurrentPropertyValues(object obj)
|
|||
|
|
{
|
|||
|
|
if (obj == null) return null;
|
|||
|
|
|
|||
|
|
var values = new Dictionary<string, object>();
|
|||
|
|
var props = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
|
|||
|
|
foreach (var prop in props)
|
|||
|
|
{
|
|||
|
|
// 只保存需要复用的属性(排除 CmdCode 等模式专属字段)
|
|||
|
|
if (prop.Name != "CmdCode")
|
|||
|
|
{
|
|||
|
|
values[prop.Name] = prop.GetValue(obj);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return values;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 将旧参数值同步到新实例(仅同步名称和类型匹配的属性)
|
|||
|
|
/// </summary>
|
|||
|
|
private void SyncPropertyValues(object newObj, Dictionary<string, object> oldValues)
|
|||
|
|
{
|
|||
|
|
if (newObj == null || oldValues == null) return;
|
|||
|
|
|
|||
|
|
var newProps = newObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
foreach (var prop in newProps)
|
|||
|
|
{
|
|||
|
|
// 只同步名称存在于旧参数且类型匹配的属性
|
|||
|
|
if (oldValues.TryGetValue(prop.Name, out var oldValue)
|
|||
|
|
&& prop.PropertyType.IsAssignableFrom(oldValue.GetType()))
|
|||
|
|
{
|
|||
|
|
prop.SetValue(newObj, oldValue);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|