--- /dev/null
+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