From 161482b55e12906fb43ded5025a22b983bc75d3c Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Wed, 21 Feb 2018 00:26:16 +0200 Subject: [PATCH] Fixed InvertBasicExpressionVisitor.invert to keep inverted value type Previously the code would convert all Number-values to Double instead of passing the inverted value to Variable.setValue in the same type the original non-inverted value was in. refs #7777 Change-Id: I78771698d3e2222ede47969e3cceea2166c23a75 (cherry picked from commit 4f743d81482d51262a7bc07d2a4874cdd0856a17) --- .../InvertBasicExpressionVisitor.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/InvertBasicExpressionVisitor.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/InvertBasicExpressionVisitor.java index 11351f06b..5bcce3ee4 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/InvertBasicExpressionVisitor.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/InvertBasicExpressionVisitor.java @@ -126,18 +126,19 @@ public class InvertBasicExpressionVisitor extends DepthFirstAdapter { public static void invert(WriteGraph graph, Variable base, String expression, Object value) throws DatabaseException { InvertBasicExpressionVisitor visitor = new InvertBasicExpressionVisitor(); Expressions.evaluate(replaced(expression), visitor); - Object pair = visitor.getResult(); - if(pair == null) return; - if(pair instanceof Triple) { + Object result = visitor.getResult(); + if(result == null) return; + if(result instanceof Triple) { @SuppressWarnings("unchecked") - Triple data = (Triple)pair; + Triple data = (Triple)result; String key = data.third.replace(MAGIC, "."); String path = getVariablePath(graph, base, key); Variable targetVariable = base.browse(graph, path); if(value instanceof Number) { if(Math.abs(data.first) > 1e-9) { - Double inverted = (((Number)value).doubleValue() - data.second) / data.first; - targetVariable.setValue(graph, inverted); + double inverted = (double) (((Number)value).doubleValue() - data.second) / data.first; + Object invertedValue = numericValueInType(inverted, value.getClass()); + targetVariable.setValue(graph, invertedValue); } } else if (value instanceof Boolean) { // TODO: support 'not' @@ -146,7 +147,20 @@ public class InvertBasicExpressionVisitor extends DepthFirstAdapter { } } - + + private static Object numericValueInType(double value, Class type) { + if (type == Integer.class) { + return (int) value; + } else if (type == Long.class) { + return (long) value; + } else if (type == Byte.class) { + return (byte) value; + } else if (type == Float.class) { + return (float) value; + } + return value; + } + private static String getVariablePath(ReadGraph graph, Variable base, String key) throws DatabaseException { StructuralResource2 STR = StructuralResource2.getInstance(graph); Resource type = base.getPossibleType(graph); -- 2.43.2