From c4c4ccf46d7b398416abf5b8b50859947b8200b3 Mon Sep 17 00:00:00 2001 From: lempinen Date: Fri, 27 Apr 2012 09:00:22 +0000 Subject: [PATCH] Step property controls to game experiment tab (refs #3398) git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@24831 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 63623 -> 63788 bytes .../graph/Sysdyn.pgraph | 1 + .../org/simantics/sysdyn/SysdynResource.java | 6 ++ .../NewGameExperimentNodeHanlder.java | 12 +++ .../ui/menu/GameStepDurationContribution.java | 50 ++++------- .../ui/properties/GameExperimentTab.java | 82 ++++++++++++++++++ .../ResourceSelectionProcessor.java | 11 ++- .../ui/validation/DependencyFunction.java | 8 +- .../sysdyn/manager/SysdynGameExperiment.java | 57 +++++++++--- .../sysdyn/representation/Entity.java | 7 +- 10 files changed, 182 insertions(+), 52 deletions(-) create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/GameExperimentTab.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index 4e7c067d7408bf97e58a236c153b720323e000d8..a9b8ca8a1e172c0616942215dbbb67db4204a4e7 100644 GIT binary patch literal 63788 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

s0=5KCG)w%Ho%go# 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 diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index 1fdfb7e1..54086f8a 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -269,6 +269,7 @@ SYSDYN.BasicExperiment -- SYSDYN.GameExperiment.stepDuration --> L0.Double -- SYSDYN.GameExperiment.stepLength --> L0.Double GLOBAL_VARIABLES = CollectionUtils.toSet("time"); /** * Evaluates dependency-related issues for a component. @@ -124,7 +128,7 @@ public class DependencyFunction { // Check that all references have corresponding arrows if (references != null && dependencies != null) { for (String reference : references) { - if (!dependencies.contains(reference)) { + if (!dependencies.contains(reference) && !GLOBAL_VARIABLES.contains(reference)) { Resource variable = null; if ((variable = ValidationUtils.reach(graph, component, reference)) != null) { if(isStock) { @@ -241,7 +245,7 @@ public class DependencyFunction { if (references != null && dependencies != null) { for (String reference : references) { // If dependencies does not contain reference and the reference -// is not reachable from component, add the name + // is not reachable from component, add the name if (!dependencies.contains(reference) && ValidationUtils.reach(graph, component, reference) == null) { result.add(reference); } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynGameExperiment.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynGameExperiment.java index 6721ad51..673bf856 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynGameExperiment.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynGameExperiment.java @@ -16,16 +16,21 @@ import java.util.ArrayList; import java.util.HashMap; import org.eclipse.core.runtime.IProgressMonitor; +import org.simantics.db.AsyncReadGraph; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.procedure.AsyncListener; +import org.simantics.db.request.Read; import org.simantics.modelica.IModelicaMonitor; import org.simantics.modelica.SimulationLocation; import org.simantics.modelica.data.DataSet; import org.simantics.modelica.data.SimulationResult; import org.simantics.modelica.fmi.FMUControlJNI; import org.simantics.modelica.fmi.FMUJNIException; +import org.simantics.simulation.experiment.ExperimentState; import org.simantics.sysdyn.SysdynResource; +import org.simantics.utils.datastructures.Pair; /** * Game experiment @@ -37,8 +42,11 @@ public class SysdynGameExperiment extends SysdynExperiment { private FMUControlJNI control; private String[] subscription; private HashMap> results; - private double stepLength = 0.1; - private double stepDuration = 1.0; + private double stepLength = DEFAULT_STEP_LENGTH; + private double stepDuration = DEFAULT_STEP_DURATION; + + public static double DEFAULT_STEP_DURATION = 1.0; + public static double DEFAULT_STEP_LENGTH = 0.1; public SysdynGameExperiment(Resource experiment, Resource model) { super(experiment, model); @@ -58,12 +66,6 @@ public class SysdynGameExperiment extends SysdynExperiment { public void setStepLength(double stepLength) { this.stepLength = stepLength; - if(control != null) { - try { - control.setStepLength(this.stepLength); - } catch (FMUJNIException e) { - } - } } @Override @@ -75,11 +77,37 @@ public class SysdynGameExperiment extends SysdynExperiment { results = new HashMap>(); - try { - stepDuration = g.getPossibleRelatedValue(experiment, SysdynResource.getInstance(g).GameExperiment_stepDuration); - } catch (DatabaseException e) { - stepDuration = 1.0; - } + g.asyncRequest(new Read>() { + + @Override + public Pair perform(ReadGraph graph) + throws DatabaseException { + SysdynResource sr = SysdynResource.getInstance(graph); + Double stepDuration = graph.getPossibleRelatedValue(experiment, sr.GameExperiment_stepDuration); + Double stepLength =graph.getPossibleRelatedValue(experiment, sr.GameExperiment_stepLength); + return new Pair(stepDuration, stepLength); + } + }, new AsyncListener>() { + + @Override + public void execute(AsyncReadGraph graph, + Pair result) { + setStepDuration(result.first != null ? result.first : DEFAULT_STEP_DURATION); + setStepLength(result.second != null ? result.second : DEFAULT_STEP_LENGTH); + } + + @Override + public void exception(AsyncReadGraph graph, Throwable throwable) { + throwable.printStackTrace(); + setStepDuration(DEFAULT_STEP_DURATION); + setStepLength(DEFAULT_STEP_LENGTH); + } + + @Override + public boolean isDisposed() { + return getState().equals(ExperimentState.DISPOSED); + } + }); } @Override @@ -159,7 +187,10 @@ public class SysdynGameExperiment extends SysdynExperiment { if(duration <= 0.0) duration = stepDuration; + try { + control.setStepLength(stepLength); // Set step length each time in case there has been changes + double time = control.getTime(); double eTime = time + duration; double[] results = new double[subscription.length]; diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Entity.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Entity.java index 433848f6..ec61ed05 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Entity.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Entity.java @@ -13,6 +13,7 @@ package org.simantics.sysdyn.representation; import org.simantics.layer0.Layer0; import org.simantics.objmap.annotations.GraphType; +import org.simantics.sysdyn.representation.visitors.IElementVisitorVoid; /** * Dummy class representing any entity. @@ -20,6 +21,10 @@ import org.simantics.objmap.annotations.GraphType; * */ @GraphType(Layer0.URIs.Entity) -public class Entity { +public class Entity implements IElement { + + @Override + public void accept(IElementVisitorVoid v) { + } } -- 2.47.1