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