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);
+ }
}
}