From 1449cdd2b29bf35b40865f0698d41c87bab3bef6 Mon Sep 17 00:00:00 2001 From: Mike Smith Date: Sun, 7 Feb 2016 22:04:05 -0800 Subject: [PATCH] Added Clone() method to OSCADObject and all descendants --- OSCADSharp/OSCADSharp.ConsoleTests/Program.cs | 13 +++++++++---- OSCADSharp/OSCADSharp/Booleans/Difference.cs | 2 +- OSCADSharp/OSCADSharp/OSCADObject.cs | 9 +++++++++ .../OSCADSharp/Scripting/BlockStatementObject.cs | 13 ++++++++++++- OSCADSharp/OSCADSharp/Solids/Cube.cs | 9 +++++++++ OSCADSharp/OSCADSharp/Solids/Cylinder.cs | 14 ++++++++++++++ OSCADSharp/OSCADSharp/Solids/Sphere.cs | 11 +++++++++++ OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs | 5 +++++ OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs | 5 +++++ OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs | 5 +++++ OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs | 5 +++++ OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs | 5 +++++ .../OSCADSharp/Transforms/TranslatedObject.cs | 5 +++++ 13 files changed, 95 insertions(+), 6 deletions(-) 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); + } } }