RobotNet/RobotNet.WebApp/Maps/Models/MapEdgeModel.cs
2025-10-15 15:15:53 +07:00

124 lines
4.2 KiB
C#

using RobotNet.MapShares.Dtos;
using RobotNet.MapShares.Enums;
namespace RobotNet.WebApp.Maps.Models;
public class MapEdgeModel : IEnumerable<EdgeModel>
{
private readonly Dictionary<Guid, EdgeModel> dicEdges = [];
public EdgeModel this[int i] => dicEdges.Values.ElementAt(i);
public EdgeModel this[Guid id] => dicEdges[id];
public IEnumerator<EdgeModel> GetEnumerator() => dicEdges.Values.GetEnumerator();
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator();
public bool TryGetValue(Guid id, out EdgeModel? value) => dicEdges.TryGetValue(id, out value);
public bool ContainsKey(Guid key) => dicEdges.ContainsKey(key);
public List<EdgeModel> ActivedEdges { get; private set; } = [];
public event Action? Changed;
public event Action<EdgeModel?>? EdgeSelectedChanged;
private (double X, double Y) StartMovePosition;
public void Add(EdgeDto edge, NodeModel start, NodeModel end)
{
if (dicEdges.ContainsKey(edge.Id)) return;
var model = new EdgeModel(edge, start, end);
dicEdges.Add(model.Id, model);
model.SelectedChanged += EdgeSelectedChange;
Changed?.Invoke();
}
public void ReplaceAll(IEnumerable<EdgeModel> edges)
{
foreach (var edge in dicEdges.Values)
{
if (ActivedEdges.Any(e => e.Id == edge.Id))
{
edge.SelectedChanged -= EdgeSelectedChange;
edge.UnActive();
ActivedEdges.Remove(edge);
}
edge.Dispose();
}
dicEdges.Clear();
foreach (var edge in edges)
{
dicEdges.Add(edge.Id, edge);
edge.SelectedChanged += EdgeSelectedChange;
}
Changed?.Invoke();
}
public void Remove(EdgeModel edge)
{
if (!dicEdges.ContainsKey(edge.Id)) return;
edge.SelectedChanged -= EdgeSelectedChange;
if (ActivedEdges.Any(e => e.Id == edge.Id))
{
ActivedEdges.Remove(edge);
}
edge.Dispose();
dicEdges.Remove(edge.Id);
Changed?.Invoke();
}
private void EdgeSelectedChange(EdgeModel edge)
{
EdgeSelectedChanged?.Invoke(edge);
}
public void UnActivedEdge(EdgeModel? exceptedModel = null)
{
foreach (var edge in ActivedEdges)
{
if (exceptedModel is not null && edge.Id == exceptedModel.Id) continue;
var edgeInDic = dicEdges.Values.FirstOrDefault(e => e.Id.Equals(edge.Id));
edgeInDic?.UnActive();
}
ActivedEdges.Clear();
if (exceptedModel is not null) ActivedEdges.Add(exceptedModel);
}
public void ActivedEdge(IEnumerable<EdgeModel> edges)
{
UnActivedEdge();
foreach (var edge in edges)
{
var edgeInDic = dicEdges[edge.Id];
edgeInDic?.Active();
ActivedEdges.Add(edge);
}
}
public void SetStartMovePosition(double x, double y)
{
StartMovePosition.X = x;
StartMovePosition.Y = y;
}
public void UpdateMoveEdge(double x, double y)
{
double deltaX = x - StartMovePosition.X;
double deltaY = y - StartMovePosition.Y;
List<Guid> NodeUpdated = [];
foreach (var edge in ActivedEdges)
{
if (!NodeUpdated.Any(n => n == edge.StartNode.Id)) edge.StartNode.UpdatePosition(edge.StartNode.X + deltaX, edge.StartNode.Y + deltaY);
if (!NodeUpdated.Any(n => n == edge.EndNode.Id)) edge.EndNode.UpdatePosition(edge.EndNode.X + deltaX, edge.EndNode.Y + deltaY);
if (edge.TrajectoryDegree == TrajectoryDegree.Two) edge.UpdateControlPoint1(edge.ControlPoint1X + deltaX, edge.ControlPoint1Y + deltaY);
if (edge.TrajectoryDegree == TrajectoryDegree.Three)
{
edge.UpdateControlPoint1(edge.ControlPoint1X + deltaX, edge.ControlPoint1Y + deltaY);
edge.UpdateControlPoint2(edge.ControlPoint2X + deltaX, edge.ControlPoint2Y + deltaY);
}
NodeUpdated.Add(edge.StartNode.Id);
NodeUpdated.Add(edge.EndNode.Id);
}
StartMovePosition.X = x;
StartMovePosition.Y = y;
}
}