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