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:
parent
4eea3292b6
commit
0a199d73c3
@ -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>();
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
90
core/src/net/sf/openrocket/preset/loader/MaterialHolder.java
Normal file
90
core/src/net/sf/openrocket/preset/loader/MaterialHolder.java
Normal 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;
|
||||
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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());
|
||||
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user