diff --git a/OpenNest.Core/Geometry/Arc.cs b/OpenNest.Core/Geometry/Arc.cs
index 0ed1272..d51a4c9 100644
--- a/OpenNest.Core/Geometry/Arc.cs
+++ b/OpenNest.Core/Geometry/Arc.cs
@@ -267,6 +267,13 @@ namespace OpenNest.Geometry
get { return Diameter * System.Math.PI * SweepAngle() / Angle.TwoPI; }
}
+ public override Entity Clone()
+ {
+ var copy = new Arc(center, radius, startAngle, endAngle, reversed);
+ CopyBaseTo(copy);
+ return copy;
+ }
+
///
/// Reverses the rotation direction.
///
diff --git a/OpenNest.Core/Geometry/Circle.cs b/OpenNest.Core/Geometry/Circle.cs
index 05a03de..ac25197 100644
--- a/OpenNest.Core/Geometry/Circle.cs
+++ b/OpenNest.Core/Geometry/Circle.cs
@@ -165,6 +165,13 @@ namespace OpenNest.Geometry
get { return Circumference(); }
}
+ public override Entity Clone()
+ {
+ var copy = new Circle(center, radius) { Rotation = Rotation };
+ CopyBaseTo(copy);
+ return copy;
+ }
+
///
/// Reverses the rotation direction.
///
diff --git a/OpenNest.Core/Geometry/Entity.cs b/OpenNest.Core/Geometry/Entity.cs
index bd2e7fe..723ddc6 100644
--- a/OpenNest.Core/Geometry/Entity.cs
+++ b/OpenNest.Core/Geometry/Entity.cs
@@ -251,6 +251,23 @@ namespace OpenNest.Geometry
///
public abstract bool Intersects(Shape shape, out List pts);
+ ///
+ /// Creates a deep copy of the entity with a new Id.
+ ///
+ public abstract Entity Clone();
+
+ ///
+ /// Copies common Entity properties from this instance to the target.
+ ///
+ protected void CopyBaseTo(Entity target)
+ {
+ target.Color = Color;
+ target.Layer = Layer;
+ target.LineTypeName = LineTypeName;
+ target.IsVisible = IsVisible;
+ target.Tag = Tag;
+ }
+
///
/// Type of entity.
///
@@ -259,6 +276,14 @@ namespace OpenNest.Geometry
public static class EntityExtensions
{
+ public static List CloneAll(this IEnumerable entities)
+ {
+ var result = new List();
+ foreach (var e in entities)
+ result.Add(e.Clone());
+ return result;
+ }
+
public static List CollectPoints(this IEnumerable entities)
{
var points = new List();
diff --git a/OpenNest.Core/Geometry/Line.cs b/OpenNest.Core/Geometry/Line.cs
index e0317d8..9b4474b 100644
--- a/OpenNest.Core/Geometry/Line.cs
+++ b/OpenNest.Core/Geometry/Line.cs
@@ -257,6 +257,13 @@ namespace OpenNest.Geometry
}
}
+ public override Entity Clone()
+ {
+ var copy = new Line(pt1, pt2);
+ CopyBaseTo(copy);
+ return copy;
+ }
+
///
/// Reversed the line.
///
diff --git a/OpenNest.Core/Geometry/Polygon.cs b/OpenNest.Core/Geometry/Polygon.cs
index 22e2131..9ae1cab 100644
--- a/OpenNest.Core/Geometry/Polygon.cs
+++ b/OpenNest.Core/Geometry/Polygon.cs
@@ -168,6 +168,13 @@ namespace OpenNest.Geometry
get { return Perimeter(); }
}
+ public override Entity Clone()
+ {
+ var copy = new Polygon { Vertices = new List(Vertices) };
+ CopyBaseTo(copy);
+ return copy;
+ }
+
///
/// Reverses the rotation direction of the polygon.
///
diff --git a/OpenNest.Core/Geometry/Shape.cs b/OpenNest.Core/Geometry/Shape.cs
index 6e35f1c..6cd9358 100644
--- a/OpenNest.Core/Geometry/Shape.cs
+++ b/OpenNest.Core/Geometry/Shape.cs
@@ -349,6 +349,15 @@ namespace OpenNest.Geometry
return polygon;
}
+ public override Entity Clone()
+ {
+ var copy = new Shape();
+ foreach (var e in Entities)
+ copy.Entities.Add(e.Clone());
+ CopyBaseTo(copy);
+ return copy;
+ }
+
///
/// Reverses the rotation direction of the shape.
///
diff --git a/OpenNest.Core/Geometry/ShapeProfile.cs b/OpenNest.Core/Geometry/ShapeProfile.cs
index 23928e6..e73632d 100644
--- a/OpenNest.Core/Geometry/ShapeProfile.cs
+++ b/OpenNest.Core/Geometry/ShapeProfile.cs
@@ -75,7 +75,8 @@ namespace OpenNest.Geometry
///
public static List NormalizeEntities(IEnumerable entities)
{
- var profile = new ShapeProfile(entities.ToList());
+ var cloned = entities.CloneAll();
+ var profile = new ShapeProfile(cloned);
return profile.ToNormalizedEntities();
}
diff --git a/OpenNest.Core/PartGeometry.cs b/OpenNest.Core/PartGeometry.cs
index c30f6e0..573d641 100644
--- a/OpenNest.Core/PartGeometry.cs
+++ b/OpenNest.Core/PartGeometry.cs
@@ -126,20 +126,10 @@ namespace OpenNest
{
var result = new List(source.Count);
- for (var i = 0; i < source.Count; i++)
+ foreach (var entity in source)
{
- var entity = source[i];
- Entity copy;
-
- if (entity is Line line)
- copy = new Line(line.StartPoint + location, line.EndPoint + location);
- else if (entity is Arc arc)
- copy = new Arc(arc.Center + location, arc.Radius, arc.StartAngle, arc.EndAngle, arc.IsReversed);
- else if (entity is Circle circle)
- copy = new Circle(circle.Center + location, circle.Radius);
- else
- continue;
-
+ var copy = entity.Clone();
+ copy.Offset(location);
result.Add(copy);
}
diff --git a/OpenNest/Controls/ProgramEditorControl.cs b/OpenNest/Controls/ProgramEditorControl.cs
index 0941463..0b026aa 100644
--- a/OpenNest/Controls/ProgramEditorControl.cs
+++ b/OpenNest/Controls/ProgramEditorControl.cs
@@ -209,15 +209,8 @@ namespace OpenNest.Controls
private static Entity CloneEntity(Entity entity, Color color)
{
- Entity clone = entity switch
- {
- Line line => new Line(line.StartPoint, line.EndPoint) { Layer = line.Layer, IsVisible = line.IsVisible },
- Arc arc => new Arc(arc.Center, arc.Radius, arc.StartAngle, arc.EndAngle, arc.IsReversed) { Layer = arc.Layer, IsVisible = arc.IsVisible },
- Circle circle => new Circle(circle.Center, circle.Radius) { Layer = circle.Layer, IsVisible = circle.IsVisible },
- _ => null,
- };
- if (clone != null)
- clone.Color = color;
+ var clone = entity.Clone();
+ clone.Color = color;
return clone;
}