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); } } }