import net.sf.openrocket.material.Material;
import net.sf.openrocket.motor.Manufacturer;
-import net.sf.openrocket.rocketcomponent.BodyTube;
import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish;
-import net.sf.openrocket.rocketcomponent.NoseCone;
-import net.sf.openrocket.rocketcomponent.Transition;
import net.sf.openrocket.rocketcomponent.Transition.Shape;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.BugException;
BODY_TUBE( new TypedKey<?>[] {
ComponentPreset.MANUFACTURER,
ComponentPreset.PARTNO,
- ComponentPreset.OUTER_DIAMETER,
+ ComponentPreset.DESCRIPTION,
ComponentPreset.INNER_DIAMETER,
+ ComponentPreset.OUTER_DIAMETER,
ComponentPreset.LENGTH} ),
NOSE_CONE( new TypedKey<?>[] {
ComponentPreset.DESCRIPTION,
ComponentPreset.SHAPE,
ComponentPreset.OUTER_DIAMETER,
+ ComponentPreset.SHOULDER_DIAMETER,
ComponentPreset.LENGTH} ),
TRANSITION( new TypedKey<?>[] {
ComponentPreset.PARTNO,
ComponentPreset.DESCRIPTION,
ComponentPreset.OUTER_DIAMETER,
+ ComponentPreset.LENGTH} ),
+
+ CENTERING_RING( new TypedKey<?>[] {
+ ComponentPreset.MANUFACTURER,
+ ComponentPreset.PARTNO,
+ ComponentPreset.DESCRIPTION,
+ ComponentPreset.INNER_DIAMETER,
+ ComponentPreset.OUTER_DIAMETER,
+ ComponentPreset.LENGTH} ),
+
+ ENGINE_BLOCK( new TypedKey<?>[] {
+ ComponentPreset.MANUFACTURER,
+ ComponentPreset.PARTNO,
+ ComponentPreset.DESCRIPTION,
+ ComponentPreset.INNER_DIAMETER,
+ ComponentPreset.OUTER_DIAMETER,
ComponentPreset.LENGTH} );
+
Type[] compatibleTypes;
TypedKey<?>[] displayedColumns;
makeTubeCoupler(preset);
break;
}
+ case CENTERING_RING: {
+ makeCenteringRing(preset);
+ break;
+ }
+ case ENGINE_BLOCK: {
+ makeEngineBlock(preset);
+ break;
+ }
}
preset.computeDigest();
checkRequiredFields( preset, LENGTH );
- BodyTube bt = new BodyTube();
-
- bt.setLength(preset.get(LENGTH));
-
- // Need to verify contains 2 of OD, thickness, ID. Compute the third.
- boolean hasOd = preset.has(OUTER_DIAMETER);
- boolean hasId = preset.has(INNER_DIAMETER);
- boolean hasThickness = preset.has(THICKNESS);
-
- if ( hasOd ) {
- double outerRadius = preset.get(OUTER_DIAMETER)/2.0;
- double thickness = 0;
- bt.setOuterRadius( outerRadius );
- if ( hasId ) {
- thickness = outerRadius - preset.get(INNER_DIAMETER)/2.0;
- } else if ( hasThickness ) {
- thickness = preset.get(THICKNESS);
- } else {
- throw new InvalidComponentPresetException("Body tube preset underspecified " + preset.toString());
- }
- bt.setThickness( thickness );
- } else {
- if ( ! hasId && ! hasThickness ) {
- throw new InvalidComponentPresetException("Body tube preset underspecified " + preset.toString());
- }
- double innerRadius = preset.get(INNER_DIAMETER)/2.0;
- double thickness = preset.get(THICKNESS);
- bt.setOuterRadius(innerRadius + thickness);
- bt.setThickness(thickness);
- }
-
- preset.put(OUTER_DIAMETER, bt.getOuterRadius() *2.0);
- preset.put(INNER_DIAMETER, bt.getInnerRadius() *2.0);
- preset.put(THICKNESS, bt.getThickness());
-
+ checkDiametersAndThickness(preset);
+
+ double volume = computeVolumeOfTube( preset );
+
// Need to translate Mass to Density.
if ( preset.has(MASS) ) {
String materialName = "TubeCustom";
if ( preset.has(MATERIAL) ) {
materialName = preset.get(MATERIAL).getName();
}
- Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/bt.getComponentVolume(), false);
+ Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/volume, false);
preset.put(MATERIAL, m);
}
if ( preset.has(MASS) ) {
// compute a density for this component
double mass = preset.get(MASS);
- Bulkhead tr = new Bulkhead();
- tr.loadPreset(preset);
// FIXME - Bulkhead.getComponentVolume does not exist!
// double density = mass / tr.getComponentVolume();
double volume = Math.pow(preset.get(OUTER_DIAMETER),2) * Math.PI / 4.0;
double density = mass / volume;
- String materialName = "TransitionCustom";
+ String materialName = "BulkHeadCustom";
if ( preset.has(MATERIAL) ) {
materialName = preset.get(MATERIAL).getName();
}
checkRequiredFields( preset, LENGTH );
- // FIXME - TubeCoupler does not have getComponentVolume. So we use a BodyTube for this.
- BodyTube bt = new BodyTube();
+ checkDiametersAndThickness( preset );
+
+ double volume = computeVolumeOfTube( preset );
- bt.setLength(preset.get(LENGTH));
+ // Need to translate Mass to Density.
+ if ( preset.has(MASS) ) {
+ String materialName = "TubeCouplerCustom";
+ if ( preset.has(MATERIAL) ) {
+ materialName = preset.get(MATERIAL).getName();
+ }
+ Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/volume, false);
+ preset.put(MATERIAL, m);
+ }
+ }
- // Need to verify contains 2 of OD, thickness, ID. Compute the third.
- boolean hasOd = preset.has(OUTER_DIAMETER);
- boolean hasId = preset.has(INNER_DIAMETER);
- boolean hasThickness = preset.has(THICKNESS);
+ private static void makeCenteringRing( ComponentPreset preset ) throws InvalidComponentPresetException {
+ checkRequiredFields( preset, LENGTH );
- if ( hasOd ) {
- double outerRadius = preset.get(OUTER_DIAMETER)/2.0;
- double thickness = 0;
- bt.setOuterRadius( outerRadius );
- if ( hasId ) {
- thickness = outerRadius - preset.get(INNER_DIAMETER)/2.0;
- } else if ( hasThickness ) {
- thickness = preset.get(THICKNESS);
- } else {
- throw new InvalidComponentPresetException("Body tube preset underspecified " + preset.toString());
- }
- bt.setThickness( thickness );
- } else {
- if ( ! hasId && ! hasThickness ) {
- throw new InvalidComponentPresetException("Body tube preset underspecified " + preset.toString());
+ checkDiametersAndThickness( preset );
+
+ double volume = computeVolumeOfTube( preset );
+
+ // Need to translate Mass to Density.
+ if ( preset.has(MASS) ) {
+ String materialName = "TubeCouplerCustom";
+ if ( preset.has(MATERIAL) ) {
+ materialName = preset.get(MATERIAL).getName();
}
- double innerRadius = preset.get(INNER_DIAMETER)/2.0;
- double thickness = preset.get(THICKNESS);
- bt.setOuterRadius(innerRadius + thickness);
- bt.setThickness(thickness);
+ Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/volume, false);
+ preset.put(MATERIAL, m);
}
- preset.put(OUTER_DIAMETER, bt.getOuterRadius() *2.0);
- preset.put(INNER_DIAMETER, bt.getInnerRadius() *2.0);
- preset.put(THICKNESS, bt.getThickness());
+ }
+
+ private static void makeEngineBlock( ComponentPreset preset ) throws InvalidComponentPresetException {
+ checkRequiredFields( preset, LENGTH );
+
+ checkDiametersAndThickness( preset );
+
+ double volume = computeVolumeOfTube( preset );
// Need to translate Mass to Density.
if ( preset.has(MASS) ) {
- String materialName = "TubeCustom";
+ String materialName = "TubeCouplerCustom";
if ( preset.has(MATERIAL) ) {
materialName = preset.get(MATERIAL).getName();
}
- Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/bt.getComponentVolume(), false);
+ Material m = Material.newMaterial(Material.Type.BULK, materialName, preset.get(MASS)/volume, false);
preset.put(MATERIAL, m);
}
-
}
private static void checkRequiredFields( ComponentPreset preset, TypedKey<?> ... keys ) throws InvalidComponentPresetException {
}
}
+ private static void checkDiametersAndThickness( ComponentPreset preset ) throws InvalidComponentPresetException {
+ // Need to verify contains 2 of OD, thickness, ID. Compute the third.
+ boolean hasOd = preset.has(OUTER_DIAMETER);
+ boolean hasId = preset.has(INNER_DIAMETER);
+ boolean hasThickness = preset.has(THICKNESS);
+
+ double outerRadius;
+ double innerRadius;
+ double thickness;
+
+ if ( hasOd ) {
+ outerRadius = preset.get(OUTER_DIAMETER)/2.0;
+ thickness = 0;
+ if ( hasId ) {
+ innerRadius = preset.get(INNER_DIAMETER)/2.0;
+ thickness = outerRadius - innerRadius;
+ } else if ( hasThickness ) {
+ thickness = preset.get(THICKNESS);
+ innerRadius = outerRadius - thickness;
+ } else {
+ throw new InvalidComponentPresetException("Preset underspecified " + preset.toString());
+ }
+ } else {
+ if ( ! hasId && ! hasThickness ) {
+ throw new InvalidComponentPresetException("Preset underspecified " + preset.toString());
+ }
+ innerRadius = preset.get(INNER_DIAMETER)/2.0;
+ thickness = preset.get(THICKNESS);
+ outerRadius = innerRadius + thickness;
+ }
+
+ preset.put(OUTER_DIAMETER, outerRadius *2.0);
+ preset.put(INNER_DIAMETER, innerRadius *2.0);
+ preset.put(THICKNESS, thickness );
+
+ }
+
+ private static double computeVolumeOfTube(ComponentPreset preset) {
+ double or = preset.get(OUTER_DIAMETER)/2.0;
+ double ir = preset.get(INNER_DIAMETER)/2.0;
+ double l = preset.get(LENGTH);
+ return Math.PI * (or*or - ir*ir) * l;
+ }
+
+
}