1 package org.simantics.modeling.ui.expression;
\r
3 import org.simantics.basicexpression.Expressions;
\r
4 import org.simantics.databoard.binding.Binding;
\r
5 import org.simantics.databoard.Bindings;
\r
6 import org.simantics.db.ReadGraph;
\r
7 import org.simantics.db.Resource;
\r
8 import org.simantics.db.WriteGraph;
\r
9 import org.simantics.db.exception.DatabaseException;
\r
10 import org.simantics.db.layer0.variable.EquationExpression;
\r
11 import org.simantics.db.layer0.variable.Expression;
\r
12 import org.simantics.db.layer0.variable.Variable;
\r
13 import org.simantics.utils.datastructures.Triple;
\r
15 public class BasicExpression implements Expression, EquationExpression {
\r
17 final private Resource expression;
\r
19 public BasicExpression(Resource expression) {
\r
20 this.expression = expression;
\r
24 public <T> T evaluate(ReadGraph graph, Variable property, Binding binding) throws DatabaseException {
\r
25 return evaluate(graph, property);
\r
28 @SuppressWarnings("unchecked")
\r
30 public <T> T evaluate(ReadGraph graph, Variable property) throws DatabaseException {
\r
32 String expressionString = graph.getValue(expression, Bindings.STRING);
\r
33 BasicExpressionVisitor visitor = new BasicExpressionVisitor(graph, property);
\r
34 Expressions.evaluate(expressionString, visitor);
\r
35 return (T)visitor.getResult();
\r
40 public <T> void invert(WriteGraph graph, Variable property, T value, Binding binding) throws DatabaseException {
\r
42 String expressionString = graph.getValue(expression, Bindings.STRING);
\r
43 InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor();
\r
44 Expressions.evaluate(expressionString, visitor);
\r
45 Object pair = visitor.getResult();
\r
46 if(pair instanceof Triple) {
\r
47 @SuppressWarnings("unchecked")
\r
48 Triple<Double, Double, String> data = (Triple<Double, Double, String>)pair;
\r
49 if(Math.abs(data.first) > 1e-9) {
\r
50 Double inverted = ((Double)value - data.second) / data.first;
\r
51 String target = data.third;
\r
52 Variable targetVariable = property.browse(graph, target);
\r
53 // System.out.println("invert: " + target + " = " + property.browse(graph, target).getURI(graph));
\r
54 targetVariable.setValue(graph, inverted, binding);
\r
61 public boolean isInvertible(ReadGraph graph, Variable property) throws DatabaseException {
\r
63 String expressionString = graph.getValue(expression, Bindings.STRING);
\r
64 InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor();
\r
65 Expressions.evaluate(expressionString, visitor);
\r
66 Object value = visitor.getResult();
\r
67 if(value instanceof Triple) return true;
\r