List<ComponentPreset> presets;
- public BaseComponentLoader(Map<String, Material> materials) {
+ public BaseComponentLoader(MaterialHolder materials) {
super();
presets = new ArrayList<ComponentPreset>();
public class BodyTubeLoader extends BaseComponentLoader {
- public BodyTubeLoader(Map<String, Material> materials) {
+ public BodyTubeLoader(MaterialHolder materials) {
super(materials);
fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER));
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
-import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
import net.sf.openrocket.preset.TypedPropertyMap;
public class BulkHeadLoader extends BaseComponentLoader {
- public BulkHeadLoader(Map<String, Material> materials) {
+ public BulkHeadLoader(MaterialHolder materials) {
super(materials);
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
-import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
public class CenteringRingLoader extends BodyTubeLoader {
- public CenteringRingLoader(Map<String, Material> materials) {
+ public CenteringRingLoader(MaterialHolder materials) {
super(materials);
}
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
-import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
public class EngineBlockLoader extends BodyTubeLoader {
- public EngineBlockLoader(Map<String, Material> materials) {
+ public EngineBlockLoader(MaterialHolder materials) {
super(materials);
}
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
-import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
public class LaunchLugLoader extends BaseComponentLoader {
- public LaunchLugLoader(Map<String, Material> materials) {
+ public LaunchLugLoader(MaterialHolder materials) {
super(materials);
fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER));
public class LineMaterialColumnParser extends BaseColumnParser {
- private Map<String,Material> materialMap = Collections.<String,Material>emptyMap();
+ private final MaterialHolder materialMap;
private final TypedKey<Material> param;
- public LineMaterialColumnParser(Map<String,Material> materialMap, String columnName, TypedKey<Material> param) {
+ public LineMaterialColumnParser(MaterialHolder materialMap, String columnName, TypedKey<Material> param) {
super(columnName);
this.param = param;
this.materialMap = materialMap;
return;
}
- Material.Line myMaterial;
+ Material.Line myMaterial = new Material.Line(columnData, 0.0, true);
- Material m = materialMap.get(columnData);
-
- if ( m == null || m.getType() != Material.Type.LINE ) {
- myMaterial = new Material.Line(columnData, 0.0, true);
- } else {
- myMaterial =(Material.Line) m;
- }
-
+ myMaterial = materialMap.getLineMaterial(myMaterial);
props.put(param, myMaterial);
}
public class MaterialColumnParser extends BaseColumnParser {
- private Map<String,Material> materialMap = Collections.<String,Material>emptyMap();
+ private final MaterialHolder materialMap;
private final TypedKey<Material> param;
- public MaterialColumnParser(Map<String,Material> materialMap, String columnName, TypedKey<Material> param) {
+ public MaterialColumnParser(MaterialHolder materialMap, String columnName, TypedKey<Material> param) {
super(columnName);
this.param = param;
this.materialMap = materialMap;
}
- public MaterialColumnParser(Map<String,Material> materialMap) {
+ public MaterialColumnParser(MaterialHolder materialMap) {
this(materialMap, "Material", ComponentPreset.MATERIAL);
}
return;
}
- Material m = materialMap.get(columnData);
- if ( m == null ) {
- m = new Material.Bulk(columnData, 0.0, true);
- }
+ Material.Bulk m = new Material.Bulk(columnData, 0.0, true);
+ m = materialMap.getBulkMaterial(m);
props.put(param, m);
}
--- /dev/null
+package net.sf.openrocket.preset.loader;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import net.sf.openrocket.material.Material;
+import net.sf.openrocket.unit.UnitGroup;
+
+public class MaterialHolder {
+
+ private final Map<String,Material.Bulk> bulkMaterials = new HashMap<String,Material.Bulk>();
+
+ private final Map<String,Material.Surface> surfaceMaterials = new HashMap<String,Material.Surface>();
+
+ private final Map<String, Material.Line> lineMaterials = new HashMap<String,Material.Line>();
+
+ public void put( Material material ) {
+ switch ( material.getType() ) {
+ case BULK:
+ bulkMaterials.put(material.getName(), (Material.Bulk) material);
+ break;
+ case SURFACE:
+ surfaceMaterials.put(material.getName(), (Material.Surface) material);
+ break;
+ case LINE:
+ lineMaterials.put(material.getName(), (Material.Line) material);
+ break;
+ }
+ }
+
+ public Material.Bulk getBulkMaterial( Material.Bulk material ) {
+ Material.Bulk m = bulkMaterials.get( material.getName() );
+ return (m==null) ? material : m;
+ }
+
+ public Material.Surface getSurfaceMaterial( Material.Surface material, Double thickness ) {
+ Material.Surface m = surfaceMaterials.get(material.getName() );
+ if ( m != null ) {
+ return m;
+ }
+ // Try to see if we can convert a bulk material.
+ if ( thickness == null ) {
+ // if we have no thickness, there is nothing we can do
+ return material;
+ }
+ String thicknessName = UnitGroup.UNITS_LENGTH.getUnit("mm").toString(thickness);
+ String convertedMaterialName = material.getName() + "(" + thicknessName + ")";
+ m = surfaceMaterials.get(convertedMaterialName);
+ if ( m != null ) {
+ return m;
+ }
+ Material.Bulk bulk = bulkMaterials.get(material.getName() );
+
+ if ( bulk == null ) {
+ return material;
+ }
+
+ // Ok, now we have a thickness and a bulk material of the correct name,
+ // we can make our own surface material.
+
+ Material.Surface surface = new Material.Surface( convertedMaterialName, bulk.getDensity() * thickness , true);
+
+ this.put(surface);
+
+ return surface;
+
+ }
+
+ public Material.Line getLineMaterial( Material.Line material ) {
+ Material.Line m = lineMaterials.get( material.getName() );
+ return (m==null) ? material : m;
+ }
+
+ public int size() {
+ return bulkMaterials.size() + surfaceMaterials.size() + lineMaterials.size();
+ }
+
+ public Collection<Material> values() {
+
+ HashSet<Material> allMats = new HashSet<Material>();
+ allMats.addAll( bulkMaterials.values() );
+ allMats.addAll( surfaceMaterials.values() );
+ allMats.addAll( lineMaterials.values() );
+
+ return allMats;
+
+ }
+}
public class MaterialLoader extends RocksimComponentFileLoader {
- private Map<String,Material> materialMap = new HashMap<String,Material>();
+ 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);
return RocksimComponentFileType.MATERIAL;
}
- public Map<String, Material> getMaterialMap() {
+ public MaterialHolder getMaterialMap() {
return materialMap;
}
String cleanedMaterialName = stripAll(name, '"').trim();
if ( "g/cm".equals( unit ) ) {
- materialMap.put( cleanedMaterialName, new Material.Line(cleanedMaterialName, 0.1d * density, true));
+ materialMap.put( new Material.Line(cleanedMaterialName, 0.1d * density, true));
} else if ( "g/cm2".equals(unit) ) {
- materialMap.put( cleanedMaterialName, new Material.Surface(cleanedMaterialName, 10.0d * density, true));
+ materialMap.put( new Material.Surface(cleanedMaterialName, 10.0d * density, true));
} else if ( "g/cm3".equals(unit) ) {
- materialMap.put( cleanedMaterialName, new Material.Bulk(cleanedMaterialName, 1000.0d * density, true));
+ materialMap.put( new Material.Bulk(cleanedMaterialName, 1000.0d * density, true));
} else if ( "kg/m3".equals(unit) ) {
- materialMap.put( cleanedMaterialName, new Material.Bulk(cleanedMaterialName, density, true));
+ materialMap.put( new Material.Bulk(cleanedMaterialName, density, true));
} else if ( "lb/ft3".equals(unit) ) {
- materialMap.put( cleanedMaterialName, new Material.Bulk(cleanedMaterialName, 16.0184634d * density, true));
+ materialMap.put( new Material.Bulk(cleanedMaterialName, 16.0184634d * density, true));
} else if ( "oz/in".equals(unit) ) {
- materialMap.put( cleanedMaterialName, new Material.Line(cleanedMaterialName, 1.11612296d * density, true));
+ materialMap.put( new Material.Line(cleanedMaterialName, 1.11612296d * density, true));
} else if ( "oz/in2".equals(unit ) ) {
- materialMap.put( cleanedMaterialName, new Material.Surface(cleanedMaterialName, 43.94184876d * density, true));
+ materialMap.put( new Material.Surface(cleanedMaterialName, 43.94184876d * density, true));
} else {
throw new BugException("Unknown unit in Materials file: " + unit);
}
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
-import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
import net.sf.openrocket.preset.TypedPropertyMap;
public class NoseConeLoader extends BaseComponentLoader {
- public NoseConeLoader(Map<String, Material> materials) {
+ public NoseConeLoader(MaterialHolder materials) {
super(materials);
fileColumns.add(new DoubleUnitColumnParser("Outer Dia","Units",ComponentPreset.AFT_OUTER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
+import net.sf.openrocket.preset.TypedPropertyMap;
public class ParachuteLoader extends BaseComponentLoader {
- Map<String,Material> materialMap;
-
- public ParachuteLoader(Map<String, Material> materials) {
+ private final MaterialHolder materials;
+
+ public ParachuteLoader(MaterialHolder materials) {
super(materials);
- this.materialMap = materials;
+ this.materials = materials;
fileColumns.add(new IntegerColumnParser("n sides", ComponentPreset.SIDES));
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.DIAMETER));
fileColumns.add(new IntegerColumnParser("Shroud Count", ComponentPreset.LINE_COUNT));
return RocksimComponentFileType.PARACHUTE;
}
+
+ @Override
+ protected void postProcess(TypedPropertyMap props) {
+ super.postProcess(props);
+
+ // Fix the material since some files use bulk materials for streamers.
+ Double thickness = props.get( ComponentPreset.THICKNESS );
+ Material.Surface material = (Material.Surface) props.get( ComponentPreset.MATERIAL );
+
+ material = materials.getSurfaceMaterial(material, thickness);
+ props.put(ComponentPreset.MATERIAL, material);
+ }
+
}
MaterialLoader mats = new MaterialLoader();
mats.load();
- Map<String, Material> materialMap = mats.getMaterialMap();
+ MaterialHolder materialMap = mats.getMaterialMap();
System.err.println("\tMaterial types loaded: " + materialMap.size());
{
package net.sf.openrocket.preset.loader;
-import java.util.Map;
-
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type;
+import net.sf.openrocket.preset.TypedPropertyMap;
public class StreamerLoader extends BaseComponentLoader {
- Map<String,Material> materialMap;
-
- public StreamerLoader(Map<String, Material> materials) {
+ private final MaterialHolder materials;
+
+ public StreamerLoader(MaterialHolder materials) {
super(materials);
- this.materialMap = materials;
+ this.materials = materials;
fileColumns.add(new SurfaceMaterialColumnParser(materials,"Material",ComponentPreset.MATERIAL));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));
fileColumns.add(new DoubleUnitColumnParser("Width","Units",ComponentPreset.WIDTH));
return RocksimComponentFileType.STREAMER;
}
+
+ @Override
+ protected void postProcess(TypedPropertyMap props) {
+ super.postProcess(props);
+
+ // Fix the material since some files use bulk materials for streamers.
+ Double thickness = props.get( ComponentPreset.THICKNESS );
+ Material.Surface material = (Material.Surface) props.get( ComponentPreset.MATERIAL );
+
+ material = materials.getSurfaceMaterial(material, thickness);
+
+ props.put(ComponentPreset.MATERIAL, material);
+ }
+
}
package net.sf.openrocket.preset.loader;
-import java.util.Collections;
-import java.util.Map;
-
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.TypedKey;
import net.sf.openrocket.preset.TypedPropertyMap;
public class SurfaceMaterialColumnParser extends BaseColumnParser {
- private Map<String,Material> materialMap = Collections.<String,Material>emptyMap();
+ private final MaterialHolder materialMap;
private final TypedKey<Material> param;
- public SurfaceMaterialColumnParser(Map<String,Material> materialMap, String columnName, TypedKey<Material> param) {
+ public SurfaceMaterialColumnParser(MaterialHolder materialMap, String columnName, TypedKey<Material> param) {
super(columnName);
this.param = param;
this.materialMap = materialMap;
return;
}
- Material.Surface myMaterial;
-
- Material m = materialMap.get(columnData);
-
- if ( m == null || m.getType() != Material.Type.SURFACE ) {
- myMaterial = new Material.Surface(columnData, 0.0, true);
- } else {
- myMaterial =(Material.Surface) m;
- }
-
+ Material.Surface myMaterial = new Material.Surface(columnData, 0.0, true);
+ myMaterial = materialMap.getSurfaceMaterial(myMaterial, null);
props.put(param, myMaterial);
}
public class TransitionLoader extends NoseConeLoader {
- public TransitionLoader(Map<String, Material> materials) {
+ public TransitionLoader(MaterialHolder materials) {
super(materials);
fileColumns.add(new DoubleUnitColumnParser("Front Insert Len","Units",ComponentPreset.FORE_SHOULDER_LENGTH));
fileColumns.add(new DoubleUnitColumnParser("Front Insert OD","Units",ComponentPreset.FORE_SHOULDER_DIAMETER));
public class TubeCouplerLoader extends BodyTubeLoader {
- public TubeCouplerLoader(Map<String, Material> materials) {
+ public TubeCouplerLoader(MaterialHolder materials) {
super(materials);
}