RobotNet/RobotNet.WebApp/Robots/Components/Monitoring/Element/EdgeDirection.razor
2025-10-15 15:15:53 +07:00

70 lines
2.5 KiB
Plaintext

@implements IDisposable
@inject IJSRuntime JSRuntime
<polyline @ref="Ref" />
@code {
[Parameter, EditorRequired]
public EdgeModel Model { get; set; } = null!;
private ElementReference Ref;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender) return;
await UpdatePathData();
await UpdateMaker();
}
private async Task UpdatePathData()
{
string data = string.Empty;
double sx = 0, sy = 0, mx = 0, my = 0, ex = 0, ey = 0;
double sTime = 0.49, eTime = 0.5;
if (Model.TrajectoryDegree == TrajectoryDegree.One)
{
sx = Model.X1;
sy = Model.Y1;
ex = Model.X2;
ey = Model.Y2;
}
else if (Model.TrajectoryDegree == TrajectoryDegree.Two)
{
sx = (Model.X1 + Model.ControlPoint1X) / 2;
sy = (Model.Y1 + Model.ControlPoint1Y) / 2;
ex = (Model.X2 + Model.ControlPoint1X) / 2;
ey = (Model.Y2 + Model.ControlPoint1Y) / 2;
}
else if (Model.TrajectoryDegree == TrajectoryDegree.Three)
{
sx = Math.Pow(1 - sTime, 3) * Model.X1 + 3 * Math.Pow(1 - sTime, 2) * sTime * Model.ControlPoint1X + 3 * Math.Pow(sTime, 2) * (1 - sTime) * Model.ControlPoint2X + Math.Pow(sTime, 3) * Model.X2;
sy = Math.Pow(1 - sTime, 3) * Model.Y1 + 3 * Math.Pow(1 - sTime, 2) * sTime * Model.ControlPoint1Y + 3 * Math.Pow(sTime, 2) * (1 - sTime) * Model.ControlPoint2Y + Math.Pow(sTime, 3) * Model.Y2;
ex = Math.Pow(1 - eTime, 3) * Model.X1 + 3 * Math.Pow(1 - eTime, 2) * eTime * Model.ControlPoint1X + 3 * Math.Pow(eTime, 2) * (1 - eTime) * Model.ControlPoint2X + Math.Pow(eTime, 3) * Model.X2;
ey = Math.Pow(1 - eTime, 3) * Model.Y1 + 3 * Math.Pow(1 - eTime, 2) * eTime * Model.ControlPoint1Y + 3 * Math.Pow(eTime, 2) * (1 - eTime) * Model.ControlPoint2Y + Math.Pow(eTime, 3) * Model.Y2;
}
mx = (sx + ex) / 2;
my = (sy + ey) / 2;
await JSRuntime.InvokeVoidAsync("ElementSetAttribute", Ref, "points", $"{sx},{sy} {mx},{my} {ex},{ey}");
}
private async Task UpdateMaker()
{
if (Model == null) return;
await JSRuntime.InvokeVoidAsync("ElementSetAttribute", Ref, "marker-mid", MapSvgDefs.GetMakerMid(Model.DirectionAllowed));
}
public void Dispose()
{
GC.SuppressFinalize(this);
}
}