diff --git a/OSCADSharp/OSCADSharp.UnitTests/Solids/SphereTests.cs b/OSCADSharp/OSCADSharp.UnitTests/Solids/SphereTests.cs index 30f1ed6..1f306a3 100644 --- a/OSCADSharp/OSCADSharp.UnitTests/Solids/SphereTests.cs +++ b/OSCADSharp/OSCADSharp.UnitTests/Solids/SphereTests.cs @@ -127,9 +127,10 @@ namespace OSCADSharp.UnitTests var sphere = new Sphere(); sphere.Bind("Radius", Variables.Global["mySphereRadius"]); + Assert.IsTrue(sphere.Radius == radius); string script = sphere.ToString(); - // Assert.IsTrue(script.Contains("r = mySphereRadius")); + Assert.IsTrue(script.Contains("r = mySphereRadius")); } } } diff --git a/OSCADSharp/OSCADSharp/OSCADSharp.csproj b/OSCADSharp/OSCADSharp/OSCADSharp.csproj index a6032ff..9208137 100644 --- a/OSCADSharp/OSCADSharp/OSCADSharp.csproj +++ b/OSCADSharp/OSCADSharp/OSCADSharp.csproj @@ -48,7 +48,7 @@ - + diff --git a/OSCADSharp/OSCADSharp/Scripting/BindingMapper.cs b/OSCADSharp/OSCADSharp/Scripting/Binding.cs similarity index 55% rename from OSCADSharp/OSCADSharp/Scripting/BindingMapper.cs rename to OSCADSharp/OSCADSharp/Scripting/Binding.cs index 3c6c03d..c1afe73 100644 --- a/OSCADSharp/OSCADSharp/Scripting/BindingMapper.cs +++ b/OSCADSharp/OSCADSharp/Scripting/Binding.cs @@ -6,10 +6,9 @@ using System.Threading.Tasks; namespace OSCADSharp.Scripting { - internal class BindingMapper + internal class Binding { public string OpenSCADFieldName { get; set; } - public List BindingOptions { get; set; } - public Dictionary> BindingTransformers { get; set; } + public Variable BoundVariable { get; set; } } } diff --git a/OSCADSharp/OSCADSharp/Scripting/Bindings.cs b/OSCADSharp/OSCADSharp/Scripting/Bindings.cs index c8357e8..30b09eb 100644 --- a/OSCADSharp/OSCADSharp/Scripting/Bindings.cs +++ b/OSCADSharp/OSCADSharp/Scripting/Bindings.cs @@ -8,12 +8,20 @@ namespace OSCADSharp.Scripting { internal class Bindings { - internal List Mappers { get; set; } = new List(); - - private Dictionary bindings = new Dictionary(); - internal void Add(string property, Variable variable) + private Dictionary bindings = new Dictionary(); + internal void Add(Binding binding) { - bindings[property] = variable; + bindings[binding.OpenSCADFieldName] = binding; + } + + internal bool Contains(string property) + { + return bindings.ContainsKey(property); + } + + internal Binding Get(string property) + { + return bindings[property]; } } } diff --git a/OSCADSharp/OSCADSharp/Scripting/StatementBuilder.cs b/OSCADSharp/OSCADSharp/Scripting/StatementBuilder.cs index 2d440f0..a8615d5 100644 --- a/OSCADSharp/OSCADSharp/Scripting/StatementBuilder.cs +++ b/OSCADSharp/OSCADSharp/Scripting/StatementBuilder.cs @@ -13,6 +13,18 @@ namespace OSCADSharp.Scripting internal class StatementBuilder { private StringBuilder SB { get; set; } = new StringBuilder(); + private Bindings bindings; + + internal StatementBuilder() + { + this.bindings = new Bindings(); + } + + internal StatementBuilder(Bindings bindings) + { + this.bindings = bindings; + } + /// /// Special append method for conditionally adding value-pairs @@ -22,6 +34,8 @@ namespace OSCADSharp.Scripting /// (optional) Flag indicating whether a comma should be added before the value-pair public void AppendValuePairIfExists(string name, object value, bool prefixWithComma = false) { + bool useBinding = this.shouldUseBinding(name); + if (!String.IsNullOrEmpty(value?.ToString())) { if (prefixWithComma) @@ -31,10 +45,23 @@ namespace OSCADSharp.Scripting SB.Append(name); SB.Append(" = "); - SB.Append(value); + + if(useBinding) + { + SB.Append(this.bindings.Get(name).BoundVariable.Name); + } + else + { + SB.Append(value); + } } } + private bool shouldUseBinding(string name) + { + return this.bindings.Contains(name); + } + /// /// Pass-through for StringBuilder.Append /// diff --git a/OSCADSharp/OSCADSharp/Solids/Sphere.cs b/OSCADSharp/OSCADSharp/Solids/Sphere.cs index ce7c1bb..a9b131b 100644 --- a/OSCADSharp/OSCADSharp/Solids/Sphere.cs +++ b/OSCADSharp/OSCADSharp/Solids/Sphere.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using OSCADSharp.Spatial; using OSCADSharp.Scripting; +using System.Collections.Concurrent; namespace OSCADSharp.Solids { @@ -71,7 +72,7 @@ namespace OSCADSharp.Solids /// Script for this object public override string ToString() { - StatementBuilder sb = new StatementBuilder(); + StatementBuilder sb = new StatementBuilder(this.bindings); sb.Append("sphere("); sb.AppendValuePairIfExists("r", this.Radius); sb.AppendValuePairIfExists("$fn", this.Resolution, true); @@ -120,6 +121,11 @@ namespace OSCADSharp.Solids } private Bindings bindings = new Bindings(); + private static Dictionary bindingMapping = new Dictionary() + { + { "radius", "r" } + }; + /// /// Binds a a variable to a property on this object /// @@ -128,7 +134,31 @@ namespace OSCADSharp.Solids /// literal value of the property public void Bind(string property, Variable variable) { - this.bindings.Add(property, variable); + + string lowercaseProp = property.ToLower(); + if (!bindingMapping.ContainsKey(lowercaseProp)) + { + throw new KeyNotFoundException(String.Format("No bindable property matching the name {0} was found")); + } + + //Set value of property to variable value + this.setValueForBinding(lowercaseProp, variable); + + //Assign mapping r -> radius -> variable + var binding = new Binding() + { + OpenSCADFieldName = bindingMapping[lowercaseProp], + BoundVariable = variable + }; + + this.bindings.Add(binding); + } + + private void setValueForBinding(string property, Variable variable) + { + if (property == "radius") { + this.Radius = Convert.ToDouble(variable.Value); + } } #endregion }