Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / preset / loader / MaterialLoader.java
diff --git a/core/src/net/sf/openrocket/preset/loader/MaterialLoader.java b/core/src/net/sf/openrocket/preset/loader/MaterialLoader.java
new file mode 100644 (file)
index 0000000..b7ef55b
--- /dev/null
@@ -0,0 +1,62 @@
+package net.sf.openrocket.preset.loader;
+
+import java.io.File;
+
+import net.sf.openrocket.database.Databases;
+import net.sf.openrocket.material.Material;
+import net.sf.openrocket.preset.TypedKey;
+import net.sf.openrocket.preset.TypedPropertyMap;
+import net.sf.openrocket.util.BugException;
+
+public class MaterialLoader extends RocksimComponentFileLoader {
+       
+       private MaterialHolder materialMap = new MaterialHolder();
+       
+       private final static TypedKey<String> MATERIALNAME = new TypedKey<String>("MaterialName", String.class);
+       private final static TypedKey<String> UNITS = new TypedKey<String>("Units", String.class);
+       private final static TypedKey<Double> DENSITY = new TypedKey<Double>("Density", Double.class);
+       
+       public MaterialLoader(File theBasePathToLoadFrom) {
+               super(theBasePathToLoadFrom);
+               fileColumns.add(new StringColumnParser("Material Name", MATERIALNAME));
+               fileColumns.add(new StringColumnParser("Units", UNITS));
+               fileColumns.add(new DoubleColumnParser("Density", DENSITY));
+       }
+       
+       @Override
+       protected RocksimComponentFileType getFileType() {
+               return RocksimComponentFileType.MATERIAL;
+       }
+       
+       public MaterialHolder getMaterialMap() {
+               return materialMap;
+       }
+       
+       @Override
+       protected void postProcess(TypedPropertyMap props) {
+               String name = props.get(MATERIALNAME);
+               String unit = props.get(UNITS);
+               double density = props.get(DENSITY);
+               
+               String cleanedMaterialName = stripAll(name, '"').trim();
+               
+               if ("g/cm".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.LINE, cleanedMaterialName, 0.1d * density));
+               } else if ("g/cm2".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.SURFACE, cleanedMaterialName, 10.0d * density));
+               } else if ("g/cm3".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.BULK, cleanedMaterialName, 1000.0d * density));
+               } else if ("kg/m3".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.BULK, cleanedMaterialName, density));
+               } else if ("lb/ft3".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.BULK, cleanedMaterialName, 16.0184634d * density));
+               } else if ("oz/in".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.LINE, cleanedMaterialName, 1.11612296d * density));
+               } else if ("oz/in2".equals(unit)) {
+                       materialMap.put(Databases.findMaterial(Material.Type.SURFACE, cleanedMaterialName, 43.94184876d * density));
+               } else {
+                       throw new BugException("Unknown unit in Materials file: " + unit);
+               }
+       }
+       
+}
\ No newline at end of file