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#
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));
|
|
}
|
|
} |