From 08b1e460af4d8b8d95bff57c592ef314c1c25db2 Mon Sep 17 00:00:00 2001 From: lempinen Date: Thu, 1 Dec 2011 10:33:09 +0000 Subject: [PATCH] git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@23384 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 78303 -> 78412 bytes .../graph/Sysdyn.pgraph | 5 +- .../org/simantics/sysdyn/SysdynResource.java | 6 + .../sysdyn/ui/properties/EquationTab.java | 105 +++++++++++++----- .../widgets/expressions/DelayExpression.java | 4 +- .../widgets/expressions/ExpressionField.java | 105 +++++++++++++++++- .../sysdyn/ui/utils/ExpressionUtils.java | 7 +- .../ui/validation/DependencyFunction.java | 12 +- .../sysdyn/ui/validation/ValidationUtils.java | 35 +++--- .../sysdyn/manager/FunctionUtils.java | 2 + .../expressions/DelayExpression.java | 13 +-- 11 files changed, 225 insertions(+), 69 deletions(-) diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index dd36a3eebc0a8815c90b58498ea98ffb3427afa0..613fa022d034bb046a7ac5b9308769a8df480a06 100644 GIT binary patch literal 78412 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 literal 78303 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 diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index c19156a4..8e329777 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -208,6 +208,9 @@ SYSDYN.RefersTo -- SYSDYN.DelayExpression.expression --> L0.String -- SYSDYN.DelayExpression.order --> L0.Integer -- SYSDYN.DelayExpression.delayTime --> L0.String -- SYSDYN.DelayExpression.initialValue --> L0.String -- SYSDYN.DelayExpression.initialValue --> L0.String creating a new ordered set expressions and the active expression + // The variable has no expressions -> creating a new ordered set expressions and the active expression if(expression == null && variable != null) { try { expression = SimanticsUI.getSession().syncRequest(new WriteResultRequest() { @@ -226,9 +220,12 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } } - + // Now the variable should have an expression SimanticsUI.getSession().asyncRequest(new Read>() { + /** + * Find out if user can add a new expression or delete the current expression + */ @Override public Pair perform(ReadGraph graph) throws DatabaseException { SysdynResource sr = SysdynResource.getInstance(graph); @@ -243,10 +240,14 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { boolean canAdd = true; boolean canDelete = false; + // If there are multiple expressions, one can be removed if(expressionList.size() > 1) canDelete = true; String defaultRange = ArrayExpressionCombo.getDefaultRange(graph, variable); + /* If the variable is an array variable, a range has been set to all expressions and none of + * the ranges is the default range, an expression can be added + */ for(Resource expression : expressionList) { String range = graph.getPossibleRelatedValue(expression, sr.HasArrayRange); if(range == null || range.equals("") || range.equals(defaultRange)) { @@ -284,13 +285,20 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { return newExpression.getWidget().isDisposed() || deleteExpression.getWidget().isDisposed(); } }); - + + // Set input to widgets using expressionSupport StructuredSelection ss = new StructuredSelection(expression); expressionSupport.fireInput(context, ss); } + /** + * Adds listeners to widgets in this tab + * + * @param context ISessionContext + */ private void addListeners(ISessionContext context) { + // Validate expression fields when a dependency has been added or removed shortcutTabWidget.addDependencyListener(new Runnable() { @Override @@ -299,6 +307,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Deletes a selected expression deleteExpression.addSelectionListener(new SelectionListenerImpl(context) { @Override @@ -308,6 +317,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { SysdynResource sr = SysdynResource.getInstance(graph); Layer0 l0 = Layer0.getInstance(graph); + // Currently active expressin should be located in (Model sr.HasActiveExpression expression) Resource activeExpression = graph.getPossibleObject(input, sr.HasActiveExpression); if(activeExpression == null) return; @@ -316,15 +326,19 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { if(OrderedSetUtils.toList(graph, expressionList).size() <= 1) return; + // Get the previous expression in expression list to be activated Resource prev = OrderedSetUtils.prev(graph, expressionList, activeExpression); OrderedSetUtils.remove(graph, expressionList, activeExpression); graph.deny(input, l0.ConsistsOf, activeExpression); if(prev.equals(expressionList)) { + // If the removed expression was last on the list, prev returns the list. + // Get a proper list element to be activated Iterator iterator = OrderedSetUtils.iterator(graph, expressionList); prev = iterator.next(); } + // Set prev as active in virtual graph final Resource newActive = prev; VirtualGraphSupport support = graph.getService(VirtualGraphSupport.class); final Session session = graph.getSession(); @@ -347,6 +361,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Creates a new expression newExpression.addSelectionListener(new SelectionListenerImpl(context) { @Override @@ -359,14 +374,17 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { if(expressions == null) { return; } + // Get the currently active expression Resource activeExpression = graph.getPossibleObject(input, sr.HasActiveExpression); Resource newExpression = graph.newResource(); if(activeExpression != null) { + // Create a new expression based on the old expression graph.claim(newExpression, l0.InstanceOf, graph.getSingleObject(activeExpression, l0.InstanceOf)); if(graph.isInstanceOf(newExpression, sr.StockExpression)) { graph.claimLiteral(newExpression, sr.HasInitialEquation, ""); } } else { + // If there was no active expression, create a normal expression graph.claim(newExpression, l0.InstanceOf, sr.NormalExpression); } OrderedSetUtils.add(graph, expressions, newExpression); @@ -374,6 +392,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Item factory for expression type combo expressionTypeCombo.setItemFactory(new ReadFactoryImpl>() { @Override @@ -382,6 +401,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { Map map = new HashMap(); SysdynResource sr = SysdynResource.getInstance(graph); + // Select expression types based on the type of the variable final ExpressionType[] expressionTypes; if(graph.isInstanceOf(input, sr.Auxiliary)) expressionTypes = ExpressionTypes.auxiliaryExpressions; @@ -399,6 +419,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Initial selection to the combo from active expression expressionTypeCombo.setSelectionFactory(new ReadFactoryImpl() { @Override @@ -410,6 +431,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Modify listener for selecting expression type expressionTypeCombo.addModifyListener(new TextModifyListener() { @Override @@ -420,6 +442,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { }); + // Add all units used in the model to the unit combo unitCombo.setItemFactory(new ReadFactoryImpl>() { @Override @@ -442,6 +465,8 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { return map; } }); + + // Set initial selection of unit combo unitCombo.setSelectionFactory(new ReadFactoryImpl() { @Override @@ -454,6 +479,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Modify unit unitCombo.addModifyListener(new ComboModifyListenerImpl() { @Override @@ -463,6 +489,11 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { }); + /* + * Double-clicking something in shortcut tab widget + * writes the clicked element into expression widget, + * sets focus on expression widget and validates its fields + */ shortcutTabWidget.addMouseListener(new MouseListener(){ @Override @@ -476,8 +507,8 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { @Override public void run() { if(expressionWidget!= null) { + expressionWidget.getExpression().focus(); expressionWidget.getExpression().replaceSelection(var); - expressionWidget.getExpression().focus(); expressionWidget.validateFieldsTimed(); } } @@ -495,6 +526,10 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + + /* + * Shortcut tab widget should not maintain any selections for visual reasons + */ shortcutTabWidget.addFocusListener(new FocusListener() { @Override @@ -508,6 +543,9 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { }); + /* Modifying an expression sets a timed validation. The timer is + * reset after each modification + */ expressionWidget.addModifyListener(new ModifyListener() { @Override @@ -516,6 +554,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Pressing return without shift key triggers saving the expression expressionWidget.addVerifyKeyListener(new VerifyKeyListener() { @Override @@ -530,6 +569,7 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { } }); + // Triggers save when equation tab loses focus if(focusLostListener == null) { focusLostListener = new org.eclipse.ui.IPartListener2() { @@ -565,6 +605,15 @@ public class EquationTab extends LabelPropertyTabContributor implements Widget { super.dispose(); } + /** + * Get the currently active expression of the first expression in expression list if + * no expression has been set to active + * + * @param graph ReadGraph + * @param variable Variable + * @return active expression or the first expression in variables expression list + * @throws DatabaseException + */ private Resource getActiveExpression(ReadGraph graph, Resource variable) throws DatabaseException { SysdynResource sr = SysdynResource.getInstance(graph); Resource expression = graph.getPossibleObject(variable, sr.HasActiveExpression); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/DelayExpression.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/DelayExpression.java index 18b2e8cd..8494a8c9 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/DelayExpression.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/DelayExpression.java @@ -144,12 +144,12 @@ public class DelayExpression implements IExpression { @Override public void focus() { - equation.setFocus(); + lastSelectedText.setFocus(); } @Override public List getExpressionFields() { - return Arrays.asList(equation, delayTime); + return Arrays.asList(equation, delayTime, initialValue); } @Override diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/ExpressionField.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/ExpressionField.java index 38f0c16d..2904c0d0 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/ExpressionField.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/expressions/ExpressionField.java @@ -29,6 +29,8 @@ import org.eclipse.jface.text.source.MatchingCharacterPainter; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Color; @@ -39,6 +41,14 @@ import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess; import org.eclipse.swt.graphics.Point; import org.simantics.sysdyn.expressionParser.Token; +/** + * Field for displaying a part of an expression. Expression field uses SourceViewer + * to display annotations and other visual elements just like any other + * source viewer in eclipse. + * + * @author Teemu Lempinen + * + */ public class ExpressionField extends Composite { protected SourceViewer _sourceViewer; @@ -55,6 +65,11 @@ public class ExpressionField extends Composite { IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess(); + /** + * Create a new expression field + * @param parent + * @param style + */ public ExpressionField(Composite parent, int style) { super(parent, style); @@ -77,11 +92,13 @@ public class ExpressionField extends Composite { null, true, styles); + + // Configuration for color management _sourceViewer.configure(new ExpressionFieldConfiguration(cManager)); - AnnotationPainter painter = new AnnotationPainter(_sourceViewer, annotationAccess); _sourceViewer.addPainter(painter); + // Annotation types painter.addAnnotationType(MISSING_LINK); painter.setAnnotationTypeColor(MISSING_LINK, new Color(this.getDisplay(), 255,215,0)); painter.addAnnotationType(NO_SUCH_VARIABLE); @@ -92,11 +109,8 @@ public class ExpressionField extends Composite { _sourceViewer.setDocument(_document, _annotationModel); GridDataFactory.fillDefaults().grab(true, true).applyTo(_sourceViewer.getControl()); -// _sourceViewer.getControl().setLayoutData(new GridData(SWT.FILL, -// SWT.FILL, -// true, -// true)); + // Parenthesis matching PaintManager paintManager = new PaintManager(_sourceViewer); MatchingCharacterPainter matchingCharacterPainter = new MatchingCharacterPainter(_sourceViewer, new DefaultCharacterPairMatcher( new char[] {'(', ')', '{', '}', '[', ']'} )); @@ -104,6 +118,7 @@ public class ExpressionField extends Composite { paintManager.addPainter(matchingCharacterPainter); + // Listener for canceling editing. ESC -> revert back to original text _sourceViewer.getTextWidget().addKeyListener(new KeyListener() { @Override @@ -119,12 +134,39 @@ public class ExpressionField extends Composite { } }); + /* Focus listener saving and restoring selections + * When focus is lost, current selection is saved, but the selection is removed. + * When focus is gained back, the selection is restored + */ + _sourceViewer.getTextWidget().addFocusListener(new FocusListener() { + + Point selection = null; + @Override + public void focusLost(FocusEvent e) { + selection = ((StyledText)e.widget).getSelection(); + ((StyledText)e.widget).setSelection(0); + } + + @Override + public void focusGained(FocusEvent e) { + if(selection != null) + ((StyledText)e.widget).setSelection(selection); + } + }); } + /** + * Returns the {@link SourceViewer} of this ExpressionField + * @return Returns the {@link SourceViewer} of this ExpressionField + */ public SourceViewer getSourceViewer() { return this._sourceViewer; } + /** + * Sets missing link annotations to given positions + * @param positions Positions for missing link annotations + */ public void setMissingLinkAnnotations(List positions){ for(Position p : positions) { Annotation annotation = new Annotation(false); @@ -134,6 +176,10 @@ public class ExpressionField extends Composite { } } + /** + * Sets no such variable annotations to given positions + * @param positions Positions for no such variable annotations + */ public void setNoSuchVariableAnnotations(List positions){ for(Position p : positions) { Annotation annotation = new Annotation(false); @@ -143,14 +189,33 @@ public class ExpressionField extends Composite { } } + /** + * Sets syntax error for the given token + * @param token Token with syntax error + * @param message Message to be displayed in tool tips + */ public void setSyntaxError(Token token, String message){ setSyntaxError(token.image, message, token.beginLine, token.beginColumn, token.endLine, token.endColumn); } + /** + * Sets syntax error for the given token + * @param token Token with syntax error + * @param message Message to be displayed in tool tips + */ public void setSyntaxError(org.simantics.sysdyn.tableParser.Token token, String message){ setSyntaxError(token.image, message, token.beginLine, token.beginColumn, token.endLine, token.endColumn); } + /** + * Sets syntax error to given location + * @param image Token image + * @param message Message to be displayed in tool tips + * @param beginLine Begin line + * @param beginColumn Begin column + * @param endLine End line + * @param endColumn End column + */ public void setSyntaxError(String image, String message, int beginLine, int beginColumn, int endLine, int endColumn) { int start = 0; int offset = this._document.getLength(); @@ -165,6 +230,13 @@ public class ExpressionField extends Composite { setSyntaxError(start, offset, SYNTAX_ERROR, message == null ? "Syntax Error" : message); } + /** + * Sets syntax error to given start and offset + * @param start Start location + * @param offset Offset + * @param type Error type (SYNTAX_ERROR, MISSING_LINK, NO_SUCH_VARIABLE) + * @param text Message to be displayedin tool tips + */ public void setSyntaxError(int start, int offset, String type, String text) { Annotation annotation = new Annotation(false); annotation.setType(type); @@ -173,22 +245,42 @@ public class ExpressionField extends Composite { _annotationModel.addAnnotation(annotation, p); } + /** + * Resets all annotations + */ public void resetAnnotations() { _annotationModel.removeAllAnnotations(); } + + /** + * Sets an expression to this expression field + * @param expression + */ public void setExpression(String expression) { _document.set(expression); this.oldExpression = expression; } + /** + * Returns the expression of this expression field + * @return + */ public String getExpression() { return this._document.get(); } + /** + * Returns the current selection + * @return current selection + */ public Point getSelection() { return _sourceViewer.getSelectedRange(); } + /** + * Set selection for this expression field. The length of the selection is 0 + * @param selection Selection location + */ public void setSelection(int selection) { this._sourceViewer.setSelectedRange(selection, 0); } @@ -197,6 +289,9 @@ public class ExpressionField extends Composite { return _document; } + /** + * Focus to this expression field + */ public void focus() { this._sourceViewer.getTextWidget().forceFocus(); } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ExpressionUtils.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ExpressionUtils.java index bb0a96ac..6abe38f2 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ExpressionUtils.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ExpressionUtils.java @@ -257,7 +257,7 @@ public class ExpressionUtils { TableItem[] connectedVariables = variableTable.getItems(); for(TableItem ti : connectedVariables) { if(!variables.contains(ti.getText())) { - ti.setForeground(new Color(ti.getDisplay(), 255, 0, 0)); + ti.setForeground(new Color(ti.getDisplay(), 255,125,0)); } else { ti.setForeground(new Color(ti.getDisplay(), 0, 0, 0)); variables.remove(ti.getText()); @@ -381,11 +381,6 @@ public class ExpressionUtils { } - - - - - for(ExpressionField ef : ranges.keySet()) { HashMap tokens = errors.get(ef); if(tokens == null || tokens.isEmpty()) continue; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java index 8ad6013b..8a550544 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/DependencyFunction.java @@ -63,15 +63,15 @@ public class DependencyFunction { Set dependencies = ValidationUtils.getDependencies(graph, component); Set references = null; + ArrayList result = new ArrayList(); + + // Find all references in equations of component try { references = ValidationUtils.getReferences(graph, component); - } catch (SyntaxErrorException e) { - } catch (UnsupportedCharactersException e) { - } catch (UndefinedExpressionException e) { - } - - ArrayList result = new ArrayList(); + } catch (Exception e) { + return result; + } // Check that all arrow dependencies are used in equations if (dependencies != null) { diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ValidationUtils.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ValidationUtils.java index 11eb5f04..5ad0123a 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ValidationUtils.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/ValidationUtils.java @@ -19,6 +19,7 @@ import java.util.List; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.Statement; import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.utils.OrderedSetUtils; import org.simantics.db.exception.DatabaseException; @@ -34,7 +35,7 @@ import org.simantics.sysdyn.expressionParser.TokenMgrError; * */ public class ValidationUtils { - + /** * Find all variables that are referred to in the expressions of variable r * @param graph ReadGraph @@ -50,19 +51,25 @@ public class ValidationUtils { ExpressionParser parser = new ExpressionParser(new StringReader("")); SysdynResource sr = SysdynResource.getInstance(graph); - Layer0 l0 = Layer0.getInstance(graph); List expressionList = getExpressions(graph, r); if(expressionList == null || expressionList.isEmpty()) throw new UndefinedExpressionException(); for(Resource expression : expressionList) { - Collection equations = graph.syncRequest(new ObjectsWithType(expression, sr.HasEquation, l0.String)); - if(equations.isEmpty()) + Collection statements = graph.getStatements(expression, sr.HasEquation); + if(statements.isEmpty()) throw new UndefinedExpressionException(); - - for(Resource s : equations) { - String value = graph.getValue(s, Bindings.STRING); - if(value.length() == 0) - throw new UndefinedExpressionException(); + + for(Statement statement : statements) { + Object v = graph.getValue(statement.getObject()); + String value = v.toString(); + + if(value.length() == 0) { + // Empty might be allowed + if(graph.isSubrelationOf(statement.getPredicate(), sr.HasEquationOrEmpty)) + return references; + else + throw new UndefinedExpressionException(); + } parser.ReInit(new StringReader(value)); try { @@ -77,7 +84,7 @@ public class ValidationUtils { } return references; } - + /** * Get all expressions of a variable r * @param graph ReadGraph @@ -94,7 +101,7 @@ public class ValidationUtils { return null; } - + /** * Returns the names of the related variables (dependencies) * @@ -124,7 +131,7 @@ public class ValidationUtils { } return variables; } - + /** * Is reference reachable from variable * @@ -140,7 +147,7 @@ public class ValidationUtils { else return false; } - + /** * Find a resource starting from variable and using reference path * @@ -162,5 +169,5 @@ public class ValidationUtils { } return null; } - + } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/FunctionUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/FunctionUtils.java index 1ef05738..e3d02a2c 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/FunctionUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/FunctionUtils.java @@ -77,6 +77,8 @@ public class FunctionUtils { SysdynResource sr = SysdynResource.getInstance(graph); SimulationResource simu = SimulationResource.getInstance(graph); Resource modelResource = graph.getPossibleObject(model.getConfigurationResource(), simu.IsConfigurationOf); + if(modelResource == null) + return parents; parents.add(modelResource); diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java index 6aea3fc5..852ea14c 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java @@ -146,7 +146,7 @@ public class DelayExpression extends Expression { sb.append("\tReal" + range + " initialValue = " + (range.length() > 0 ? "fill(-137543," + range.substring(1, range.length() - 1) + ")" : -137543) + ";\n"); else // Initial value - sb.append("\tReal" + range + " initialValue = " + initialValue + ";\n"); + sb.append("\tReal" + range + " initialValue = " + FormatUtils.formatExpressionForModelica(variable, this.initialValue) + ";\n"); // First valve sb.append("\tReal" + range + " delay0;\n"); @@ -160,13 +160,11 @@ public class DelayExpression extends Expression { sb.append("initial equation\n"); // "Generic" structure selection. If the "random" number is not used in initial value, use delay0 as initial value - sb.append("\tLV" + n +" = DL * " + - (range.length() > 0 ? "(if max(initialValue) < -137543 or max(initialValue) > -137543 then initialValue else delay0)" : - "(if initialValue < -137543 or initialValue > -137543 then initialValue else delay0)") + ";\n"); - // Each stock gets the same initial value - for(int i = 1; i < n; i++) - sb.append("\tLV" + i + " = LV" + n + ";\n"); + for(int i = 1; i <= n; i++) + sb.append("\tLV" + i +" = DL * " + + (range.length() > 0 ? "(if max(initialValue) < -137543 or max(initialValue) > -137543 then initialValue else delay0)" : + "(if initialValue < -137543 or initialValue > -137543 then initialValue else delay0)") + ";\n"); sb.append("equation\n"); sb.append("\tDL = delayTime/" + n + ";\n"); @@ -184,6 +182,7 @@ public class DelayExpression extends Expression { @Override public String getEquation(IndependentVariable variable) { String equation = FormatUtils.formatExpressionForModelica(variable, this.equation); + String delayTime = FormatUtils.formatExpressionForModelica(variable, this.delayTime); // Set delay properties StringBuilder sb = new StringBuilder(); -- 2.47.1