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();