RobotNet/RobotNet.WebApp/Maps/Components/Editor/Edge/EdgeDirection.razor
2025-10-15 15:15:53 +07:00

114 lines
4.1 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();
}
public override async Task SetParametersAsync(ParameterView parameters)
{
bool updateLine = false;
if (parameters.TryGetValue(nameof(Model), out EdgeModel? model))
{
if (((Model?.Id ?? Guid.Empty) != (model?.Id ?? Guid.Empty)))
{
if (Model != null)
{
Model.StartNodePositionChanged -= UpdatePathData;
Model.EndNodePositionChanged -= UpdatePathData;
Model.ControlPoint1PositionChanged -= UpdatePathData;
Model.ControlPoint2PositionChanged -= UpdatePathData;
Model.DirectionChanged -= UpdateMaker;
}
if (model != null)
{
model.StartNodePositionChanged += UpdatePathData;
model.EndNodePositionChanged += UpdatePathData;
model.ControlPoint1PositionChanged += UpdatePathData;
model.ControlPoint2PositionChanged += UpdatePathData;
model.DirectionChanged += UpdateMaker;
updateLine = true;
}
}
}
await base.SetParametersAsync(parameters);
if (updateLine)
{
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()
{
if (Model != null)
{
Model.StartNodePositionChanged -= UpdatePathData;
Model.EndNodePositionChanged -= UpdatePathData;
Model.ControlPoint1PositionChanged -= UpdatePathData;
Model.ControlPoint2PositionChanged -= UpdatePathData;
Model.DirectionChanged -= UpdateMaker;
}
GC.SuppressFinalize(this);
}
}