mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-13 14:41:59 -04:00
Repo-wide sweep with the pinned CSharpier 1.3.0 tool. Whitespace and line-wrapping only; OpenNest.Engine.Tests (109) and OpenNest.IO.Tests pass after reformat, full solution builds 0 errors. Added .csharpierignore so csproj/config XML keeps its existing layout (CSharpier's XML wrapping churns attributes with zero benefit). Formatting is now enforceable: dotnet csharpier check . passes.
84 lines
2.4 KiB
C#
84 lines
2.4 KiB
C#
using System.Collections.Generic;
|
|
using OpenNest.CNC;
|
|
using OpenNest.Geometry;
|
|
|
|
namespace OpenNest.Controls
|
|
{
|
|
internal class CutOffHandler
|
|
{
|
|
private readonly PlateView view;
|
|
private Dictionary<Part, Geometry.Entity> dragPerimeterCache;
|
|
|
|
public CutOffHandler(PlateView view)
|
|
{
|
|
this.view = view;
|
|
}
|
|
|
|
public bool IsDragging { get; private set; }
|
|
|
|
public CutOff TryStartDrag(Vector point, double tolerance)
|
|
{
|
|
var hitCutOff = GetCutOffAtPoint(point, tolerance);
|
|
if (hitCutOff == null)
|
|
return null;
|
|
|
|
IsDragging = true;
|
|
dragPerimeterCache = Plate.BuildPerimeterCache(view.Plate);
|
|
return hitCutOff;
|
|
}
|
|
|
|
public void UpdateDrag(Vector currentPoint, CutOff cutOff)
|
|
{
|
|
if (!IsDragging || cutOff == null)
|
|
return;
|
|
|
|
if (cutOff.Axis == CutOffAxis.Vertical)
|
|
cutOff.Position = new Vector(currentPoint.X, cutOff.Position.Y);
|
|
else
|
|
cutOff.Position = new Vector(cutOff.Position.X, currentPoint.Y);
|
|
|
|
cutOff.Regenerate(view.Plate, view.CutOffSettings, dragPerimeterCache);
|
|
view.Invalidate();
|
|
}
|
|
|
|
public void EndDrag()
|
|
{
|
|
if (!IsDragging)
|
|
return;
|
|
|
|
IsDragging = false;
|
|
dragPerimeterCache = null;
|
|
view.Plate.RegenerateCutOffs(view.CutOffSettings);
|
|
view.Invalidate();
|
|
}
|
|
|
|
public CutOff GetCutOffAtPoint(Vector point, double tolerance)
|
|
{
|
|
if (view.Plate?.CutOffs == null)
|
|
return null;
|
|
|
|
foreach (var cutoff in view.Plate.CutOffs)
|
|
{
|
|
var program = cutoff.Drawing?.Program;
|
|
if (program == null)
|
|
continue;
|
|
|
|
for (var i = 0; i < program.Codes.Count - 1; i += 2)
|
|
{
|
|
if (
|
|
program.Codes[i] is RapidMove rapid
|
|
&& program.Codes[i + 1] is LinearMove linear
|
|
)
|
|
{
|
|
var line = new Line(rapid.EndPoint, linear.EndPoint);
|
|
if (line.ClosestPointTo(point).DistanceTo(point) <= tolerance)
|
|
return cutoff;
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|