diff --git a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs
index c9450d3..fb2ed23 100644
--- a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs
+++ b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs
@@ -2,6 +2,7 @@
using OSCADSharp.Transforms;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -14,7 +15,7 @@ namespace OSCADSharp.ConsoleTests
{
OSCADObject cube = new Cube()
{
- Size = new Vector3(5, 5, 5),
+ Size = new Vector3(15, 15, 15),
Center = false
};
@@ -27,13 +28,17 @@ namespace OSCADSharp.ConsoleTests
OSCADObject cylinder = new Cylinder()
{
- Diameter = 25.4,
+ Diameter = 35.4,
Height = 50.8
}.Translate(10, 5, 2);
- var combined = cube.Intersection(cylinder);
+ var combined = cube.Intersection(cylinder).Color("Blue");
+ combined = cube.Clone().Mirror(0, 0, 1).Union(combined);
- Console.WriteLine(combined.ToString());
+ string script = combined.ToString();
+ File.WriteAllLines("test.scad", new string[] { script });
+
+ Console.WriteLine(script);
Console.ReadKey();
}
}
diff --git a/OSCADSharp/OSCADSharp/Booleans/Difference.cs b/OSCADSharp/OSCADSharp/Booleans/Difference.cs
index 8b36550..0e662b9 100644
--- a/OSCADSharp/OSCADSharp/Booleans/Difference.cs
+++ b/OSCADSharp/OSCADSharp/Booleans/Difference.cs
@@ -18,6 +18,6 @@ namespace OSCADSharp.Booleans
///
public Difference(IEnumerable children) : base("difference()", children)
{
- }
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/OSCADObject.cs b/OSCADSharp/OSCADSharp/OSCADObject.cs
index 7498ee3..ec8e0f7 100644
--- a/OSCADSharp/OSCADSharp/OSCADObject.cs
+++ b/OSCADSharp/OSCADSharp/OSCADObject.cs
@@ -182,5 +182,14 @@ namespace OSCADSharp
return factory(children);
}
#endregion
+
+ ///
+ /// Creates a copy of this object and all of its children
+ ///
+ /// This is not a deep copy in the sense that all OSCADObjects will be new instances,
+ /// but any complex objects used as parameters (Such as Vector3s) will be referenced by the copies
+ ///
+ /// Clone of this object
+ public abstract OSCADObject Clone();
}
}
diff --git a/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs b/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs
index 30a0c10..8ae220f 100644
--- a/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs
+++ b/OSCADSharp/OSCADSharp/Scripting/BlockStatementObject.cs
@@ -27,11 +27,22 @@ namespace OSCADSharp.Scripting
StringBuilder sb = new StringBuilder();
foreach (var child in this.children)
{
- sb.AppendLine(child.ToString());
+ sb.Append(child.ToString());
}
var formatter = new BlockFormatter(this.outerStatement, sb.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ List childClones = new List();
+ foreach (var child in this.children)
+ {
+ childClones.Add(child.Clone());
+ }
+
+ return new BlockStatementObject(this.outerStatement, childClones);
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Solids/Cube.cs b/OSCADSharp/OSCADSharp/Solids/Cube.cs
index 6c00987..9031b9a 100644
--- a/OSCADSharp/OSCADSharp/Solids/Cube.cs
+++ b/OSCADSharp/OSCADSharp/Solids/Cube.cs
@@ -30,5 +30,14 @@ namespace OSCADSharp.Solids
return String.Format("cube(size = [{0}, {1}, {2}], center = {3});",
this.Size.X.ToString(), this.Size.Y.ToString(), this.Size.Z.ToString(), this.Center.ToString().ToLower()); ;
}
+
+ public override OSCADObject Clone()
+ {
+ return new Cube()
+ {
+ Size = this.Size,
+ Center = this.Center
+ };
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Solids/Cylinder.cs b/OSCADSharp/OSCADSharp/Solids/Cylinder.cs
index 7cfe512..fd53370 100644
--- a/OSCADSharp/OSCADSharp/Solids/Cylinder.cs
+++ b/OSCADSharp/OSCADSharp/Solids/Cylinder.cs
@@ -101,5 +101,19 @@ namespace OSCADSharp.Solids
Resolution.ToString(), MinimumAngle.ToString(), MinimumCircumferentialLength.ToString(),
Height.ToString(), Radius1.ToString(), Radius2.ToString(), Center.ToString().ToLower());
}
+
+ public override OSCADObject Clone()
+ {
+ return new Cylinder()
+ {
+ Height = this.Height,
+ Radius1 = this.Radius1,
+ Radius2 = this.Radius2,
+ Resolution = this.Resolution,
+ MinimumAngle = this.MinimumAngle,
+ MinimumCircumferentialLength = this.MinimumCircumferentialLength,
+ Center = this.Center
+ };
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Solids/Sphere.cs b/OSCADSharp/OSCADSharp/Solids/Sphere.cs
index bc07254..20575ee 100644
--- a/OSCADSharp/OSCADSharp/Solids/Sphere.cs
+++ b/OSCADSharp/OSCADSharp/Solids/Sphere.cs
@@ -50,5 +50,16 @@ namespace OSCADSharp.Solids
this.Resolution.ToString(), this.MinimumAngle.ToString(),
this.MinimumFragmentSize.ToString(), this.Radius.ToString());
}
+
+ public override OSCADObject Clone()
+ {
+ return new Sphere()
+ {
+ Resolution = this.Resolution,
+ MinimumAngle = this.MinimumAngle,
+ MinimumFragmentSize = this.MinimumFragmentSize,
+ Radius = this.Radius
+ };
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs b/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs
index ca0fb3a..b097b33 100644
--- a/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs
@@ -38,5 +38,10 @@ namespace OSCADSharp.Transforms
var formatter = new BlockFormatter(colorCommand, this.obj.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ return new ColoredObject(this.obj, this.ColorName, this.Opacity);
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs
index d6969db..587506f 100644
--- a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs
@@ -37,5 +37,10 @@ namespace OSCADSharp.Transforms
var formatter = new BlockFormatter(mirrorCommand, this.obj.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ return new MirroredObject(this.obj, this.Normal);
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs
index aa08a8c..73db2b4 100644
--- a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs
@@ -36,5 +36,10 @@ namespace OSCADSharp.Transforms
var formatter = new BlockFormatter(resizeCommand, this.obj.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ return new ResizedObject(this.obj, this.Size);
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs
index ccc5aad..c87b849 100644
--- a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs
@@ -36,5 +36,10 @@ namespace OSCADSharp.Transforms
var formatter = new BlockFormatter(rotateCommand, this.obj.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ return new RotatedObject(this.obj, this.Angle);
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs
index e55eae4..43b941a 100644
--- a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs
@@ -36,5 +36,10 @@ namespace OSCADSharp.Transforms
var formatter = new BlockFormatter(scaleCommand, this.obj.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ return new ScaledObject(this.obj, this.ScaleFactor);
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs
index 1004ef1..b3fb4f1 100644
--- a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs
@@ -33,5 +33,10 @@ namespace OSCADSharp.Transforms
var formatter = new BlockFormatter(translateCommmand, this.obj.ToString());
return formatter.ToString();
}
+
+ public override OSCADObject Clone()
+ {
+ return new TranslatedObject(this.obj, this.Vector);
+ }
}
}