]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/expression/BasicExpression.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / expression / BasicExpression.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/expression/BasicExpression.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/expression/BasicExpression.java
new file mode 100644 (file)
index 0000000..e2ac335
--- /dev/null
@@ -0,0 +1,72 @@
+package org.simantics.modeling.ui.expression;\r
+\r
+import org.simantics.basicexpression.Expressions;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.EquationExpression;\r
+import org.simantics.db.layer0.variable.Expression;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.utils.datastructures.Triple;\r
+\r
+public class BasicExpression implements Expression, EquationExpression {\r
+\r
+       final private Resource expression;\r
+       \r
+       public BasicExpression(Resource expression) {\r
+               this.expression = expression;\r
+       }\r
+       \r
+       @Override\r
+       public <T> T evaluate(ReadGraph graph, Variable property, Binding binding) throws DatabaseException {\r
+               return evaluate(graph, property);\r
+       }\r
+\r
+       @SuppressWarnings("unchecked")\r
+    @Override\r
+       public <T> T evaluate(ReadGraph graph, Variable property) throws DatabaseException {\r
+       \r
+               String expressionString = graph.getValue(expression, Bindings.STRING);\r
+               BasicExpressionVisitor visitor = new BasicExpressionVisitor(graph, property);\r
+               Expressions.evaluate(expressionString, visitor);\r
+               return (T)visitor.getResult();\r
+               \r
+       }\r
+\r
+       @Override\r
+       public <T> void invert(WriteGraph graph, Variable property, T value, Binding binding) throws DatabaseException {\r
+               \r
+               String expressionString = graph.getValue(expression, Bindings.STRING);\r
+               InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor();\r
+               Expressions.evaluate(expressionString, visitor);\r
+               Object pair = visitor.getResult();\r
+               if(pair instanceof Triple) {\r
+                       @SuppressWarnings("unchecked")\r
+                       Triple<Double, Double, String> data = (Triple<Double, Double, String>)pair;\r
+                       if(Math.abs(data.first) > 1e-9) {\r
+                               Double inverted = ((Double)value - data.second) / data.first;\r
+                               String target = data.third;\r
+                               Variable targetVariable = property.browse(graph, target);\r
+//                             System.out.println("invert: " + target + " = " + property.browse(graph, target).getURI(graph));\r
+                               targetVariable.setValue(graph, inverted, binding);\r
+                       }\r
+               }\r
+               \r
+       }\r
+\r
+       @Override\r
+       public boolean isInvertible(ReadGraph graph, Variable property) throws DatabaseException {\r
+               \r
+               String expressionString = graph.getValue(expression, Bindings.STRING);\r
+               InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor();\r
+               Expressions.evaluate(expressionString, visitor);\r
+               Object value = visitor.getResult();\r
+               if(value instanceof Triple) return true;\r
+               else return false;\r
+               \r
+       }\r
+\r
+}\r