From 34a4558c0c17a0881db00ee6dcc84238b4e1f600 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Fri, 4 May 2012 20:11:33 +0000 Subject: [PATCH] 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. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@645 180e2498-e6e9-4542-8430-84ac67f01cd8 --- .../preset/loader/BaseComponentLoader.java | 2 +- .../preset/loader/BodyTubeLoader.java | 2 +- .../preset/loader/BulkHeadLoader.java | 5 +- .../preset/loader/CenteringRingLoader.java | 5 +- .../preset/loader/EngineBlockLoader.java | 5 +- .../preset/loader/LaunchLugLoader.java | 5 +- .../loader/LineMaterialColumnParser.java | 15 +--- .../preset/loader/MaterialColumnParser.java | 12 ++- .../preset/loader/MaterialHolder.java | 90 +++++++++++++++++++ .../preset/loader/MaterialLoader.java | 18 ++-- .../preset/loader/NoseConeLoader.java | 5 +- .../preset/loader/ParachuteLoader.java | 24 +++-- .../RocksimComponentFileTranslator.java | 2 +- .../preset/loader/StreamerLoader.java | 25 ++++-- .../loader/SurfaceMaterialColumnParser.java | 19 +--- .../preset/loader/TransitionLoader.java | 2 +- .../preset/loader/TubeCouplerLoader.java | 2 +- 17 files changed, 159 insertions(+), 79 deletions(-) create mode 100644 core/src/net/sf/openrocket/preset/loader/MaterialHolder.java diff --git a/core/src/net/sf/openrocket/preset/loader/BaseComponentLoader.java b/core/src/net/sf/openrocket/preset/loader/BaseComponentLoader.java index 12a9404f..741b8969 100644 --- a/core/src/net/sf/openrocket/preset/loader/BaseComponentLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/BaseComponentLoader.java @@ -14,7 +14,7 @@ public abstract class BaseComponentLoader extends RocksimComponentFileLoader { List presets; - public BaseComponentLoader(Map materials) { + public BaseComponentLoader(MaterialHolder materials) { super(); presets = new ArrayList(); diff --git a/core/src/net/sf/openrocket/preset/loader/BodyTubeLoader.java b/core/src/net/sf/openrocket/preset/loader/BodyTubeLoader.java index 364dd86e..e0a2b127 100644 --- a/core/src/net/sf/openrocket/preset/loader/BodyTubeLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/BodyTubeLoader.java @@ -8,7 +8,7 @@ import net.sf.openrocket.preset.ComponentPreset.Type; public class BodyTubeLoader extends BaseComponentLoader { - public BodyTubeLoader(Map 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)); diff --git a/core/src/net/sf/openrocket/preset/loader/BulkHeadLoader.java b/core/src/net/sf/openrocket/preset/loader/BulkHeadLoader.java index 0ebafa28..9b8ed2a4 100644 --- a/core/src/net/sf/openrocket/preset/loader/BulkHeadLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/BulkHeadLoader.java @@ -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 materials) { + public BulkHeadLoader(MaterialHolder materials) { super(materials); fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH)); diff --git a/core/src/net/sf/openrocket/preset/loader/CenteringRingLoader.java b/core/src/net/sf/openrocket/preset/loader/CenteringRingLoader.java index 58cf4975..d2232e2d 100644 --- a/core/src/net/sf/openrocket/preset/loader/CenteringRingLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/CenteringRingLoader.java @@ -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 materials) { + public CenteringRingLoader(MaterialHolder materials) { super(materials); } diff --git a/core/src/net/sf/openrocket/preset/loader/EngineBlockLoader.java b/core/src/net/sf/openrocket/preset/loader/EngineBlockLoader.java index bcdb0fe6..ae846995 100644 --- a/core/src/net/sf/openrocket/preset/loader/EngineBlockLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/EngineBlockLoader.java @@ -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 materials) { + public EngineBlockLoader(MaterialHolder materials) { super(materials); } diff --git a/core/src/net/sf/openrocket/preset/loader/LaunchLugLoader.java b/core/src/net/sf/openrocket/preset/loader/LaunchLugLoader.java index e0a29584..03394110 100644 --- a/core/src/net/sf/openrocket/preset/loader/LaunchLugLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/LaunchLugLoader.java @@ -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 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)); diff --git a/core/src/net/sf/openrocket/preset/loader/LineMaterialColumnParser.java b/core/src/net/sf/openrocket/preset/loader/LineMaterialColumnParser.java index c888845e..009619c5 100644 --- a/core/src/net/sf/openrocket/preset/loader/LineMaterialColumnParser.java +++ b/core/src/net/sf/openrocket/preset/loader/LineMaterialColumnParser.java @@ -9,11 +9,11 @@ import net.sf.openrocket.preset.TypedPropertyMap; public class LineMaterialColumnParser extends BaseColumnParser { - private Map materialMap = Collections.emptyMap(); + private final MaterialHolder materialMap; private final TypedKey param; - public LineMaterialColumnParser(Map materialMap, String columnName, TypedKey param) { + public LineMaterialColumnParser(MaterialHolder materialMap, String columnName, TypedKey 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); } diff --git a/core/src/net/sf/openrocket/preset/loader/MaterialColumnParser.java b/core/src/net/sf/openrocket/preset/loader/MaterialColumnParser.java index 41f1ab20..76bd5722 100644 --- a/core/src/net/sf/openrocket/preset/loader/MaterialColumnParser.java +++ b/core/src/net/sf/openrocket/preset/loader/MaterialColumnParser.java @@ -10,17 +10,17 @@ import net.sf.openrocket.preset.TypedPropertyMap; public class MaterialColumnParser extends BaseColumnParser { - private Map materialMap = Collections.emptyMap(); + private final MaterialHolder materialMap; private final TypedKey param; - public MaterialColumnParser(Map materialMap, String columnName, TypedKey param) { + public MaterialColumnParser(MaterialHolder materialMap, String columnName, TypedKey param) { super(columnName); this.param = param; this.materialMap = materialMap; } - public MaterialColumnParser(Map 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); } diff --git a/core/src/net/sf/openrocket/preset/loader/MaterialHolder.java b/core/src/net/sf/openrocket/preset/loader/MaterialHolder.java new file mode 100644 index 00000000..7ac24592 --- /dev/null +++ b/core/src/net/sf/openrocket/preset/loader/MaterialHolder.java @@ -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 bulkMaterials = new HashMap(); + + private final Map surfaceMaterials = new HashMap(); + + private final Map lineMaterials = new HashMap(); + + 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 values() { + + HashSet allMats = new HashSet(); + allMats.addAll( bulkMaterials.values() ); + allMats.addAll( surfaceMaterials.values() ); + allMats.addAll( lineMaterials.values() ); + + return allMats; + + } +} diff --git a/core/src/net/sf/openrocket/preset/loader/MaterialLoader.java b/core/src/net/sf/openrocket/preset/loader/MaterialLoader.java index c8edaf6a..5e3da799 100644 --- a/core/src/net/sf/openrocket/preset/loader/MaterialLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/MaterialLoader.java @@ -10,7 +10,7 @@ import net.sf.openrocket.util.BugException; public class MaterialLoader extends RocksimComponentFileLoader { - private Map materialMap = new HashMap(); + private MaterialHolder materialMap = new MaterialHolder(); private final static TypedKey MATERIALNAME = new TypedKey("MaterialName", String.class); private final static TypedKey UNITS = new TypedKey("Units", String.class); @@ -28,7 +28,7 @@ public class MaterialLoader extends RocksimComponentFileLoader { return RocksimComponentFileType.MATERIAL; } - public Map 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); } diff --git a/core/src/net/sf/openrocket/preset/loader/NoseConeLoader.java b/core/src/net/sf/openrocket/preset/loader/NoseConeLoader.java index 5e774a52..2edb8e4e 100644 --- a/core/src/net/sf/openrocket/preset/loader/NoseConeLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/NoseConeLoader.java @@ -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 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)); diff --git a/core/src/net/sf/openrocket/preset/loader/ParachuteLoader.java b/core/src/net/sf/openrocket/preset/loader/ParachuteLoader.java index 5e19796a..757d9c23 100644 --- a/core/src/net/sf/openrocket/preset/loader/ParachuteLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/ParachuteLoader.java @@ -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 materialMap; - - public ParachuteLoader(Map 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); + } + } diff --git a/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileTranslator.java b/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileTranslator.java index 4b3f08d5..cd57c518 100644 --- a/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileTranslator.java +++ b/core/src/net/sf/openrocket/preset/loader/RocksimComponentFileTranslator.java @@ -43,7 +43,7 @@ public class RocksimComponentFileTranslator { MaterialLoader mats = new MaterialLoader(); mats.load(); - Map materialMap = mats.getMaterialMap(); + MaterialHolder materialMap = mats.getMaterialMap(); System.err.println("\tMaterial types loaded: " + materialMap.size()); { diff --git a/core/src/net/sf/openrocket/preset/loader/StreamerLoader.java b/core/src/net/sf/openrocket/preset/loader/StreamerLoader.java index bc7905c5..b66e27b2 100644 --- a/core/src/net/sf/openrocket/preset/loader/StreamerLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/StreamerLoader.java @@ -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 materialMap; - - public StreamerLoader(Map 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); + } + } diff --git a/core/src/net/sf/openrocket/preset/loader/SurfaceMaterialColumnParser.java b/core/src/net/sf/openrocket/preset/loader/SurfaceMaterialColumnParser.java index fc797fbd..2dad9f0a 100644 --- a/core/src/net/sf/openrocket/preset/loader/SurfaceMaterialColumnParser.java +++ b/core/src/net/sf/openrocket/preset/loader/SurfaceMaterialColumnParser.java @@ -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 materialMap = Collections.emptyMap(); + private final MaterialHolder materialMap; private final TypedKey param; - public SurfaceMaterialColumnParser(Map materialMap, String columnName, TypedKey param) { + public SurfaceMaterialColumnParser(MaterialHolder materialMap, String columnName, TypedKey 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); } diff --git a/core/src/net/sf/openrocket/preset/loader/TransitionLoader.java b/core/src/net/sf/openrocket/preset/loader/TransitionLoader.java index a8d29038..56f59c23 100644 --- a/core/src/net/sf/openrocket/preset/loader/TransitionLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/TransitionLoader.java @@ -8,7 +8,7 @@ import net.sf.openrocket.preset.ComponentPreset.Type; public class TransitionLoader extends NoseConeLoader { - public TransitionLoader(Map 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)); diff --git a/core/src/net/sf/openrocket/preset/loader/TubeCouplerLoader.java b/core/src/net/sf/openrocket/preset/loader/TubeCouplerLoader.java index 615a00df..bdbdbfa5 100644 --- a/core/src/net/sf/openrocket/preset/loader/TubeCouplerLoader.java +++ b/core/src/net/sf/openrocket/preset/loader/TubeCouplerLoader.java @@ -8,7 +8,7 @@ import net.sf.openrocket.preset.ComponentPreset.Type; public class TubeCouplerLoader extends BodyTubeLoader { - public TubeCouplerLoader(Map materials) { + public TubeCouplerLoader(MaterialHolder materials) { super(materials); } -- 2.39.2