diff --git a/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj b/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj index 6763354..0d6119f 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj +++ b/OSCADSharp/OSCADSharp.UnitTests/OSCADSharp.UnitTests.csproj @@ -72,6 +72,7 @@ + diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/MirrorTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/MirrorTests.cs index ab16829..d5c7213 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/Transforms/MirrorTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/MirrorTests.cs @@ -59,5 +59,15 @@ namespace OSCADSharp.UnitTests var pos = cube.Mirror(1, 1, 0).Bounds(); } + + [TestMethod] + public void Mirror_CanBindNormal() + { + var cube = new Cube(5, 20, 15).Mirror(1, 0, 0); + cube.Bind("normal", new Scripting.Variable("myVar", new Vector3(1, 0, 0))); + + string script = cube.ToString(); + Assert.IsTrue(script.Contains("mirror(myVar)")); + } } } diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/ResizeTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/ResizeTests.cs index f6edd06..e1daa2e 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/Transforms/ResizeTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/ResizeTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OSCADSharp.Scripting; using OSCADSharp.Solids; using System; using System.Collections.Generic; @@ -29,5 +30,19 @@ namespace OSCADSharp.UnitTests.Transforms Assert.AreEqual(new Vector3(5, 5, 5), bounds.TopRight); Assert.AreEqual(new Vector3(0, 0, 0), bounds.BottomLeft); } + + [TestMethod] + public void Resize_SizeBindingwithVectorAppearsInOutput() + { + var resizedCube = new Cube().Resize(5, 5, 10); + + var sizeVar = new Variable("mySize", new Vector3(20, 30, 20)); + + resizedCube.Bind("size", sizeVar); + + string script = resizedCube.ToString(); + + Assert.IsTrue(script.Contains("resize(mySize)")); + } } } diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs new file mode 100644 index 0000000..b69c215 --- /dev/null +++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs @@ -0,0 +1,27 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OSCADSharp.Scripting; +using OSCADSharp.Solids; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp.UnitTests.Transforms +{ + [TestClass] + public class RotateTests + { + [TestMethod] + public void Rotate_CanBindAngle() + { + var cyl = new Cylinder().Rotate(0, 90, 0); + var rotVar = new Variable("myRot", new Vector3(120, 90, 30)); + + cyl.Bind("angle", rotVar); + + string script = cyl.ToString(); + Assert.IsTrue(script.Contains("rotate(myRot)")); + } + } +} diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs index 537ef09..6bc29d0 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OSCADSharp.Scripting; using OSCADSharp.Solids; using System; using System.Collections.Generic; @@ -34,5 +35,17 @@ namespace OSCADSharp.UnitTests.Transforms Assert.AreEqual(bounds.Y_Min, 0); Assert.AreEqual(bounds.Z_Min, 0); } + + [TestMethod] + public void Scale_CanBindScaleValue() + { + var cube = new Cube().Scale(2, 2, 2); + var scaleVar = new Variable("scaleVar", new Vector3(5, 1, 2)); + + cube.Bind("scale", scaleVar); + + string script = cube.ToString(); + Assert.IsTrue(script.Contains("v = scaleVar")); + } } } diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/TranslateTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/TranslateTests.cs index b915f53..bc239ab 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/Transforms/TranslateTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/TranslateTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OSCADSharp.Scripting; using OSCADSharp.Solids; using System; using System.Collections.Generic; @@ -22,5 +23,17 @@ namespace OSCADSharp.UnitTests.Transforms Assert.AreEqual(boundsAfter.TopRight, boundsBefore.TopRight + new Vector3(5, 2, 3)); Assert.AreEqual(boundsAfter.BottomLeft, boundsBefore.BottomLeft + new Vector3(5, 2, 3)); } + + [TestMethod] + public void Translate_CanBindVector() + { + var cube = new Cube().Translate(10, 0, 0); + var vec = new Variable("vec", new Vector3(0, 20, 30)); + + cube.Bind("vector", vec); + + string script = cube.ToString(); + Assert.IsTrue(script.Contains("v = vec")); + } } } diff --git a/OSCADSharp/OSCADSharp/Spatial/Vector3.cs b/OSCADSharp/OSCADSharp/Spatial/Vector3.cs index 054dee8..3c4d3bf 100644 --- a/OSCADSharp/OSCADSharp/Spatial/Vector3.cs +++ b/OSCADSharp/OSCADSharp/Spatial/Vector3.cs @@ -142,9 +142,9 @@ namespace OSCADSharp /// public static bool operator ==(Vector3 left, Vector3 right) { - return left.X == right.X && - left.Y == right.Y && - left.Z == right.Z; + return left?.X == right?.X && + left?.Y == right?.Y && + left?.Z == right?.Z; } /// @@ -155,9 +155,7 @@ namespace OSCADSharp /// public static bool operator !=(Vector3 left, Vector3 right) { - return !(left.X == right.X && - left.Y == right.Y && - left.Z == right.Z); + return !(left == right); } /// diff --git a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs index 5242a5f..4f96f36 100644 --- a/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/MirroredObject.cs @@ -1,4 +1,5 @@ -using OSCADSharp.Scripting; +using OSCADSharp.Bindings; +using OSCADSharp.Scripting; using OSCADSharp.Spatial; using System; using System.Collections.Generic; @@ -17,7 +18,7 @@ namespace OSCADSharp.Transforms /// The normal vector of a plane intersecting the origin of the object, /// through which to mirror it. /// - internal Vector3 Normal { get; set; } = new Vector3(); + internal Vector3 Normal { get; set; } = new BindableVector(); /// /// Creates an object that's mirrored on a plane @@ -26,12 +27,14 @@ namespace OSCADSharp.Transforms /// The normal vector of the plane on the object's origin to mirror upon internal MirroredObject(OSCADObject obj, Vector3 normal) : base(obj) { - this.Normal = normal; + this.Normal = new BindableVector(normal); } public override string ToString() { - string mirrorCommand = String.Format("mirror([{0}, {1}, {2}])", this.Normal.X, this.Normal.Y, this.Normal.Z); + string normal = this.bindings.Contains("normal") ? this.bindings.Get("normal").BoundVariable.Name : this.Normal.ToString(); + + string mirrorCommand = String.Format("mirror({0})", normal); var formatter = new SingleBlockFormatter(mirrorCommand, this.obj.ToString()); return formatter.ToString(); } @@ -89,9 +92,12 @@ namespace OSCADSharp.Transforms return new Bounds(newBottomLeft, newTopRight); } + private Bindings.Bindings bindings = new Bindings.Bindings(new Dictionary() { + {"normal", "normal"} + }); public override void Bind(string property, Variable variable) { - throw new NotImplementedException(); + this.bindings.Add(this, property, variable); } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs index 8e9ffac..9cbb561 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ResizedObject.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using OSCADSharp.Spatial; +using OSCADSharp.Bindings; namespace OSCADSharp.Transforms { @@ -25,13 +26,14 @@ namespace OSCADSharp.Transforms /// The size to resize to, in terms of x/y/z dimensions internal ResizedObject(OSCADObject obj, Vector3 size) : base(obj) { - this.Size = size; + Size = new BindableVector(size); } public override string ToString() { - string resizeCommand = String.Format("resize([{0}, {1}, {2}])", this.Size.X.ToString(), - this.Size.Y.ToString(), this.Size.Z.ToString()); + string size = this.bindings.Contains("size") ? this.bindings.Get("size").BoundVariable.Name : this.Size.ToString(); + + string resizeCommand = String.Format("resize({0})", size); var formatter = new SingleBlockFormatter(resizeCommand, this.obj.ToString()); return formatter.ToString(); } @@ -62,9 +64,22 @@ namespace OSCADSharp.Transforms return new Bounds(oldBounds.BottomLeft * scaleMultiplier, oldBounds.TopRight * scaleMultiplier); } + + private Bindings.Bindings bindings = new Bindings.Bindings(new Dictionary() { + { "size", "size" } + }); public override void Bind(string property, Variable variable) { - throw new NotImplementedException(); + var bindableVec = this.Size as BindableVector; + + if(bindableVec != null && property == "x" || property == "y" || property == "z") + { + bindableVec.Bind(property, variable); + } + else + { + this.bindings.Add(this, property, variable); + } } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs index e08032c..8f7ac25 100644 --- a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs @@ -1,4 +1,5 @@ -using OSCADSharp.Scripting; +using OSCADSharp.Bindings; +using OSCADSharp.Scripting; using OSCADSharp.Spatial; using System; using System.Collections.Generic; @@ -16,7 +17,7 @@ namespace OSCADSharp.Transforms /// /// The angle to rotate, in terms of X/Y/Z euler angles /// - internal Vector3 Angle { get; set; } = new Vector3(); + internal Vector3 Angle { get; set; } = new BindableVector(); /// /// Creates an object with rotation applied @@ -25,13 +26,14 @@ namespace OSCADSharp.Transforms /// The angle to rotate internal RotatedObject(OSCADObject obj, Vector3 angle) : base(obj) { - this.Angle = angle; + this.Angle = new BindableVector(angle); } public override string ToString() { - string rotateCommand = String.Format("rotate([{0}, {1}, {2}])", - this.Angle.X.ToString(), this.Angle.Y.ToString(), this.Angle.Z.ToString()); + string angle = this.bindings.Contains("angle") ? this.bindings.Get("angle").BoundVariable.Name : this.Angle.ToString(); + + string rotateCommand = String.Format("rotate({0})", angle.ToString()); var formatter = new SingleBlockFormatter(rotateCommand, this.obj.ToString()); return formatter.ToString(); } @@ -56,9 +58,21 @@ namespace OSCADSharp.Transforms Matrix.GetRotatedPoint(oldBounds.TopRight, this.Angle.X, this.Angle.Y, this.Angle.Z)); } + private Bindings.Bindings bindings = new Bindings.Bindings(new Dictionary() { + { "angle", "angle" } + }); public override void Bind(string property, Variable variable) { - throw new NotImplementedException(); + var bindableVec = this.Angle as BindableVector; + + if (bindableVec != null && property == "x" || property == "y" || property == "z") + { + bindableVec.Bind(property, variable); + } + else + { + this.bindings.Add(this, property, variable); + } } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs index 0fbd263..cf21051 100644 --- a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using OSCADSharp.Spatial; +using OSCADSharp.Bindings; namespace OSCADSharp.Transforms { @@ -16,7 +17,7 @@ namespace OSCADSharp.Transforms /// /// The scale factor to be applied /// - internal Vector3 ScaleFactor { get; set; } = new Vector3(1, 1, 1); + internal Vector3 ScaleFactor { get; set; } = new BindableVector(1, 1, 1); /// /// Creates a scaled object @@ -25,13 +26,14 @@ namespace OSCADSharp.Transforms /// Scale factor in x/y/z components internal ScaledObject(OSCADObject obj, Vector3 scale) : base(obj) { - this.ScaleFactor = scale; + this.ScaleFactor = new BindableVector(scale); } public override string ToString() { - string scaleCommand = String.Format("scale(v = [{0}, {1}, {2}])", - this.ScaleFactor.X.ToString(), this.ScaleFactor.Y.ToString(), this.ScaleFactor.Z.ToString()); + string scale = this.bindings.Contains("scalefactor") ? this.bindings.Get("scalefactor").BoundVariable.Name : this.ScaleFactor.ToString(); + + string scaleCommand = String.Format("scale(v = {0})", scale); var formatter = new SingleBlockFormatter(scaleCommand, this.obj.ToString()); return formatter.ToString(); } @@ -55,9 +57,22 @@ namespace OSCADSharp.Transforms return new Bounds(oldBounds.BottomLeft * this.ScaleFactor, oldBounds.TopRight * this.ScaleFactor); } + private Bindings.Bindings bindings = new Bindings.Bindings(new Dictionary() { + { "scalefactor", "scalefactor" } + }); public override void Bind(string property, Variable variable) { - throw new NotImplementedException(); + var bindableVec = this.ScaleFactor as BindableVector; + property = property == "scale" ? "scalefactor" : property; + + if (bindableVec != null && property == "x" || property == "y" || property == "z") + { + bindableVec.Bind(property, variable); + } + else + { + this.bindings.Add(this, property, variable); + } } } } diff --git a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs index a9ee28c..7092059 100644 --- a/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs +++ b/OSCADSharp/OSCADSharp/Transforms/TranslatedObject.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using OSCADSharp.Spatial; +using OSCADSharp.Bindings; namespace OSCADSharp.Transforms { @@ -22,13 +23,14 @@ namespace OSCADSharp.Transforms /// Amount to translate by internal TranslatedObject(OSCADObject obj, Vector3 vector) : base(obj) { - this.Vector = vector; + this.Vector = new BindableVector(vector); } public override string ToString() { - string translateCommmand = String.Format("translate(v = [{0}, {1}, {2}])", - this.Vector.X.ToString(), this.Vector.Y.ToString(), this.Vector.Z.ToString()); + string translation = this.bindings.Contains("vector") ? this.bindings.Get("vector").BoundVariable.Name : this.Vector.ToString(); + + string translateCommmand = String.Format("translate(v = {0})", translation); var formatter = new SingleBlockFormatter(translateCommmand, this.obj.ToString()); return formatter.ToString(); } @@ -52,9 +54,21 @@ namespace OSCADSharp.Transforms return new Bounds(oldBounds.BottomLeft + this.Vector, oldBounds.TopRight + this.Vector); } + private Bindings.Bindings bindings = new Bindings.Bindings(new Dictionary() { + { "vector", "vector" } + }); public override void Bind(string property, Variable variable) { - throw new NotImplementedException(); + var bindableVec = this.Vector as BindableVector; + + if (bindableVec != null && property == "x" || property == "y" || property == "z") + { + bindableVec.Bind(property, variable); + } + else + { + this.bindings.Add(this, property, variable); + } } } }