Implement MaterialHolder, a container for the Material objects loaded during processi...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Fri, 4 May 2012 20:11:33 +0000 (20:11 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Fri, 4 May 2012 20:11:33 +0000 (20:11 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@645 180e2498-e6e9-4542-8430-84ac67f01cd8

17 files changed:
core/src/net/sf/openrocket/preset/loader/BaseComponentLoader.java
core/src/net/sf/openrocket/preset/loader/BodyTubeLoader.java
core/src/net/sf/openrocket/preset/loader/BulkHeadLoader.java
core/src/net/sf/openrocket/preset/loader/CenteringRingLoader.java
core/src/net/sf/openrocket/preset/loader/EngineBlockLoader.java
core/src/net/sf/openrocket/preset/loader/LaunchLugLoader.java
core/src/net/sf/openrocket/preset/loader/LineMaterialColumnParser.java
core/src/net/sf/openrocket/preset/loader/MaterialColumnParser.java
core/src/net/sf/openrocket/preset/loader/MaterialHolder.java [new file with mode: 0644]
core/src/net/sf/openrocket/preset/loader/MaterialLoader.java
core/src/net/sf/openrocket/preset/loader/NoseConeLoader.java
core/src/net/sf/openrocket/preset/loader/ParachuteLoader.java
core/src/net/sf/openrocket/preset/loader/RocksimComponentFileTranslator.java
core/src/net/sf/openrocket/preset/loader/StreamerLoader.java
core/src/net/sf/openrocket/preset/loader/SurfaceMaterialColumnParser.java
core/src/net/sf/openrocket/preset/loader/TransitionLoader.java
core/src/net/sf/openrocket/preset/loader/TubeCouplerLoader.java

index 12a9404f1bb54ced47a4d50ec2715d3665debf2d..741b8969e75707d7697fa33860fc7174e2eea639 100644 (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>();
 
index 364dd86e3fb28c05e3dcb62be19e2416f806b22e..e0a2b127beeed60cb5aa174cac2239bf81cfd548 100644 (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));
index 0ebafa2880ddb5f54cd6f66c9724a15986fed968..9b8ed2a4c9ef44a0062a9c9c7d61ad09bc521546 100644 (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));
index 58cf49754f1f2a2e544597a73d160f86d575f1ce..d2232e2da6a5b5da9eef3f80ea39bbfcdd91c7d3 100644 (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);
        }
 
index bcdb0fe6b1159d097c43f714efc865b0e736ac4a..ae846995c68e43cc43ad3b4fd972e4e315ff6c94 100644 (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);
        }
 
index e0a295845f3473f493019f8c7304394dd0936fb5..033941104f6db37ea5437c3bec3d809c2b57baba 100644 (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));
index c888845e0a074f7676c1d46d2506e01719c9322d..009619c53225ca8d180e127283dd87717b5aa230 100644 (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);
 
        }
index 41f1ab209c0cd0c7af26ce02d42c9869ff6e484d..76bd57228271b0a3ca17ec693d991481874f6f5f 100644 (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);
                
        }
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 (file)
index 0000000..7ac2459
--- /dev/null
@@ -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;
+               
+       }
+}
index c8edaf6a9c3c264910f19322ff2229ee89af1464..5e3da79911a8ca75f27c64f39c498ddc95db5b0c 100644 (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);
                }
index 5e774a52684db18e8b61f01c18a598cbf6db0342..2edb8e4e0c24e619e08c27b91d8716236afae01d 100644 (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));
index 5e19796a61b54b3544679035d56e0552c50169b8..757d9c234533fe154a04e5358337bcda5a83bd70 100644 (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);
+       }
+
 }
index 4b3f08d5d32112a16498556b923563942f431577..cd57c5181347ae7c82dae5f2776c84864bb52bb5 100644 (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());
                
                {
index bc7905c5b166266fe81f94c7973280333471d29e..b66e27b2d99a87d2b1b9998a1c8f4ea366e5d876 100644 (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);
+       }
+
 }
index fc797fbd872c9ce8ef193725f05731781785d789..2dad9f0a8ac829e386b1cc63823ab98451696f52 100644 (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);
 
        }
index a8d2903835a226d61e0349ef2e98a3d886de4479..56f59c23e6e2713dd7ecc30d2b355c67b5402ed8 100644 (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));
index 615a00dfe7af89c2746a859dbc61366001ed1740..bdbdbfa5de61f604d31f390429033e3b2f75fbef 100644 (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);
        }