]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.modeling.ui.expression;\r
2 \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
14 \r
15 public class BasicExpression implements Expression, EquationExpression {\r
16 \r
17         final private Resource expression;\r
18         \r
19         public BasicExpression(Resource expression) {\r
20                 this.expression = expression;\r
21         }\r
22         \r
23         @Override\r
24         public <T> T evaluate(ReadGraph graph, Variable property, Binding binding) throws DatabaseException {\r
25                 return evaluate(graph, property);\r
26         }\r
27 \r
28         @SuppressWarnings("unchecked")\r
29     @Override\r
30         public <T> T evaluate(ReadGraph graph, Variable property) throws DatabaseException {\r
31         \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
36                 \r
37         }\r
38 \r
39         @Override\r
40         public <T> void invert(WriteGraph graph, Variable property, T value, Binding binding) throws DatabaseException {\r
41                 \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
55                         }\r
56                 }\r
57                 \r
58         }\r
59 \r
60         @Override\r
61         public boolean isInvertible(ReadGraph graph, Variable property) throws DatabaseException {\r
62                 \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
68                 else return false;\r
69                 \r
70         }\r
71 \r
72 }\r