@implements IDisposable @inject IJSRuntime JSRuntime @inject IHttpClientFactory HttpFactory @Model?.RobotName @code { [Parameter, EditorRequired] public RobotVisualizationModel Model { get; set; } = null!; [Parameter] public bool ShowName { get; set; } private ElementReference ElementRef; private ElementReference RobotRef; private ElementReference textRef; private RobotModelDto RobotModel = new(); private bool isCarrying = false; private ElementModelDto ElementModel = new(); protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; using var Http = HttpFactory.CreateClient("RobotManagerAPI"); var model = await Http.GetFromJsonAsync>($"api/Robots/Model/{Model.RobotId}"); if (model is not null && model.Data is not null) { await JSRuntime.InvokeVoidAsync("SetImageAttribute", RobotRef, model.Data.Length, model.Data.Width, model.Data.OriginX, model.Data.OriginY, $"{Http.BaseAddress}api/RobotModels/image/{model.Data.Id}"); RobotModel = model.Data; } if (Model is not null) { Model.PositionChanged += Model_PositionChanged; Model.LoadsChanged += Model_LoadChanged; await UpdatePosition(Model.X, Model.Y, Model.Theta); if(Model.Loads.Length > 0 && Guid.TryParse(Model.Loads[0].LoadId, out Guid loadId)) { await Model_LoadChanged(loadId); await UpdateLoadPosition(Model.X, Model.Y, Model.Theta); } } } public override async Task SetParametersAsync(ParameterView parameters) { bool updateRobot = false; if (parameters.TryGetValue(nameof(Model), out RobotVisualizationModel? model) && ((Model?.RobotId ?? string.Empty) != (model?.RobotId ?? string.Empty))) { if (Model != null) { Model.PositionChanged -= Model_PositionChanged; Model.LoadsChanged -= Model_LoadChanged; } if (model != null) { updateRobot = true; model.PositionChanged += Model_PositionChanged; model.LoadsChanged += Model_LoadChanged; } } await base.SetParametersAsync(parameters); if (updateRobot && model != null) { await UpdatePosition(model.X, model.Y, model.Theta); if (model.Loads.Length > 0) await UpdateLoadPosition(model.X, model.Y, model.Theta); } } private async Task Model_PositionChanged() { await UpdatePosition(Model.X, Model.Y, Model.Theta); await UpdateLoadPosition(Model.X, Model.Y, Model.Theta); } public async Task UpdatePosition(double x, double y, double theta) => await JSRuntime.InvokeVoidAsync("SetRobotPosition", RobotRef, textRef, x, y, theta, RobotModel.OriginX, RobotModel.OriginY); private async Task UpdateLoadPosition(double x, double y, double theta) => await JSRuntime.InvokeVoidAsync("SetRobotPosition", ElementRef, null, x, y, theta, -ElementModel.Width / 2, -ElementModel.Height / 2); private async Task Model_LoadChanged(Guid elementModelId) { if (elementModelId != Guid.Empty) { using var Http = HttpFactory.CreateClient("MapManagerAPI"); var model = await Http.GetFromJsonAsync>($"api/ElementModels/{elementModelId}"); if (model is not null && model.Data is not null) { isCarrying = true;; await JSRuntime.InvokeVoidAsync("SetImageAttribute", ElementRef, model.Data.Width, model.Data.Height, -model.Data.Width / 2, -model.Data.Height / 2, $"{Http.BaseAddress}api/images/elementModel/{model.Data.Id}?IsOpen=true"); await UpdateLoadPosition(Model.X, Model.Y, Model.Theta); ElementModel = model.Data; } } else isCarrying = false; StateHasChanged(); } public void Dispose() { if (Model != null) Model.PositionChanged -= Model_PositionChanged; GC.SuppressFinalize(this); } }