1 package net.sf.openrocket.preset.loader;
3 import java.util.HashMap;
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;
11 public class MaterialLoader extends RocksimComponentFileLoader {
13 private Map<String,Material> materialMap = new HashMap<String,Material>();
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);
19 public MaterialLoader() {
21 fileColumns.add( new StringColumnParser("Material Name", MATERIALNAME) );
22 fileColumns.add( new StringColumnParser("Units", UNITS));
23 fileColumns.add( new DoubleColumnParser("Density", DENSITY));
27 protected RocksimComponentFileType getFileType() {
28 return RocksimComponentFileType.MATERIAL;
31 public Map<String, Material> getMaterialMap() {
36 protected void postProcess(TypedPropertyMap props) {
37 String name = props.get(MATERIALNAME);
38 String unit = props.get(UNITS);
39 double density = props.get(DENSITY);
41 String cleanedMaterialName = stripAll(name, '"').trim();
43 if ( "g/cm".equals( unit ) ) {
44 materialMap.put( cleanedMaterialName, new Material.Line(cleanedMaterialName, 0.1d * density, true));
45 } else if ( "g/cm2".equals(unit) ) {
46 materialMap.put( cleanedMaterialName, new Material.Surface(cleanedMaterialName, 10.0d * density, true));
47 } else if ( "g/cm3".equals(unit) ) {
48 materialMap.put( cleanedMaterialName, new Material.Bulk(cleanedMaterialName, 1000.0d * density, true));
49 } else if ( "kg/m3".equals(unit) ) {
50 materialMap.put( cleanedMaterialName, new Material.Bulk(cleanedMaterialName, density, true));
51 } else if ( "lb/ft3".equals(unit) ) {
52 materialMap.put( cleanedMaterialName, new Material.Bulk(cleanedMaterialName, 16.0184634d * density, true));
53 } else if ( "oz/in".equals(unit) ) {
54 materialMap.put( cleanedMaterialName, new Material.Line(cleanedMaterialName, 1.11612296d * density, true));
55 } else if ( "oz/in2".equals(unit ) ) {
56 materialMap.put( cleanedMaterialName, new Material.Surface(cleanedMaterialName, 43.94184876d * density, true));
58 throw new BugException("Unknown unit in Materials file: " + unit);