DGP - Fix to non-bulk densities
This commit is contained in:
parent
c2b5dd705f
commit
84533440d3
@ -34,17 +34,17 @@ public abstract class BaseHandler<C extends RocketComponent> extends ElementHand
|
|||||||
* The material name.
|
* The material name.
|
||||||
*/
|
*/
|
||||||
private String materialName = "";
|
private String materialName = "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The SAX method called when the closing element tag is reached.
|
* The SAX method called when the closing element tag is reached.
|
||||||
*
|
*
|
||||||
* @param element the element name.
|
* @param element the element name.
|
||||||
* @param attributes attributes of the element.
|
* @param attributes attributes of the element.
|
||||||
* @param content the textual content of the element.
|
* @param content the textual content of the element.
|
||||||
* @param warnings the warning set to store warnings in.
|
* @param warnings the warning set to store warnings in.
|
||||||
* @throws SAXException
|
* @throws SAXException
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings)
|
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings)
|
||||||
throws SAXException {
|
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);
|
mass = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
|
||||||
}
|
}
|
||||||
if ("Density".equals(element)) {
|
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)) {
|
if ("KnownCG".equals(element)) {
|
||||||
cg = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_LENGTH);
|
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.
|
* Override the mass and Cg of the component.
|
||||||
*
|
*
|
||||||
* @param component the component
|
* @param component the component
|
||||||
* @param override true if any override should happen
|
* @param override true if any override should happen
|
||||||
* @param mass the override mass
|
* @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.
|
* 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
|
* @param theCG the CG value to really use when overriding CG on the OpenRocket component
|
||||||
*/
|
*/
|
||||||
protected void setCG(double theCG) {
|
protected void setCG(double theCG) {
|
||||||
cg = theCG;
|
cg = theCG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the material name as specified in the Rocksim design file.
|
* Set the material name as specified in the Rocksim design file.
|
||||||
*
|
*
|
||||||
* @param content the material name
|
* @param content the material name
|
||||||
*/
|
*/
|
||||||
protected void setMaterialName(String content) {
|
protected void setMaterialName(String content) {
|
||||||
materialName = content;
|
materialName = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a custom material based on the density.
|
* Create a custom material based on the density.
|
||||||
*
|
*
|
||||||
* @param type the type of the material
|
* @param type the type of the material
|
||||||
* @param name the name of the component
|
* @param name the name of the component
|
||||||
* @param density the density in g/cm^3
|
* @param density the density in g/cm^3
|
||||||
*
|
*
|
||||||
* @return a Material instance
|
* @return a Material instance
|
||||||
*/
|
*/
|
||||||
public static Material createCustomMaterial(Material.Type type, String name, double density) {
|
public static Material createCustomMaterial(Material.Type type, String name, double density) {
|
||||||
return Material.newMaterial(type, "RS: " + name, density, true);
|
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
|
* 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.
|
* 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 component the component who's material is to be seta
|
||||||
* @param name the method name
|
* @param name the method name
|
||||||
* @param args the class types of the parameters
|
* @param args the class types of the parameters
|
||||||
*
|
*
|
||||||
* @return the Method instance, or null
|
* @return the Method instance, or null
|
||||||
*/
|
*/
|
||||||
private static Method getMethod(RocketComponent component, String name, Class[] args) {
|
private static Method getMethod(RocketComponent component, String name, Class[] args) {
|
||||||
|
@ -134,13 +134,13 @@ class FinSetHandler extends ElementHandler {
|
|||||||
* The Rocksim calculated cg.
|
* The Rocksim calculated cg.
|
||||||
*/
|
*/
|
||||||
private Double calcCg = 0d;
|
private Double calcCg = 0d;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param c the parent
|
* @param c the parent
|
||||||
*
|
*
|
||||||
* @throws IllegalArgumentException thrown if <code>c</code> is null
|
* @throws IllegalArgumentException thrown if <code>c</code> is null
|
||||||
*/
|
*/
|
||||||
public FinSetHandler(RocketComponent c) throws IllegalArgumentException {
|
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);
|
mass = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
|
||||||
}
|
}
|
||||||
if ("Density".equals(element)) {
|
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)) {
|
if ("KnownCG".equals(element)) {
|
||||||
cg = Math.max(0d, Double.parseDouble(content) / RocksimHandler.ROCKSIM_TO_OPENROCKET_MASS);
|
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:
|
* @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>
|
* <pre>x0,y0|x1,y1|x2,y2|... </pre>
|
||||||
* @param warnings the warning set to convey incompatibilities to the user
|
* @param warnings the warning set to convey incompatibilities to the user
|
||||||
*
|
*
|
||||||
* @return an array of OpenRocket Coordinates
|
* @return an array of OpenRocket Coordinates
|
||||||
*/
|
*/
|
||||||
private Coordinate[] toCoordinates(String pointList, WarningSet warnings) {
|
private Coordinate[] toCoordinates(String pointList, WarningSet warnings) {
|
||||||
@ -339,7 +339,7 @@ class FinSetHandler extends ElementHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!result.isEmpty()) {
|
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 array.
|
||||||
Coordinate last = result.get(result.size() - 1);
|
Coordinate last = result.get(result.size() - 1);
|
||||||
if (last.x == 0 && last.y == 0) {
|
if (last.x == 0 && last.y == 0) {
|
||||||
@ -370,6 +370,6 @@ class FinSetHandler extends ElementHandler {
|
|||||||
return FinSet.CrossSection.SQUARE;
|
return FinSet.CrossSection.SQUARE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ class ParachuteHandler extends PositionDependentHandler<Parachute> {
|
|||||||
* The shroud line density.
|
* The shroud line density.
|
||||||
*/
|
*/
|
||||||
private double shroudLineDensity = 0.0d;
|
private double shroudLineDensity = 0.0d;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
@ -82,7 +82,7 @@ class ParachuteHandler extends PositionDependentHandler<Parachute> {
|
|||||||
warnings.add("Parachute spill holes are not supported. Ignoring.");
|
warnings.add("Parachute spill holes are not supported. Ignoring.");
|
||||||
}
|
}
|
||||||
if ("ShroudLineMassPerMM".equals(element)) {
|
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)) {
|
if ("ShroudLineMaterial".equals(element)) {
|
||||||
chute.setLineMaterial(BaseHandler.createCustomMaterial(Material.Type.LINE, content, shroudLineDensity));
|
chute.setLineMaterial(BaseHandler.createCustomMaterial(Material.Type.LINE, content, shroudLineDensity));
|
||||||
|
@ -36,9 +36,19 @@ public class RocksimHandler extends ElementHandler {
|
|||||||
public static final int ROCKSIM_TO_OPENROCKET_MASS = 1000;
|
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.
|
* Radius conversion. Rocksim is always in diameters, OpenRocket mostly in radius.
|
||||||
@ -210,7 +220,7 @@ class RocketDesignHandler extends ElementHandler {
|
|||||||
@Override
|
@Override
|
||||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
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.
|
* rocket defines stage '2' as the initial booster with stage '3' sitting atop it. And so on.
|
||||||
*/
|
*/
|
||||||
if ("Stage3Parts".equals(element)) {
|
if ("Stage3Parts".equals(element)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user