package org.eclipse.iee.pad.graph; import java.util.List; import org.eclipse.iee.core.document.source.IScope; import org.eclipse.iee.core.document.source.ISourceGenerator; import org.eclipse.iee.core.document.source.ISourceGeneratorContext; import org.eclipse.iee.core.document.source.IVariableType; import org.eclipse.iee.core.document.source.VariableType; import org.eclipse.iee.pad.graph.model.GraphElement; import org.eclipse.iee.pad.graph.model.GraphModel; import org.osgi.service.component.annotations.Component; @Component public class GraphPadSourceGenerator implements ISourceGenerator<GraphPart> { @Override public String getSource(GraphPart part, ISourceGeneratorContext context) { GraphModel model = part.getModel(); List<GraphElement> elements = model.getElements(); List<String> variables = model.getVariables(); StringBuilder generatedText = new StringBuilder(); double minX = model.getMinX() != null ? model.getMinX() : 0; double maxX = model.getMaxX() != null ? model.getMaxX() : 1.0; generatedText.append("{"); generatedText.append("StringBuilder result").append(" = new StringBuilder();"); if (variables.size() > 0) { for (int i = 0; i < elements.size(); i++) { GraphElement graphElement = elements.get(i); String variable; if (i < variables.size()) { variable = variables.get(i); } else { variable = variables.get(variables.size() - 1); } if (variable != null && variable.length() > 0) { String function = graphElement.getFunction(); if (function != null && function.trim().length() > 0) { generatedText.append("{"); generatedText.append("StringBuilder sb").append(i).append(" = new StringBuilder();"); generatedText.append("boolean first = true;"); generatedText.append("sb").append(i).append(".append(\"[\");"); IVariableType xType; IScope scope = context.getScope(); if (scope.hasVariable(variable)) { xType = context.getExpressionType(variable, scope); } else { xType = VariableType.DOUBLE; } if (xType == VariableType.MATRIX) { String translateFunction = context.translateFunction(variable, part.getId()); generatedText.append("Jama.Matrix __tmpX = ").append(translateFunction).append(";"); generatedText.append("for (int __tmp = 0; __tmp < ").append("__tmpX.getColumnDimension(); __tmp ++) {"); generatedText.append("double __grpVar = __tmpX.get(0,__tmp);"); } else { generatedText.append("for (double ").append(variable).append(" = ") .append(minX).append("; ").append(variable).append(" < ") .append(maxX) .append("; ").append(variable).append(" += Math.abs((") .append(minX).append(" - ") .append(maxX).append(") / ") .append(graphElement.getNumberOfPoints()) .append(")) {"); generatedText.append("double __grpVar = ").append(variable).append(";"); } IVariableType yType = context.getExpressionType(function, scope); String translateElement = context.translateFunction(function, part.getId()); if (yType == VariableType.MATRIX) { generatedText.append("Jama.Matrix __tmpY = ").append(translateElement).append(";"); generatedText.append("double __grpVal = __tmpY.get(0,__tmp);"); } else { generatedText.append("double __grpVal = ").append(translateElement).append(";"); } generatedText.append("if (!first) {").append("sb").append(i).append(".append(\",\");} else {first=false;}"); generatedText.append("sb").append(i).append(".append(\"[\").append( __grpVar).append(\",\").append(__grpVal).append(\"]\");"); generatedText.append("}"); generatedText.append("sb").append(i).append(".append(\"]\");"); generatedText.append("result.append(\"[\" + ").append("sb").append(i).append(".toString()").append(");"); generatedText.append("result.append(\"]\");"); generatedText.append("}"); } } } } generatedText.append("org.eclipse.iee.core.EvaluationContextHolder.putResult(\"").append(part.getId()).append("\", result.toString());"); generatedText.append("}"); return generatedText.toString(); } }