DGP - Fix to non-bulk densities

This commit is contained in:
Doug Pedrick 2010-03-17 03:22:45 +00:00
parent c2b5dd705f
commit 84533440d3
4 changed files with 49 additions and 22 deletions

View File

@ -34,17 +34,17 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
* The material name.
*/
private String materialName = "";
/**
* The SAX method called when the closing element tag is reached.
*
*
* @param element the element name.
* @param attributes attributes of the element.
* @param content the textual content of the element.
* @param warnings the warning set to store warnings in.
* @throws SAXException
*/
@Override
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings)
throws SAXException {
@ -57,7 +57,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
mass = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
}
if ("Density".equals(element)) {
density = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_DENSITY);
density = Math.max(0d, Double.parseDouble(content) / getDensityConversion());
}
if ("KnownCG".equals(element)) {
cg = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_LENGTH);
@ -102,7 +102,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
/**
* Override the mass and Cg of the component.
*
*
* @param component the component
* @param override true if any override should happen
* @param mass the override mass
@ -134,35 +134,52 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
/**
* Some CG positions in Rocksim do not correspond to the CG position reference in OpenRocket.
*
*
* @param theCG the CG value to really use when overriding CG on the OpenRocket component
*/
protected void setCG(double theCG) {
cg = theCG;
}
/**
* Set the material name as specified in the Rocksim design file.
*
*
* @param content the material name
*/
protected void setMaterialName(String content) {
materialName = content;
}
/**
* Create a custom material based on the density.
*
* @param type the type of the material
* @param name the name of the component
* @param density the density in g/cm^3
*
*
* @return a Material instance
*/
public static Material createCustomMaterial(Material.Type type, String name, double density) {
return Material.newMaterial(type, "RS: " + name, density, true);
}
/**
* Get the appropriate density conversion for different types of materials.
*
* @return a conversion value that is assumed to be in Rocksim Units / OpenRocket Units
*/
private double getDensityConversion() {
switch (getMaterialType()) {
case LINE:
return RocksimHandler.ROCKSIM_TO_OPENROCKET_LINE_DENSITY;
case SURFACE:
return RocksimHandler.ROCKSIM_TO_OPENROCKET_SURFACE_DENSITY;
case BULK:
default:
return RocksimHandler.ROCKSIM_TO_OPENROCKET_BULK_DENSITY;
}
}
/**
* Set the material onto an instance of RocketComponent. This is done because only some subtypes of RocketComponent
* have the setMaterial method. Unfortunately the supertype cannot be used.
@ -189,7 +206,7 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
* @param component the component who's material is to be seta
* @param name the method name
* @param args the class types of the parameters
*
*
* @return the Method instance, or null
*/
private static Method getMethod(RocketComponent component, String name, Class[] args) {

View File

@ -134,13 +134,13 @@ class FinSetHandler extends ElementHandler {
* The Rocksim calculated cg.
*/
private Double calcCg = 0d;
/**
* Constructor.
*
* @param c the parent
*
*
* @throws IllegalArgumentException thrown if <code>c</code> is null
*/
public FinSetHandler(RocketComponent c) throws IllegalArgumentException {
@ -220,7 +220,7 @@ class FinSetHandler extends ElementHandler {
mass = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
}
if ("Density".equals(element)) {
density = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_DENSITY);
density = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_BULK_DENSITY);
}
if ("KnownCG".equals(element)) {
cg = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
@ -314,7 +314,7 @@ class FinSetHandler extends ElementHandler {
* @param pointList a comma and pipe delimited string of X,Y coordinates from Rocksim. This is of the format:
* <pre>x0,y0|x1,y1|x2,y2|... </pre>
* @param warnings the warning set to convey incompatibilities to the user
*
*
* @return an array of OpenRocket Coordinates
*/
private Coordinate[] toCoordinates(String pointList, WarningSet warnings) {
@ -339,7 +339,7 @@ class FinSetHandler extends ElementHandler {
}
}
if (!result.isEmpty()) {
//OpenRocket requires fin plan points be ordered from leading root chord to trailing root chord in the
//OpenRocket requires fin plan points be ordered from leading root chord to trailing root chord in the
//Coordinate array.
Coordinate last = result.get(result.size() - 1);
if (last.x == 0 && last.y == 0) {
@ -370,6 +370,6 @@ class FinSetHandler extends ElementHandler {
return FinSet.CrossSection.SQUARE;
}
}
}

View File

@ -28,7 +28,7 @@ class ParachuteHandler extends PositionDependentHandler<Parachute> {
* The shroud line density.
*/
private double shroudLineDensity = 0.0d;
/**
* Constructor.
*
@ -82,7 +82,7 @@ class ParachuteHandler extends PositionDependentHandler<Parachute> {
warnings.add("Parachute spill holes are not supported. Ignoring.");
}
if ("ShroudLineMassPerMM".equals(element)) {
shroudLineDensity = Double.parseDouble(content) * 10d/ RocksimHandler.ROCKSIM_TO_OPENROCKET_DENSITY;
shroudLineDensity = Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_LINE_DENSITY;
}
if ("ShroudLineMaterial".equals(element)) {
chute.setLineMaterial(BaseHandler.createCustomMaterial(Material.Type.LINE, content, shroudLineDensity));

View File

@ -36,9 +36,19 @@ public class RocksimHandler extends ElementHandler {
public static final int ROCKSIM_TO_OPENROCKET_MASS = 1000;
/**
* Density conversion. Rocksim is in milligrams/cubic centimeter, OpenRocket in grams/cubic centimeter.
* Bulk Density conversion. Rocksim is in kilograms/cubic meter, OpenRocket in kilograms/cubic meter.
*/
public static final int ROCKSIM_TO_OPENROCKET_DENSITY = 1;
public static final int ROCKSIM_TO_OPENROCKET_BULK_DENSITY = 1;
/**
* Surface Density conversion. Rocksim is in grams/sq centimeter, OpenRocket in kilograms/sq meter. 1000/(100*100) = 1/10
*/
public static final double ROCKSIM_TO_OPENROCKET_SURFACE_DENSITY = 1/10d;
/**
* Line Density conversion. Rocksim is in kilograms/meter, OpenRocket in kilograms/meter.
*/
public static final int ROCKSIM_TO_OPENROCKET_LINE_DENSITY = 1;
/**
* Radius conversion. Rocksim is always in diameters, OpenRocket mostly in radius.
@ -210,7 +220,7 @@ class RocketDesignHandler extends ElementHandler {
@Override
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
/**
* In Rocksim stages are from the top down, so a single stage rocket is actually stage '3'. A 2-stage
* In Rocksim stages are from the top down, so a single stage rocket is actually stage '3'. A 2-stage
* rocket defines stage '2' as the initial booster with stage '3' sitting atop it. And so on.
*/
if ("Stage3Parts".equals(element)) {