Added support for Rocksim SubAssembly file elements (import only).
This commit is contained in:
parent
f7553c9a6f
commit
c2e79ba50e
@ -9,6 +9,7 @@ public class RocksimCommonConstants {
|
|||||||
public static final String WALL_THICKNESS = "WallThickness";
|
public static final String WALL_THICKNESS = "WallThickness";
|
||||||
public static final String SHAPE_PARAMETER = "ShapeParameter";
|
public static final String SHAPE_PARAMETER = "ShapeParameter";
|
||||||
public static final String ATTACHED_PARTS = "AttachedParts";
|
public static final String ATTACHED_PARTS = "AttachedParts";
|
||||||
|
public static final String SUBASSEMBLY = "SubAssembly";
|
||||||
public static final String BODY_TUBE = "BodyTube";
|
public static final String BODY_TUBE = "BodyTube";
|
||||||
public static final String FIN_SET = "FinSet";
|
public static final String FIN_SET = "FinSet";
|
||||||
public static final String CUSTOM_FIN_SET = "CustomFinSet";
|
public static final String CUSTOM_FIN_SET = "CustomFinSet";
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
package net.sf.openrocket.file.rocksim.importt;
|
package net.sf.openrocket.file.rocksim.importt;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import net.sf.openrocket.aerodynamics.WarningSet;
|
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||||
import net.sf.openrocket.file.DocumentLoadingContext;
|
import net.sf.openrocket.file.DocumentLoadingContext;
|
||||||
import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
|
import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
|
||||||
@ -12,20 +10,22 @@ import net.sf.openrocket.file.simplesax.AbstractElementHandler;
|
|||||||
import net.sf.openrocket.file.simplesax.ElementHandler;
|
import net.sf.openrocket.file.simplesax.ElementHandler;
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A SAX handler for the Rocksim AttachedParts XML type.
|
* A SAX handler for the Rocksim AttachedParts XML type.
|
||||||
*/
|
*/
|
||||||
class AttachedPartsHandler extends AbstractElementHandler {
|
class AttachedPartsHandler extends AbstractElementHandler {
|
||||||
private final DocumentLoadingContext context;
|
private final DocumentLoadingContext context;
|
||||||
|
|
||||||
/** The parent component. */
|
/** The parent component. */
|
||||||
private final RocketComponent component;
|
private final RocketComponent component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 AttachedPartsHandler(DocumentLoadingContext context, RocketComponent c) throws IllegalArgumentException {
|
public AttachedPartsHandler(DocumentLoadingContext context, RocketComponent c) throws IllegalArgumentException {
|
||||||
@ -33,10 +33,18 @@ class AttachedPartsHandler extends AbstractElementHandler {
|
|||||||
throw new IllegalArgumentException("The parent component of any attached part may not be null.");
|
throw new IllegalArgumentException("The parent component of any attached part may not be null.");
|
||||||
}
|
}
|
||||||
this.context = context;
|
this.context = context;
|
||||||
component = c;
|
this.component = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
DocumentLoadingContext getContext() {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
RocketComponent getComponent() {
|
||||||
|
return component;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
||||||
if (RocksimCommonConstants.FIN_SET.equals(element)) {
|
if (RocksimCommonConstants.FIN_SET.equals(element)) {
|
||||||
return new FinSetHandler(context, component);
|
return new FinSetHandler(context, component);
|
||||||
@ -65,6 +73,9 @@ class AttachedPartsHandler extends AbstractElementHandler {
|
|||||||
if (RocksimCommonConstants.TRANSITION.equals(element)) {
|
if (RocksimCommonConstants.TRANSITION.equals(element)) {
|
||||||
return new TransitionHandler(context, component, warnings);
|
return new TransitionHandler(context, component, warnings);
|
||||||
}
|
}
|
||||||
|
if (RocksimCommonConstants.SUBASSEMBLY.equals(element)) {
|
||||||
|
return new SubAssemblyHandler(context, component);
|
||||||
|
}
|
||||||
if (RocksimCommonConstants.TUBE_FIN_SET.equals(element)) {
|
if (RocksimCommonConstants.TUBE_FIN_SET.equals(element)) {
|
||||||
warnings.add("Tube fins are not currently supported. Ignoring.");
|
warnings.add("Tube fins are not currently supported. Ignoring.");
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
package net.sf.openrocket.file.rocksim.importt;
|
||||||
|
|
||||||
|
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||||
|
import net.sf.openrocket.file.DocumentLoadingContext;
|
||||||
|
import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
|
||||||
|
import net.sf.openrocket.file.simplesax.ElementHandler;
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class handles Rocksim 'SubAssembly' elements. They are similar to 'AttachedParts' (which is why this class is subclassed from
|
||||||
|
* AttachedPartsHandler) with some key differences. In Rocksim, AttachedParts elements can contain SubAssembly elements, which can in turn
|
||||||
|
* contain AttachedParts elements. To represent them in OR, SubAssembly elements are treated as children of the stage - much like a nose cone or
|
||||||
|
* external body tube.
|
||||||
|
*/
|
||||||
|
public class SubAssemblyHandler extends AttachedPartsHandler {
|
||||||
|
|
||||||
|
public SubAssemblyHandler(final DocumentLoadingContext context, final RocketComponent c)
|
||||||
|
throws IllegalArgumentException {
|
||||||
|
//A bit of a risk here, but assign the subassembly to the stage, not to the component. This is because typically the
|
||||||
|
//first component within the subassembly will be an external component.
|
||||||
|
super(context, c.getStage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
||||||
|
// We're already part of a subassembly, and then there are attached parts! Can't use an attached parts handler in this situation because
|
||||||
|
// the AttachedPartsHandler assumes that all body tubes are inner body tubes (Rocksim makes no distinction). OR does not allow things
|
||||||
|
// like fins to be attached to inner body tubes - which is often what these Rocksim subassemblies contain. So just return this instance
|
||||||
|
// which treats body tubes as external body tubes.
|
||||||
|
if (RocksimCommonConstants.ATTACHED_PARTS.equals(element)) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
// The key override of this class - treat body tubes as external body tubes.
|
||||||
|
else if (RocksimCommonConstants.BODY_TUBE.equals(element)) {
|
||||||
|
return new BodyTubeHandler(getContext(), getComponent(), warnings);
|
||||||
|
}
|
||||||
|
return super.openElement(element, attributes, warnings);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,10 +4,6 @@
|
|||||||
*/
|
*/
|
||||||
package net.sf.openrocket.file.rocksim.importt;
|
package net.sf.openrocket.file.rocksim.importt;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
import net.sf.openrocket.document.OpenRocketDocument;
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
import net.sf.openrocket.document.OpenRocketDocumentFactory;
|
import net.sf.openrocket.document.OpenRocketDocumentFactory;
|
||||||
import net.sf.openrocket.file.DatabaseMotorFinder;
|
import net.sf.openrocket.file.DatabaseMotorFinder;
|
||||||
@ -18,161 +14,225 @@ import net.sf.openrocket.rocketcomponent.LaunchLug;
|
|||||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||||
import net.sf.openrocket.rocketcomponent.Stage;
|
import net.sf.openrocket.rocketcomponent.Stage;
|
||||||
import net.sf.openrocket.util.BaseTestCase.BaseTestCase;
|
import net.sf.openrocket.util.BaseTestCase.BaseTestCase;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RocksimLoader Tester.
|
* RocksimLoader Tester.
|
||||||
*/
|
*/
|
||||||
public class RocksimLoaderTest extends BaseTestCase {
|
public class RocksimLoaderTest extends BaseTestCase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test a bug reported via automated bug report. I have been unable to reproduce this bug
|
* Test a bug reported via automated bug report. I have been unable to reproduce this bug (hanging finset off of an inner body tube) when creating
|
||||||
* (hanging finset off of an inner body tube) when creating a Rocksim file using Rocksim. The bug
|
* a Rocksim file using Rocksim. The bug is reproducible when manually modifying the Rocksim file, which is what is tested here.
|
||||||
* is reproducible when manually modifying the Rocksim file, which is what is tested here.
|
*/
|
||||||
*/
|
@org.junit.Test
|
||||||
@org.junit.Test
|
public void testFinsOnInnerTube() throws Exception {
|
||||||
public void testFinsOnInnerTube() throws Exception {
|
RocksimLoader loader = new RocksimLoader();
|
||||||
RocksimLoader loader = new RocksimLoader();
|
InputStream stream = this.getClass().getResourceAsStream("PodFins.rkt");
|
||||||
InputStream stream = this.getClass().getResourceAsStream("PodFins.rkt");
|
Assert.assertNotNull("Could not open PodFins.rkt", stream);
|
||||||
Assert.assertNotNull("Could not open PodFins.rkt", stream);
|
try {
|
||||||
try {
|
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||||
DocumentLoadingContext context = new DocumentLoadingContext();
|
context.setOpenRocketDocument(doc);
|
||||||
context.setOpenRocketDocument(doc);
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
context.setMotorFinder(new DatabaseMotorFinder());
|
loader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
loader.loadFromStream(context, new BufferedInputStream(stream));
|
Rocket rocket = doc.getRocket();
|
||||||
Rocket rocket = doc.getRocket();
|
Assert.assertNotNull(rocket);
|
||||||
Assert.assertNotNull(rocket);
|
}
|
||||||
} catch (IllegalStateException ise) {
|
catch (IllegalStateException ise) {
|
||||||
Assert.fail(ise.getMessage());
|
Assert.fail(ise.getMessage());
|
||||||
}
|
}
|
||||||
Assert.assertTrue(loader.getWarnings().size() == 2);
|
Assert.assertTrue(loader.getWarnings().size() == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method: loadFromStream(InputStream source)
|
* Method: loadFromStream(InputStream source)
|
||||||
*
|
*
|
||||||
* @throws Exception thrown if something goes awry
|
* @throws Exception thrown if something goes awry
|
||||||
*/
|
*/
|
||||||
@org.junit.Test
|
@org.junit.Test
|
||||||
public void testLoadFromStream() throws Exception {
|
public void testLoadFromStream() throws Exception {
|
||||||
RocksimLoader loader = new RocksimLoader();
|
RocksimLoader loader = new RocksimLoader();
|
||||||
//Stupid single stage rocket
|
//Stupid single stage rocket
|
||||||
OpenRocketDocument doc = loadRocksimRocket(loader);
|
OpenRocketDocument doc = loadRocksimRocket(loader);
|
||||||
InputStream stream;
|
InputStream stream;
|
||||||
|
|
||||||
Assert.assertNotNull(doc);
|
Assert.assertNotNull(doc);
|
||||||
Rocket rocket = doc.getRocket();
|
Rocket rocket = doc.getRocket();
|
||||||
Assert.assertNotNull(rocket);
|
Assert.assertNotNull(rocket);
|
||||||
Assert.assertEquals("FooBar Test", doc.getRocket().getName());
|
Assert.assertEquals("FooBar Test", doc.getRocket().getName());
|
||||||
Assert.assertTrue(loader.getWarnings().isEmpty());
|
Assert.assertTrue(loader.getWarnings().isEmpty());
|
||||||
|
|
||||||
stream = this.getClass().getResourceAsStream("rocksimTestRocket2.rkt");
|
stream = this.getClass().getResourceAsStream("rocksimTestRocket2.rkt");
|
||||||
Assert.assertNotNull("Could not open rocksimTestRocket2.rkt", stream);
|
Assert.assertNotNull("Could not open rocksimTestRocket2.rkt", stream);
|
||||||
|
|
||||||
doc = OpenRocketDocumentFactory.createEmptyRocket();
|
doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
DocumentLoadingContext context = new DocumentLoadingContext();
|
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||||
context.setOpenRocketDocument(doc);
|
context.setOpenRocketDocument(doc);
|
||||||
context.setMotorFinder(new DatabaseMotorFinder());
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
loader.loadFromStream(context, new BufferedInputStream(stream));
|
loader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
|
|
||||||
Assert.assertNotNull(doc);
|
Assert.assertNotNull(doc);
|
||||||
rocket = doc.getRocket();
|
rocket = doc.getRocket();
|
||||||
Assert.assertNotNull(rocket);
|
Assert.assertNotNull(rocket);
|
||||||
|
|
||||||
//Do some simple asserts; the important thing here is just validating that the mass and cg were
|
//Do some simple asserts; the important thing here is just validating that the mass and cg were
|
||||||
//not overridden for each stage.
|
//not overridden for each stage.
|
||||||
Assert.assertEquals("Three Stage Everything Included Rocket", doc.getRocket().getName());
|
Assert.assertEquals("Three Stage Everything Included Rocket", doc.getRocket().getName());
|
||||||
Assert.assertEquals(0, loader.getWarnings().size());
|
Assert.assertEquals(0, loader.getWarnings().size());
|
||||||
Assert.assertEquals(3, rocket.getStageCount());
|
Assert.assertEquals(3, rocket.getStageCount());
|
||||||
Stage stage1 = (Stage) rocket.getChild(0);
|
Stage stage1 = (Stage) rocket.getChild(0);
|
||||||
Assert.assertFalse(stage1.isMassOverridden());
|
Assert.assertFalse(stage1.isMassOverridden());
|
||||||
Assert.assertFalse(stage1.isCGOverridden());
|
Assert.assertFalse(stage1.isCGOverridden());
|
||||||
Stage stage2 = (Stage) rocket.getChild(1);
|
Stage stage2 = (Stage) rocket.getChild(1);
|
||||||
Assert.assertFalse(stage2.isMassOverridden());
|
Assert.assertFalse(stage2.isMassOverridden());
|
||||||
Assert.assertFalse(stage2.isCGOverridden());
|
Assert.assertFalse(stage2.isCGOverridden());
|
||||||
Stage stage3 = (Stage) rocket.getChild(2);
|
Stage stage3 = (Stage) rocket.getChild(2);
|
||||||
Assert.assertFalse(stage3.isMassOverridden());
|
Assert.assertFalse(stage3.isMassOverridden());
|
||||||
Assert.assertFalse(stage3.isCGOverridden());
|
Assert.assertFalse(stage3.isCGOverridden());
|
||||||
|
|
||||||
stream = this.getClass().getResourceAsStream("rocksimTestRocket3.rkt");
|
stream = this.getClass().getResourceAsStream("rocksimTestRocket3.rkt");
|
||||||
Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream);
|
Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream);
|
||||||
|
|
||||||
doc = OpenRocketDocumentFactory.createEmptyRocket();
|
doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
context = new DocumentLoadingContext();
|
context = new DocumentLoadingContext();
|
||||||
context.setOpenRocketDocument(doc);
|
context.setOpenRocketDocument(doc);
|
||||||
context.setMotorFinder(new DatabaseMotorFinder());
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
loader.loadFromStream(context, new BufferedInputStream(stream));
|
loader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
|
|
||||||
Assert.assertNotNull(doc);
|
Assert.assertNotNull(doc);
|
||||||
rocket = doc.getRocket();
|
rocket = doc.getRocket();
|
||||||
Assert.assertNotNull(rocket);
|
Assert.assertNotNull(rocket);
|
||||||
Assert.assertEquals("Three Stage Everything Included Rocket - Override Total Mass/CG", doc.getRocket().getName());
|
Assert.assertEquals("Three Stage Everything Included Rocket - Override Total Mass/CG", doc.getRocket().getName());
|
||||||
Assert.assertEquals(3, rocket.getStageCount());
|
Assert.assertEquals(3, rocket.getStageCount());
|
||||||
stage1 = (Stage) rocket.getChild(0);
|
stage1 = (Stage) rocket.getChild(0);
|
||||||
stage2 = (Stage) rocket.getChild(1);
|
stage2 = (Stage) rocket.getChild(1);
|
||||||
stage3 = (Stage) rocket.getChild(2);
|
stage3 = (Stage) rocket.getChild(2);
|
||||||
|
|
||||||
//Do some 1st level and simple asserts; the idea here is to not do a deep validation as that
|
//Do some 1st level and simple asserts; the idea here is to not do a deep validation as that
|
||||||
//should have been covered elsewhere. Assert that the stage overrides are correct.
|
//should have been covered elsewhere. Assert that the stage overrides are correct.
|
||||||
Assert.assertEquals(2, stage1.getChildCount());
|
Assert.assertEquals(2, stage1.getChildCount());
|
||||||
Assert.assertEquals("Nose cone", stage1.getChild(0).getName());
|
Assert.assertEquals("Nose cone", stage1.getChild(0).getName());
|
||||||
Assert.assertEquals("Body tube", stage1.getChild(1).getName());
|
Assert.assertEquals("Body tube", stage1.getChild(1).getName());
|
||||||
Assert.assertTrue(stage1.isMassOverridden());
|
Assert.assertTrue(stage1.isMassOverridden());
|
||||||
Assert.assertEquals(0.185d, stage1.getOverrideMass(), 0.001);
|
Assert.assertEquals(0.185d, stage1.getOverrideMass(), 0.001);
|
||||||
Assert.assertTrue(stage1.isCGOverridden());
|
Assert.assertTrue(stage1.isCGOverridden());
|
||||||
Assert.assertEquals(0.3d, stage1.getOverrideCG().x, 0.001);
|
Assert.assertEquals(0.3d, stage1.getOverrideCG().x, 0.001);
|
||||||
Assert.assertEquals(4, loader.getWarnings().size());
|
Assert.assertEquals(4, loader.getWarnings().size());
|
||||||
|
|
||||||
Assert.assertEquals(1, stage2.getChildCount());
|
Assert.assertEquals(1, stage2.getChildCount());
|
||||||
Assert.assertEquals("2nd Stage Tube", stage2.getChild(0).getName());
|
Assert.assertEquals("2nd Stage Tube", stage2.getChild(0).getName());
|
||||||
Assert.assertTrue(stage2.isMassOverridden());
|
Assert.assertTrue(stage2.isMassOverridden());
|
||||||
Assert.assertEquals(0.21d, stage2.getOverrideMass(), 0.001);
|
Assert.assertEquals(0.21d, stage2.getOverrideMass(), 0.001);
|
||||||
Assert.assertTrue(stage2.isCGOverridden());
|
Assert.assertTrue(stage2.isCGOverridden());
|
||||||
Assert.assertEquals(0.4d, stage2.getOverrideCG().x, 0.001);
|
Assert.assertEquals(0.4d, stage2.getOverrideCG().x, 0.001);
|
||||||
|
|
||||||
BodyTube bt = (BodyTube) stage2.getChild(0);
|
BodyTube bt = (BodyTube) stage2.getChild(0);
|
||||||
LaunchLug ll = (LaunchLug) bt.getChild(6);
|
LaunchLug ll = (LaunchLug) bt.getChild(6);
|
||||||
Assert.assertEquals(1.22d, ll.getRadialDirection(), 0.001);
|
Assert.assertEquals(1.22d, ll.getRadialDirection(), 0.001);
|
||||||
|
|
||||||
Assert.assertEquals(2, stage3.getChildCount());
|
Assert.assertEquals(2, stage3.getChildCount());
|
||||||
Assert.assertEquals("Transition", stage3.getChild(0).getName());
|
Assert.assertEquals("Transition", stage3.getChild(0).getName());
|
||||||
Assert.assertEquals("Body tube", stage3.getChild(1).getName());
|
Assert.assertEquals("Body tube", stage3.getChild(1).getName());
|
||||||
Assert.assertTrue(stage2.isMassOverridden());
|
Assert.assertTrue(stage2.isMassOverridden());
|
||||||
Assert.assertEquals(0.33d, stage3.getOverrideMass(), 0.001);
|
Assert.assertEquals(0.33d, stage3.getOverrideMass(), 0.001);
|
||||||
Assert.assertTrue(stage2.isCGOverridden());
|
Assert.assertTrue(stage2.isCGOverridden());
|
||||||
Assert.assertEquals(0.5d, stage3.getOverrideCG().x, 0.001);
|
Assert.assertEquals(0.5d, stage3.getOverrideCG().x, 0.001);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OpenRocketDocument loadRocksimRocket(RocksimLoader theLoader) throws IOException, RocketLoadException {
|
@org.junit.Test
|
||||||
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket1.rkt");
|
public void testSubAssemblyRocket() throws IOException, RocketLoadException {
|
||||||
try {
|
RocksimLoader loader = new RocksimLoader();
|
||||||
Assert.assertNotNull("Could not open rocksimTestRocket1.rkt", stream);
|
//Stupid single stage rocket
|
||||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
OpenRocketDocument doc = loadRocksimSubassemblyRocket(loader);
|
||||||
DocumentLoadingContext context = new DocumentLoadingContext();
|
InputStream stream;
|
||||||
context.setOpenRocketDocument(doc);
|
|
||||||
context.setMotorFinder(new DatabaseMotorFinder());
|
Assert.assertNotNull(doc);
|
||||||
theLoader.loadFromStream(context, new BufferedInputStream(stream));
|
Rocket rocket = doc.getRocket();
|
||||||
return doc;
|
Assert.assertNotNull(rocket);
|
||||||
} finally {
|
Assert.assertEquals("SubAssembly Element Test", doc.getRocket().getName());
|
||||||
stream.close();
|
Assert.assertTrue(loader.getWarnings().isEmpty());
|
||||||
}
|
|
||||||
}
|
stream = this.getClass().getResourceAsStream("SubAssemblyTest.rkt");
|
||||||
|
Assert.assertNotNull("Could not open SubAssemblyTest.rkt", stream);
|
||||||
public static OpenRocketDocument loadRocksimRocket3(RocksimLoader theLoader) throws IOException, RocketLoadException {
|
|
||||||
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket3.rkt");
|
doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
try {
|
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||||
Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream);
|
context.setOpenRocketDocument(doc);
|
||||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
DocumentLoadingContext context = new DocumentLoadingContext();
|
loader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
context.setOpenRocketDocument(doc);
|
|
||||||
context.setMotorFinder(new DatabaseMotorFinder());
|
Assert.assertNotNull(doc);
|
||||||
theLoader.loadFromStream(context, new BufferedInputStream(stream));
|
rocket = doc.getRocket();
|
||||||
return doc;
|
Assert.assertNotNull(rocket);
|
||||||
} finally {
|
Assert.assertEquals(1, rocket.getStageCount());
|
||||||
stream.close();
|
Stage stage1 = (Stage) rocket.getChild(0);
|
||||||
}
|
Assert.assertEquals("Nose cone", stage1.getChild(0).getName());
|
||||||
}
|
Assert.assertEquals("Forward Body tube", stage1.getChild(1).getName());
|
||||||
|
Assert.assertEquals("Aft Body tube", stage1.getChild(2).getName());
|
||||||
|
|
||||||
|
BodyTube subassemblyBodyTube = (BodyTube)stage1.getChild(2);
|
||||||
|
Assert.assertEquals(8, subassemblyBodyTube.getChildCount());
|
||||||
|
Assert.assertEquals("Engine block", subassemblyBodyTube.getChild(0).getName());
|
||||||
|
Assert.assertEquals("Fin set-1", subassemblyBodyTube.getChild(1).getName());
|
||||||
|
Assert.assertEquals("Fin set", subassemblyBodyTube.getChild(2).getName());
|
||||||
|
Assert.assertEquals("Fin set-2", subassemblyBodyTube.getChild(3).getName());
|
||||||
|
Assert.assertEquals("Fin set-3", subassemblyBodyTube.getChild(4).getName());
|
||||||
|
Assert.assertEquals("Fin set-4", subassemblyBodyTube.getChild(5).getName());
|
||||||
|
Assert.assertEquals("Centering ring", subassemblyBodyTube.getChild(6).getName());
|
||||||
|
Assert.assertEquals("Centering ring", subassemblyBodyTube.getChild(7).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRocketDocument loadRocksimRocket(RocksimLoader theLoader) throws IOException, RocketLoadException {
|
||||||
|
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket1.rkt");
|
||||||
|
try {
|
||||||
|
Assert.assertNotNull("Could not open rocksimTestRocket1.rkt", stream);
|
||||||
|
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
|
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||||
|
context.setOpenRocketDocument(doc);
|
||||||
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
|
theLoader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRocketDocument loadRocksimRocket3(RocksimLoader theLoader) throws IOException, RocketLoadException {
|
||||||
|
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket3.rkt");
|
||||||
|
try {
|
||||||
|
Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream);
|
||||||
|
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
|
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||||
|
context.setOpenRocketDocument(doc);
|
||||||
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
|
theLoader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRocketDocument loadRocksimSubassemblyRocket(RocksimLoader theLoader) throws IOException, RocketLoadException {
|
||||||
|
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("SubAssemblyTest.rkt");
|
||||||
|
try {
|
||||||
|
Assert.assertNotNull("Could not open SubAssemblyTest.rkt", stream);
|
||||||
|
OpenRocketDocument doc = OpenRocketDocumentFactory.createEmptyRocket();
|
||||||
|
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||||
|
context.setOpenRocketDocument(doc);
|
||||||
|
context.setMotorFinder(new DatabaseMotorFinder());
|
||||||
|
theLoader.loadFromStream(context, new BufferedInputStream(stream));
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,483 @@
|
|||||||
|
<RockSimDocument>
|
||||||
|
<FileVersion>4</FileVersion>
|
||||||
|
<DesignInformation>
|
||||||
|
<RocketDesign>
|
||||||
|
<Name>SubAssembly Element Test</Name>
|
||||||
|
<StageCount>1</StageCount>
|
||||||
|
<DisplayFlags>7</DisplayFlags>
|
||||||
|
<ViewType>0</ViewType>
|
||||||
|
<ViewStageCount>3</ViewStageCount>
|
||||||
|
<ViewTypeEdit>0</ViewTypeEdit>
|
||||||
|
<ViewStageCountEdit>3</ViewStageCountEdit>
|
||||||
|
<ZoomFactor>0.0</ZoomFactor>
|
||||||
|
<ZoomFactorEdit>0.0</ZoomFactorEdit>
|
||||||
|
<ScrollPosX>0</ScrollPosX>
|
||||||
|
<ScrollPosY>0</ScrollPosY>
|
||||||
|
<ScrollPosXEdit>0</ScrollPosXEdit>
|
||||||
|
<ScrollPosYEdit>0</ScrollPosYEdit>
|
||||||
|
<ThreeDFlags>0</ThreeDFlags>
|
||||||
|
<ThreeDFlagsEdit>0</ThreeDFlagsEdit>
|
||||||
|
<LastSerialNumber>18</LastSerialNumber>
|
||||||
|
<Stage3Mass>0.0</Stage3Mass>
|
||||||
|
<Stage2Mass>0.0</Stage2Mass>
|
||||||
|
<Stage1Mass>0.0</Stage1Mass>
|
||||||
|
<Stage3CG>426.6301716552979</Stage3CG>
|
||||||
|
<Stage2CGAlone>0.0</Stage2CGAlone>
|
||||||
|
<Stage1CGAlone>0.0</Stage1CGAlone>
|
||||||
|
<Stage321CG>0.0</Stage321CG>
|
||||||
|
<Stage32CG>0.0</Stage32CG>
|
||||||
|
<CPCalcFlags>1</CPCalcFlags>
|
||||||
|
<CPSimFlags>1</CPSimFlags>
|
||||||
|
<UseKnownMass>0</UseKnownMass>
|
||||||
|
<Stage3Parts>
|
||||||
|
<NoseCone>
|
||||||
|
<KnownMass>6.107306539734526</KnownMass>
|
||||||
|
<Density>1049.21</Density>
|
||||||
|
<Material>Polystyrene PS</Material>
|
||||||
|
<Name>Nose cone</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>0.0</Xb>
|
||||||
|
<CalcMass>6.107306539734526</CalcMass>
|
||||||
|
<CalcCG>53.68748632541546</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>76.2</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>1</SerialNo>
|
||||||
|
<ShapeCode>3</ShapeCode>
|
||||||
|
<ConstructionType>1</ConstructionType>
|
||||||
|
<WallThickness>1.00076</WallThickness>
|
||||||
|
<ShapeParameter>0.0</ShapeParameter>
|
||||||
|
<AttachedParts/>
|
||||||
|
<BaseDia>24.8006</BaseDia>
|
||||||
|
<ShoulderLen>19.1008</ShoulderLen>
|
||||||
|
<ShoulderOD>23.5991</ShoulderOD>
|
||||||
|
</NoseCone>
|
||||||
|
<BodyTube>
|
||||||
|
<KnownMass>15.040422946044567</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Forward Body tube</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>0.0</Xb>
|
||||||
|
<CalcMass>15.040422946044567</CalcMass>
|
||||||
|
<CalcCG>228.6</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>457.2</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>2</SerialNo>
|
||||||
|
<OD>24.892</OD>
|
||||||
|
<ID>24.13</ID>
|
||||||
|
<IsMotorMount>0</IsMotorMount>
|
||||||
|
<MotorDia>24.13</MotorDia>
|
||||||
|
<EngineOverhang>0.0</EngineOverhang>
|
||||||
|
<IsInsideTube>0</IsInsideTube>
|
||||||
|
<AttachedParts>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>0.0</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Tube coupler</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>120.65</Xb>
|
||||||
|
<CalcMass>0.0</CalcMass>
|
||||||
|
<CalcCG>31.75</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>63.5</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>3</SerialNo>
|
||||||
|
<OD>27.8892</OD>
|
||||||
|
<ID>27.8892</ID>
|
||||||
|
<UsageCode>4</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
<Streamer>
|
||||||
|
<KnownMass>10.038912051168</KnownMass>
|
||||||
|
<Density>0.00664972</Density>
|
||||||
|
<Material>Mylar</Material>
|
||||||
|
<Name>Streamer</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>44.45</Xb>
|
||||||
|
<CalcMass>10.038912051168</CalcMass>
|
||||||
|
<CalcCG>57.15</CalcCG>
|
||||||
|
<DensityType>1</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>114.3</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>4</SerialNo>
|
||||||
|
<Width>114.3</Width>
|
||||||
|
<DragCoefficient>0.138</DragCoefficient>
|
||||||
|
</Streamer>
|
||||||
|
<MassObject>
|
||||||
|
<KnownMass>1.2996672000000002</KnownMass>
|
||||||
|
<Density>0.0</Density>
|
||||||
|
<Material></Material>
|
||||||
|
<Name>Shock Cord</Name>
|
||||||
|
<KnownCG>187.325</KnownCG>
|
||||||
|
<UseKnownCG>1</UseKnownCG>
|
||||||
|
<Xb>187.325</Xb>
|
||||||
|
<CalcMass>0.0</CalcMass>
|
||||||
|
<CalcCG>0.0</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>12.192000000000002</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>5</SerialNo>
|
||||||
|
<TypeCode>0</TypeCode>
|
||||||
|
</MassObject>
|
||||||
|
<MassObject>
|
||||||
|
<KnownMass>2.549</KnownMass>
|
||||||
|
<Density>0.0</Density>
|
||||||
|
<Material></Material>
|
||||||
|
<Name>Mass object - 2.549 g</Name>
|
||||||
|
<KnownCG>282.575</KnownCG>
|
||||||
|
<UseKnownCG>1</UseKnownCG>
|
||||||
|
<Xb>282.575</Xb>
|
||||||
|
<CalcMass>0.0</CalcMass>
|
||||||
|
<CalcCG>0.0</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>0.0</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>6</SerialNo>
|
||||||
|
<TypeCode>0</TypeCode>
|
||||||
|
</MassObject>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>1.1277286611933457</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Centering ring</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>384.175</Xb>
|
||||||
|
<CalcMass>1.1277286611933457</CalcMass>
|
||||||
|
<CalcCG>3.175</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>6.35</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>7</SerialNo>
|
||||||
|
<OD>28.702</OD>
|
||||||
|
<ID>24.9428</ID>
|
||||||
|
<UsageCode>0</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>1.1277286611933457</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Centering ring</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>358.775</Xb>
|
||||||
|
<CalcMass>1.1277286611933457</CalcMass>
|
||||||
|
<CalcCG>3.175</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>6.35</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>8</SerialNo>
|
||||||
|
<OD>28.702</OD>
|
||||||
|
<ID>24.9428</ID>
|
||||||
|
<UsageCode>0</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>1.1277286611933457</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Centering ring</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>288.925</Xb>
|
||||||
|
<CalcMass>1.1277286611933457</CalcMass>
|
||||||
|
<CalcCG>3.175</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>6.35</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>9</SerialNo>
|
||||||
|
<OD>28.702</OD>
|
||||||
|
<ID>24.9428</ID>
|
||||||
|
<UsageCode>0</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
</AttachedParts>
|
||||||
|
</BodyTube>
|
||||||
|
<BodyTube>
|
||||||
|
<KnownMass>13.498613632777841</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Aft Body tube</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>0.0</Xb>
|
||||||
|
<CalcMass>13.498613632777841</CalcMass>
|
||||||
|
<CalcCG>165.1</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>330.2</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>10</SerialNo>
|
||||||
|
<OD>29.8704</OD>
|
||||||
|
<ID>29.083</ID>
|
||||||
|
<IsMotorMount>1</IsMotorMount>
|
||||||
|
<MotorDia>29.083</MotorDia>
|
||||||
|
<EngineOverhang>12.7</EngineOverhang>
|
||||||
|
<IsInsideTube>0</IsInsideTube>
|
||||||
|
<AttachedParts>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>1.25084668869137</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Engine block</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>252.73000000000002</Xb>
|
||||||
|
<CalcMass>1.25084668869137</CalcMass>
|
||||||
|
<CalcCG>3.175</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>6.35</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>11</SerialNo>
|
||||||
|
<OD>29.083</OD>
|
||||||
|
<ID>24.9428</ID>
|
||||||
|
<UsageCode>2</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
<FinSet>
|
||||||
|
<KnownMass>0.9977479979838839</KnownMass>
|
||||||
|
<Density>128.148</Density>
|
||||||
|
<Material>Balsa</Material>
|
||||||
|
<Name>Fin set-1</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>257.175</Xb>
|
||||||
|
<CalcMass>0.9977479979838839</CalcMass>
|
||||||
|
<CalcCG>54.72939060773481</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>0.0</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>12</SerialNo>
|
||||||
|
<FinCount>1</FinCount>
|
||||||
|
<RootChord>66.675</RootChord>
|
||||||
|
<TipChord>29.8704</TipChord>
|
||||||
|
<SemiSpan>50.8</SemiSpan>
|
||||||
|
<SweepDistance>67.4141</SweepDistance>
|
||||||
|
<Thickness>3.175</Thickness>
|
||||||
|
<ShapeCode>0</ShapeCode>
|
||||||
|
<TipShapeCode>0</TipShapeCode>
|
||||||
|
<TabLength>0.0</TabLength>
|
||||||
|
<TabDepth>0.0</TabDepth>
|
||||||
|
<TabOffset>0.0</TabOffset>
|
||||||
|
<SweepMode>1</SweepMode>
|
||||||
|
<CantAngle>0.0</CantAngle>
|
||||||
|
</FinSet>
|
||||||
|
<FinSet>
|
||||||
|
<KnownMass>2.8874580315239995</KnownMass>
|
||||||
|
<Density>128.148</Density>
|
||||||
|
<Material>Balsa</Material>
|
||||||
|
<Name>Fin set</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>146.05</Xb>
|
||||||
|
<CalcMass>2.8874580315239995</CalcMass>
|
||||||
|
<CalcCG>61.383333333333326</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.785398</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>0.0</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>13</SerialNo>
|
||||||
|
<FinCount>4</FinCount>
|
||||||
|
<RootChord>101.6</RootChord>
|
||||||
|
<TipChord>0.0</TipChord>
|
||||||
|
<SemiSpan>34.925</SemiSpan>
|
||||||
|
<SweepDistance>82.55</SweepDistance>
|
||||||
|
<Thickness>3.175</Thickness>
|
||||||
|
<ShapeCode>0</ShapeCode>
|
||||||
|
<TipShapeCode>0</TipShapeCode>
|
||||||
|
<TabLength>0.0</TabLength>
|
||||||
|
<TabDepth>0.0</TabDepth>
|
||||||
|
<TabOffset>0.0</TabOffset>
|
||||||
|
<SweepMode>1</SweepMode>
|
||||||
|
<CantAngle>0.0</CantAngle>
|
||||||
|
</FinSet>
|
||||||
|
<FinSet>
|
||||||
|
<KnownMass>0.9977479979838839</KnownMass>
|
||||||
|
<Density>128.148</Density>
|
||||||
|
<Material>Balsa</Material>
|
||||||
|
<Name>Fin set-2</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>257.175</Xb>
|
||||||
|
<CalcMass>0.9977479979838839</CalcMass>
|
||||||
|
<CalcCG>54.72939060773481</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>1.5708</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>0.0</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>14</SerialNo>
|
||||||
|
<FinCount>1</FinCount>
|
||||||
|
<RootChord>66.675</RootChord>
|
||||||
|
<TipChord>29.8704</TipChord>
|
||||||
|
<SemiSpan>50.8</SemiSpan>
|
||||||
|
<SweepDistance>67.4141</SweepDistance>
|
||||||
|
<Thickness>3.175</Thickness>
|
||||||
|
<ShapeCode>0</ShapeCode>
|
||||||
|
<TipShapeCode>0</TipShapeCode>
|
||||||
|
<TabLength>0.0</TabLength>
|
||||||
|
<TabDepth>0.0</TabDepth>
|
||||||
|
<TabOffset>0.0</TabOffset>
|
||||||
|
<SweepMode>1</SweepMode>
|
||||||
|
<CantAngle>0.0</CantAngle>
|
||||||
|
</FinSet>
|
||||||
|
<FinSet>
|
||||||
|
<KnownMass>0.9977479979838839</KnownMass>
|
||||||
|
<Density>128.148</Density>
|
||||||
|
<Material>Balsa</Material>
|
||||||
|
<Name>Fin set-3</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>257.175</Xb>
|
||||||
|
<CalcMass>0.9977479979838839</CalcMass>
|
||||||
|
<CalcCG>54.72939060773481</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>3.14159</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>0.0</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>15</SerialNo>
|
||||||
|
<FinCount>1</FinCount>
|
||||||
|
<RootChord>66.675</RootChord>
|
||||||
|
<TipChord>29.8704</TipChord>
|
||||||
|
<SemiSpan>50.8</SemiSpan>
|
||||||
|
<SweepDistance>67.4141</SweepDistance>
|
||||||
|
<Thickness>3.175</Thickness>
|
||||||
|
<ShapeCode>0</ShapeCode>
|
||||||
|
<TipShapeCode>0</TipShapeCode>
|
||||||
|
<TabLength>0.0</TabLength>
|
||||||
|
<TabDepth>0.0</TabDepth>
|
||||||
|
<TabOffset>0.0</TabOffset>
|
||||||
|
<SweepMode>1</SweepMode>
|
||||||
|
<CantAngle>0.0</CantAngle>
|
||||||
|
</FinSet>
|
||||||
|
<FinSet>
|
||||||
|
<KnownMass>0.9977479979838839</KnownMass>
|
||||||
|
<Density>128.148</Density>
|
||||||
|
<Material>Balsa</Material>
|
||||||
|
<Name>Fin set-4</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>257.175</Xb>
|
||||||
|
<CalcMass>0.9977479979838839</CalcMass>
|
||||||
|
<CalcCG>54.72939060773481</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>-1.5708</RadialAngle>
|
||||||
|
<LocationMode>0</LocationMode>
|
||||||
|
<Len>0.0</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>16</SerialNo>
|
||||||
|
<FinCount>1</FinCount>
|
||||||
|
<RootChord>66.675</RootChord>
|
||||||
|
<TipChord>29.8704</TipChord>
|
||||||
|
<SemiSpan>50.8</SemiSpan>
|
||||||
|
<SweepDistance>67.4141</SweepDistance>
|
||||||
|
<Thickness>3.175</Thickness>
|
||||||
|
<ShapeCode>0</ShapeCode>
|
||||||
|
<TipShapeCode>0</TipShapeCode>
|
||||||
|
<TabLength>0.0</TabLength>
|
||||||
|
<TabDepth>0.0</TabDepth>
|
||||||
|
<TabOffset>0.0</TabOffset>
|
||||||
|
<SweepMode>1</SweepMode>
|
||||||
|
<CantAngle>0.0</CantAngle>
|
||||||
|
</FinSet>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>1.1277286611933457</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Centering ring</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>323.85</Xb>
|
||||||
|
<CalcMass>1.1277286611933457</CalcMass>
|
||||||
|
<CalcCG>3.175</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>2</LocationMode>
|
||||||
|
<Len>6.35</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>17</SerialNo>
|
||||||
|
<OD>28.702</OD>
|
||||||
|
<ID>24.9428</ID>
|
||||||
|
<UsageCode>0</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
<Ring>
|
||||||
|
<KnownMass>1.1277286611933457</KnownMass>
|
||||||
|
<Density>1121.29</Density>
|
||||||
|
<Material>Paper</Material>
|
||||||
|
<Name>Centering ring</Name>
|
||||||
|
<KnownCG>0.0</KnownCG>
|
||||||
|
<UseKnownCG>0</UseKnownCG>
|
||||||
|
<Xb>282.575</Xb>
|
||||||
|
<CalcMass>1.1277286611933457</CalcMass>
|
||||||
|
<CalcCG>3.175</CalcCG>
|
||||||
|
<DensityType>0</DensityType>
|
||||||
|
<RadialLoc>0.0</RadialLoc>
|
||||||
|
<RadialAngle>0.0</RadialAngle>
|
||||||
|
<LocationMode>2</LocationMode>
|
||||||
|
<Len>6.35</Len>
|
||||||
|
<FinishCode>0</FinishCode>
|
||||||
|
<SerialNo>18</SerialNo>
|
||||||
|
<OD>28.702</OD>
|
||||||
|
<ID>24.9428</ID>
|
||||||
|
<UsageCode>0</UsageCode>
|
||||||
|
<AutoSize>0</AutoSize>
|
||||||
|
</Ring>
|
||||||
|
</AttachedParts>
|
||||||
|
</BodyTube>
|
||||||
|
</Stage3Parts>
|
||||||
|
<Stage2Parts/>
|
||||||
|
<Stage1Parts/>
|
||||||
|
</RocketDesign>
|
||||||
|
</DesignInformation>
|
||||||
|
</RockSimDocument>
|
Loading…
x
Reference in New Issue
Block a user