79081eb4fec377a5e5eda459e9aa8375795ba34b
[debian/openrocket] / core / src / net / sf / openrocket / preset / loader / MaterialLoader.java
1 package net.sf.openrocket.preset.loader;
2
3 import net.sf.openrocket.material.Material;
4 import net.sf.openrocket.preset.TypedKey;
5 import net.sf.openrocket.preset.TypedPropertyMap;
6 import net.sf.openrocket.util.BugException;
7
8 import java.io.File;
9
10 public class MaterialLoader extends RocksimComponentFileLoader {
11
12         private MaterialHolder materialMap = new MaterialHolder();
13
14         private final static TypedKey<String> MATERIALNAME = new TypedKey<String>("MaterialName", String.class);
15         private final static TypedKey<String> UNITS = new TypedKey<String>("Units", String.class);
16         private final static TypedKey<Double> DENSITY = new TypedKey<Double>("Density", Double.class);
17
18         public MaterialLoader(File theBasePathToLoadFrom) {
19                 super(theBasePathToLoadFrom);
20                 fileColumns.add( new StringColumnParser("Material Name", MATERIALNAME) );
21                 fileColumns.add( new StringColumnParser("Units", UNITS));
22                 fileColumns.add( new DoubleColumnParser("Density", DENSITY));
23         }
24
25         @Override
26         protected RocksimComponentFileType getFileType() {
27                 return RocksimComponentFileType.MATERIAL;
28         }
29
30         public MaterialHolder getMaterialMap() {
31                 return materialMap;
32         }
33
34         @Override
35         protected void postProcess(TypedPropertyMap props) {
36                 String name = props.get(MATERIALNAME);
37                 String unit = props.get(UNITS);
38                 double density = props.get(DENSITY);
39
40                 String cleanedMaterialName = stripAll(name, '"').trim();
41
42                 if ( "g/cm".equals( unit ) ) {
43                         materialMap.put( new Material.Line(cleanedMaterialName, 0.1d * density, true));
44                 } else if ( "g/cm2".equals(unit) ) {
45                         materialMap.put( new Material.Surface(cleanedMaterialName, 10.0d * density, true));
46                 } else if ( "g/cm3".equals(unit) ) {
47                         materialMap.put( new Material.Bulk(cleanedMaterialName, 1000.0d * density, true));
48                 } else if ( "kg/m3".equals(unit) ) {
49                         materialMap.put( new Material.Bulk(cleanedMaterialName, density, true));
50                 } else if ( "lb/ft3".equals(unit) ) {
51                         materialMap.put( new Material.Bulk(cleanedMaterialName, 16.0184634d * density, true));
52                 } else if ( "oz/in".equals(unit) ) {
53                         materialMap.put( new Material.Line(cleanedMaterialName, 1.11612296d * density, true));
54                 } else if ( "oz/in2".equals(unit ) ) {
55                         materialMap.put( new Material.Surface(cleanedMaterialName, 43.94184876d * density, true));
56                 } else {
57                         throw new BugException("Unknown unit in Materials file: " + unit);
58                 }
59         }
60
61 }