From 17461901650b5c82c7f2f1084aa273d0f6a329bf Mon Sep 17 00:00:00 2001 From: Mike Smith Date: Sun, 14 Feb 2016 01:07:18 -0800 Subject: [PATCH] Added 'mimic' method to copy identical transforms to other objects --- OSCADSharp/OSCADSharp.ConsoleTests/Program.cs | 13 +++---- .../OSCADSharp.UnitTests/OSCADObjectTests.cs | 11 ++++++ OSCADSharp/OSCADSharp/OSCADObject.cs | 35 ++++++++++++++++++- OSCADSharp/OSCADSharp/OSCADSharp.csproj | 1 + .../OSCADSharp/Transforms/ColoredObject.cs | 7 +++- OSCADSharp/OSCADSharp/Transforms/IMimicer.cs | 13 +++++++ .../OSCADSharp/Transforms/MirroredObject.cs | 7 +++- .../OSCADSharp/Transforms/ResizedObject.cs | 7 +++- .../OSCADSharp/Transforms/RotatedObject.cs | 7 +++- .../OSCADSharp/Transforms/ScaledObject.cs | 7 +++- .../OSCADSharp/Transforms/TranslatedObject.cs | 7 +++- 11 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 OSCADSharp/OSCADSharp/Transforms/IMimicer.cs diff --git a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs index 1b48911..6a54eac 100644 --- a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs +++ b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs @@ -13,16 +13,11 @@ namespace OSCADSharp.ConsoleTests { static void Main(string[] args) { - OSCADObject cube = new Cube(new Vector3(15, 15, 15)); + var cube = new Cube(null, true).Translate(10, 0, 5).Scale(1, 1, 5); + var sphere = new Sphere().Mimic(cube).Translate(0, 0, 5); + string script = cube.Union(sphere).ToString(); - for (int i = 0; i < 1000; i++) - { - cube = cube.Translate(1, 0, 0); - } - - string script = cube.ToString(); - - //File.WriteAllLines("test.scad", new string[] { script.ToString() }); + File.WriteAllLines("test.scad", new string[] { script.ToString() }); Console.ReadKey(); } } diff --git a/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs b/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs index 1bf396b..c91f506 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/OSCADObjectTests.cs @@ -42,5 +42,16 @@ namespace OSCADSharp.UnitTests //But the child should be a different instance Assert.IsFalse(clone.Children().FirstOrDefault() == text.Children().FirstOrDefault()); } + + [TestMethod] + public void OSCADObject_MimickedObjectHasSameTransform() + { + var cube = new Cube(null, true).Translate(10, 0, 5); + var sphere = new Sphere().Mimic(cube); + + Assert.IsTrue(sphere.GetType() == cube.GetType()); + Assert.IsTrue(cube.ToString().StartsWith("translate(")); + Assert.IsTrue(sphere.ToString().StartsWith("translate(")); + } } } diff --git a/OSCADSharp/OSCADSharp/OSCADObject.cs b/OSCADSharp/OSCADSharp/OSCADObject.cs index 04f9097..853302d 100644 --- a/OSCADSharp/OSCADSharp/OSCADObject.cs +++ b/OSCADSharp/OSCADSharp/OSCADObject.cs @@ -229,6 +229,39 @@ namespace OSCADSharp return allChildren; } - + + /// + /// Copies the transforms that have been applied to another OSCADObject, and applies + /// the same transforms to this object. (Only transforms) + /// + /// + /// + public OSCADObject Mimic(OSCADObject other) + { + IEnumerable children = other.Children(); + Stack stack = new Stack(); + OSCADObject finalObject = this; + stack.Push(other); + + foreach (var child in children) + { + stack.Push(child); + } + + while(stack.Count > 0) + { + var current = stack.Pop(); + if(!(current is IMimicer)) + { + continue; + } + else + { + finalObject = ((IMimicer)current).MimicObject(finalObject); + } + } + + return finalObject; + } } } diff --git a/OSCADSharp/OSCADSharp/OSCADSharp.csproj b/OSCADSharp/OSCADSharp/OSCADSharp.csproj index 3fb9457..5becd83 100644 --- a/OSCADSharp/OSCADSharp/OSCADSharp.csproj +++ b/OSCADSharp/OSCADSharp/OSCADSharp.csproj @@ -41,6 +41,7 @@ + diff --git a/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs b/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs index 7b45b64..6603257 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ColoredObject.cs @@ -10,7 +10,7 @@ namespace OSCADSharp.Transforms /// /// An object that has color and/or opacity applied to it /// - internal class ColoredObject : OSCADObject + internal class ColoredObject : OSCADObject, IMimicer { #region Attributes internal string ColorName { get; set; } = "Yellow"; @@ -45,5 +45,10 @@ namespace OSCADSharp.Transforms { return new ColoredObject(this.obj.Clone(), this.ColorName, this.Opacity); } + + public OSCADObject MimicObject(OSCADObject obj) + { + return new ColoredObject(obj, this.ColorName, this.Opacity); + } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/IMimicer.cs b/OSCADSharp/OSCADSharp/Transforms/IMimicer.cs new file mode 100644 index 0000000..49c8da5 --- /dev/null +++ b/OSCADSharp/OSCADSharp/Transforms/IMimicer.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp.Transforms +{ + internal interface IMimicer + { + OSCADObject MimicObject(OSCADObject obj); + } +} diff --git a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs index 51b33d3..1b4b434 100644 --- a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs @@ -10,7 +10,7 @@ namespace OSCADSharp.Transforms /// /// An object that's mirrored on a plane /// - internal class MirroredObject : OSCADObject + internal class MirroredObject : OSCADObject, IMimicer { /// /// The normal vector of a plane intersecting the origin of the object, @@ -44,5 +44,10 @@ namespace OSCADSharp.Transforms { return new MirroredObject(this.obj.Clone(), this.Normal); } + + public OSCADObject MimicObject(OSCADObject obj) + { + return new MirroredObject(obj, this.Normal); + } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs index d134630..ccda6ac 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs @@ -10,7 +10,7 @@ namespace OSCADSharp.Transforms /// /// An object that's been resized to a specified set of X/Y/Z dimensions /// - internal class ResizedObject : OSCADObject + internal class ResizedObject : OSCADObject, IMimicer { /// /// Size of the object in terms of X/Y/Z @@ -43,5 +43,10 @@ namespace OSCADSharp.Transforms { return new ResizedObject(this.obj.Clone(), this.Size); } + + public OSCADObject MimicObject(OSCADObject obj) + { + return new ResizedObject(obj, this.Size); + } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs index 6ec35ae..c255c0b 100644 --- a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs @@ -10,7 +10,7 @@ namespace OSCADSharp.Transforms /// /// An object with rotation applied /// - internal class RotatedObject : OSCADObject + internal class RotatedObject : OSCADObject, IMimicer { /// /// The angle to rotate, in terms of X/Y/Z euler angles @@ -43,5 +43,10 @@ namespace OSCADSharp.Transforms { return new RotatedObject(this.obj.Clone(), this.Angle); } + + public OSCADObject MimicObject(OSCADObject obj) + { + return new RotatedObject(obj, this.Angle); + } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs index 27a7640..41c040f 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs @@ -10,7 +10,7 @@ namespace OSCADSharp.Transforms /// /// An object that's been rescaled /// - internal class ScaledObject : OSCADObject + internal class ScaledObject : OSCADObject, IMimicer { /// /// The scale factor to be applied @@ -43,5 +43,10 @@ namespace OSCADSharp.Transforms { return new ScaledObject(this.obj.Clone(), this.ScaleFactor); } + + public OSCADObject MimicObject(OSCADObject obj) + { + return new ScaledObject(obj, this.ScaleFactor); + } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs index a5bf4fa..fdde347 100644 --- a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs @@ -10,7 +10,7 @@ namespace OSCADSharp.Transforms /// /// An object or objects that have been moved along the specified vector /// - internal class TranslatedObject : OSCADObject + internal class TranslatedObject : OSCADObject, IMimicer { internal Vector3 Vector { get; set; } private OSCADObject obj; @@ -40,5 +40,10 @@ namespace OSCADSharp.Transforms { return new TranslatedObject(this.obj.Clone(), this.Vector); } + + public OSCADObject MimicObject(OSCADObject obj) + { + return new TranslatedObject(obj, this.Vector); + } } }