1 package net.sf.openrocket.preset.loader;
3 import java.util.Collection;
4 import java.util.HashMap;
5 import java.util.HashSet;
9 import net.sf.openrocket.database.Database;
10 import net.sf.openrocket.database.Databases;
11 import net.sf.openrocket.material.Material;
12 import net.sf.openrocket.unit.UnitGroup;
14 public class MaterialHolder {
16 private final Map<String, Material.Bulk> bulkMaterials = new HashMap<String, Material.Bulk>();
18 private final Map<String, Material.Surface> surfaceMaterials = new HashMap<String, Material.Surface>();
20 private final Map<String, Material.Line> lineMaterials = new HashMap<String, Material.Line>();
22 public MaterialHolder() {
25 public MaterialHolder(List<Material> materials) {
26 if (materials == null) {
29 for (Material material : materials) {
34 public void put(Material material) {
35 switch (material.getType()) {
37 bulkMaterials.put(material.getName(), (Material.Bulk) material);
40 surfaceMaterials.put(material.getName(), (Material.Surface) material);
43 lineMaterials.put(material.getName(), (Material.Line) material);
48 public Material getMaterial(Material material) {
49 switch (material.getType()) {
51 return getBulkMaterial((Material.Bulk) material);
53 return getSurfaceMaterial((Material.Surface) material, null);
55 return getLineMaterial((Material.Line) material);
61 public Material.Bulk getBulkMaterial(Material.Bulk material) {
62 Material.Bulk m = bulkMaterials.get(material.getName());
66 public Material.Surface getSurfaceMaterial(Material.Surface material, Double thickness) {
67 Material.Surface m = surfaceMaterials.get(material.getName());
71 // Try to see if we can convert a bulk material.
72 if (thickness == null) {
73 // if we have no thickness, there is nothing we can do
76 String thicknessName = UnitGroup.UNITS_LENGTH.getUnit("mm").toString(thickness);
77 String convertedMaterialName = material.getName() + "(" + thicknessName + ")";
78 m = surfaceMaterials.get(convertedMaterialName);
82 Material.Bulk bulk = bulkMaterials.get(material.getName());
88 // Ok, now we have a thickness and a bulk material of the correct name,
89 // we can make our own surface material.
91 Material.Surface surface = (Material.Surface) Databases.findMaterial(Material.Type.SURFACE, convertedMaterialName, bulk.getDensity() * thickness);
99 public Material.Line getLineMaterial(Material.Line material) {
100 Material.Line m = lineMaterials.get(material.getName());
105 return bulkMaterials.size() + surfaceMaterials.size() + lineMaterials.size();
108 public Collection<Material> values() {
110 HashSet<Material> allMats = new HashSet<Material>();
111 allMats.addAll(bulkMaterials.values());
112 allMats.addAll(surfaceMaterials.values());
113 allMats.addAll(lineMaterials.values());
119 public Database<Material> asDatabase(Material.Type theType) {
120 Database<Material> result = new Database<Material>();
123 result.addAll(lineMaterials.values());
126 result.addAll(surfaceMaterials.values());
130 result.addAll(bulkMaterials.values());