You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.8 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Win32;
using NodeNetwork.ViewModels;
using System.Collections.ObjectModel;
using System.Reactive.Linq;
using WpfNodeTest.Models;
using WpfNodeTest.Services;
namespace WpfNodeTest.ViewModels;
/// <summary>
/// 主窗口ViewModel
/// </summary>
public partial class MainWindowViewModel : ObservableObject
{
private readonly NodeGraphSerializer _serializer = new();
private readonly NodeTypeConfigService _configService = new();
private readonly PathPlanningService _pathPlanning = new();
[ObservableProperty]
private NetworkViewModel _network = new();
[ObservableProperty]
private ObservableCollection<string> _nodeTypes = new();
[ObservableProperty]
private ObservableCollection<NodeTypeInfo> _nodeTypeInfos = new();
[ObservableProperty]
private AGVDockingNode? _selectedNode;
public MainWindowViewModel()
{
LoadNodeTypes();
// 监听节点选择变化
Network.SelectedNodes.Connect().Subscribe(_ =>
{
SelectedNode = Network.SelectedNodes.Items.FirstOrDefault() as AGVDockingNode;
});
}
// 加载节点类型列表
private void LoadNodeTypes()
{
var config = _configService.LoadConfig();
NodeTypes = new ObservableCollection<string>(config.NodeTypes.Select(t => t.TypeName));
NodeTypeInfos = new ObservableCollection<NodeTypeInfo>(config.NodeTypes);
}
/// <summary>
/// 加载节点图文件
/// </summary>
[RelayCommand]
private void LoadFile()
{
var dialog = new OpenFileDialog
{
Filter = "JSON文件|*.json",
Title = "加载节点图"
};
if (dialog.ShowDialog() == true)
{
Network = _serializer.LoadFromFile(dialog.FileName);
}
}
/// <summary>
/// 保存节点图文件
/// </summary>
[RelayCommand]
private void SaveFile()
{
var dialog = new SaveFileDialog
{
Filter = "JSON文件|*.json",
Title = "保存节点图"
};
if (dialog.ShowDialog() == true)
{
_serializer.SaveToFile(Network, dialog.FileName);
}
}
/// <summary>
/// 添加新节点
/// </summary>
[RelayCommand]
private void AddNode(string nodeType)
{
var typeInfo = _configService.GetNodeTypeInfo(nodeType);
var node = new AGVDockingNode
{
Name = nodeType,
NodeType = nodeType,
InputCount = typeInfo?.DefaultInputCount ?? 1,
OutputCount = typeInfo?.DefaultOutputCount ?? 1,
Position = new System.Windows.Point(100, 100)
};
Network.Nodes.Edit(list => list.Add(node));
}
}