Compare commits
2 Commits
c3494681a8
...
59fec2f98d
| Author | SHA1 | Date | |
|---|---|---|---|
| 59fec2f98d | |||
| c3a2fe6b0a |
@@ -93,6 +93,9 @@ namespace OpenNest.Geometry
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsFullCircle() =>
|
||||||
|
SweepAngle() >= Angle.TwoPI - Tolerance.Epsilon;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Angle in radians between start and end angles.
|
/// Angle in radians between start and end angles.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -17,6 +17,38 @@ namespace OpenNest.Geometry
|
|||||||
(list, item, i) => list.GetCollinearLines(item, i),
|
(list, item, i) => list.GetCollinearLines(item, i),
|
||||||
(Line a, Line b, out Line joined) => TryJoinLines(a, b, out joined));
|
(Line a, Line b, out Line joined) => TryJoinLines(a, b, out joined));
|
||||||
|
|
||||||
|
public static void Deduplicate(IList<Circle> circles)
|
||||||
|
{
|
||||||
|
for (var i = circles.Count - 1; i >= 1; i--)
|
||||||
|
{
|
||||||
|
for (var j = i - 1; j >= 0; j--)
|
||||||
|
{
|
||||||
|
if (circles[i].Center.DistanceTo(circles[j].Center) <= Tolerance.Epsilon
|
||||||
|
&& circles[i].Radius.IsEqualTo(circles[j].Radius))
|
||||||
|
{
|
||||||
|
circles.RemoveAt(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Deduplicate(IList<Circle> circles, IList<Arc> arcs)
|
||||||
|
{
|
||||||
|
for (var i = circles.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
for (var j = arcs.Count - 1; j >= 0; j--)
|
||||||
|
{
|
||||||
|
if (arcs[j].Center.DistanceTo(circles[i].Center) <= Tolerance.Epsilon
|
||||||
|
&& arcs[j].Radius.IsEqualTo(circles[i].Radius)
|
||||||
|
&& arcs[j].IsFullCircle())
|
||||||
|
{
|
||||||
|
arcs.RemoveAt(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private delegate bool TryJoin<T>(T a, T b, out T joined);
|
private delegate bool TryJoin<T>(T a, T b, out T joined);
|
||||||
|
|
||||||
private static void MergePass<T>(IList<T> items,
|
private static void MergePass<T>(IList<T> items,
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ namespace OpenNest.IO
|
|||||||
var dxf = Dxf.Import(path);
|
var dxf = Dxf.Import(path);
|
||||||
|
|
||||||
RemoveDuplicateArcs(dxf.Entities);
|
RemoveDuplicateArcs(dxf.Entities);
|
||||||
|
RemoveZeroSweepArcs(dxf.Entities);
|
||||||
|
|
||||||
var bends = new List<Bend>();
|
var bends = new List<Bend>();
|
||||||
if (options.DetectBends && dxf.Document != null)
|
if (options.DetectBends && dxf.Document != null)
|
||||||
@@ -141,6 +142,12 @@ namespace OpenNest.IO
|
|||||||
return drawing;
|
return drawing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void RemoveZeroSweepArcs(List<Entity> entities)
|
||||||
|
{
|
||||||
|
entities.RemoveAll(e =>
|
||||||
|
e is Arc arc && arc.StartAngle.IsEqualTo(arc.EndAngle, Tolerance.ChainTolerance));
|
||||||
|
}
|
||||||
|
|
||||||
internal static void RemoveDuplicateArcs(List<Entity> entities)
|
internal static void RemoveDuplicateArcs(List<Entity> entities)
|
||||||
{
|
{
|
||||||
var circles = entities.OfType<Circle>().ToList();
|
var circles = entities.OfType<Circle>().ToList();
|
||||||
|
|||||||
+5
-1
@@ -133,6 +133,7 @@ namespace OpenNest.IO
|
|||||||
var entities = new List<Entity>();
|
var entities = new List<Entity>();
|
||||||
var lines = new List<Line>();
|
var lines = new List<Line>();
|
||||||
var arcs = new List<Arc>();
|
var arcs = new List<Arc>();
|
||||||
|
var circles = new List<Circle>();
|
||||||
|
|
||||||
foreach (var entity in doc.Entities)
|
foreach (var entity in doc.Entities)
|
||||||
{
|
{
|
||||||
@@ -150,7 +151,7 @@ namespace OpenNest.IO
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ACadSharp.Entities.Circle circle:
|
case ACadSharp.Entities.Circle circle:
|
||||||
entities.Add(circle.ToOpenNest());
|
circles.Add(circle.ToOpenNest());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACadSharp.Entities.Spline spline:
|
case ACadSharp.Entities.Spline spline:
|
||||||
@@ -181,7 +182,10 @@ namespace OpenNest.IO
|
|||||||
|
|
||||||
GeometryOptimizer.Optimize(lines);
|
GeometryOptimizer.Optimize(lines);
|
||||||
GeometryOptimizer.Optimize(arcs);
|
GeometryOptimizer.Optimize(arcs);
|
||||||
|
GeometryOptimizer.Deduplicate(circles);
|
||||||
|
GeometryOptimizer.Deduplicate(circles, arcs);
|
||||||
|
|
||||||
|
entities.AddRange(circles);
|
||||||
entities.AddRange(lines);
|
entities.AddRange(lines);
|
||||||
entities.AddRange(arcs);
|
entities.AddRange(arcs);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user