@implements IDisposable @using RobotNet.WebApp.Maps.Components.Editor.Edge @using RobotNet.WebApp.Maps.Components.Editor.Node @code { public MapEdgeModel EdgeModels { get; set; } = []; public MapNodeModel NodeModels { get; set; } = []; public bool isMoving = false; private bool isShowing = false; private (Guid Id, double X, double Y) StartPosition = new(); public void OnShow(bool isShow, List edgeModels) { isShowing = isShow; if (isShow && edgeModels.Count > 0) { isMoving = false; List nodeDtos = []; foreach (var edge in edgeModels) { if (!nodeDtos.Any(n => n.Id == edge.StartNode.Id)) nodeDtos.Add(new() { Id = edge.StartNode.Id, MapId = edge.StartNode.MapId, Name = edge.StartNode.Name, X = edge.StartNode.X, Y = edge.StartNode.Y, Theta = edge.StartNode.Theta, AllowedDeviationXy = edge.StartNode.AllowedDeviationXy, AllowedDeviationTheta = edge.StartNode.AllowedDeviationTheta, Actions = edge.StartNode.Actions, }); if (!nodeDtos.Any(n => n.Id == edge.EndNode.Id)) nodeDtos.Add(new() { Id = edge.EndNode.Id, MapId = edge.EndNode.MapId, Name = edge.EndNode.Name, X = edge.EndNode.X, Y = edge.EndNode.Y, Theta = edge.EndNode.Theta, AllowedDeviationXy = edge.EndNode.AllowedDeviationXy, AllowedDeviationTheta = edge.EndNode.AllowedDeviationTheta, Actions = edge.EndNode.Actions, }); } NodeModels.ReplaceAll(nodeDtos); List edges = edgeModels.Select(edge => new EdgeModel(new() { Id = edge.Id, MapId = edge.MapId, DirectionAllowed = edge.DirectionAllowed, TrajectoryDegree = edge.TrajectoryDegree, Actions = edge.Actions, AllowedDeviationTheta = edge.AllowedDeviationTheta, AllowedDeviationXy = edge.AllowedDeviationXy, RotationAllowed = edge.RotationAllowed, MaxHeight = edge.MaxHeight, MinHeight = edge.MinHeight, MaxRotationSpeed = edge.MaxRotationSpeed, MaxSpeed = edge.MaxRotationSpeed, ControlPoint1X = edge.ControlPoint1X, ControlPoint1Y = edge.ControlPoint1Y, ControlPoint2X = edge.ControlPoint2X, ControlPoint2Y = edge.ControlPoint2Y, }, NodeModels[edge.StartNode.Id], NodeModels[edge.EndNode.Id] )).ToList(); EdgeModels.ReplaceAll(edges); EdgeModels.ActivedEdge(edges); if (NodeModels.Count() > 0) { StartPosition.Id = NodeModels[0].Id; StartPosition.X = NodeModels[0].X; StartPosition.Y = NodeModels[0].Y; } } else { isMoving = false; NodeModels.ReplaceAll([]); EdgeModels.ReplaceAll([]); } StateHasChanged(); } public void UpdateMove(double x, double y) { if (!isShowing) return; if (NodeModels.Count() > 0) { var nodeChange = NodeModels[StartPosition.Id]; if (nodeChange is not null) { var distance = Math.Sqrt(Math.Pow(StartPosition.X - nodeChange.X, 2) + Math.Pow(StartPosition.Y - nodeChange.Y, 2)); if (distance > 0.25) isMoving = true; else isMoving = false; } EdgeModels.UpdateMoveEdge(x, y); } } public void SetStartMovePosition(double x, double y) { EdgeModels.SetStartMovePosition(x, y); } public void Dispose() { GC.SuppressFinalize(this); } }