From: lempinen Date: Mon, 17 May 2010 13:57:01 +0000 (+0000) Subject: Switch to new Model Browser X-Git-Tag: apros-i4-rc3^0 X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=0c9dd0905a35ac30694d027d98c1d2d642039644;p=simantics%2Fsysdyn.git Switch to new Model Browser git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@15751 ac1ea38d-2e2b-0410-8846-a27921b304fc --- diff --git a/org.simantics.sysdyn.ui/adapters.xml b/org.simantics.sysdyn.ui/adapters.xml index e92213e6..fda0571f 100644 --- a/org.simantics.sysdyn.ui/adapters.xml +++ b/org.simantics.sysdyn.ui/adapters.xml @@ -16,7 +16,7 @@ - + - + \ No newline at end of file diff --git a/org.simantics.sysdyn.ui/plugin.xml b/org.simantics.sysdyn.ui/plugin.xml index 366f6029..39699954 100644 --- a/org.simantics.sysdyn.ui/plugin.xml +++ b/org.simantics.sysdyn.ui/plugin.xml @@ -143,6 +143,21 @@ + + + + + + @@ -244,6 +259,14 @@ id="org.simantics.sysdyn.ui.simulate.state"> + + + + @@ -303,6 +326,14 @@ + + + + @@ -320,5 +351,61 @@ Simple System Dynamics Tutorials + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/SysdynBrowser.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/SysdynBrowser.java index 96be2b87..aa546cde 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/SysdynBrowser.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/SysdynBrowser.java @@ -11,125 +11,24 @@ *******************************************************************************/ package org.simantics.sysdyn.ui.browser; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; -import java.util.Map; - -import org.simantics.browsing.ui.BuiltinKeys; -import org.simantics.browsing.ui.NodeContext; -import org.simantics.browsing.ui.PrimitiveQueryUpdater; -import org.simantics.browsing.ui.BuiltinKeys.LabelerKey; -import org.simantics.browsing.ui.common.ColumnKeys; -import org.simantics.browsing.ui.common.EvaluatorData; -import org.simantics.browsing.ui.common.EvaluatorDataImpl; -import org.simantics.browsing.ui.common.EvaluatorImpl; -import org.simantics.browsing.ui.common.EvaluatorData.Evaluator; -import org.simantics.browsing.ui.content.Labeler; -import org.simantics.browsing.ui.content.LabelerFactory; -import org.simantics.browsing.ui.graph.impl.GraphViewpointFactory; -import org.simantics.browsing.ui.graph.impl.LabelModifier; -import org.simantics.browsing.ui.graph.impl.LazyGraphLabeler; +import java.util.Set; import org.simantics.browsing.ui.swt.ContextMenuInitializer; import org.simantics.browsing.ui.swt.GraphExplorerView; import org.simantics.browsing.ui.swt.IContextMenuInitializer; -import org.simantics.db.Builtins; -import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.Session; -import org.simantics.db.exception.DatabaseException; -import org.simantics.sysdyn.SysdynResource; -import org.simantics.ui.SimanticsUI; -import org.simantics.utils.datastructures.hints.HintContext; public class SysdynBrowser extends GraphExplorerView { - + + private static final Set browseContexts = Collections.singleton("http://www.simantics.org/Sysdyn-1.0/Browser"); + @Override protected IContextMenuInitializer getContextMenuInitializer() { return new ContextMenuInitializer("#SysdynBrowserPopup"); } - + @Override - protected EvaluatorData createEvaluatorData(Session session) { - HintContext factoryHints = new HintContext(); - //if (sessionContext != null) - //factoryHints.setHint(IGraphExplorerHints.KEY_SESSION_CONTEXT, sessionContext); - - EvaluatorData data = new EvaluatorDataImpl(); - data.addEvaluator(Resource.class, createResourceEvaluator(session, factoryHints)); - return data; + protected Set getBrowseContexts() { + return browseContexts; } - - private Evaluator createResourceEvaluator(Session session, HintContext factoryHints) { - Evaluator evaluator = new EvaluatorImpl(); - evaluator.addViewpoint(new GraphViewpointFactory() { - @Override - protected Collection getChildren(ReadGraph g, Resource r) - throws DatabaseException { - Builtins b = g.getBuiltins(); - SysdynResource sr = SysdynResource.getInstance(g); - ArrayList result = new ArrayList(); - for(Resource c : g.getObjects(r, b.ConsistsOf)) { - if( g.isInstanceOf(c, sr.Configuration) - || (g.isInstanceOf(c, sr.Variable) && - !g.isInstanceOf(c, sr.Cloud) - ) - ) - result.add(c); - } - return result; - } - }, 1.0); - evaluator.addLabeler(new LabelerFactory() { - @Override - public Labeler create(PrimitiveQueryUpdater updater, final NodeContext context, LabelerKey key) { - return new LazyGraphLabeler(updater, context, key) { - - Resource nameResource; - - @Override - public Map labels(ReadGraph g) - throws DatabaseException { - Builtins b = g.getBuiltins(); - nameResource = b.HasName; - Resource el = (Resource) context.getConstant(BuiltinKeys.INPUT); - StringBuilder sb = new StringBuilder(); - for(Resource r : g.getObjects(el, b.HasName)) - sb.append(g.getValue(r)); - sb.append(" : "); - for(Resource t : g.getObjects(el, b.InstanceOf)) - for(Resource r : g.getObjects(t, b.HasName)) - sb.append(g.getValue(r)); - return Collections.singletonMap(ColumnKeys.SINGLE, sb.toString()); - } - - @Override - public Modifier getModifier(String key) { - LabelModifier modifier = new LabelModifier(SimanticsUI.getSession(), (Resource) context.getConstant(BuiltinKeys.INPUT), nameResource) { - @Override - public String isValid(String label) { - if (label.isEmpty()) - return "Empty label not allowed"; - if (label.contains(" ")) - return "Spaces are not allowed"; - return null; - } - }; - return modifier; - } - }; - } - - }, 1.0); - /*evaluator.addImager(new ImagerFactory() { - @Override - public Imager create(PrimitiveQueryUpdater updater, INodeContext context) { - // TODO Auto-generated method stub - return null; - } - });*/ - return evaluator; - } - } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/AbstractNodeImager.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/AbstractNodeImager.java new file mode 100644 index 00000000..f0557825 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/AbstractNodeImager.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.simantics.browsing.ui.swt.ImagerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; +import org.simantics.ui.icons.ImageDescriptorProvider; + +public class AbstractNodeImager extends ImagerContributor { + + @Override + public ImageDescriptor getDescriptor(ReadGraph graph, AbstractNode node) throws DatabaseException { + if (!graph.hasStatement(node.resource)) + return null; + ImageDescriptorProvider provider = graph.adapt(node.resource, ImageDescriptorProvider.class); + return provider != null ? provider.get() : null; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/AbstractNodeLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/AbstractNodeLabeler.java new file mode 100644 index 00000000..813365cb --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/AbstractNodeLabeler.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; + +public class AbstractNodeLabeler extends LabelerContributor { + + @Override + public String getLabel(ReadGraph graph, AbstractNode node) throws DatabaseException { + if (!graph.hasStatement(node.resource)) + return ""; + return graph.adapt(node.resource, String.class); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Configuration.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Configuration.java new file mode 100644 index 00000000..171280e4 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Configuration.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; +import org.simantics.sysdyn.ui.browser.nodes.ConfigurationNode; +import org.simantics.sysdyn.ui.browser.nodes.ModelNode; +import org.simantics.utils.DataContainer; + +public class Configuration extends ViewpointContributor { + + @Override + public Collection getContribution(ReadGraph graph, ModelNode model) + throws DatabaseException { + return new DataContainer(new ConfigurationNode( + graph.getSingleObject( + model.resource, + graph.getBuiltins().HasConfiguration)) + ); + + } + + @Override + public String getViewpointId() { + return "Standard"; + } + +} \ No newline at end of file diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ConfigurationLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ConfigurationLabeler.java new file mode 100644 index 00000000..56f4e97e --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ConfigurationLabeler.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.ConfigurationNode; + +public class ConfigurationLabeler extends LabelerContributor{ + + @Override + public String getLabel(ReadGraph graph, ConfigurationNode conf) throws DatabaseException { + String name = graph.getPossibleRelatedValue(conf.resource, graph.getBuiltins().HasName); + return name == null ? "Project (no name)" : name; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Experiment.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Experiment.java new file mode 100644 index 00000000..d80b0313 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Experiment.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.ExperimentsFolder; + +public class Experiment extends ViewpointContributor { + + @Override + public Collection getContribution(ReadGraph graph, ExperimentsFolder input) throws DatabaseException { + // hasExperiment or something + return null; + } + + @Override + public String getViewpointId() { + return "Standard"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ExperimentLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ExperimentLabeler.java new file mode 100644 index 00000000..f78e77ea --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ExperimentLabeler.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ + +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.ExperimentNode; + +public class ExperimentLabeler extends LabelerContributor{ + + @Override + public String getLabel(ReadGraph graph, ExperimentNode input) throws DatabaseException { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Experiments.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Experiments.java new file mode 100644 index 00000000..1efed43a --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Experiments.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ + +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; +import org.simantics.sysdyn.ui.browser.nodes.ExperimentsFolder; +import org.simantics.sysdyn.ui.browser.nodes.ModelNode; +import org.simantics.utils.DataContainer; + +public class Experiments extends ViewpointContributor { + + @Override + public Collection getContribution(ReadGraph graph, ModelNode model) throws DatabaseException { + return new DataContainer(new ExperimentsFolder(model.resource)); + } + + @Override + public String getViewpointId() { + return "Standard"; + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ExperimentsLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ExperimentsLabeler.java new file mode 100644 index 00000000..f301ce2c --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ExperimentsLabeler.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ + +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.ExperimentsFolder; + +public class ExperimentsLabeler extends LabelerContributor { + + @Override + public String getLabel(ReadGraph graph, ExperimentsFolder experiments) throws DatabaseException { + return "Experiments"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/LibraryViewpointContributor.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/LibraryViewpointContributor.java new file mode 100644 index 00000000..50ab222a --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/LibraryViewpointContributor.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.ArrayList; +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.request.Read; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; + +/** + * @author Tuukka Lehtonen + * + * @param input library node type + */ +public abstract class LibraryViewpointContributor extends ViewpointContributor { + + protected abstract Read> getChildRequest(ReadGraph graph, T lib) throws DatabaseException; + + @Override + public final Collection getContribution(ReadGraph graph, T lib) throws DatabaseException { + ArrayList result = new ArrayList(); + for (Resource r : graph.syncRequest(getChildRequest(graph, lib))) { + try { + AbstractNode n = graph.adapt(r, AbstractNode.class); + result.add(n); + } catch (DatabaseException e) { + e.printStackTrace(); + } + } + return result; + } + + @Override + public String getViewpointId() { + return "Standard"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java new file mode 100644 index 00000000..9f5c18be --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java @@ -0,0 +1,42 @@ +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.ArrayList; +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.Builtins; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ObjectsWithType; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; +import org.simantics.sysdyn.ui.browser.nodes.ModulesNode; + +public class Model extends ViewpointContributor { + + @Override + public Collection getContribution(ReadGraph graph, Resource project) + throws DatabaseException { + + ArrayList result = new ArrayList(); + Builtins b = graph.getBuiltins(); + SysdynResource sr = SysdynResource.getInstance(graph); + for(Resource r : graph.syncRequest(new ObjectsWithType(project, b.ConsistsOf, sr.SysdynModel))) { + try { + result.add(graph.adapt(r, AbstractNode.class)); + } catch(DatabaseException e) { + e.printStackTrace(); + } + } + result.add(new ModulesNode(project)); + return result; + + } + + @Override + public String getViewpointId() { + return "Standard"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ModelLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ModelLabeler.java new file mode 100644 index 00000000..64dc4856 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ModelLabeler.java @@ -0,0 +1,15 @@ +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.ModelNode; + +public class ModelLabeler extends LabelerContributor{ + + @Override + public String getLabel(ReadGraph graph, ModelNode model) throws DatabaseException { + String name = graph.getPossibleRelatedValue(model.resource, graph.getBuiltins().HasName); + return name == null ? "Model (no name)" : name; + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ModulesLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ModulesLabeler.java new file mode 100644 index 00000000..9bc154c9 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/ModulesLabeler.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ + +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.ModulesNode; + +public class ModulesLabeler extends LabelerContributor{ + + @Override + public String getLabel(ReadGraph graph, ModulesNode input) throws DatabaseException { + return "Modules"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/OperatingInterfaces.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/OperatingInterfaces.java new file mode 100644 index 00000000..a0394aeb --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/OperatingInterfaces.java @@ -0,0 +1,25 @@ +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; +import org.simantics.sysdyn.ui.browser.nodes.ModelNode; +import org.simantics.sysdyn.ui.browser.nodes.OperatingInterfacesFolder; +import org.simantics.utils.DataContainer; + +public class OperatingInterfaces extends ViewpointContributor { + + @Override + public Collection getContribution(ReadGraph graph, ModelNode model) throws DatabaseException { + return new DataContainer(new OperatingInterfacesFolder(model.resource)); + } + + @Override + public String getViewpointId() { + return "Standard"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/OperatingInterfacesLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/OperatingInterfacesLabeler.java new file mode 100644 index 00000000..13cc2d38 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/OperatingInterfacesLabeler.java @@ -0,0 +1,15 @@ +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.OperatingInterfacesFolder; + +public class OperatingInterfacesLabeler extends LabelerContributor { + + @Override + public String getLabel(ReadGraph graph, OperatingInterfacesFolder input) throws DatabaseException { + return "Operating interfaces"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Variable.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Variable.java new file mode 100644 index 00000000..333f1c25 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Variable.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import java.util.ArrayList; +import java.util.Collection; + +import org.simantics.browsing.ui.graph.contributor.viewpoint.ViewpointContributor; +import org.simantics.db.Builtins; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ObjectsWithType; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.ui.browser.nodes.AbstractNode; +import org.simantics.sysdyn.ui.browser.nodes.ConfigurationNode; + +public class Variable extends ViewpointContributor { + + @Override + public Collection getContribution(ReadGraph graph, ConfigurationNode configuration) throws DatabaseException { + ArrayList result = new ArrayList(); + Builtins b = graph.getBuiltins(); + SysdynResource sr = SysdynResource.getInstance(graph); + for(Resource r : graph.syncRequest(new ObjectsWithType(configuration.resource, b.ConsistsOf, sr.IndependentVariable))) { + try { + result.add(graph.adapt(r, AbstractNode.class)); + } catch(DatabaseException e) { + e.printStackTrace(); + } + } + return result; + } + + @Override + public String getViewpointId() { + return "Standard"; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/VariableLabeler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/VariableLabeler.java new file mode 100644 index 00000000..14b675a9 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/VariableLabeler.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.contributions; + +import org.simantics.browsing.ui.graph.contributor.labeler.LabelerContributor; +import org.simantics.db.Builtins; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.ui.browser.nodes.VariableNode; + +public class VariableLabeler extends LabelerContributor{ + + @Override + public String getLabel(ReadGraph graph, VariableNode var) throws DatabaseException { + Builtins b = graph.getBuiltins(); + Resource varres = var.resource; + StringBuilder sb = new StringBuilder(); + for(Resource r : graph.getObjects(varres, b.HasName)) + sb.append(graph.getValue(r)); + sb.append(" : "); + for(Resource t : graph.getObjects(varres, b.InstanceOf)) + for(Resource r : graph.getObjects(t, b.HasName)) + sb.append(graph.getValue(r)); + return sb.toString(); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/AbstractNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/AbstractNode.java new file mode 100644 index 00000000..bf56020b --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/AbstractNode.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.eclipse.core.runtime.IAdaptable; +import org.simantics.db.Resource; + +public abstract class AbstractNode implements IAdaptable { + public final Resource resource; + + public AbstractNode(Resource resource) { + assert(resource != null); + this.resource = resource; + } + + @Override + public int hashCode() { + return resource.hashCode() + getClass().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AbstractNode other = (AbstractNode) obj; + return resource.equals(other.resource); + } + + @SuppressWarnings("unchecked") + @Override + public Object getAdapter(Class adapter) { + if(adapter.equals(Resource.class)) + return resource; + return null; + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ConfigurationNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ConfigurationNode.java new file mode 100644 index 00000000..1bde861e --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ConfigurationNode.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.browsing.ui.common.node.IDeletable; +import org.simantics.browsing.ui.common.node.IModifiableNode; +import org.simantics.browsing.ui.content.Labeler.Modifier; +import org.simantics.browsing.ui.graph.impl.LabelModifier; +import org.simantics.db.Resource; +import org.simantics.ui.SimanticsUI; + +public class ConfigurationNode extends AbstractNode implements IDeletable, IModifiableNode { + + public ConfigurationNode(Resource resource) { + super(resource); + } + + @Override + public Modifier getModifier(String columnId) { + LabelModifier modifier = new LabelModifier(SimanticsUI.getSession(), resource) { + @Override + public String isValid(String label) { + if (label.isEmpty()) + return "Empty label not allowed"; + if (label.contains(" ")) + return "Spaces are not allowed"; + return null; + } + }; + return modifier; + } +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ExperimentNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ExperimentNode.java new file mode 100644 index 00000000..adea16cd --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ExperimentNode.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.db.Resource; + +public class ExperimentNode extends AbstractNode { + + public ExperimentNode(Resource resource) { + super(resource); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ExperimentsFolder.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ExperimentsFolder.java new file mode 100644 index 00000000..b68b5394 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ExperimentsFolder.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.db.Resource; + +public class ExperimentsFolder extends AbstractNode { + + public ExperimentsFolder(Resource resource) { + super(resource); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ModelNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ModelNode.java new file mode 100644 index 00000000..b79582cc --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ModelNode.java @@ -0,0 +1,31 @@ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.browsing.ui.common.node.IDeletable; +import org.simantics.browsing.ui.common.node.IModifiableNode; +import org.simantics.browsing.ui.content.Labeler.Modifier; +import org.simantics.browsing.ui.graph.impl.LabelModifier; +import org.simantics.db.Resource; +import org.simantics.ui.SimanticsUI; + +public class ModelNode extends AbstractNode implements IDeletable, IModifiableNode { + + public ModelNode(Resource resource) { + super(resource); + } + + @Override + public Modifier getModifier(String columnId) { + LabelModifier modifier = new LabelModifier(SimanticsUI.getSession(), resource) { + @Override + public String isValid(String label) { + if (label.isEmpty()) + return "Empty label not allowed"; + if (label.contains(" ")) + return "Spaces are not allowed"; + return null; + } + }; + return modifier; + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ModulesNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ModulesNode.java new file mode 100644 index 00000000..1536a4c3 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/ModulesNode.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.db.Resource; + +public class ModulesNode extends AbstractNode { + + public ModulesNode(Resource resource) { + super(resource); + } + + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/OperatingInterfacesFolder.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/OperatingInterfacesFolder.java new file mode 100644 index 00000000..94ecb3f3 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/OperatingInterfacesFolder.java @@ -0,0 +1,11 @@ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.db.Resource; + +public class OperatingInterfacesFolder extends AbstractNode { + + public OperatingInterfacesFolder(Resource resource) { + super(resource); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/VariableNode.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/VariableNode.java new file mode 100644 index 00000000..1480bb64 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/nodes/VariableNode.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.sysdyn.ui.browser.nodes; + +import org.simantics.db.Resource; + +public class VariableNode extends AbstractNode { + + public VariableNode(Resource resource) { + super(resource); + } + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewModelHandler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewModelHandler.java new file mode 100644 index 00000000..232e673c --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewModelHandler.java @@ -0,0 +1,43 @@ +package org.simantics.sysdyn.ui.handlers; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.simantics.db.Builtins; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.ui.SimanticsUI; + +public class NewModelHandler extends AbstractHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + SimanticsUI.getSession().asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + // Same as in SysdynProject.java. Should use the same code, not copy. + Builtins b = graph.getBuiltins(); + SysdynResource sr = SysdynResource.getInstance(graph); + Resource model = graph.newResource(); + graph.claimValue(model, b.HasName, "Model1"); + graph.claim(model, b.InstanceOf, sr.SysdynModel); + graph.claim(model, b.PartOf, SimanticsUI.getProject().get()); + + Resource conf = graph.newResource(); + graph.claimValue(conf, b.HasName, "Configuration"); + graph.claim(conf, b.InstanceOf, sr.Configuration); + graph.claim(model, b.HasConfiguration, conf); + graph.claimValue(conf, sr.HasStartTime, 0.0); + graph.claimValue(conf, sr.HasStopTime, 10.0); + } + }); + return null; + } + + + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewModuleNodeHandler.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewModuleNodeHandler.java new file mode 100644 index 00000000..54d75f87 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/NewModuleNodeHandler.java @@ -0,0 +1,16 @@ +package org.simantics.sysdyn.ui.handlers; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +public class NewModuleNodeHandler extends AbstractHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + System.out.println("New module!"); + return null; + } + + +} diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java index 073dffdf..59fa382d 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java @@ -72,11 +72,16 @@ public class SysdynProject extends AbstractProjectFeature { Builtins b = g.getBuiltins(); SysdynResource sr = SysdynResource.getInstance(g); Resource model = g.newResource(); - g.claimValue(model, b.HasName, "Configuration"); - g.claim(model, b.InstanceOf, null, sr.Configuration); + g.claimValue(model, b.HasName, "Model1"); + g.claim(model, b.InstanceOf, sr.SysdynModel); g.claim(model, b.PartOf, library); - g.claimValue(model, sr.HasStartTime, 0.0); - g.claimValue(model, sr.HasStopTime, 10.0); + + Resource conf = g.newResource(); + g.claimValue(conf, b.HasName, "Configuration"); + g.claim(conf, b.InstanceOf, sr.Configuration); + g.claim(model, b.HasConfiguration, conf); + g.claimValue(conf, sr.HasStartTime, 0.0); + g.claimValue(conf, sr.HasStopTime, 10.0); } catch(Exception e) { errorCallback.run(e); diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/SysdynResource.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/SysdynResource.java index f108d491..87165c9e 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/SysdynResource.java @@ -52,6 +52,7 @@ public class SysdynResource { public final Resource RefersTo; public final Resource Stock; public final Resource StockExpression; + public final Resource SysdynModel; public final Resource SysdynProject; public final Resource Terminal; public final Resource Valve; @@ -91,6 +92,7 @@ public class SysdynResource { public static final String RefersTo = "http://www.simantics.org/Sysdyn-1.0/RefersTo"; public static final String Stock = "http://www.simantics.org/Sysdyn-1.0/Stock"; public static final String StockExpression = "http://www.simantics.org/Sysdyn-1.0/StockExpression"; + public static final String SysdynModel = "http://www.simantics.org/Sysdyn-1.0/SysdynModel"; public static final String SysdynProject = "http://www.simantics.org/Sysdyn-1.0/SysdynProject"; public static final String Terminal = "http://www.simantics.org/Sysdyn-1.0/Terminal"; public static final String Valve = "http://www.simantics.org/Sysdyn-1.0/Valve"; @@ -140,6 +142,7 @@ public class SysdynResource { RefersTo = getResourceOrNull(graph, URIs.RefersTo); Stock = getResourceOrNull(graph, URIs.Stock); StockExpression = getResourceOrNull(graph, URIs.StockExpression); + SysdynModel = getResourceOrNull(graph, URIs.SysdynModel); SysdynProject = getResourceOrNull(graph, URIs.SysdynProject); Terminal = getResourceOrNull(graph, URIs.Terminal); Valve = getResourceOrNull(graph, URIs.Valve); diff --git a/sysdyn_ontologies/sysdyn.graph b/sysdyn_ontologies/sysdyn.graph index 42d4611f..a615777e 100644 --- a/sysdyn_ontologies/sysdyn.graph +++ b/sysdyn_ontologies/sysdyn.graph @@ -1,6 +1,7 @@ %import "layer0.graph" L0 %import "structural2.graph" ST %import "project.graph" PROJ +%import "simulation.graph" SIMU %deflib L0.Type Sysdyn %deflib L0.Relation Sysdyn @@ -20,10 +21,13 @@ SysdynProject : PROJ.Feature L0.HasDescription """System dynamics modelling project. Create system dynamics models and simulate them with OpenModelica.""" : L0.String L0.PartOf Sysdyn L0.PartOf PROJ.PublishedProjectFeatures + +###################################################################### +# Model +###################################################################### -#SysdynTest : PROJ.Project2 -# PROJ.HasFeature SysdynProject -# L0.PartOf L0.Projects +SysdynModel