Implement MaterialHolder, a container for the Material objects loaded during processing of rocksim csv files. Added logic to streamer and parachutes so it can produce a SURFACE material if the csv file specified a BULK material and thickness.

This commit is contained in:
Kevin Ruland 2012-05-04 20:11:33 +00:00
parent 4eea3292b6
commit 0a199d73c3
17 changed files with 159 additions and 79 deletions

View File

@ -14,7 +14,7 @@ public abstract class BaseComponentLoader extends RocksimComponentFileLoader {
List<ComponentPreset> presets;
public BaseComponentLoader(Map<String, Material> materials) {
public BaseComponentLoader(MaterialHolder materials) {
super();
presets = new ArrayList<ComponentPreset>();

View File

@ -8,7 +8,7 @@ import net.sf.openrocket.preset.ComponentPreset.Type;
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));

View File

@ -1,15 +1,12 @@
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));

View File

@ -1,14 +1,11 @@
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);
}

View File

@ -1,14 +1,11 @@
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);
}

View File

@ -1,14 +1,11 @@
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));

View File

@ -9,11 +9,11 @@ import net.sf.openrocket.preset.TypedPropertyMap;
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;
@ -27,16 +27,9 @@ public class LineMaterialColumnParser extends BaseColumnParser {
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);
}

View File

@ -10,17 +10,17 @@ import net.sf.openrocket.preset.TypedPropertyMap;
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);
}
@ -32,10 +32,8 @@ public class MaterialColumnParser extends BaseColumnParser {
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);
}

View File

@ -0,0 +1,90 @@
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;
}
}

View File

@ -10,7 +10,7 @@ import net.sf.openrocket.util.BugException;
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);
@ -28,7 +28,7 @@ public class MaterialLoader extends RocksimComponentFileLoader {
return RocksimComponentFileType.MATERIAL;
}
public Map<String, Material> getMaterialMap() {
public MaterialHolder getMaterialMap() {
return materialMap;
}
@ -41,19 +41,19 @@ public class MaterialLoader extends RocksimComponentFileLoader {
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);
}

View File

@ -1,15 +1,12 @@
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));

View File

@ -1,18 +1,17 @@
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));
@ -34,4 +33,17 @@ public class ParachuteLoader extends BaseComponentLoader {
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);
}
}

View File

@ -43,7 +43,7 @@ public class RocksimComponentFileTranslator {
MaterialLoader mats = new MaterialLoader();
mats.load();
Map<String, Material> materialMap = mats.getMaterialMap();
MaterialHolder materialMap = mats.getMaterialMap();
System.err.println("\tMaterial types loaded: " + materialMap.size());
{

View File

@ -1,18 +1,17 @@
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));
@ -31,4 +30,18 @@ public class StreamerLoader extends BaseComponentLoader {
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);
}
}

View File

@ -1,19 +1,16 @@
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;
@ -27,16 +24,8 @@ public class SurfaceMaterialColumnParser extends BaseColumnParser {
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);
}

View File

@ -8,7 +8,7 @@ import net.sf.openrocket.preset.ComponentPreset.Type;
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));

View File

@ -8,7 +8,7 @@ import net.sf.openrocket.preset.ComponentPreset.Type;
public class TubeCouplerLoader extends BodyTubeLoader {
public TubeCouplerLoader(Map<String, Material> materials) {
public TubeCouplerLoader(MaterialHolder materials) {
super(materials);
}