X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling.ui%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fui%2Fexpression%2FBasicExpression.java;fp=bundles%2Forg.simantics.modeling.ui%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fui%2Fexpression%2FBasicExpression.java;h=e2ac33516362c5e7256a48be7ad42db1470b003f;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git 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 index 000000000..e2ac33516 --- /dev/null +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/expression/BasicExpression.java @@ -0,0 +1,72 @@ +package org.simantics.modeling.ui.expression; + +import org.simantics.basicexpression.Expressions; +import org.simantics.databoard.binding.Binding; +import org.simantics.databoard.Bindings; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.EquationExpression; +import org.simantics.db.layer0.variable.Expression; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.utils.datastructures.Triple; + +public class BasicExpression implements Expression, EquationExpression { + + final private Resource expression; + + public BasicExpression(Resource expression) { + this.expression = expression; + } + + @Override + public T evaluate(ReadGraph graph, Variable property, Binding binding) throws DatabaseException { + return evaluate(graph, property); + } + + @SuppressWarnings("unchecked") + @Override + public T evaluate(ReadGraph graph, Variable property) throws DatabaseException { + + String expressionString = graph.getValue(expression, Bindings.STRING); + BasicExpressionVisitor visitor = new BasicExpressionVisitor(graph, property); + Expressions.evaluate(expressionString, visitor); + return (T)visitor.getResult(); + + } + + @Override + public void invert(WriteGraph graph, Variable property, T value, Binding binding) throws DatabaseException { + + String expressionString = graph.getValue(expression, Bindings.STRING); + InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor(); + Expressions.evaluate(expressionString, visitor); + Object pair = visitor.getResult(); + if(pair instanceof Triple) { + @SuppressWarnings("unchecked") + Triple data = (Triple)pair; + if(Math.abs(data.first) > 1e-9) { + Double inverted = ((Double)value - data.second) / data.first; + String target = data.third; + Variable targetVariable = property.browse(graph, target); +// System.out.println("invert: " + target + " = " + property.browse(graph, target).getURI(graph)); + targetVariable.setValue(graph, inverted, binding); + } + } + + } + + @Override + public boolean isInvertible(ReadGraph graph, Variable property) throws DatabaseException { + + String expressionString = graph.getValue(expression, Bindings.STRING); + InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor(); + Expressions.evaluate(expressionString, visitor); + Object value = visitor.getResult(); + if(value instanceof Triple) return true; + else return false; + + } + +}