1 package net.sf.openrocket.database;
3 import net.sf.openrocket.l10n.Translator;
4 import net.sf.openrocket.logging.LogHelper;
5 import net.sf.openrocket.material.Material;
6 import net.sf.openrocket.material.MaterialStorage;
7 import net.sf.openrocket.startup.Application;
8 import net.sf.openrocket.util.MathUtil;
12 * A class that contains single instances of {@link Database} for specific purposes.
14 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
16 public class Databases {
17 private static final LogHelper log = Application.getLogger();
18 private static final Translator trans = Application.getTranslator();
20 /* Static implementations of specific databases: */
23 * A database of bulk materials (with bulk densities).
25 public static final Database<Material> BULK_MATERIAL = new Database<Material>();
27 * A database of surface materials (with surface densities).
29 public static final Database<Material> SURFACE_MATERIAL = new Database<Material>();
31 * A database of linear material (with length densities).
33 public static final Database<Material> LINE_MATERIAL = new Database<Material>();
39 // Add default materials
40 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Acrylic"), 1190, false));
41 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Aluminum"), 2700, false));
42 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Balsa"), 170, false));
43 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Basswood"), 500, false));
44 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Birch"), 670, false));
45 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Brass"), 8600, false));
46 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Cardboard"), 680, false));
47 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Carbonfiber"), 1780, false));
48 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Cork"), 240, false));
49 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.DepronXPS"), 40, false));
50 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Fiberglass"), 1850, false));
51 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Kraftphenolic"), 950, false));
52 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Maple"), 755, false));
53 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Paperoffice"), 820, false));
54 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Pine"), 530, false));
55 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Plywoodbirch"), 630, false));
56 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.PolycarbonateLexan"), 1200, false));
57 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Polystyrene"), 1050, false));
58 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.PVC"), 1390, false));
59 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Spruce"), 450, false));
60 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Steel"), 7850, false));
61 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.StyrofoamgenericEPS"), 20, false));
62 // BULK_MATERIAL.add(new Material.Bulk("Styrofoam (Blue foam, XPS)", 32, false));
63 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.StyrofoamBluefoamXPS"), 32, false));
64 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Titanium"), 4500, false));
65 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.Quantumtubing"), 1050, false));
66 BULK_MATERIAL.add(new Material.Bulk(trans.get("Databases.materials.BlueTube"), 1300, false));
68 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Ripstopnylon"), 0.067, false));
69 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Mylar"), 0.021, false));
70 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Polyethylenethin"), 0.015, false));
71 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Polyethyleneheavy"), 0.040, false));
72 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Silk"), 0.060, false));
73 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Paperoffice"), 0.080, false));
74 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Cellophane"), 0.018, false));
75 SURFACE_MATERIAL.add(new Material.Surface(trans.get("Databases.materials.Crepepaper"), 0.025, false));
77 //// Thread (heavy-duty)
78 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Threadheavy-duty"), 0.0003, false));
79 //// Elastic cord (round 2mm, 1/16 in)
80 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordround2mm"), 0.0018, false));
81 //// Elastic cord (flat 6mm, 1/4 in)
82 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat6mm"), 0.0043, false));
83 //// Elastic cord (flat 12mm, 1/2 in)
84 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat12mm"), 0.008, false));
85 //// Elastic cord (flat 19mm, 3/4 in)
86 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat19mm"), 0.0012, false));
87 //// Elastic cord (flat 25mm, 1 in)
88 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Elasticcordflat25mm"), 0.0016, false));
89 //// Braided nylon (2 mm, 1/16 in)
90 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Braidednylon2mm"), 0.001, false));
91 //// Braided nylon (3 mm, 1/8 in)
92 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Braidednylon3mm"), 0.0035, false));
93 //// Tubular nylon (11 mm, 7/16 in)
94 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon11mm"), 0.013, false));
95 //// Tubular nylon (14 mm, 9/16 in)
96 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon14mm"), 0.016, false));
97 //// Tubular nylon (25 mm, 1 in)
98 LINE_MATERIAL.add(new Material.Line(trans.get("Databases.materials.Tubularnylon25mm"), 0.029, false));
101 // Add user-defined materials
102 for (Material m : Application.getPreferences().getUserMaterials()) {
103 switch (m.getType()) {
105 LINE_MATERIAL.add(m);
109 SURFACE_MATERIAL.add(m);
113 BULK_MATERIAL.add(m);
117 log.warn("ERROR: Unknown material type " + m);
121 // Add database storage listener
122 MaterialStorage listener = new MaterialStorage();
123 LINE_MATERIAL.addDatabaseListener(listener);
124 SURFACE_MATERIAL.addDatabaseListener(listener);
125 BULK_MATERIAL.addDatabaseListener(listener);
130 * Used just for ensuring initialization of the class.
132 public static void fakeMethod() {
138 * Find a material from the database with the specified type and name. Returns
139 * <code>null</code> if the specified material could not be found.
141 * @param type the material type.
142 * @param name the material name in the database.
143 * @return the material, or <code>null</code> if not found.
145 public static Material findMaterial(Material.Type type, String name) {
146 Database<Material> db;
152 db = SURFACE_MATERIAL;
158 throw new IllegalArgumentException("Illegal material type: " + type);
161 for (Material m : db) {
162 if (m.getName().equalsIgnoreCase(name)) {
171 * Find a material from the database or return a new material if the specified
172 * material with the specified density is not found.
174 * @param type the material type.
175 * @param name the material name.
176 * @param density the density of the material.
177 * @param userDefined whether a newly created material should be user-defined.
178 * @return the material object from the database or a new material.
180 public static Material findMaterial(Material.Type type, String name, double density,
181 boolean userDefined) {
182 Database<Material> db;
188 db = SURFACE_MATERIAL;
194 throw new IllegalArgumentException("Illegal material type: " + type);
197 for (Material m : db) {
198 if (m.getName().equalsIgnoreCase(name) && MathUtil.equals(m.getDensity(), density)) {
202 return Material.newMaterial(type, name, density, userDefined);