From 27ccc55df21f6a26a4ad91a712e11a5d586399bc Mon Sep 17 00:00:00 2001 From: lempinen Date: Mon, 11 Jul 2011 06:41:03 +0000 Subject: [PATCH] Use doubles from spreadsheets in variable equations: SheetName.Coordinate git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@21456 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 65277 -> 65501 bytes .../Sysdyn_ModelBrowser_Viewpoint.pgraph | 2 + org.simantics.sysdyn/META-INF/MANIFEST.MF | 4 +- .../sysdyn/modelica/ModelicaWriter.java | 9 +++ .../simantics/sysdyn/representation/Book.java | 35 ++++++++ .../representation/LoadRepresentation.java | 15 ++++ .../sysdyn/representation/Sheet.java | 75 ++++++++++++++++++ .../sysdyn/representation/SysdynSchema.java | 2 + .../representation/utils/IndexUtils.java | 2 + .../visitors/ElementVisitorVoidAdapter.java | 5 ++ .../visitors/IElementVisitorVoid.java | 2 + 11 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Book.java create mode 100644 org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index b633d258ad179412f8208215847fb2d1527fdadd..e417d414a4bd042c9bd2862f422d6bdb255da6c8 100644 GIT binary patch literal 65501 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

W4nm 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 BTS@=` literal 65277 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 PF+sN$TYeP&2mk&r?HK;4 diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph index 18248d92..4925976c 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn_ModelBrowser_Viewpoint.pgraph @@ -36,6 +36,8 @@ MBC VP.ChildContribution.HasChildNodeType SBC.BuiltinFunctions VP.ChildContribution.HasRule _ : VP.ConstantChildRule VP.ConstantChildRule.HasChild BuiltinFunctions + @VP.relationChildRule SBC.BuiltinFunctions L0.ConsistsOf SYSDYN.SysdynModelicaFunctionLibrary + @VP.relationChildRule SBC.BuiltinFunctions L0.ConsistsOf SYSDYN.SysdynModelicaFunction // Shared functions linked to a model @VP.relationChildRuleWithFolder SBC.FunctionsFolder L0.IsLinkedTo SYSDYN.SharedFunctionOntology SBC.SharedFunctionsFolder : VP.ResourceNodeType diff --git a/org.simantics.sysdyn/META-INF/MANIFEST.MF b/org.simantics.sysdyn/META-INF/MANIFEST.MF index f901e786..36314b58 100644 --- a/org.simantics.sysdyn/META-INF/MANIFEST.MF +++ b/org.simantics.sysdyn/META-INF/MANIFEST.MF @@ -22,7 +22,9 @@ Require-Bundle: org.simantics.objmap;bundle-version="0.1.0", org.simantics.diagram;bundle-version="1.1.1", org.simantics.diagram.ontology;bundle-version="1.1.1", org.simantics.scl.runtime;bundle-version="0.1.3", - org.simantics.db.layer0;bundle-version="1.1.0" + org.simantics.db.layer0;bundle-version="1.1.0", + org.simantics.spreadsheet.common;bundle-version="1.1.0", + org.simantics.spreadsheet;bundle-version="1.1.0" Export-Package: org.simantics.sysdyn, org.simantics.sysdyn.adapter, org.simantics.sysdyn.expressionParser, diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/modelica/ModelicaWriter.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/modelica/ModelicaWriter.java index d88a02a5..484e1955 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/modelica/ModelicaWriter.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/modelica/ModelicaWriter.java @@ -14,6 +14,7 @@ package org.simantics.sysdyn.modelica; import java.util.ArrayList; import java.util.HashMap; +import org.simantics.sysdyn.representation.Book; import org.simantics.sysdyn.representation.Configuration; import org.simantics.sysdyn.representation.Dependency; import org.simantics.sysdyn.representation.Enumeration; @@ -54,6 +55,7 @@ public class ModelicaWriter { ArrayList inputDependencies = new ArrayList(); ArrayList outputDependencies = new ArrayList(); HashMap> moduleInputs = new HashMap>(); + Book book = null; // Initialize lists for(IElement element : configuration.getElements()) { @@ -80,6 +82,8 @@ public class ModelicaWriter { } else if(dependency.getTail() instanceof Module){ inputDependencies.add(dependency); } + } else if (element instanceof Book) { + book = (Book)element; } } @@ -113,6 +117,11 @@ public class ModelicaWriter { b.append(e.getDeclaration()); } } + + if(book != null) { + b.append("// Spreadsheet definition\n"); + b.append(book.getBook()); + } boolean initialEquations = false; for(Stock stock : stocks) { diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Book.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Book.java new file mode 100644 index 00000000..17e1baa9 --- /dev/null +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Book.java @@ -0,0 +1,35 @@ +package org.simantics.sysdyn.representation; + +import java.util.ArrayList; +import java.util.List; + +import org.simantics.objmap.IMapping; +import org.simantics.objmap.annotations.GraphType; +import org.simantics.objmap.annotations.RelatedElements; +import org.simantics.sysdyn.representation.visitors.IElementVisitorVoid; + +@GraphType("http://www.simantics.org/Spreadsheet-1.0/Book") +public class Book implements IElement { + + @RelatedElements( + value = "http://www.simantics.org/Layer0-1.0/ConsistsOf", + composition = true) + private ArrayList sheets = new ArrayList(); + + @Override + public void accept(IElementVisitorVoid v) { + v.visit(this); + } + + public List getSheets() { + return sheets; + } + + public String getBook() { + StringBuilder book = new StringBuilder(); + for(Sheet sheet : sheets) + book.append(sheet.getCells()); + return book.toString(); + } + +} diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/LoadRepresentation.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/LoadRepresentation.java index edc18884..912f2e9b 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/LoadRepresentation.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/LoadRepresentation.java @@ -20,6 +20,21 @@ import org.simantics.objmap.IMapping; import org.simantics.objmap.Mappings; public class LoadRepresentation { + + public static IMapping loadMappedMapping(Session session, final Resource configuration) throws DatabaseException { + return session.syncRequest(new Read() { + + @Override + public IMapping perform(ReadGraph graph) + throws DatabaseException { + SysdynSchema schema = new SysdynSchema(graph); + IMapping mapping = Mappings.createWithoutListening(schema); + mapping.map(graph, configuration); + return mapping; + } + + }); + } public static Configuration loadConfiguration(Session session, final Resource configuration) throws DatabaseException { return session.syncRequest(new Read() { diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java new file mode 100644 index 00000000..e33b0f50 --- /dev/null +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java @@ -0,0 +1,75 @@ +package org.simantics.sysdyn.representation; + +import java.util.HashMap; + +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.mutable.Variant; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.exception.MissingVariableException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.objmap.annotations.GraphType; +import org.simantics.objmap.annotations.RelatedValue; +import org.simantics.objmap.annotations.UpdateMethod; +import org.simantics.spreadsheet.Range; +import org.simantics.spreadsheet.SheetVariables; +import org.simantics.spreadsheet.common.exception.CellParseException; +import org.simantics.spreadsheet.util.SpreadsheetUtils; + +@GraphType("http://www.simantics.org/Spreadsheet-1.0/Spreadsheet") +public class Sheet { + + @RelatedValue("http://www.simantics.org/Layer0-1.0/HasName") + protected String name; + + HashMap cells = new HashMap(); + + public String getSheet() { + return "Sheet"; + } + + @UpdateMethod + public boolean updateCells(ReadGraph g, Resource r) throws DatabaseException { + System.out.println("updating cells"); + Variable v = g.adapt(r, Variable.class); + cells.clear(); + for(Variable child : v.browseChildren(g)) { + String name = child.getPropertyValue(g, Variables.NAME); + try { + Range range = SpreadsheetUtils.decodeCellAbsolute(name); + Variant value = child.getPropertyValue(g, SheetVariables.CONTENT, Bindings.VARIANT); + cells.put(name, value.getValue()); + } catch (CellParseException e) { + } catch (MissingVariableException e) { + System.out.println("missing content for: " + name); + } + } + return true; + } + + public String getCells() { + StringBuilder clazz = new StringBuilder(); + + clazz.append(" class " + name + "_class\n "); + + int counter = 0; + for(String key : cells.keySet()) { + Object value = cells.get(key); + if(value instanceof Double) { + Double d = (Double)value; + clazz.append("constant Real " + key + " = " + d + "; "); + counter++; + if(counter > 10) { + counter = 0; + clazz.append("\n "); + } + } + } + clazz.append("\n end " + name + "_class;\n"); + clazz.append(" " + name + "_class " + name + ";\n"); + return clazz.toString(); + } + +} diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/SysdynSchema.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/SysdynSchema.java index 3614a667..5b95bc91 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/SysdynSchema.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/SysdynSchema.java @@ -51,6 +51,8 @@ public class SysdynSchema extends SimpleSchema { addLinkType(MappingSchemas.fromAnnotations(g, LookupExpression.class)); addLinkType(MappingSchemas.fromAnnotations(g, Redeclaration.class)); addLinkType(MappingSchemas.fromAnnotations(g, LibraryDummy.class)); + addLinkType(MappingSchemas.fromAnnotations(g, Book.class)); + addLinkType(MappingSchemas.fromAnnotations(g, Sheet.class)); } catch (DatabaseException e) { e.printStackTrace(); } catch (InstantiationException e) { diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java index a1693271..e2bfc7a0 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java @@ -41,6 +41,8 @@ public class IndexUtils { public static String rangeToIndexes(Variable variable, String range) { + if(variable == null) + return range; StringBuilder sb = new StringBuilder(); ArrayIndexes arrayIndexes = variable.getArrayIndexes(); if(arrayIndexes == null || range == null) diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/ElementVisitorVoidAdapter.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/ElementVisitorVoidAdapter.java index af988b5d..4ee889c1 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/ElementVisitorVoidAdapter.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/ElementVisitorVoidAdapter.java @@ -20,6 +20,7 @@ import org.simantics.sysdyn.representation.Flow; import org.simantics.sysdyn.representation.Input; import org.simantics.sysdyn.representation.LibraryDummy; import org.simantics.sysdyn.representation.Module; +import org.simantics.sysdyn.representation.Book; import org.simantics.sysdyn.representation.Stock; import org.simantics.sysdyn.representation.Valve; @@ -68,4 +69,8 @@ public class ElementVisitorVoidAdapter implements IElementVisitorVoid { @Override public void visit(LibraryDummy libraryDummy) { } + + @Override + public void visit(Book sheet) { + } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/IElementVisitorVoid.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/IElementVisitorVoid.java index 9c7e5504..89899f15 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/IElementVisitorVoid.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/visitors/IElementVisitorVoid.java @@ -20,6 +20,7 @@ import org.simantics.sysdyn.representation.Flow; import org.simantics.sysdyn.representation.Input; import org.simantics.sysdyn.representation.LibraryDummy; import org.simantics.sysdyn.representation.Module; +import org.simantics.sysdyn.representation.Book; import org.simantics.sysdyn.representation.Stock; import org.simantics.sysdyn.representation.Valve; @@ -36,4 +37,5 @@ public interface IElementVisitorVoid { void visit(Configuration configuration); void visit(Enumeration enumeration); void visit(LibraryDummy libraryDummy); + void visit(Book sheet); } -- 2.47.1