Added centering rings and engine blocks presets
This commit is contained in:
		
							parent
							
								
									c72e51eb6b
								
							
						
					
					
						commit
						5808c7b703
					
				@ -13,10 +13,7 @@ import java.util.Map;
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
@ -43,8 +40,9 @@ public class ComponentPreset implements Comparable<ComponentPreset> {
 | 
			
		||||
		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<?>[] {
 | 
			
		||||
@ -53,6 +51,7 @@ public class ComponentPreset implements Comparable<ComponentPreset> {
 | 
			
		||||
				ComponentPreset.DESCRIPTION,
 | 
			
		||||
				ComponentPreset.SHAPE,
 | 
			
		||||
				ComponentPreset.OUTER_DIAMETER,
 | 
			
		||||
				ComponentPreset.SHOULDER_DIAMETER,
 | 
			
		||||
				ComponentPreset.LENGTH} ),
 | 
			
		||||
 | 
			
		||||
		TRANSITION( new TypedKey<?>[] {
 | 
			
		||||
@ -76,8 +75,25 @@ public class ComponentPreset implements Comparable<ComponentPreset> {
 | 
			
		||||
				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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -61,6 +61,14 @@ public abstract class ComponentPresetFactory {
 | 
			
		||||
			makeTubeCoupler(preset);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		case CENTERING_RING: {
 | 
			
		||||
			makeCenteringRing(preset);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		case ENGINE_BLOCK: {
 | 
			
		||||
			makeEngineBlock(preset);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		preset.computeDigest();
 | 
			
		||||
@ -73,40 +81,9 @@ public abstract class ComponentPresetFactory {
 | 
			
		||||
		
 | 
			
		||||
		checkRequiredFields( preset, LENGTH );
 | 
			
		||||
 | 
			
		||||
		BodyTube bt = new BodyTube();
 | 
			
		||||
		checkDiametersAndThickness(preset);
 | 
			
		||||
		
 | 
			
		||||
		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());
 | 
			
		||||
		double volume = computeVolumeOfTube( preset );
 | 
			
		||||
		
 | 
			
		||||
		// Need to translate Mass to Density.
 | 
			
		||||
		if ( preset.has(MASS) ) {
 | 
			
		||||
@ -114,7 +91,7 @@ public abstract class ComponentPresetFactory {
 | 
			
		||||
			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);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -172,15 +149,13 @@ public abstract class ComponentPresetFactory {
 | 
			
		||||
		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();
 | 
			
		||||
			}
 | 
			
		||||
@ -196,52 +171,56 @@ public abstract class ComponentPresetFactory {
 | 
			
		||||
		
 | 
			
		||||
		checkRequiredFields( preset, LENGTH );
 | 
			
		||||
 | 
			
		||||
		// FIXME - TubeCoupler does not have getComponentVolume.  So we use a BodyTube for this.
 | 
			
		||||
		BodyTube bt = new BodyTube();
 | 
			
		||||
		checkDiametersAndThickness( preset );
 | 
			
		||||
		
 | 
			
		||||
		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());
 | 
			
		||||
		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 makeCenteringRing( 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 = "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);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	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 = "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);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
@ -253,4 +232,49 @@ public abstract class ComponentPresetFactory {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,7 @@
 | 
			
		||||
package net.sf.openrocket.rocketcomponent;
 | 
			
		||||
 | 
			
		||||
import net.sf.openrocket.preset.ComponentPreset;
 | 
			
		||||
import net.sf.openrocket.preset.ComponentPreset.Type;
 | 
			
		||||
import net.sf.openrocket.util.Coordinate;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -67,4 +69,9 @@ public class CenteringRing extends RadiusRingComponent {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Type getPresetType() {
 | 
			
		||||
		return ComponentPreset.Type.CENTERING_RING;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,8 @@
 | 
			
		||||
package net.sf.openrocket.rocketcomponent;
 | 
			
		||||
 | 
			
		||||
import net.sf.openrocket.preset.ComponentPreset;
 | 
			
		||||
import net.sf.openrocket.preset.ComponentPreset.Type;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class EngineBlock extends ThicknessRingComponent {
 | 
			
		||||
	
 | 
			
		||||
@ -30,4 +33,9 @@ public class EngineBlock extends ThicknessRingComponent {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public Type getPresetType() {
 | 
			
		||||
		return ComponentPreset.Type.ENGINE_BLOCK;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user