From 2cccd2fcd0902847e7249890db723c0c233926c7 Mon Sep 17 00:00:00 2001 From: lempinen Date: Mon, 10 Oct 2011 13:18:23 +0000 Subject: [PATCH] First profile git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@22597 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 68458 -> 69394 bytes .../graph/Profiles.pgraph | 25 ++++ .../org/simantics/sysdyn/SysdynResource.java | 12 ++ org.simantics.sysdyn.ui/META-INF/MANIFEST.MF | 3 +- org.simantics.sysdyn.ui/adapters.xml | 2 +- .../profiles/SimulationPlaybackStyle.java | 127 ++++++++++++++++++ .../simantics/sysdyn/ui/utils/ModelUtils.java | 20 +-- .../sysdyn/ui/utils/ProfileEntries.java | 46 +++++++ .../ui/validation/DependencyFunction.java | 2 +- 9 files changed, 216 insertions(+), 21 deletions(-) create mode 100644 org.simantics.sysdyn.ontology/graph/Profiles.pgraph create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements2/profiles/SimulationPlaybackStyle.java create mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ProfileEntries.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index 75a536254a291bf81c15887ebe1d0322e376c9ad..11db7b9ecb1886238ea91dd3e64d258ac166866d 100644 GIT binary patch literal 69394 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

7H_-YcQaqyWPJdC-tftb zaHK1_k5nr)yo$#3a641T#J5ZFaA7{iX^UG|)ymG%&;{BO*J;h(&!HBJc4ut6X$#N$ zKKd{p_(#i^l@?0BEh;o0;}tO3hk0mmuc%$F9I)N=a6R6zKtzbnqMxbc3S;0R$x0eSo{MdGJguq@fRyfH= zDx--P;>AK`BpZodWkxF(o|lP80}q}e>08P={_zfrGY%w|w}M#@fWA1TR5R0&o5Db` zRxH>q8EdY0t)yw9jkOpXGh{Q2eRtNEvoB-b+dZZrM@~IIn=^@VteW}2hAj9nRc{zO zK_*0)YOLWO$l*b@A8(0pa2oMnj&Nbswqr6EO8f#K6J+m^^}=ZF!rk~?OksEPF~=?( zLt(7>n57Gmif0VgGr~VSPAUZXFvOG^4-@w?l)4w};6yccpYSr;-16 z_N0G*R|)Idjg54j*_>9R;S0wWxizq;&?3iiG#EE_JLuXS@&HlWSy?>5_mKQKDxM=` zrNZT(xGuaP>ZgD6F~J|?w%}X5CgvvpRMLS5{EGu8?0?5~^NqIvF#43$_YAD`9$W!T!OboAZ+yOkR){@pYC+yE$7oh<=!O@^3lqKlhw*j-JT= z&$uR?9DeU2|M<^@M)|1@EWf}tp|O`Qa8dfPpcR9au>q96k88^0Wn;U_gJn5Y$UoXK zq4BKZ;0_+vK8Y*kbml9o>C@aDdeiP9ywF6&i)qCrf77oqU&E_T06u><=6Mf60S6WP z)vWv-uwcafyUyg}OR)3+OlU0ObifBBj^d=A1^BP~(~S@FeQ$#I<;j90%&(D0%R_jE z$M2Ar@JGpOin~kIrp0*R1&`OWa5wE99oRkWxi}yvogMfgQ-67Dx#ZqB<4jk<`(?ta z|G^U=f zV*flB*QAN7221WOKL26mgkPKGrMvUn@y%|&RxA(ZswJG|<=IE4x+JuS*r;{1InXGG=3a^#8<@LEn z%#g|{z4GR!zqFpuG#1T+L40R%!ny3?z{CSqX9zFJD@P$0aUP8Mnr1QLP)NN$7EL1kVi= zYeWS#+P}}%pX~3v@9zmH`#-r(6b`}_&*w&bS;A+79KJtqcm#yQa2AgepeZ_5Lx^A1XY+$H7+&g-f`|Aj( zcilD1*RQVhkB#!70+wePRq4$%yEdjWl__)GdRb8!9!83|P5Q|#V?HG`c|Re~MCWsr z;EP6NB^&Jl!NB!o3^H8lj7@kZ?w2pw{IZ=)he@-cv{%gW=H8*C$8&GCRA%R1X64D! zOrwc-5WQy1=^e#(S047!D^*#ybHp||RD!v`R83n}E%{p6Wn?Fq!St8m{I}CO@J7M? zZ+}1C=6SrI$8$ZN?eQF7at`vCQ^PHkeldI0$+*NXq_$HLyT7iX}PTePP0|LJk#|K8z31|gml z?wGQvkh`0xnJ@v{DFvK)u74cET^m5eicK$kx}cjX#g`Tqj# C`{b(t literal 68458 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 +L0X = +DIA = +SYSDYN = + +PROFILES = SYSDYN.Profiles : L0.Library + + +// TEMPLATE +groupStyleEntry : L0.Template + @template %subject %style %group + %subject : DIA.GroupStyleProfileEntry + DIA.ProfileEntry.HasStyle %style + DIA.ProfileEntry.HasGroup %group + + +SYSDYN.SimulationPlaybackStyle : DIA.Style + +SYSDYN.AllElementsGroup : DIA.TypeGroup + L0.HasLabel "Element" + DIA.HasType DIA.Element + +PROFILES.SimulationPlaybackColours + L0.HasLabel "Playback colours" + @groupStyleEntry SYSDYN.SimulationPlaybackStyle SYSDYN.AllElementsGroup \ No newline at end of file diff --git a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java index 68049fb4..77000eb8 100644 --- a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java @@ -10,6 +10,7 @@ public class SysdynResource { public final Resource AdditionalSymbols; public final Resource AdditionalSymbols_Text; + public final Resource AllElementsGroup; public final Resource ArrayIndexes; public final Resource ArrayIndexes_Inverse; public final Resource Auxiliary; @@ -140,6 +141,8 @@ public class SysdynResource { public final Resource ParameterExpression; public final Resource Polarity; public final Resource Polarity_Inverse; + public final Resource Profiles; + public final Resource Profiles_SimulationPlaybackColours; public final Resource ProjectActionContext; public final Resource ProjectActionContext_Actions; public final Resource ProjectActionContext_Actions_NewEnumeration; @@ -169,6 +172,7 @@ public class SysdynResource { public final Resource ShowEnumerationIndexInCharts; public final Resource ShowEnumerationIndexInCharts_Inverse; public final Resource SimulateOnChangeExperiment; + public final Resource SimulationPlaybackStyle; public final Resource Stock; public final Resource StockExpression; public final Resource StockSymbol; @@ -201,6 +205,7 @@ public class SysdynResource { public static class URIs { public static final String AdditionalSymbols = "http://www.simantics.org/Sysdyn-1.0/AdditionalSymbols"; public static final String AdditionalSymbols_Text = "http://www.simantics.org/Sysdyn-1.0/AdditionalSymbols/Text"; + public static final String AllElementsGroup = "http://www.simantics.org/Sysdyn-1.0/AllElementsGroup"; public static final String ArrayIndexes = "http://www.simantics.org/Sysdyn-1.0/ArrayIndexes"; public static final String ArrayIndexes_Inverse = "http://www.simantics.org/Sysdyn-1.0/ArrayIndexes/Inverse"; public static final String Auxiliary = "http://www.simantics.org/Sysdyn-1.0/Auxiliary"; @@ -331,6 +336,8 @@ public class SysdynResource { public static final String ParameterExpression = "http://www.simantics.org/Sysdyn-1.0/ParameterExpression"; public static final String Polarity = "http://www.simantics.org/Sysdyn-1.0/Polarity"; public static final String Polarity_Inverse = "http://www.simantics.org/Sysdyn-1.0/Polarity/Inverse"; + public static final String Profiles = "http://www.simantics.org/Sysdyn-1.0/Profiles"; + public static final String Profiles_SimulationPlaybackColours = "http://www.simantics.org/Sysdyn-1.0/Profiles/SimulationPlaybackColours"; public static final String ProjectActionContext = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext"; public static final String ProjectActionContext_Actions = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions"; public static final String ProjectActionContext_Actions_NewEnumeration = "http://www.simantics.org/Sysdyn-1.0/ProjectActionContext/Actions/NewEnumeration"; @@ -360,6 +367,7 @@ public class SysdynResource { public static final String ShowEnumerationIndexInCharts = "http://www.simantics.org/Sysdyn-1.0/ShowEnumerationIndexInCharts"; public static final String ShowEnumerationIndexInCharts_Inverse = "http://www.simantics.org/Sysdyn-1.0/ShowEnumerationIndexInCharts/Inverse"; public static final String SimulateOnChangeExperiment = "http://www.simantics.org/Sysdyn-1.0/SimulateOnChangeExperiment"; + public static final String SimulationPlaybackStyle = "http://www.simantics.org/Sysdyn-1.0/SimulationPlaybackStyle"; 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 StockSymbol = "http://www.simantics.org/Sysdyn-1.0/StockSymbol"; @@ -402,6 +410,7 @@ public class SysdynResource { public SysdynResource(ReadGraph graph) { AdditionalSymbols = getResourceOrNull(graph, URIs.AdditionalSymbols); AdditionalSymbols_Text = getResourceOrNull(graph, URIs.AdditionalSymbols_Text); + AllElementsGroup = getResourceOrNull(graph, URIs.AllElementsGroup); ArrayIndexes = getResourceOrNull(graph, URIs.ArrayIndexes); ArrayIndexes_Inverse = getResourceOrNull(graph, URIs.ArrayIndexes_Inverse); Auxiliary = getResourceOrNull(graph, URIs.Auxiliary); @@ -532,6 +541,8 @@ public class SysdynResource { ParameterExpression = getResourceOrNull(graph, URIs.ParameterExpression); Polarity = getResourceOrNull(graph, URIs.Polarity); Polarity_Inverse = getResourceOrNull(graph, URIs.Polarity_Inverse); + Profiles = getResourceOrNull(graph, URIs.Profiles); + Profiles_SimulationPlaybackColours = getResourceOrNull(graph, URIs.Profiles_SimulationPlaybackColours); ProjectActionContext = getResourceOrNull(graph, URIs.ProjectActionContext); ProjectActionContext_Actions = getResourceOrNull(graph, URIs.ProjectActionContext_Actions); ProjectActionContext_Actions_NewEnumeration = getResourceOrNull(graph, URIs.ProjectActionContext_Actions_NewEnumeration); @@ -561,6 +572,7 @@ public class SysdynResource { ShowEnumerationIndexInCharts = getResourceOrNull(graph, URIs.ShowEnumerationIndexInCharts); ShowEnumerationIndexInCharts_Inverse = getResourceOrNull(graph, URIs.ShowEnumerationIndexInCharts_Inverse); SimulateOnChangeExperiment = getResourceOrNull(graph, URIs.SimulateOnChangeExperiment); + SimulationPlaybackStyle = getResourceOrNull(graph, URIs.SimulationPlaybackStyle); Stock = getResourceOrNull(graph, URIs.Stock); StockExpression = getResourceOrNull(graph, URIs.StockExpression); StockSymbol = getResourceOrNull(graph, URIs.StockSymbol); diff --git a/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF b/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF index 30281ccd..d8d2338f 100644 --- a/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF +++ b/org.simantics.sysdyn.ui/META-INF/MANIFEST.MF @@ -46,7 +46,8 @@ Require-Bundle: org.simantics.layer0.utils;bundle-version="0.6.2", org.simantics.selectionview;bundle-version="1.0.0", org.simantics.issues;bundle-version="1.1.0", org.simantics.issues.ui;bundle-version="1.1.0", - org.simantics.issues.common;bundle-version="1.1.0" + org.simantics.issues.common;bundle-version="1.1.0", + org.simantics.scenegraph.profile;bundle-version="1.0.0" Bundle-Activator: org.simantics.sysdyn.ui.Activator Bundle-ActivationPolicy: lazy Export-Package: org.simantics.sysdyn.ui.browser.nodes diff --git a/org.simantics.sysdyn.ui/adapters.xml b/org.simantics.sysdyn.ui/adapters.xml index edbfeb08..4986006c 100644 --- a/org.simantics.sysdyn.ui/adapters.xml +++ b/org.simantics.sysdyn.ui/adapters.xml @@ -10,5 +10,5 @@ VTT Technical Research Centre of Finland - initial API and implementation --> - none 0 fill 1 + none 0 fill 1 \ No newline at end of file diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements2/profiles/SimulationPlaybackStyle.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements2/profiles/SimulationPlaybackStyle.java new file mode 100644 index 00000000..26aa3682 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements2/profiles/SimulationPlaybackStyle.java @@ -0,0 +1,127 @@ +package org.simantics.sysdyn.ui.elements2.profiles; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ObjectsWithType; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.diagram.profile.StyleBase; +import org.simantics.diagram.stubs.G2DResource; +import org.simantics.diagram.synchronization.graph.DiagramGraphUtil; +import org.simantics.issues.ontology.IssueResource; +import org.simantics.layer0.Layer0; +import org.simantics.modeling.ModelingResources; +import org.simantics.scenegraph.INode; +import org.simantics.scenegraph.g2d.nodes.ShapeNode; +import org.simantics.scenegraph.profile.EvaluationContext; +import org.simantics.scenegraph.profile.Observer; +import org.simantics.scenegraph.profile.common.ProfileVariables; +import org.simantics.scenegraph.utils.GeometryUtils; +import org.simantics.scenegraph.utils.NodeUtil; +import org.simantics.sysdyn.SysdynResource; + +public class SimulationPlaybackStyle extends StyleBase { + + public static class A extends ShapeNode { + + private static final long serialVersionUID = -5273246617906214956L; + + @Override + public Rectangle2D getBoundsInLocal() { + return null; + } + + @Override + public Rectangle2D getBoundsInLocal(boolean b) { + return null; + } + + @Override + public Rectangle2D getBounds() { + return null; + } + + } + + @Override + public AffineTransform calculateStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource element, Variable configuration) throws DatabaseException { +// TODO: Get results from variable +// DiagramResource dr = DiagramResource.getInstance(graph); +// String rvi = graph.getPossibleRelatedValue(runtimeDiagram, dr.RuntimeDiagram_HasRVI, Bindings.STRING); + + Layer0 l0 = Layer0.getInstance(graph); + SysdynResource sr = SysdynResource.getInstance(graph); + ModelingResources mr = ModelingResources.getInstance(graph); + IssueResource issue = IssueResource.getInstance(graph); + + Resource component = graph.getPossibleObject(element, mr.ElementToComponent); + if (component == null) + return null; + + Resource config = graph.getPossibleObject(component, l0.PartOf); + + Resource model = graph.getPossibleObject(config, l0.PartOf); + if(!graph.isInstanceOf(model, sr.SysdynModel)) + return null; + + for(Resource i : graph.syncRequest(new ObjectsWithType(model, l0.ConsistsOf, issue.Issue))) { + System.out.println(NameUtils.getSafeName(graph, graph.getSingleObject(i, issue.HasIssueContext))); + if(graph.getSingleObject(i, issue.HasIssueContext).equals(component)) { + AffineTransform at = DiagramGraphUtil.getAffineTransform(graph, element, G2DResource.getInstance(graph).HasTransform, true); + return at; + } + } + + return null; +// String name = graph.getPossibleRelatedValue(config, l0.HasName, Bindings.STRING); +// if(name == null) +// return null; +// if(name.startsWith("A")) { +// AffineTransform at = DiagramGraphUtil.getAffineTransform(graph, element, G2DResource.getInstance(graph).HasTransform, true); +// return at; +// } else { +// return null; +// } + } + + @Override + public void styleResultChanged(Observer observer, Resource element, AffineTransform result) { + if (result != null) + values.put(element, result); + else + values.remove(element); + observer.update(); + } + + @Override + public void applyStyleForNode(EvaluationContext observer, INode _node, AffineTransform transform) { + if (transform != null) { + A node = ProfileVariables.claimChild(_node, "", "simulationPlaybackColour", A.class, observer); + if (node == null) + return; + + Rectangle2D expandedElementBounds = GeometryUtils.expandRectangle( NodeUtil.getLocalElementBounds(_node), 0.5 ); + node.setTransform(transform); + node.setZIndex(-1000); + node.setFill(true); + node.setColor(Color.LIGHT_GRAY); + node.setStroke(new BasicStroke(0.2f)); + node.setValue("shape", expandedElementBounds); + } else { + cleanupStyleForNode(_node); + } + } + + @Override + protected void cleanupStyleForNode(INode node) { + ProfileVariables.denyChild(node, "", "simulationPlaybackColour"); + } + +} + diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java index 088d67fe..05a1b500 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ModelUtils.java @@ -1,8 +1,5 @@ package org.simantics.sysdyn.ui.utils; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.UUID; import org.simantics.databoard.Bindings; @@ -13,7 +10,6 @@ import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.adapter.Template; import org.simantics.document.DocumentResource; -import org.simantics.issues.ontology.IssueResource; import org.simantics.layer0.Layer0; import org.simantics.layer0.utils.direct.GraphUtils; import org.simantics.modeling.ModelingResources; @@ -141,20 +137,8 @@ public class ModelUtils { } } - /* - IssueResource ISSUE = IssueResource.getInstance(g); - Resource sampleNote = g.newResource(); - g.claim(sampleNote, l0.InstanceOf, null, ISSUE.TextualIssue); - g.claimLiteral(sampleNote, l0.HasName, "sampleNote"); - g.claim(sampleNote, ISSUE.HasSeverity, ISSUE.Severity_Error); - g.claim(sampleNote, ISSUE.HasIssueContext, model); - g.claimLiteral(sampleNote, l0.HasLabel, "Test note", Bindings.STRING); - g.claimLiteral(sampleNote, l0.HasDescription, "= Test =\nThis is a test note.\n", Bindings.STRING); - DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); - String created = format.format(Calendar.getInstance().getTime()); - g.claimLiteral(sampleNote, ISSUE.HasCreationTime, created, Bindings.STRING); - g.claim(model, l0.ConsistsOf, sampleNote); - */ + ProfileEntries.createStandardProfiles(g, model); + } catch (DatabaseException e ) { diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ProfileEntries.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ProfileEntries.java new file mode 100644 index 00000000..d285d393 --- /dev/null +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ProfileEntries.java @@ -0,0 +1,46 @@ +package org.simantics.sysdyn.ui.utils; + +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.diagram.profile.Profiles; +import org.simantics.diagram.stubs.DiagramResource; +import org.simantics.layer0.Layer0; +import org.simantics.sysdyn.SysdynResource; + +public class ProfileEntries { + + public static Resource createWorkProfile(WriteGraph graph, String name) throws DatabaseException { + + SysdynResource sr = SysdynResource.getInstance(graph); + + return Profiles.createProfile(graph, name, + sr.Profiles_SimulationPlaybackColours); + + } + + public static void createStandardProfiles(WriteGraph graph, final Resource model) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + DiagramResource DIA = DiagramResource.getInstance(graph); + + final Resource a = createWorkProfile(graph, "A"); + + Resource plain = Profiles.createProfile(graph, "Plain"); + + graph.claim(model, DIA.HasProfile, plain); + graph.claim(model, L0.ConsistsOf, a); + graph.claim(model, L0.ConsistsOf, plain); + + // FIXME: add virtual graph write back once this is fixed: https://www.simulationsite.net/redmine/issues/3296 +// graph.sync(new WriteRequest(graph.getService(VirtualGraphSupport.class).getWorkspacePersistent("profiles")) { +// @Override +// public void perform(WriteGraph graph) throws DatabaseException { +// DiagramResource DIA = DiagramResource.getInstance(graph); + graph.claim(model, DIA.HasActiveProfile, plain); +// } +// }); + + } + +} 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 e7190584..828f722d 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 @@ -166,7 +166,7 @@ public class DependencyFunction { Resource issue = graph.newResource(); graph.claim(issue, L0.InstanceOf, null, ISSUE.Issue); graph.claim(issue, ISSUE.HasIssueContext, null, variable); - graph.claim(issue, ISSUE.HasSeverity, ISSUE.Severity_Error); + graph.claim(issue, ISSUE.HasSeverity, ISSUE.Severity_Warning); graph.claimLiteral(issue, L0.HasLabel, label, Bindings.STRING); graph.claimLiteral(issue, L0.HasName, UUID.randomUUID().toString(), Bindings.STRING); DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); -- 2.47.1