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
}