--- /dev/null
+package org.simantics.datatypes;\r
+\r
+import java.io.File;\r
+import java.io.PrintStream;\r
+import java.io.UnsupportedEncodingException;\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+import java.net.URLDecoder;\r
+import java.util.ArrayList;\r
+\r
+public class SIGenerator {\r
+\r
+ public static class Unit {\r
+ \r
+ public String name;\r
+ public String shorthand;\r
+ \r
+ public Unit(String name, String shorthand) {\r
+ this.name = name;\r
+ this.shorthand = shorthand;\r
+ }\r
+ \r
+ public Unit withPrefix(String namePrefix, String shorthandPrefix) {\r
+ return new Unit(namePrefix+name, shorthandPrefix+shorthand);\r
+ }\r
+ \r
+ }\r
+ \r
+ public static final Unit[] baseUnits = {\r
+ new Unit("Metre", "m"),\r
+ // Easier this way..\r
+ new Unit("gram", "g"),\r
+ new Unit("Second", "s"),\r
+ new Unit("Ampere", "A"),\r
+ new Unit("Kelvin", "K"),\r
+ new Unit("Candela", "cd"),\r
+ new Unit("Mole", "mol"),\r
+ };\r
+ \r
+ public static final Unit[] baseUnitsPrefixed = prefix(baseUnits);\r
+ \r
+ public static final Unit[] derivedUnits = {\r
+ new Unit("Hertz", "hz"),\r
+ new Unit("Radian", "rad"),\r
+ new Unit("Steradian", "sr"),\r
+ new Unit("Newton", "N"),\r
+ new Unit("Pascal", "Pa"),\r
+ new Unit("Joule", "J"),\r
+ new Unit("Watt", "W"),\r
+ new Unit("Coulomb", "C"),\r
+ new Unit("Volt", "V"),\r
+ new Unit("Farad", "F"),\r
+ new Unit("Ohm", "ohm"),\r
+ new Unit("Siemens", "S"),\r
+ new Unit("Weber", "Wb"),\r
+ new Unit("Tesla", "T"),\r
+ new Unit("Henry", "H"),\r
+ new Unit("Celsius", "C"),\r
+ new Unit("Lumen", "lm"),\r
+ new Unit("Lux", "lx"),\r
+ new Unit("Becquerel", "Bq"),\r
+ new Unit("Gray", "Gy"),\r
+ new Unit("Sievert", "Sv"),\r
+ new Unit("Katal", "kat")\r
+ };\r
+\r
+ public static final Unit[] derivedUnitsPrefixed = prefix(derivedUnits);\r
+\r
+ public static final Unit[] scalableCompoundUnits = {\r
+ new Unit("gramPerSecond", "g/s"),\r
+ new Unit("gramPerLitre", "g/l"),\r
+ new Unit("gramPerCubicMetre", "g/m3"),\r
+ new Unit("NewtonPerMetre", "N/m"),\r
+ new Unit("JoulePerKilogram", "J/kg"),\r
+ new Unit("MetrePerSecond", "m/s"),\r
+ new Unit("MolePerLitre", "mol/l"),\r
+ new Unit("MolePerKilogram", "mol/kg"),\r
+ };\r
+\r
+ public static final Unit[] scalableCompoundUnitsPrefixed = prefix(scalableCompoundUnits);\r
+\r
+ public static final Unit[] compoundUnits = {\r
+ new Unit("SquareMetre", "m2"),\r
+ new Unit("CubicMetre", "m3"),\r
+ };\r
+\r
+ public static final Unit[] specials = {\r
+ new Unit("MassPercentage", "w-%"),\r
+ new Unit("Percentage", "%"),\r
+ new Unit("Degree", "deg"),\r
+ new Unit("Minute", "min"),\r
+ new Unit("Hour", "h"),\r
+ new Unit("Litre", "l"),\r
+ };\r
+ \r
+ static Unit[] prefix(Unit[] units) {\r
+ ArrayList<Unit> result = new ArrayList<Unit>();\r
+ for(Unit unit : units) {\r
+ result.add(unit.withPrefix("Tera", "T"));\r
+ result.add(unit.withPrefix("Giga", "G"));\r
+ result.add(unit.withPrefix("Mega", "M"));\r
+ result.add(unit.withPrefix("Kilo", "k"));\r
+ result.add(unit.withPrefix("Hecto", "h"));\r
+ result.add(unit.withPrefix("", ""));\r
+ result.add(unit.withPrefix("Centi", "c"));\r
+ result.add(unit.withPrefix("Milli", "m"));\r
+ result.add(unit.withPrefix("Micro", "u"));\r
+ }\r
+ return result.toArray(new Unit[result.size()]);\r
+ }\r
+ \r
+ static void print(PrintStream out, Unit unit) {\r
+ out.println("SI." + unit.name + " <T SI.Unit");\r
+ out.println("SI." + unit.name + ".Double <T L0.Double");\r
+ out.println(" @L0.assert L0.HasDataType $Double(unit=\"" + unit.shorthand + "\")");\r
+ out.println("SI." + unit.name + ".Float <T L0.Float");\r
+ out.println(" @L0.assert L0.HasDataType $Float(unit=\"" + unit.shorthand + "\")");\r
+ out.println("");\r
+ }\r
+ \r
+ static void create(File path) {\r
+ \r
+ try {\r
+\r
+ PrintStream out = new PrintStream(path + "/graph/SI.pgraph");\r
+ out.println("L0 = <http://www.simantics.org/Layer0-1.1>");\r
+ out.println("DATA = <http://www.simantics.org/Datatypes-1.1>");\r
+ out.println("SI = DATA.SI : L0.Library");\r
+ out.println(" L0.HasResourceClass \"org.simantics.datatypes.SIResource\"");\r
+ out.println("");\r
+ out.println("SI.Unit <T L0.Entity");\r
+ out.println("");\r
+ out.println("// SI base units");\r
+ out.println("");\r
+ \r
+ for(Unit unit : baseUnitsPrefixed) {\r
+ print(out, unit);\r
+ }\r
+\r
+ out.println("// SI derived units");\r
+ out.println("");\r
+\r
+ for(Unit unit : derivedUnitsPrefixed) {\r
+ print(out, unit);\r
+ }\r
+\r
+ out.println("// SI scalable compound units");\r
+ out.println("");\r
+\r
+ for(Unit unit : scalableCompoundUnitsPrefixed) {\r
+ print(out, unit);\r
+ }\r
+ \r
+ out.println("// SI compound units");\r
+ out.println("");\r
+\r
+ for(Unit unit : compoundUnits) {\r
+ print(out, unit);\r
+ }\r
+\r
+ out.println("// Special units");\r
+ out.println("");\r
+\r
+ for(Unit unit : specials) {\r
+ print(out, unit);\r
+ }\r
+ \r
+ } catch (Exception e) {\r
+ \r
+ }\r
+ \r
+ }\r
+ \r
+ public static void main(String[] args) {\r
+ \r
+ URL classLocation = SIGenerator.class.getResource(".");\r
+ if (classLocation != null) {\r
+ if (classLocation.getProtocol().equals("file")) {\r
+ try {\r
+ URL resource = new URL(classLocation, "../../../..");\r
+ File path = new File(URLDecoder.decode(resource.getPath(), "UTF-8"));\r
+ System.err.println("path=" + path.getAbsolutePath());\r
+ create(path);\r
+ } catch (MalformedURLException e) {\r
+ e.printStackTrace();\r
+ } catch (UnsupportedEncodingException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+}\r