diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs
index b69c215..892fbe6 100644
--- a/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs
+++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/RotateTests.cs
@@ -23,5 +23,17 @@ namespace OSCADSharp.UnitTests.Transforms
string script = cyl.ToString();
Assert.IsTrue(script.Contains("rotate(myRot)"));
}
+
+ [TestMethod]
+ public void Rotate_CanBindAngleWithParameters()
+ {
+ var xAngle = new Variable("xAngle", 30);
+ var yAngle = new Variable("yAngle", -20);
+
+ var cyl = new Cylinder().Rotate(xAngle, yAngle, 120);
+
+ string script = cyl.ToString();
+ Assert.IsTrue(script.Contains("rotate([xAngle, yAngle, 120])"));
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs
index 6bc29d0..6ed5564 100644
--- a/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs
+++ b/OSCADSharp/OSCADSharp.UnitTests/Transforms/ScaleTests.cs
@@ -47,5 +47,18 @@ namespace OSCADSharp.UnitTests.Transforms
string script = cube.ToString();
Assert.IsTrue(script.Contains("v = scaleVar"));
}
+
+ [TestMethod]
+ public void Scale_CanBindParameterizedScaleValue()
+ {
+ var x = new Variable("xS", 3);
+ var y = new Variable("yS", 4);
+ var z = new Variable("zS", 3);
+
+ var cube = new Cube().Scale(x, y, z);
+
+ string script = cube.ToString();
+ Assert.IsTrue(script.Contains("v = [xS, yS, zS]"));
+ }
}
}
diff --git a/OSCADSharp/OSCADSharp/OSCADObject.cs b/OSCADSharp/OSCADSharp/OSCADObject.cs
index cefac40..991626f 100644
--- a/OSCADSharp/OSCADSharp/OSCADObject.cs
+++ b/OSCADSharp/OSCADSharp/OSCADObject.cs
@@ -35,6 +35,8 @@ namespace OSCADSharp
#endregion
#region Transforms
+
+ #region Color
///
/// Applies Color and/or Opacity to this object
///
@@ -56,6 +58,7 @@ namespace OSCADSharp
{
return new ColoredObject(this, colorName, opacity);
}
+ #endregion
#region Mirror
///
@@ -295,6 +298,7 @@ namespace OSCADSharp
}
#endregion
+ #region Rotate
///
/// Rotates about a specified X/Y/Z euler angle
///
@@ -305,6 +309,16 @@ namespace OSCADSharp
return new RotatedObject(this, angle);
}
+ ///
+ /// Rotates about a specified X/Y/Z euler angle variable
+ ///
+ /// The angle(s) to rotate
+ /// A rotated object
+ public OSCADObject Rotate(Variable angle)
+ {
+ return new RotatedObject(this, angle);
+ }
+
///
/// Rotates about a specified X/Y/Z euler angle
///
@@ -317,6 +331,92 @@ namespace OSCADSharp
return this.Rotate(new Vector3(x, y, z));
}
+ ///
+ /// Rotates about a specified X/Y/Z euler variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(Variable x, Variable y, Variable z)
+ {
+ return new RotatedObject(this, new Vector3(), x, y, z);
+ }
+
+ ///
+ /// Rotates about a specified X/Y/Z euler with one or more variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(Variable x, double y, double z)
+ {
+ return new RotatedObject(this, new Vector3(0, y, z), x, null, null);
+ }
+
+ ///
+ /// Rotates about a specified X/Y/Z euler with one or more variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(double x, Variable y, double z)
+ {
+ return new RotatedObject(this, new Vector3(x, 0, z), null, y, null);
+ }
+
+ ///
+ /// Rotates about a specified X/Y/Z euler with one or more variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(double x, double y, Variable z)
+ {
+ return new RotatedObject(this, new Vector3(x, y, 0), null, null, z);
+ }
+
+ ///
+ /// Rotates about a specified X/Y/Z euler with one or more variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(Variable x, double y, Variable z)
+ {
+ return new RotatedObject(this, new Vector3(0, y, 0), x, null, z);
+ }
+
+ ///
+ /// Rotates about a specified X/Y/Z euler with one or more variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(double x, Variable y, Variable z)
+ {
+ return new RotatedObject(this, new Vector3(x, 0, 0), null, y, z);
+ }
+
+ ///
+ /// Rotates about a specified X/Y/Z euler with one or more variables
+ ///
+ ///
+ ///
+ ///
+ /// A rotated object
+ public OSCADObject Rotate(Variable x, Variable y, double z)
+ {
+ return new RotatedObject(this, new Vector3(0, 0, z), x, y, null);
+ }
+ #endregion
+
+ #region Scale
///
/// Rescales an object by an X/Y/Z scale factor
///
@@ -327,6 +427,16 @@ namespace OSCADSharp
return new ScaledObject(this, scale);
}
+ ///
+ /// Rescales an object by an X/Y/Z scale factor variable
+ ///
+ /// The scale to apply. For example 1, 2, 1 would yield 2x scale on the Y axis
+ /// A scaled object
+ public OSCADObject Scale(Variable scale)
+ {
+ return new ScaledObject(this, scale);
+ }
+
///
/// Rescales an object by an X/Y/Z scale factor
///
@@ -339,6 +449,91 @@ namespace OSCADSharp
return this.Scale(new Vector3(x, y, z));
}
+ ///
+ /// Rescales an object by an X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(Variable x, Variable y, Variable z)
+ {
+ return new ScaledObject(this, new Vector3(), x, y, z);
+ }
+
+ ///
+ /// Rescales an object by one or more X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(Variable x, double y, double z)
+ {
+ return new ScaledObject(this, new Vector3(0, y, z), x, null, null);
+ }
+
+ ///
+ /// Rescales an object by one or more X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(double x, Variable y, double z)
+ {
+ return new ScaledObject(this, new Vector3(x, 0, z), null, y, null);
+ }
+
+ ///
+ /// Rescales an object by one or more X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(double x, double y, Variable z)
+ {
+ return new ScaledObject(this, new Vector3(x, y, 0), null, null, z);
+ }
+
+ ///
+ /// Rescales an object by one or more X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(Variable x, double y, Variable z)
+ {
+ return new ScaledObject(this, new Vector3(0, y, 0), x, null, z);
+ }
+
+ ///
+ /// Rescales an object by one or more X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(double x, Variable y, Variable z)
+ {
+ return new ScaledObject(this, new Vector3(x, 0, 0), null, y, z);
+ }
+
+ ///
+ /// Rescales an object by one or more X/Y/Z scale factor variables
+ ///
+ ///
+ ///
+ ///
+ /// A scaled object
+ public OSCADObject Scale(Variable x, Variable y, double z)
+ {
+ return new ScaledObject(this, new Vector3(0, 0, z), x, y, null);
+ }
+ #endregion
+
///
/// Translates an object by the specified amount
///
diff --git a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs
index 8f7ac25..af63dea 100644
--- a/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/RotatedObject.cs
@@ -29,6 +29,23 @@ namespace OSCADSharp.Transforms
this.Angle = new BindableVector(angle);
}
+ internal RotatedObject(OSCADObject obj, Variable normal) : base(obj)
+ {
+ this.Bind("angle", normal);
+ }
+
+ internal RotatedObject(OSCADObject obj, Vector3 angle, Variable x, Variable y, Variable z) : base(obj)
+ {
+ this.Angle = new BindableVector(angle);
+
+ if (x != null)
+ this.Bind("x", x);
+ if (y != null)
+ this.Bind("y", y);
+ if (z != null)
+ this.Bind("z", z);
+ }
+
public override string ToString()
{
string angle = this.bindings.Contains("angle") ? this.bindings.Get("angle").BoundVariable.Name : this.Angle.ToString();
diff --git a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs
index cf21051..43c0a24 100644
--- a/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs
+++ b/OSCADSharp/OSCADSharp/Transforms/ScaledObject.cs
@@ -29,6 +29,23 @@ namespace OSCADSharp.Transforms
this.ScaleFactor = new BindableVector(scale);
}
+ internal ScaledObject(OSCADObject obj, Variable normal) : base(obj)
+ {
+ this.Bind("scalefactor", normal);
+ }
+
+ internal ScaledObject(OSCADObject obj, Vector3 scale, Variable x, Variable y, Variable z) : base(obj)
+ {
+ this.ScaleFactor = new BindableVector(scale);
+
+ if (x != null)
+ this.Bind("x", x);
+ if (y != null)
+ this.Bind("y", y);
+ if (z != null)
+ this.Bind("z", z);
+ }
+
public override string ToString()
{
string scale = this.bindings.Contains("scalefactor") ? this.bindings.Get("scalefactor").BoundVariable.Name : this.ScaleFactor.ToString();